/* =====================================================================
   Tanaflex â€” thÃ¨me Â« CinÃ©ma Ã— Ã‰ditorial Â»
   Base sombre immersive (accent rouge) + raffinement Ã©ditorial
   (titres serif, numÃ©rotation, touches dorÃ©es, grandes marges).
   ===================================================================== */
:root{
  --bg:#0b0b0f; --bg2:#101017; --panel:#14141b; --panel2:#181820;
  --line:#23232f; --line2:#2e2e3d;
  --txt:#eef0f6; --mut:#8b90a3; --mut2:#6b7080;
  --accent:#e11d2a; --accent2:#ff3b47; --gold:#c9a45e; --star:#f6b21b;
  --ok:#22c55e; --warn:#fbbf24;
  --field:#0e0e14; --topbar:rgba(11,11,15,.82); --sidebar:#0d0d13;
  --hover:#2f2f3d;
  --serif:"Space Grotesk","Segoe UI",system-ui,sans-serif;
  --sans:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  /* Encart publicitaire : dimensions du CRÉATIF servi par la régie (ExoClick,
     TrafficStars, JuicyAds…). Le back-office écrase --ad-h selon le format
     retenu. Les colonnes latérales se dimensionnent à partir de --ad-w : elles
     valaient 320 px pour 24 px de remplissage, soit 294 px utiles — un pavé de
     300 px de large ne rentrait pas et se faisait rogner. */
  --ad-w:300px; --ad-h:300px;
  --ad-col:calc(var(--ad-w) + 26px);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--txt);font-family:var(--sans);font-size:15px;line-height:1.55;
  background-image:radial-gradient(70% 60% at 100% -10%,rgba(225,29,42,.10),transparent 60%);}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
.serif{font-family:var(--serif);font-weight:600;letter-spacing:-.3px}
.wrap{max-width:1200px;margin:0 auto;padding:0 24px}
.muted{color:var(--mut)} .small{font-size:13px} .center{text-align:center}
.right{text-align:right} .nowrap{white-space:nowrap} .hidden{display:none}
.gold{color:var(--star)} .danger-txt{color:var(--accent2)} .inline{display:inline}
.spacer{margin-left:auto}

/* ---------- Buttons ---------- */
.btn{font-family:var(--sans);font-weight:700;font-size:14px;border:1px solid transparent;border-radius:8px;
  padding:9px 17px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;transition:.16s;color:#fff;
  background:linear-gradient(120deg,#2b2b3a,#1e1e29);box-shadow:0 4px 12px -8px rgba(0,0,0,.6)}
.btn:hover{transform:translateY(-1px);box-shadow:0 12px 24px -12px rgba(0,0,0,.65)}
.btn:active{transform:translateY(0)}
.btn.primary{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent}
.btn.primary:hover{filter:brightness(1.08)}
.btn.ghost{background:var(--field);border-color:var(--line);color:var(--txt);box-shadow:none}
.btn.ghost:hover{border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.07)}
.btn.ok{background:linear-gradient(120deg,#22a35a,#158043);border-color:transparent;color:#fff}
.btn.ok:hover{filter:brightness(1.07)}
.btn.danger{background:linear-gradient(120deg,#e23b4e,#b3141f);border-color:transparent;color:#fff}
.btn.danger:hover{filter:brightness(1.07)}
.btn.sm{padding:6px 12px;font-size:13px;border-radius:6px}
.btn.block{width:100%;justify-content:center;padding:12px}
/* IcÃ´nes dans les boutons (Ã©diter / supprimerâ€¦) : taille cohÃ©rente quelle que soit celle du SVG */
.btn .ico{width:16px;height:16px;flex:none}
.btn.sm .ico{width:14px;height:14px}

/* Boutons natifs de champ fichier (Â« Parcourirâ€¦ Â») refaits comme de vrais boutons */
input[type=file]{font-family:inherit;font-size:14px;color:var(--mut)}
input[type=file]::file-selector-button{font-family:var(--sans);font-weight:700;font-size:13px;border:0;border-radius:7px;
  padding:9px 15px;margin-right:12px;cursor:pointer;color:#fff;background:linear-gradient(120deg,var(--accent),#b3141f);transition:.15s}
input[type=file]::file-selector-button:hover{filter:brightness(1.09);transform:translateY(-1px)}
input[type=file]::-webkit-file-upload-button{font-family:var(--sans);font-weight:700;font-size:13px;border:0;border-radius:7px;
  padding:9px 15px;margin-right:12px;cursor:pointer;color:#fff;background:linear-gradient(120deg,var(--accent),#b3141f)}

/* ---------- Top bar ---------- */
/* Header COLLANT : reste en haut de l'ecran au defilement (recherche + menu toujours a portee). */
.site-head{position:sticky;top:0;z-index:60}
/* Galeries en AJAX : leger fondu + clics neutralises pendant le chargement du fragment. */
.gal-loading{opacity:.5;pointer-events:none;transition:opacity .12s}
/* Barre supÃ©rieure : lÃ©ger dÃ©gradÃ© + ombre douce pour la dÃ©tacher du contenu. */
.topbar{position:relative;z-index:50;backdrop-filter:blur(14px);border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,var(--topbar),color-mix(in srgb,var(--topbar) 88%,transparent));
  box-shadow:0 10px 30px -24px rgba(0,0,0,.9)}
.topbar-inner{display:flex;align-items:center;gap:22px;min-height:74px;padding:9px 0}
.brand{font-family:var(--serif);font-weight:700;font-size:22px;letter-spacing:.3px;display:flex;flex-direction:column;gap:1px;line-height:1.1}
.brand-row{display:flex;align-items:center;gap:10px}
.brand-slogan{font-family:var(--sans);font-size:11px;font-weight:500;letter-spacing:.04em;color:var(--mut);text-transform:none}
.nav-collapse{display:flex;align-items:center;gap:18px;flex:1}
.tools{display:flex;align-items:center;gap:8px}
.menu-toggle{display:none;background:var(--panel);border:1px solid var(--line);color:var(--txt);font-size:20px;line-height:1;border-radius:6px;padding:7px 12px;cursor:pointer}
.theme-btn{background:var(--panel);border:1px solid var(--line);color:var(--txt);border-radius:6px;width:38px;height:38px;cursor:pointer;font-size:16px;display:inline-flex;align-items:center;justify-content:center}
.theme-btn:hover{border-color:var(--accent)}
.theme-btn .ic-sun{display:none}
html[data-theme="light"] .theme-btn .ic-sun{display:inline}
html[data-theme="light"] .theme-btn .ic-moon{display:none}
/* ---------- Menus dÃ©roulants (langue, compte) ---------- */
.dd{position:relative}
.dd-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:190px;background:var(--panel);border:1px solid var(--line2);
  border-radius:8px;padding:6px;box-shadow:0 24px 50px -16px rgba(0,0,0,.72);display:none;z-index:80}
.dd.open .dd-menu{display:block}
/* SÃ©lecteur de langue */
.flag{width:22px;height:15px;border-radius:3px;display:inline-block;flex:none;box-shadow:0 0 0 1px rgba(0,0,0,.18)}
.lang-btn{display:inline-flex;align-items:center;gap:6px;background:var(--panel);border:1px solid var(--line);border-radius:6px;
  padding:7px 9px;cursor:pointer;color:var(--txt)}
.lang-btn .caret{color:var(--mut);font-size:11px}
.lang-menu{min-width:210px;max-height:70vh;overflow:auto}
.lang-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:none;border:0;color:var(--txt);
  padding:9px 10px;border-radius:5px;cursor:pointer;font-size:14px;font-family:inherit}
.lang-item:hover{background:var(--hover)}
.lang-item.on{background:rgba(225,29,42,.12);font-weight:700}
/* Menu compte */
.account-btn .ic{font-size:14px}
.account-btn:hover{transform:none}
.account-btn .caret{color:var(--mut);font-size:11px}
.account-menu{min-width:210px}
.account-menu a,.account-menu button{display:block;width:100%;text-align:left;background:none;border:0;color:var(--txt);
  padding:10px 12px;border-radius:6px;cursor:pointer;font-size:14px;font-family:inherit;font-weight:600}
.account-menu a:hover,.account-menu button:hover{background:var(--hover)}
.account-menu form{margin:4px 0 0;padding-top:4px;border-top:1px solid var(--line)}
.account-menu form button{color:var(--accent2)}
.account-menu form button:hover{background:rgba(225,29,42,.12);color:var(--accent2)}
.upload .ic{font-size:16px}
/* Bouton Â« Publier Â» du header : bien plus visible â€” rouge vif, gras, halo pulsÃ© â€” dans les
   deux thÃ¨mes (le double sÃ©lecteur l'emporte sur l'habillage beige du thÃ¨me clair). */
.tools .btn.upload,
html[data-theme="light"] .tools .btn.upload{
  background:linear-gradient(120deg,#ff3b47,#e11d2a 52%,#b3141f);color:#fff;border-color:transparent;
  font-weight:800;letter-spacing:.2px;padding-left:18px;padding-right:18px;
  animation:publierGlow 2.6s ease-in-out infinite}
.tools .btn.upload:hover,
html[data-theme="light"] .tools .btn.upload:hover{
  filter:brightness(1.1);color:#fff;animation:none;box-shadow:0 12px 30px -8px rgba(225,29,42,1)}
@keyframes publierGlow{0%,100%{box-shadow:0 6px 16px -6px rgba(225,29,42,.7)}50%{box-shadow:0 8px 26px -3px rgba(225,29,42,1)}}
@media(prefers-reduced-motion:reduce){.tools .btn.upload{animation:none;box-shadow:0 8px 20px -6px rgba(225,29,42,.85)}}
/* Google Translate : machinerie invisible + neutralisation du bandeau */
.gt-hidden{position:absolute!important;left:-9999px;top:-9999px;height:0;overflow:hidden}
.goog-te-banner-frame,.skiptranslate>iframe,.goog-te-balloon-frame{display:none!important}
#goog-gt-tt,.goog-tooltip,.goog-te-gadget-icon{display:none!important}
body{top:0!important;position:static!important}
.brand-dot{width:11px;height:11px;border-radius:3px;background:var(--accent);box-shadow:0 0 14px var(--accent)}
.mainnav{display:flex;gap:22px;color:var(--mut);font-weight:600;font-size:14px;text-transform:uppercase;letter-spacing:.06em}
.mainnav a:hover{color:var(--accent)}
.search{margin-left:auto;display:flex;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}
.search input{background:none;border:0;color:#fff;padding:9px 13px;width:210px;outline:none;font-size:14px}
.search button{background:none;border:0;color:var(--mut);padding:0 13px;cursor:pointer;font-size:17px}
.usermenu{display:flex;align-items:center;gap:8px}

/* ---------- Recherche proÃ©minente + autocomplÃ©tion ---------- */
.search.big{position:relative;flex:1;max-width:620px;margin:0;display:flex;align-items:center;gap:2px;
  background:var(--field);border:1px solid var(--line);border-radius:999px;padding:4px 4px 4px 16px;overflow:visible;
  transition:border-color .18s,box-shadow .18s,background .18s}
.search.big:hover{border-color:var(--line2)}
.search.big:focus-within{border-color:var(--accent);background:var(--panel);
  box-shadow:0 0 0 4px rgba(225,29,42,.13),0 10px 30px -14px rgba(0,0,0,.7)}
/* Loupe en SVG : nette Ã  toute taille, contrairement au glyphe âŒ•. */
.search.big .search-ic{width:18px;height:18px;flex:none;color:var(--mut);transition:color .18s}
.search.big:focus-within .search-ic{color:var(--accent)}
.search.big input{flex:1;min-width:0;background:none;border:0;color:var(--txt);padding:10px 12px;font-size:15px;outline:none}
.search.big input::placeholder{color:var(--mut2,#6b6b7a)}
.search.big input::-webkit-search-cancel-button{filter:invert(.55)}
/* Bouton dÃ©tachÃ© Ã  l'intÃ©rieur de la barre plutÃ´t qu'un bloc collÃ© au bord. */
.search.big button{border:0;background:var(--accent);color:#fff;font-weight:700;font-size:13.5px;font-family:inherit;
  padding:9px 20px;border-radius:999px;cursor:pointer;flex:none;transition:background .15s,transform .12s}
.search.big button:hover{background:var(--accent2)}
.search.big button:active{transform:scale(.97)}
.ac{position:absolute;top:calc(100% + 10px);left:0;right:0;background:var(--panel);border:1px solid var(--line2);
  border-radius:14px;box-shadow:0 30px 60px -20px rgba(0,0,0,.72);padding:8px;z-index:70;max-height:74vh;overflow:auto}
.ac[hidden]{display:none}
/* En-têtes de rubrique de l'autocomplétion : bloc contrasté selon le thème
   (sombre → fond noir + texte blanc ; clair → fond blanc + texte noir). */
.ac-group-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;padding:8px 10px;background:#000;color:#fff;border-bottom:1px solid var(--line)}
html[data-theme="light"] .ac-group-h{background:#fff;color:#000}
.ac-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:5px;color:var(--txt)}
.ac-item:hover,.ac-item.active,.ac-item.on{background:var(--hover)}
/* Suggestion : portion SAISIE en gras, complÃ©tion en normal, nature du rÃ©sultat Ã  droite. */
.ac-lbl{flex:1;min-width:0;font-size:14px;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ac-hit{font-weight:800;color:var(--txt)}
.ac-rest{font-weight:400;color:var(--mut)}
.ac-item:hover .ac-rest,.ac-item.on .ac-rest{color:var(--txt)}
.ac-tags{display:inline-flex;align-items:center;gap:8px;flex:none}
.ac-type{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--accent);background:rgba(225,29,42,.1);border:1px solid rgba(225,29,42,.28);
  border-radius:99px;padding:2px 8px;white-space:nowrap}
.ac-thumb{width:54px;height:34px;object-fit:cover;border-radius:4px;flex:none;background:var(--field)}
.ac-av{width:34px;height:34px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--accent),#6d0f1a)}
.ac-tit{font-weight:600;font-size:14px;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ac-meta{font-size:12px;color:var(--mut)}
.ac-empty{padding:16px;text-align:center;color:var(--mut);font-size:14px}
/* Item Â« Rechercher Â« â€¦ Â» Â» (recherche libre du texte saisi), toujours en tÃªte */
.ac-search{border-bottom:1px solid var(--line)}
.ac-search .ac-type{background:var(--accent);color:#fff;border-color:var(--accent)}
.ac-search .ac-hit{color:var(--accent)}
/* ===== Barre de recherche du back-office ===== */
/* ===== En-tÃªtes de tableau triables (pyramide haut / bas) ===== */
.th-sort{display:inline-flex;align-items:center;gap:7px;color:inherit;white-space:nowrap}
.th-sort:hover{color:var(--accent)}
.th-arrows{display:inline-flex;flex-direction:column;line-height:.62;font-size:8px}
.th-arrows b{color:var(--mut2,#5b5b6b);opacity:.5;transition:color .12s,opacity .12s}
.th-arrows b.on{color:var(--accent);opacity:1}
.table th.sorted{color:var(--accent)}
.table th.num,.table td.num{text-align:right}
/* Colonne Â« favoris Â» */
.fav-n{color:#f5b301;font-weight:800;white-space:nowrap}
/* Lien vers le profil public, ouvert dans un nouvel onglet */
.u-name{font-weight:700;display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.u-name:hover{color:var(--accent)}
.u-ext{font-size:10px;opacity:.5}
.u-name:hover .u-ext{opacity:1}

/* ===== Tableau des membres (back-office) â€” refonte lisibilitÃ© =====
   8 colonnes : le tableau dÃ©file horizontalement dans son cadre (jamais coupÃ© lettre par
   lettre) ; largeurs de colonnes fixÃ©es, chaque cellule sur une seule ligne. */
.table-scroll{overflow-x:auto;overflow-y:visible}
.table-scroll .table{min-width:1120px}
/* La table des médias remplit toute la largeur du cadre (désormais pleine largeur) : la colonne
   Actions a de la place et reste visible sans défilement. min-width conservé → scroll si écran étroit. */
.table-scroll .table.table-media{width:100%}
.table tbody tr{transition:background .12s}
.table tbody tr:hover{background:rgba(255,255,255,.028)}
/* Annule le overflow-wrap:anywhere global : plus aucune coupure de mot dans ce tableau */
.table-users th,.table-users td{overflow-wrap:normal;word-break:normal;vertical-align:middle}
/* Tableau des mÃ©dias (/admin/photos, /admin/videos) : mÃªmes garde-fous que le tableau membres
   (le overflow-wrap:anywhere global coupait Â« Statut Â», Â« Vues Â», Â« Photo Â», les pseudosâ€¦ mot par mot). */
.table-media th,.table-media td{overflow-wrap:normal;word-break:normal;white-space:nowrap;vertical-align:middle}
.table-media td:nth-child(3){white-space:normal;min-width:240px} /* colonne Titre : retour Ã  la ligne par mots */
.table-media td:nth-child(3) a{overflow-wrap:anywhere}
.table-users td{padding-top:12px;padding-bottom:12px}
/* Colonne identitÃ© : pastille + pseudo sur une seule ligne, largeur confortable */
.table-users th:first-child,.table-users td:first-child{min-width:210px}
.u-cell{display:flex;align-items:center;gap:10px;min-width:0}
.u-cell .avatar{flex:none}
/* IcÃ´ne du sexe du membre (SVG) : ne prend pas d'espace au pseudo (flex:none), couleurs distinctes. */
.u-cell{gap:8px}
.gicon{display:inline-flex;flex:none;align-items:center}
.gicon-homme{color:#3b82f6}
.gicon-femme{color:#ec4899}
.gicon-couple{color:#a855f7}
.gicon-autre{color:var(--mut)}

/* ===== Module Rencontres ===== */
.meet-hero{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:20px 22px;margin-bottom:16px}
.meet-hero h1{margin:0 0 4px}
.meet-mine{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:8px}
.meet-filters{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end;margin-bottom:14px}
.meet-filters label{display:flex;flex-direction:column;gap:4px;font-size:13px;font-weight:600}
.meet-filters input,.meet-filters select{padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--field);color:var(--txt)}
.meet-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:14px;margin-bottom:18px}
.meet-card{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden;transition:.15s}
.meet-card:hover{transform:translateY(-4px);border-color:var(--accent);box-shadow:0 22px 44px -24px rgba(0,0,0,.5)}
.meet-card-photo{position:relative;aspect-ratio:3/4;background:var(--meet-ph);display:flex;align-items:center;justify-content:center;overflow:hidden}
.meet-card-photo img{width:100%;height:100%;object-fit:cover}
.meet-card-photo.discreet img{filter:blur(14px)}
.meet-ph{font-size:34px;color:rgba(255,255,255,.5)}
.meet-boost{position:absolute;top:8px;right:8px;background:var(--accent);color:#fff;border-radius:6px;padding:1px 7px;font-size:12px;font-weight:700}
.meet-card-body{padding:9px 11px}
.meet-card-name{font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.meet-legal ul{margin:6px 0 0;padding-left:20px}
.meet-legal li{margin:6px 0}
.meet-fs{border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin:4px 0}
.meet-fs legend{font-weight:700;padding:0 6px}
/* Langues parlées : colonnes auto-ajustées, pour tenir sur une ligne large comme sur mobile. */
.meet-langs{border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin:4px 0}
.meet-langs legend{font-weight:600;padding:0 6px;font-size:.94em}
/* Les cases se touchaient : 2 px d'écart vertical collait les bordures deux à deux, si bien
   qu'on lisait une grille pleine au lieu de choix distincts. Elles respirent, et chacune porte
   son propre fond — une case cochée se repère alors d'un coup d'œil. */
.meet-langs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.meet-langs-grid .check{
  margin:0; padding:8px 11px; border-radius:9px;
  background:var(--panel); border:1px solid var(--line);
  cursor:pointer; transition:border-color .14s, background .14s;
}
.meet-langs-grid .check:hover{border-color:var(--line2); background:var(--hover)}
.meet-langs-grid .check:has(input:checked){border-color:var(--accent); background:color-mix(in srgb,var(--accent) 12%,transparent)}
/* Réseaux : plusieurs par rangée, pour qu'une escorte qui en déclare six n'allonge pas la page.
   Les colonnes s'ajustent d'elles-mêmes (3 à 4 sur un écran large, 1 sur mobile). */
.meet-socials-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px}
.meet-social-row{display:flex;flex-direction:column;gap:4px;border:1px solid var(--line);border-radius:8px;padding:8px}
.meet-social-top{display:flex;gap:6px;align-items:center}
.meet-social-top select{flex:0 0 108px;min-width:0}
.meet-social-top input{flex:1 1 auto;min-width:0}
.meet-social-top .meet-social-del{flex:0 0 auto;padding:2px 8px}
.meet-social-vis{display:flex;gap:12px;flex-wrap:wrap}
.meet-social-vis .check{margin:0;font-size:.86em;opacity:.85}
.meet-social-vis .check:hover{opacity:1}
.meet-photo-prev img{max-width:160px;border-radius:8px;margin:6px 0;display:block}
.meet-show{display:grid;grid-template-columns:300px 1fr;gap:22px;align-items:start}
.meet-show-photo{aspect-ratio:3/4;background:var(--meet-ph);border-radius:12px;display:flex;align-items:center;justify-content:center;overflow:hidden}
.meet-show-photo img{width:100%;height:100%;object-fit:cover}
.meet-show-photo.discreet img{filter:blur(16px)}
.meet-facts{list-style:none;padding:0;margin:10px 0;display:flex;flex-direction:column;gap:5px}
.meet-bio{white-space:normal;line-height:1.6;margin:12px 0}
.meet-tags{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.meet-contact{margin-top:14px;display:flex;flex-direction:column;gap:12px;align-items:stretch}
.meet-contact label{display:block;font-weight:600;font-size:14px}
.meet-contact textarea{margin-top:6px}
.meet-contact .btn{align-self:flex-start}
/* Mur d'inscription visiteur (gate) */
.meet-gate{display:flex;justify-content:center;align-items:flex-start;padding:30px 16px;min-height:50vh}
.meet-gate-modal{max-width:480px;width:100%;text-align:center;padding:32px 28px}
.meet-gate-lock{width:60px;height:60px;margin:0 auto 14px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--accent);color:#fff}
.meet-gate-modal h1{font-size:22px;margin:0 0 10px}
.meet-gate-txt{color:var(--muted);margin:0 0 20px;line-height:1.5}
.meet-gate-actions{display:flex;flex-direction:column;gap:10px;margin-bottom:20px}
.meet-gate-actions .btn{width:100%;justify-content:center}
.meet-gate-benefits{list-style:none;padding:16px 0 0;margin:0;border-top:1px solid var(--line);text-align:left;display:flex;flex-direction:column;gap:8px}
.meet-gate-benefits li{display:flex;align-items:center;gap:8px;font-size:14px}
.meet-gate-check{color:#1db954;font-weight:800}
.meet-gate-back{margin:16px 0 0}
.meet-gate-back a{color:var(--muted);font-size:13px}
/* BLOC DE CONTACT — un seul écart vertical, partout.
   Téléphone et réseaux sont DEUX images distinctes (deux routes, deux règles de visibilité),
   posées l'une sous l'autre, et le bouton « Contacter » les suit. Trois jonctions, donc, qui
   valaient chacune autre chose : 12 px entre les images, 10 px entre deux réseaux, 8 px avant
   le bouton — l'ensemble n'avait aucun rythme.
   La valeur est celle de CONTACT_ECART (src/controllers/meeting_ctrl.php) : chaque image porte
   déjà la MOITIÉ de cet écart en haut et en bas. D'où margin:0 entre les images — les deux
   demi-marges en font une entière — et une demi-marge avant le bouton. Changer l'écart demande
   de toucher les deux endroits, et c'est dit des deux côtés. */
/* =====================================================================
   SUPPRESSION DÉFINITIVE D'UN COMPTE
   ===================================================================== */
/* Le lien de sortie : lisible, mais nettement séparé du bouton d'enregistrement.
   Ni caché — quelqu'un qui veut partir doit trouver la porte — ni proéminent. */
.profile-danger{margin:22px 0 0; padding-top:16px; border-top:1px solid var(--line); font-size:13.5px}
.profile-danger a{color:#e03131; font-weight:600; text-decoration:none}
.profile-danger a:hover{text-decoration:underline}

.purge-avert{padding:14px 16px; margin-bottom:20px;
  border-left:4px solid #e03131; background:rgba(224,49,49,.08)}
.purge-titre{margin:0; font-size:14.5px; line-height:1.6}
.purge-h2{font-size:19px; margin:0 0 10px}
/* L'inventaire : le NOMBRE d'abord, en colonne alignée. C'est lui qu'on lit, et l'aligner
   permet d'embrasser l'ampleur de la suppression d'un seul regard. */
.purge-liste{list-style:none; margin:0 0 16px; padding:0}
.purge-liste li{display:flex; gap:14px; align-items:baseline;
  padding:9px 0; border-bottom:1px solid var(--line); font-size:14px}
.purge-liste li:last-child{border-bottom:0}
.purge-n{flex:0 0 74px; text-align:right; font-size:19px; font-weight:800;
  font-variant-numeric:tabular-nums; color:#e03131}
.purge-note{margin:0 0 20px; max-width:66ch; line-height:1.6}
.purge-form{padding:16px}
.purge-form label{display:block; margin-bottom:14px}
.purge-form .form-foot{display:flex; gap:10px; align-items:center}

:root{--contact-ecart:12px}
/* Chaque réseau est désormais une PASTILLE dessinée dans l'image, sur fond transparent, et les
   pastilles sont séparées à l'intérieur même de l'image. Il ne reste à la feuille de style
   qu'à poser le MÊME écart entre les deux images (téléphone / réseaux) et avant le bouton. */
.meet-contact-img{margin:0 0 var(--contact-ecart);line-height:0}
.meet-contact-img:last-of-type{margin-bottom:0}
/* Hauteur NATIVE : l'image de contact fait 32 px par ligne, un bloc « réseaux » de 4 lignes en
   fait donc 128. Une hauteur fixe à 32 px écrasait ces 4 lignes dans 32 pixels — illisible. */
/* Plus d'arrondi ici : ce sont les PASTILLES dessinées dans l'image qui le portent. Un
   border-radius sur une image devenue transparente ne rognerait que du vide. */
.meet-contact-img img{display:inline-block;height:auto;width:auto;max-width:100%}
/* Les images n'ont plus aucune marge interne : l'écart complet se met donc ici, comme entre
   deux pastilles. */
.meet-contact-cta{margin-top:var(--contact-ecart)}
/* Astérisque « champ obligatoire » (ajouté par app.js sur les champs [required]) */
.req-star{color:var(--accent);font-weight:700;margin-left:2px}
@media(max-width:720px){.meet-show{grid-template-columns:1fr}.meet-show-photo{max-width:280px}}
.meet-avatar{width:100%;height:100%;display:block}
.meet-dist{position:absolute;bottom:8px;left:8px;background:rgba(0,0,0,.6);color:#fff;border-radius:6px;padding:1px 7px;font-size:11px;font-weight:700}
.meet-premium{background:linear-gradient(90deg,#f5b301,#e08a00);color:#1a1200;border:0}
.meet-map{height:70vh;min-height:420px;border-radius:12px;overflow:hidden;border:1px solid var(--line)}
/* Marqueur « couple » sur la carte : rond mi-rose (gauche) / mi-bleu (droite) */
.leaflet-div-icon.meet-marker-couple{background:transparent;border:0}
.mm-couple{display:block;width:16px;height:16px;border-radius:50%;border:1.5px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.2);background:linear-gradient(90deg,#e05a9a 0 50%,#3b74d0 50% 100%)}
.meet-gallery{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.meet-gallery img{width:60px;height:60px;object-fit:cover;border-radius:6px}
.meet-likes{margin-top:8px;color:var(--mut);font-size:14px}
.meet-actions{margin:10px 0}
.meet-secondary{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:10px}
.meet-report input{padding:6px 9px;border:1px solid var(--line);border-radius:7px;background:var(--field);color:var(--txt);max-width:180px}
.meet-editgal{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:10px}
.meet-editgal-item{position:relative;width:100px}
.meet-editgal-item img{width:100px;height:120px;object-fit:cover;border-radius:8px;display:block}
.meet-badge-main{position:absolute;top:4px;left:4px;background:var(--accent);color:#fff;font-size:10px;border-radius:5px;padding:1px 5px}
.meet-badge-pend{position:absolute;top:4px;right:4px;background:rgba(0,0,0,.7);color:#fff;font-size:10px;border-radius:5px;padding:1px 5px}
.meet-editgal-act{position:absolute;bottom:4px;left:4px;right:4px;display:flex;gap:4px;justify-content:center}
.meet-adfilter{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 16px}
.chip-esc{font-size:11px;color:var(--muted);display:inline-flex;align-items:center;gap:3px;margin:0 4px}
.chip-esc form{display:inline-flex;align-items:center;gap:3px}
.chip-esc input{margin:0}
.meet-adfilter .chip.on{background:var(--accent);color:#fff}
.meet-adgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px;margin-bottom:18px}
.meet-adcard{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden;transition:.15s}
.meet-adcard:hover{transform:translateY(-3px);border-color:var(--accent)}
.meet-adcard-img{position:relative;aspect-ratio:16/10;background:var(--meet-ph);display:flex;align-items:center;justify-content:center;overflow:hidden}
.meet-adcard-img img{width:100%;height:100%;object-fit:cover}
.meet-adtype{position:absolute;top:8px;left:8px;background:rgba(0,0,0,.62);color:#fff;border-radius:6px;padding:1px 8px;font-size:11px;font-weight:700}
.meet-adcard-body{padding:9px 11px}
.meet-adcard-by{color:var(--mut)}
.meet-adcard-city{color:var(--accent);font-weight:700}
/* Pseudo : blanc en thème sombre ; foncé (fond de page assombri) en thème clair. */
.meet-adcard-author{font-weight:700;color:#fff}
html[data-theme="light"] .meet-adcard-author{color:var(--bg);color:color-mix(in srgb, var(--bg) 100%, #000 55%)}
.meet-adshow{display:grid;grid-template-columns:minmax(0,300px) 1fr;gap:20px;align-items:start}
.meet-adshow-img img{width:100%;border-radius:12px}
/* Visuel générique quand une annonce n'a pas de photo. */
.meet-adshow-img.ph{aspect-ratio:4/3;border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;
  background:linear-gradient(135deg,var(--meet-ph,#1b1b24),var(--panel2));color:var(--mut);border:1px solid var(--line)}
.meet-adshow-phtype{font-weight:700;color:var(--accent);text-transform:uppercase;letter-spacing:.06em;font-size:13px}
@media(max-width:700px){.meet-adshow{grid-template-columns:1fr}}
.meet-modphotos{display:flex;flex-wrap:wrap;gap:12px}
.meet-modphoto{width:120px;text-align:center}
.meet-modphoto img{width:120px;height:150px;object-fit:cover;border-radius:8px;display:block;margin-bottom:4px}

/* ============ Module Rencontres â€” refonte Â« Wyylde Â» ============ */
/* Le module Rencontres adopte l'accent et les surfaces de FlexX (clair ET sombre). */
:root{--meet-pink:var(--accent);--meet-red:var(--accent);--meet-ph:linear-gradient(135deg,#241a22,#14101a)}
html[data-theme="light"]{--meet-ph:linear-gradient(135deg,#efe7ec,#e2d8e1)}
body.meet-app{background:var(--bg)}
/* Le header n'est pas collant dans le module : le backdrop-filter du .topbar n'a aucun effet
   utile mais rend flou le texte des menus déroulants (enfants du calque filtré) → on le retire. */
.meet-app .topbar{backdrop-filter:none;-webkit-backdrop-filter:none}
/* Icônes SVG « line » du module : alignées au texte, héritent la couleur. */
.mic{display:inline-block;vertical-align:-.18em;flex:none}
.btn .mic{vertical-align:-.2em;margin-right:2px}
/* En-tête Rencontres : réutilise le header FlexX (.site-head/.topbar/.menubar) → rendu identique. */
.meet-navstats{margin-left:auto;display:flex;gap:16px;align-items:center;color:var(--mut);font-size:13px}
.meet-navstats b{color:var(--txt)}
.meet-navstats-on{display:inline-flex;align-items:center;gap:5px}
.mlink-badge{background:var(--accent);color:#fff;border-radius:20px;padding:0 6px;font-size:11px;font-weight:700;vertical-align:middle}
.account-menu-tag{display:block;padding:8px 14px;color:#e08a00;font-weight:700;font-size:13px}
.meet-premium-tag{color:#e08a00;font-weight:700}
.meet-main{padding:18px 0}
@media(max-width:760px){.meet-navstats{display:none}}
/* Fil d'Ariane du module : espace bas franc pour ne pas coller au contenu. */
.meet-crumb{display:flex;flex-wrap:wrap;align-items:center;gap:7px;font-size:12.5px;color:var(--mut);margin:2px 0 18px;line-height:1.3}
.meet-crumb a{color:var(--mut)}
.meet-crumb a:hover{color:var(--accent)}
.meet-crumb-sep{color:var(--line2);font-size:14px}
.meet-crumb-cur{color:var(--txt);font-weight:600}
/* PUBLICITÉ DANS LE MODULE RENCONTRES.
   Le module n'en portait aucune : toute la partie où l'on passe le plus de temps échappait à
   la régie. Les encarts se posent en COLONNE LATÉRALE ou entre deux blocs — jamais dans une
   liste de profils, où un encart se prendrait pour une fiche et se ferait cliquer par erreur. */
.meet-col-r .ad-slot,.meet-filters-panel .ad-slot{margin:14px 0 0}
.meet-ville-pub{display:flex;justify-content:center;margin:22px 0}
/* ===== Recherche : titre et page presque vide =====
   Le titre de la page nommait « Recherche de profils » et rien d'autre : la ville demandée
   n'apparaissait que dans l'onglet du navigateur. Il porte désormais le sujet réel, en tête
   des résultats et non dans la colonne des filtres. */
.meet-results-titre{margin:0 0 14px}
.meet-results-titre h1{font-family:var(--serif);font-weight:600;font-size:26px;margin:0 0 2px;line-height:1.2}
.meet-results-titre p{margin:0;font-size:13.5px}
.meet-results-head{margin:0 0 10px;font-size:12.5px}
/* Un seul résultat laissait six cents pixels de blanc : on remplit avec une suite utile. */
.meet-suite{margin-top:26px;padding-top:20px;border-top:1px solid var(--line)}
.meet-suite-ville{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:10px;
  background:var(--panel2);border:1px solid var(--line);text-decoration:none;margin-bottom:20px}
.meet-suite-ville:hover{border-color:var(--accent)}
.meet-suite-ville b{display:block;font-size:15.5px;margin-bottom:2px}
.meet-suite-ville .muted{display:block;line-height:1.4}
.meet-suite-ic{flex:none;display:flex;color:var(--accent)}
.meet-suite-fl{flex:none;margin-left:auto;color:var(--mut)}
.meet-suite-h{font-size:14px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:var(--mut);margin:0 0 10px}
.meet-suite-villes{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.meet-suite-v{display:flex;flex-direction:column;gap:2px;padding:11px 13px;border-radius:9px;
  background:var(--panel);border:1px solid var(--line);text-decoration:none}
.meet-suite-v:hover{border-color:var(--accent)}
.meet-suite-note{margin:18px 0 0}
@media(max-width:520px){
  .meet-results-titre h1{font-size:21px}
  .meet-suite-villes{grid-template-columns:repeat(2,1fr);gap:8px}
}
/* ===== Publicité en modale =====
   Format le plus intrusif : il recouvre la page. Le bouton de fermeture est donc GRAND et
   toujours visible, le compte à rebours annoncé, et rien n'y est caché — une modale dont on
   cherche la croix est ce qui fait fermer l'onglet, pas la publicité elle-même. */
.admodal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
  padding:16px;background:rgba(8,8,12,.82);backdrop-filter:blur(3px)}
.admodal-box{background:var(--panel);border:1px solid var(--line);border-radius:12px;
  max-width:min(96vw,720px);max-height:92vh;overflow:auto;box-shadow:0 30px 80px -20px rgba(0,0,0,.7)}
.admodal-head{display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:10px 12px;border-bottom:1px solid var(--line)}
.admodal-label{font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--mut2)}
/* 44 px de haut : la cible reste confortable au doigt, même une fois le compte à rebours fini. */
.admodal-close{min-height:44px;padding:0 16px;border-radius:99px;border:1px solid var(--line2);
  background:var(--field);color:var(--mut);font-weight:700;font-size:13px;cursor:not-allowed}
.admodal.is-ready .admodal-close{cursor:pointer;background:var(--accent);border-color:var(--accent);color:#fff}
.admodal-x{display:none}
.admodal.is-ready .admodal-wait{display:none}
.admodal.is-ready .admodal-x{display:inline}
.admodal-body{padding:14px;display:flex;align-items:center;justify-content:center}
.admodal-body img,.admodal-body iframe{max-width:100%}
@media(max-width:520px){.admodal-box{max-width:100%}.admodal-body{padding:10px}}
@media(max-width:900px){
  /* Sur téléphone la colonne latérale passe sous le contenu : l'encart s'y centre au lieu de
     rester collé à gauche sur une largeur qui n'est plus la sienne. */
  .meet-col-r .ad-slot,.meet-filters-panel .ad-slot{margin-left:auto;margin-right:auto}
}
/* Pied de page léger du module (liens légaux + 18+, cohérent avec le site) */
.meet-foot{border-top:1px solid var(--line);background:var(--panel);margin-top:24px}
.meet-foot-in{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 18px;padding:16px 0;font-size:12px}
.meet-foot-c{color:var(--mut)}
.meet-foot-links{display:flex;flex-wrap:wrap;gap:6px 14px}
.meet-foot-links a{color:var(--mut)}
.meet-foot-links a:hover{color:var(--accent)}

/* Tableau de bord 3 colonnes */
.meet-dash{display:grid;grid-template-columns:230px 1fr 260px;gap:18px;align-items:start}
.meet-mycard{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px;text-align:center}
.meet-mycard-ph{width:120px;height:120px;border-radius:50%;margin:0 auto 10px;overflow:hidden;background:var(--meet-ph) center/cover;display:flex;align-items:center;justify-content:center}
.meet-mycard-name{font-weight:800;font-size:17px}
/* Rappel « dÃ©jÃ  membre du site » sous le bouton d'inscription : sÃ©parÃ© par un filet
   pour que la seconde voie d'accÃ¨s ne se lise pas comme la suite du texte de la premiÃ¨re. */
.meet-alreadyin{margin:12px 0 0;padding-top:10px;border-top:1px solid var(--line)}
.meet-alreadyin a{color:var(--accent);font-weight:600}
.meet-alreadyin a:hover{text-decoration:underline}
.meet-certcta{display:inline-flex;align-items:center;gap:6px;background:linear-gradient(135deg,#f6d365,#f5b301);color:#5c4300;border-radius:20px;padding:5px 12px;font-size:12px;font-weight:700;margin:10px 0 4px;box-shadow:0 4px 14px -6px rgba(245,179,1,.7)}
.meet-certcta:hover{filter:brightness(1.04)}
.meet-certbadge{display:inline-flex;align-items:center;gap:6px;color:#12b886;font-weight:700;font-size:12px;margin:10px 0 4px}
.meet-certbadge.lg{font-size:14px;margin-top:12px}
.meet-mystats{display:flex;gap:10px;justify-content:center;margin-top:12px}
.meet-mystats>div{flex:1;background:var(--field);border-radius:10px;padding:8px 4px}
.meet-mystats b{display:block;font-size:20px;font-family:var(--serif)}
.meet-mystats span{font-size:11px;color:var(--mut)}
.meet-mystats-link{display:inline-block;margin-top:10px;font-size:13px;font-weight:600}
.meet-links{margin-top:14px;display:flex;flex-direction:column;gap:2px;padding:8px}
.meet-links a{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:10px;color:var(--txt);font-weight:600;font-size:14px;transition:background .15s,color .15s}
.meet-links a:hover{background:var(--field);color:var(--accent)}
.meet-links-ic{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:9px;background:var(--field);color:var(--mut);flex:none;transition:background .15s,color .15s}
.meet-links a:hover .meet-links-ic{background:var(--accent);color:#fff}

/* Annonces — vignette de repli + statut (mode « Mes annonces ») */
.meet-adcard-ph{display:flex;align-items:center;justify-content:center;width:100%;height:100%;color:var(--mut)}
.meet-adstatus{position:absolute;top:8px;right:8px}

/* Page « La certification » */
.meet-cert{max-width:820px}
.meet-cert-hero{display:flex;gap:18px;align-items:flex-start}
.meet-cert-hero-ic{flex:none;width:64px;height:64px;border-radius:16px;display:flex;align-items:center;justify-content:center;color:#fff;background:linear-gradient(135deg,#12b886,#0ca678);box-shadow:0 10px 24px -12px rgba(18,184,134,.8)}
.meet-cert-hero h2{margin:0 0 6px;font-size:20px}
.meet-cert-steps{display:grid;grid-template-columns:1fr;gap:12px;margin:8px 0 18px}
.meet-cert-step{display:flex;gap:14px;align-items:flex-start;margin:0}
.meet-cert-step b{display:block;margin-bottom:3px}
.meet-cert-step .btn{margin-top:8px}
.meet-cert-num{flex:none;width:30px;height:30px;border-radius:50%;background:var(--accent);color:#fff;font-weight:800;display:flex;align-items:center;justify-content:center}
.meet-cert-note ul{margin:8px 0 0;padding-left:20px;color:var(--mut);display:flex;flex-direction:column;gap:6px}
.meet-cert-note li b{color:var(--txt)}
@media(min-width:640px){.meet-cert-steps{grid-template-columns:repeat(3,1fr)}.meet-cert-step{flex-direction:column}}

/* Modale de confirmation (module Rencontres) */
.meet-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:20px}
.meet-modal[hidden]{display:none}
.meet-modal-backdrop{position:absolute;inset:0;background:rgba(8,6,10,.62);backdrop-filter:blur(2px)}
.meet-modal-box{position:relative;background:var(--panel);border:1px solid var(--line2);border-radius:16px;padding:24px;max-width:400px;width:100%;box-shadow:0 30px 70px -20px rgba(0,0,0,.7);animation:meetPop .16s ease}
@keyframes meetPop{from{transform:translateY(8px) scale(.97);opacity:0}to{transform:none;opacity:1}}
.meet-modal-msg{margin:0 0 20px;font-size:16px;font-weight:600;line-height:1.4}
.meet-modal-actions{display:flex;gap:10px;justify-content:flex-end}

/* Lightbox galerie */
.meet-lb{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}
.meet-lb[hidden]{display:none}
.meet-lb-backdrop{position:absolute;inset:0;background:rgba(6,4,8,.92)}
.meet-lb-stage{position:relative;z-index:1;margin:0;max-width:92vw;max-height:88vh;display:flex}
.meet-lb-stage img{max-width:92vw;max-height:88vh;object-fit:contain;border-radius:8px;box-shadow:0 20px 60px -10px rgba(0,0,0,.8)}
.meet-lb-x{position:absolute;top:18px;right:22px;z-index:2;background:rgba(255,255,255,.1);color:#fff;border:0;width:44px;height:44px;border-radius:50%;font-size:20px;cursor:pointer;transition:background .15s}
.meet-lb-x:hover{background:rgba(255,255,255,.22)}
.meet-lb-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2;background:rgba(255,255,255,.1);color:#fff;border:0;width:52px;height:52px;border-radius:50%;font-size:32px;line-height:1;cursor:pointer;transition:background .15s}
.meet-lb-nav:hover{background:rgba(255,255,255,.22)}
.meet-lb-nav.prev{left:20px}.meet-lb-nav.next{right:20px}
.meet-lb-count{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);z-index:2;color:#fff;background:rgba(0,0,0,.5);border-radius:20px;padding:5px 14px;font-size:13px;font-weight:600}
@media(max-width:600px){.meet-lb-nav{width:42px;height:42px;font-size:26px}.meet-lb-nav.prev{left:8px}.meet-lb-nav.next{right:8px}}
.meet-publish{background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 14%,var(--panel)),var(--panel));border:1px solid color-mix(in srgb,var(--accent) 35%,var(--line));border-radius:14px;padding:12px 16px;display:flex;align-items:center;gap:14px;margin-bottom:18px;transition:box-shadow .15s,transform .15s}
.meet-publish:hover{box-shadow:0 10px 26px -14px color-mix(in srgb,var(--accent) 70%,transparent)}
.meet-publish-ic{width:44px;height:44px;border-radius:12px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;flex:none}
.meet-publish-txt{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.meet-publish-txt b{font-size:15px}
.meet-publish-cta{flex:none;pointer-events:none}
.meet-zaphead{margin:6px 0 16px}
.meet-tabs{display:flex;gap:6px}
.meet-tabs a{padding:7px 16px;border-radius:20px;font-weight:700;color:var(--mut)}
.meet-tabs a.on{background:var(--meet-pink);color:#fff}
.meet-more{text-align:center;margin-top:16px}
.meet-col-r>div{margin-bottom:14px}
.meet-complete{background:linear-gradient(135deg,var(--meet-red),#b3121e);color:#fff;border-radius:14px;padding:16px}
.meet-complete .btn.light{background:#fff;color:var(--meet-red);border:0}
.meet-newbies{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px}
.meet-events-h{font-weight:800;margin-bottom:10px}
.meet-newbies-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.meet-newbie{aspect-ratio:1;border-radius:10px;overflow:hidden;background:var(--meet-ph);display:flex;align-items:center;justify-content:center}
.meet-newbie img{width:100%;height:100%;object-fit:cover}

/* Cartes profil */
.mcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(155px,1fr));gap:14px}
.mcard{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:14px;overflow:hidden;transition:.15s}
.mcard:hover{transform:translateY(-4px);border-color:var(--meet-pink);box-shadow:0 20px 40px -22px rgba(224,70,143,.5)}
.mcard-ph{position:relative;aspect-ratio:1;background:var(--meet-ph);display:flex;align-items:center;justify-content:center;overflow:hidden}
.mcard-ph img{width:100%;height:100%;object-fit:cover}
.mcard-ph.discreet img{filter:blur(16px)}
.mcard-online{position:absolute;top:8px;left:8px;width:12px;height:12px;border-radius:50%;background:#22c55e;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.2)}
.mcard-badges{position:absolute;top:6px;right:6px;display:flex;flex-direction:column;gap:4px;align-items:flex-end}
.mcard-cert{background:#12b886;color:#fff;font-size:10px;font-weight:700;border-radius:5px;padding:1px 6px}
/* Vérification de plus de six mois : le badge PÂLIT au lieu de disparaître. Il reste vrai
   qu'une vérification a eu lieu — mais elle ne s'affirme plus au même titre qu'une récente.
   Le contour maintient la lisibilité sur une photo claire, que le fond translucide seul
   ne garantirait pas. */
.mcard-cert.pale{background:rgba(18,184,134,.28); color:#d8f5ec; box-shadow:inset 0 0 0 1px rgba(18,184,134,.55)}
/* « À la une » : la mention d'un emplacement PAYANT. Elle est volontairement lisible et non
   discrète — un placement publicitaire qui se ferait passer pour un classement au mérite
   tromperait le visiteur. Doré plutôt que rouge : c'est une distinction, pas une alerte. */
.mcard-avant{background:#e0a800; color:#241d00; font-size:10px; font-weight:800;
  border-radius:5px; padding:1px 6px; letter-spacing:.02em}
.mcard-lcs{background:var(--meet-red);color:#fff;font-size:10px;font-weight:700;border-radius:5px;padding:1px 6px}
.mcard-new{background:#f5b301;color:#3a2c00;font-size:10px;font-weight:700;border-radius:5px;padding:1px 6px}
.mcard-discreet{background:rgba(20,16,26,.72);color:#fff;font-size:10px;font-weight:700;border-radius:5px;padding:1px 6px;backdrop-filter:blur(2px)}
.mprofile-private{color:var(--mut);font-weight:600}
.mcard-dist{position:absolute;bottom:6px;left:6px;background:rgba(0,0,0,.6);color:#fff;font-size:11px;border-radius:6px;padding:1px 7px}
.mcard-rate{position:absolute;bottom:6px;right:0;background:#ffd400;color:#3a2c00;font-size:12px;font-weight:800;padding:2px 8px;border-radius:6px 0 0 6px;box-shadow:0 2px 6px rgba(0,0,0,.35);z-index:2;letter-spacing:.2px}
.mcard-body{padding:8px 10px;text-align:center}
.mcard-name{font-weight:800;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mcard-type{font-size:12px;color:var(--mut)}
.mcard-coups{color:#f5b301;font-weight:700;font-size:12px;margin-top:2px}

/* Recherche */
.meet-search{display:grid;grid-template-columns:270px 1fr;gap:18px;align-items:start}
.meet-filters-panel{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px;align-self:start}
/* Le titre du panneau est passé de <h2> à <h1> (la page n'avait aucun titre de niveau 1 à offrir
   à Google) : la règle couvre les deux balises pour que l'apparence reste strictement identique. */
.meet-filters-panel h2,.meet-filters-title{margin:0 0 10px;font-size:18px}
.meet-fi{margin-bottom:10px}
.meet-results.meet-loading{opacity:.5;pointer-events:none;transition:opacity .15s}

/* PANNEAU DE FILTRES REPLIÉ SUR PETIT ÉCRAN.
   Sur un téléphone, ce panneau mesurait plus de 1 200 px : Escorte, Certifié, Photo, Connecté,
   Type, Genre, Orientation, Âge, Localisation, Rechercher, Réinitialiser — un formulaire entier
   AVANT la première annonce, qui commençait à 1 322 px sur un écran de 844. On demandait donc de
   faire défiler un écran et demi de réglages pour voir ce qu'on était venu voir.
   Il reste ouvert au-dessus de 980 px, où il tient dans une colonne latérale sans rien pousser.
   Le bouton est posé par meeting.js : sans JavaScript, le panneau reste simplement déplié —
   long, mais entier. On ne cache jamais des filtres derrière un bouton qui n'existe pas. */
.meet-filters-toggle{display:none}
@media(max-width:980px){
  .meet-filters-toggle{display:flex;align-items:center;justify-content:space-between;gap:10px;
    width:100%;margin:0 0 12px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;
    background:var(--panel);color:inherit;font:inherit;font-weight:600;cursor:pointer}
  .meet-filters-toggle .meet-filters-count{font-weight:500;color:var(--mut)}
  .meet-filters-toggle[aria-expanded="true"] .meet-filters-caret{transform:rotate(180deg)}
  .meet-filters-caret{transition:transform .15s}
  .meet-filters-panel.is-collapsed{display:none}
}

/* Champs de formulaire — style unifié « sexy » (text · select · textarea) du module Rencontres */
.meet-main :is(input[type=text],input[type=search],input[type=number],input[type=date],input[type=email],input[type=tel],input[type=url],input[type=password],input:not([type]),select,textarea){
    width:100%;padding:11px 13px;border:1px solid var(--line);border-radius:10px;background-color:var(--field);color:var(--txt);
    font:inherit;font-size:14px;line-height:1.35;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease;-webkit-appearance:none;appearance:none}
.meet-main :is(input,select,textarea)::placeholder{color:var(--mut);opacity:.75}
.meet-main :is(input[type=text],input[type=search],input[type=number],input[type=date],input[type=email],input[type=tel],input[type=url],input[type=password],input:not([type]),select,textarea):hover:not(:focus){border-color:var(--line2)}
.meet-main :is(input[type=text],input[type=search],input[type=number],input[type=date],input[type=email],input[type=tel],input[type=url],input[type=password],input:not([type]),select,textarea):focus{
    outline:none;border-color:var(--accent);background-color:var(--panel);box-shadow:0 0 0 3px rgba(225,29,42,.16)}
.meet-main textarea{min-height:92px;resize:vertical}
.meet-main select{padding-right:36px;cursor:pointer;background-repeat:no-repeat;background-position:right 12px center;background-size:15px;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23968f98' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
.meet-main select::-ms-expand{display:none}

/* Autocomplete de ville */
.meet-ac{position:relative}
.meet-ac-list{position:absolute;z-index:60;left:0;right:0;top:calc(100% + 4px);margin:0;padding:5px;list-style:none;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:0 16px 40px -12px rgba(0,0,0,.5);max-height:280px;overflow:auto}
.meet-ac-item{padding:9px 11px;border-radius:8px;cursor:pointer;font-size:14px;color:var(--txt);display:flex;align-items:center;gap:8px}
.meet-ac-item:hover,.meet-ac-item.active{background:rgba(225,29,42,.12)}
.meet-ac-cp{font-size:12px;font-weight:700;color:var(--mut);background:var(--field);border:1px solid var(--line);border-radius:6px;padding:1px 6px}

/* Autocomplétion du header, groupée par rubrique */
.meet-app .search.big{position:relative}
.meet-sug{position:absolute;z-index:90;left:0;right:0;top:calc(100% + 6px);background:var(--panel);border:1px solid var(--line2);border-radius:12px;padding:5px;box-shadow:0 24px 55px -16px rgba(0,0,0,.6);max-height:70vh;overflow:auto}
.meet-sug[hidden]{display:none}
.meet-sug-h{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--mut);padding:9px 11px 4px}
.meet-sug-item{display:flex;align-items:baseline;gap:8px;padding:8px 11px;border-radius:8px;cursor:pointer;color:var(--txt);font-size:14px}
.meet-sug-item:hover,.meet-sug-item.active{background:rgba(225,29,42,.12)}
.meet-sug-all{font-weight:600;color:var(--accent)}
.meet-sug-l{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.meet-sug-s{font-size:12px;color:var(--mut);flex:none}

/* Aucun résultat + création d'alerte */
.meet-noresult{grid-column:1/-1;text-align:center;padding:34px 16px;display:flex;flex-direction:column;align-items:center;gap:10px}

/* Messagerie Rencontres (2 colonnes) */
.meet-msg{display:grid;grid-template-columns:290px 1fr;gap:16px;align-items:stretch;min-height:60vh}
.meet-msg-list{background:var(--panel);border:1px solid var(--line);border-radius:14px;overflow:hidden;max-height:74vh;overflow-y:auto}
.meet-msg-conv{display:flex;align-items:center;gap:10px;padding:11px 13px;border-bottom:1px solid var(--line);position:relative}
.meet-msg-conv:hover{background:var(--field)}
.meet-msg-conv.on{background:rgba(225,29,42,.10)}
/* La pastille porte la silhouette genrée (homme / femme / couple) et non plus une initiale sur
   aplat coloré : le dessin dit ce qu'est le profil, la lettre ne disait rien. overflow:hidden
   découpe le SVG au rond, sans quoi il déborderait du cercle. */
.meet-msg-ava{width:40px;height:40px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--meet-ph,#2a2530)}
.meet-msg-conv-b{flex:1;min-width:0}
.meet-msg-conv-top{display:flex;justify-content:space-between;gap:8px;align-items:baseline}
.meet-msg-conv-top b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.meet-msg-conv-last{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.meet-msg-badge{background:var(--accent);color:#fff;border-radius:20px;min-width:20px;height:20px;padding:0 6px;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;flex:none}
.meet-msg-thread{background:var(--panel);border:1px solid var(--line);border-radius:14px;display:flex;flex-direction:column;overflow:hidden}
.meet-msg-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--mut);padding:40px}
.meet-msg-thead{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line)}
.meet-msg-thead-l{display:flex;align-items:center;gap:10px}
.meet-msg-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:8px;max-height:60vh}
.meet-bubble{max-width:74%;align-self:flex-start;background:color-mix(in srgb,var(--txt) 11%,var(--panel));border:1px solid var(--line);border-radius:13px;border-bottom-left-radius:4px;padding:6px 11px}
.meet-bubble.me{align-self:flex-end;background:var(--accent);color:#fff;border-color:transparent;border-radius:13px;border-bottom-right-radius:4px}
.meet-bubble-txt{font-size:14px;line-height:1.35;word-break:break-word}
.meet-bubble-title{font-weight:600;display:block}
.meet-msg-plink{text-decoration:underline;font-weight:700}
.meet-bubble.me .meet-msg-plink{color:#fff !important}
.meet-bubble-hr{border:0;border-top:1px solid color-mix(in srgb,var(--txt) 16%,transparent);margin:5px 0}
.meet-bubble.me .meet-bubble-hr{border-top-color:rgba(255,255,255,.32)}
.meet-bubble-t{font-size:10px;opacity:.7;margin-top:2px;text-align:right}
.meet-msg-form{display:flex;gap:8px;padding:12px 14px;border-top:1px solid var(--line);align-items:flex-end}
.meet-msg-form textarea{flex:1;min-height:auto}
.meet-msg-blocked{padding:16px;text-align:center;border-top:1px solid var(--line)}
@media(max-width:760px){.meet-msg{grid-template-columns:1fr}.meet-msg-list{max-height:none}}

/* Mes alertes */
.meet-alerts{display:flex;flex-direction:column;gap:10px}
.meet-alert{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:0}
.meet-alert-b{display:flex;align-items:center;gap:12px}
.meet-alert-ic{width:40px;height:40px;border-radius:11px;background:var(--field);color:var(--accent);display:flex;align-items:center;justify-content:center;flex:none}
.meet-alert-act{display:flex;gap:8px;flex:none}

/* Mes favoris */
.meet-fav-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:14px;margin-bottom:8px}
.meet-fav-item{display:flex;flex-direction:column;gap:6px}
.meet-fav-tools{display:flex;gap:6px;flex-wrap:wrap}
.meet-fav-tools .btn{flex:1;justify-content:center}
.meet-fav-ads{display:flex;flex-direction:column;gap:10px}
.meet-fav-ad{display:flex;align-items:center;gap:12px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:8px 10px}
.meet-fav-ad-l{display:flex;align-items:center;gap:12px;flex:1;min-width:0;color:var(--txt)}
.meet-fav-ad-b{min-width:0;display:flex;flex-direction:column;gap:2px}
.meet-fav-ad-b b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media(max-width:600px){.meet-fav-ad{flex-wrap:wrap}.meet-fav-tools{width:100%}}

/* Nouvelle annonce : formulaire + colonne de suggestions illustrées */
.meet-adnew{display:grid;grid-template-columns:290px 1fr;gap:18px;align-items:start}
.meet-adnew-form{margin:0}
.meet-adnew-sug{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px;position:sticky;top:16px}
.meet-adnew-sug-h{display:flex;align-items:center;gap:8px;font-weight:800;margin-bottom:10px}
.meet-adnew-sug-list{display:flex;flex-direction:column;gap:8px;max-height:70vh;overflow:auto}
.meet-sugcard{display:flex;gap:10px;align-items:center;padding:6px;border-radius:10px;transition:background .15s}
.meet-sugcard:hover{background:var(--field)}
.meet-sugcard-img{width:56px;height:56px;border-radius:9px;overflow:hidden;flex:none;background:var(--meet-ph);display:flex;align-items:center;justify-content:center;color:var(--mut)}
.meet-sugcard-img img{width:100%;height:100%;object-fit:cover}
.meet-sugcard-b{min-width:0;display:flex;flex-direction:column;gap:2px}
.meet-sugcard-b b{font-size:13px;line-height:1.25;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
@media(max-width:820px){.meet-adnew{grid-template-columns:1fr}.meet-adnew-sug{position:static;order:2}}

/* Zone de dépôt (dossiers + .zip) sous le champ « Parcourir » */
.meet-dropzone{margin-top:8px;border:2px dashed var(--line2);border-radius:12px;background:var(--field);padding:18px;text-align:center;cursor:pointer;transition:border-color .15s,background .15s}
.meet-dropzone:hover{border-color:var(--accent)}
.meet-dropzone.drag{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--field))}
.meet-dropzone-in{display:flex;flex-direction:column;align-items:center;gap:4px;pointer-events:none}
.meet-dropzone-ic{width:44px;height:44px;border-radius:12px;background:var(--panel);border:1px solid var(--line);color:var(--accent);display:flex;align-items:center;justify-content:center;margin-bottom:4px}
/* Fichiers en attente d'envoi : de vraies miniatures, réordonnables et retirables.
   La liste ne suit plus le curseur « pointer » de la zone — on y clique pour agir
   sur une image, pas pour rouvrir le sélecteur de fichiers. */
.meet-dropzone-files{
  list-style:none; margin:12px 0 0; padding:12px 0 0;
  border-top:1px solid var(--line);
  display:grid; grid-template-columns:repeat(auto-fill,minmax(104px,1fr)); gap:10px;
  cursor:default; text-align:left;
}
.mdz-item{
  position:relative; aspect-ratio:1/1; border-radius:10px; overflow:hidden;
  background:var(--panel); border:1px solid var(--line); cursor:grab;
  transition:border-color .15s, transform .12s, opacity .12s;
}
.mdz-item:active{cursor:grabbing}
.mdz-item img{width:100%; height:100%; object-fit:cover; display:block; pointer-events:none}
.mdz-item.mdz-drag{opacity:.4}
.mdz-item.mdz-over-t{border-color:var(--accent); transform:scale(1.04)}
/* La première image devient la photo principale : le dire sur la vignette, au moment
   où l'ordre se décide, évite la surprise après validation. */
.mdz-main{
  position:absolute; top:5px; left:5px; z-index:2;
  background:var(--accent); color:#fff; font-size:10px; font-weight:700;
  padding:2px 7px; border-radius:20px; letter-spacing:.02em;
}
.mdz-over{
  position:absolute; top:5px; left:5px; z-index:2;
  background:var(--warn,#fbbf24); color:#1a1a1a; font-size:10px; font-weight:700;
  padding:2px 7px; border-radius:20px;
}
.mdz-del{
  position:absolute; top:4px; right:4px; z-index:3;
  width:22px; height:22px; padding:0; border-radius:50%;
  border:0; background:rgba(0,0,0,.62); color:#fff; font-size:12px; line-height:1;
  cursor:pointer; opacity:0; transition:opacity .15s, background .15s;
}
.mdz-item:hover .mdz-del, .mdz-del:focus-visible{opacity:1}
.mdz-del:hover{background:var(--accent)}
.mdz-name{
  position:absolute; left:0; right:0; bottom:0; z-index:2;
  padding:12px 6px 4px; font-size:10.5px; color:#fff;
  background:linear-gradient(transparent,rgba(0,0,0,.82));
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* Archive : pas de miniature possible, son contenu n'est lu qu'à l'ouverture côté serveur. */
.mdz-zip{cursor:default; display:flex; align-items:center; justify-content:center; background:var(--panel2)}
.mdz-zipic{font-size:34px; opacity:.75}
.mdz-note{grid-column:1/-1; margin:2px 0 0; font-size:12px; color:var(--mut); line-height:1.5}

/* Génération d'image par IA */
.meet-aigen{margin-top:12px;border:1px solid color-mix(in srgb,var(--accent) 30%,var(--line));border-radius:12px;padding:14px;background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 8%,var(--panel)),var(--panel))}
.meet-aigen-h{display:flex;align-items:center;gap:8px;font-weight:800;margin-bottom:2px}
.meet-aigen-row{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
.meet-aigen-row #aiPrompt{flex:1;min-width:180px}
.meet-aigen-row #aiModel{flex:none;width:auto}
.meet-aigen-msg{margin-top:8px;padding:8px 12px;border-radius:8px;font-size:13px;font-weight:600}
.meet-aigen-msg.ok{background:rgba(18,133,95,.14);color:#0e7a55}
.meet-aigen-msg.err{background:rgba(225,29,42,.12);color:var(--accent)}
/* Génération IA dans l'espace médias */
.ai-genbox{border-color:color-mix(in srgb,var(--accent) 30%,var(--line))}
.ai-genbox-h{display:flex;align-items:center;gap:8px;margin:0 0 4px}
.ai-genbox-row{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}
.ai-genbox-row input,.ai-genbox-row select{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:11px 13px;font-family:inherit;font-size:15px;outline:none;font-weight:400}
.ai-genbox-row input:focus,.ai-genbox-row select:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.ai-genbox-row #aiPrompt{flex:1;min-width:200px}
.ai-genbox-row #aiModel{flex:none;width:auto}
.ai-genbox-msg{margin-top:6px;padding:8px 12px;border-radius:8px;font-size:13px;font-weight:600}
.ai-genbox-msg.ok{background:rgba(18,133,95,.14);color:#0e7a55}
.ai-genbox-msg.err{background:rgba(225,29,42,.12);color:var(--accent)}
.ai-genbox-link{margin-left:8px;font-weight:700}
.ai-genbox-result{margin-top:10px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.ai-genbox-thumb{width:120px;height:120px;object-fit:cover;border-radius:10px;border:1px solid var(--line)}
.ai-genbox-acts{display:flex;gap:8px;flex-wrap:wrap}
.al-edit-avatar{margin:4px 0 2px}

/* Tableau de bord — onglet Abonnements */
.sub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px}
.sub-card{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:8px 12px}
.sub-card-l{display:flex;align-items:center;gap:11px;flex:1;min-width:0;color:var(--txt)}
.sub-ava{width:40px;height:40px;border-radius:50%;object-fit:cover;flex:none;display:flex;align-items:center;justify-content:center;background:var(--field);color:var(--mut);font-size:16px}
.sub-ava-cat{background:var(--accent);color:#fff}
.sub-card-b{display:flex;flex-direction:column;min-width:0}
.sub-card-name{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Back-office : « Catégories nav » (drag-and-drop, tri alpha auto) */
.catnav-block{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px;margin-bottom:18px}
.catnav-block-h{display:flex;align-items:center;justify-content:space-between;gap:12px}
.catnav-block-h h3{margin:0}
.catnav-cols{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:10px}
.catnav-col-h{font-weight:700;font-size:13px;margin-bottom:6px;color:var(--mut)}
.catnav-list{list-style:none;margin:0;padding:6px;min-height:120px;max-height:340px;overflow:auto;background:var(--field);border:1px solid var(--line);border-radius:10px;display:flex;flex-wrap:wrap;gap:6px;align-content:flex-start}
.catnav-list.over{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.12)}
.catnav-list-sel{background:color-mix(in srgb,var(--accent) 8%,var(--field))}
.catnav-item{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:6px 11px;font-size:13px;font-weight:600;cursor:grab;user-select:none}
.catnav-item:hover{border-color:var(--accent)}
.catnav-item.dragging{opacity:.45}
@media(max-width:700px){.catnav-cols{grid-template-columns:1fr}}
.meet-toggles{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}
.meet-toggle{display:flex;align-items:center;justify-content:space-between;padding:5px 0;font-size:14px;cursor:pointer}
.meet-toggle input{display:none}
.meet-toggle i{width:38px;height:22px;border-radius:20px;background:var(--line2);position:relative;transition:.15s;flex:none}
.meet-toggle i::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;transition:.15s}
.meet-toggle input:checked+i{background:var(--meet-pink)}
.meet-toggle input:checked+i::after{left:18px}
.meet-fgroup{border-top:1px solid var(--line);padding:10px 0}
.meet-fgroup>b{display:block;margin-bottom:6px}
.meet-frow{display:flex;gap:8px}.meet-frow input,.meet-frow select{flex:1;min-width:0;padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:var(--field);color:var(--txt)}
.meet-kinks{max-height:200px;overflow:auto;display:flex;flex-direction:column;gap:2px}
.meet-results-head{margin-bottom:10px}

/* Fiche profil */
.mprofile-head{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 18px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.mprofile-head-l{display:flex;align-items:center;gap:14px}
.mprofile-avatar{width:64px;height:64px;border-radius:50%;background:var(--meet-ph) center/cover;flex:none;display:flex;align-items:center;justify-content:center;overflow:hidden}
.mprofile-avatar.discreet{filter:blur(3px)}
.mprofile-head h1{margin:0;font-size:24px;font-family:var(--serif)}
.mprofile-cert{color:#12b886;font-size:16px; display:inline-flex; align-items:center; gap:3px; vertical-align:middle}
/* La DATE accolée au bouclier : c'est elle qui fait la différence entre un badge vérifiable
   et un badge décoratif. Petite et en filet, elle informe sans concurrencer le pseudo. */
.mprofile-cert-d{font-size:11px; font-weight:700; letter-spacing:.02em; opacity:.85}
.mprofile-cert.pale{color:#7fbfa9}
.mprofile-status{font-size:12px;font-weight:700;color:var(--mut);display:flex;align-items:center;gap:6px}
.mprofile-dot{width:9px;height:9px;border-radius:50%;background:#999}.mprofile-dot.on{background:#22c55e}
.mprofile-actions{display:flex;gap:8px;flex-wrap:wrap}
.mprofile-grid{display:grid;grid-template-columns:290px 1fr;gap:18px;align-items:start}
/* Colonne photo façon « fiche » : grande photo + vignettes cliquables + CTA */
.mprofile-media{border-radius:14px;overflow:hidden;border:1px solid var(--line);background:var(--panel)}
.mprofile-photo{position:relative;aspect-ratio:3/4;background:var(--meet-ph);display:flex;align-items:center;justify-content:center;overflow:hidden}
.mprofile-photo-main{width:100%;height:100%;object-fit:cover;cursor:zoom-in;display:block}
.mprofile-photo-svg{width:62%;max-width:160px}
.mprofile-photo-tag{position:absolute;left:10px;bottom:10px;color:#fff;font-weight:800;font-size:13px;padding:4px 11px;border-radius:20px;box-shadow:0 4px 12px -4px rgba(0,0,0,.6)}
.mprofile-photo-online{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:6px;background:rgba(0,0,0,.5);color:#fff;font-size:11px;font-weight:700;padding:4px 9px;border-radius:20px}
.mprofile-photo-lock{position:absolute;top:10px;right:10px;display:inline-flex;align-items:center;gap:5px;background:rgba(20,16,26,.72);color:#fff;font-size:11px;font-weight:700;padding:4px 9px;border-radius:20px;backdrop-filter:blur(2px)}
.mprofile-thumbs{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;padding:5px}
.mprofile-thumb{width:100%;aspect-ratio:1;object-fit:cover;border-radius:7px;cursor:zoom-in;transition:opacity .15s,transform .15s}
.mprofile-thumb:hover{opacity:.85;transform:scale(1.03)}
.mprofile-stats2{display:flex;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden;margin-top:12px}
.mprofile-stats2>div{flex:1;text-align:center;padding:12px 6px;border-right:1px solid var(--line)}
.mprofile-stats2>div:last-child{border-right:0}
.mprofile-stats2 b{display:block;font-size:22px;font-family:var(--serif)}
.mprofile-stats2 span{font-size:11px;color:var(--mut)}
.mprofile-loc{background:var(--panel);border:1px solid var(--line);padding:12px;font-size:14px;border-radius:12px;margin-top:10px;display:flex;align-items:center;gap:7px}
.mprofile-contactbtn{margin-top:12px;justify-content:center;font-weight:700}
.mprofile-secondary{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.mprofile-tabs{display:flex;gap:4px;border-bottom:2px solid var(--line);margin-bottom:14px}
.mprofile-tabs a{padding:10px 18px;font-weight:700;color:var(--mut);border-bottom:2px solid transparent;margin-bottom:-2px}
.mprofile-tabs a.on{color:var(--meet-red);border-bottom-color:var(--meet-red)}
.mprofile-sec{color:var(--meet-pink);margin:16px 0 8px;font-size:16px}
.mpills{display:flex;flex-wrap:wrap;gap:8px}
.mpill{border-radius:8px;padding:5px 12px;font-size:13px;font-weight:700}
.mpill.red{background:var(--meet-red);color:#fff}.mpill.dark{background:#1b1b22;color:#fff}
html[data-theme="light"] .mpill.dark{background:#26262e}
.mprofile-desc{white-space:normal;line-height:1.6}
.mprofile-table{border:1px solid var(--line);border-radius:10px;overflow:hidden}
.mprofile-couple{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.mprofile-person-h{font-weight:800;font-size:13px;margin-bottom:6px;color:var(--accent)}
@media(max-width:600px){.mprofile-couple{grid-template-columns:1fr}}
.mprofile-tr{display:flex;justify-content:space-between;padding:9px 14px}
.mprofile-tr:nth-child(odd){background:var(--field)}
.mprofile-tr span{color:var(--mut)}
.mprofile-about{display:flex;flex-wrap:wrap;gap:22px}
.mtesti{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin-bottom:10px}
.mtesti-h{margin-bottom:6px}
@media(max-width:980px){.meet-dash{grid-template-columns:1fr}.meet-col-l,.meet-col-r{order:2}.meet-search{grid-template-columns:1fr}.mprofile-grid{grid-template-columns:1fr}.meet-filters-panel{position:static}.meet-contacts{grid-template-columns:1fr}}
/* Contacts */
.meet-contacts{display:grid;grid-template-columns:250px 1fr;gap:18px;align-items:start}
.meet-listform{display:flex;gap:6px;margin:10px 0}
.meet-listform input{flex:1;min-width:0;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--field);color:var(--txt)}
.meet-lists{list-style:none;padding:0;margin:0}
.meet-lists li{display:flex;align-items:center;gap:8px;padding:8px 4px;border-top:1px solid var(--line)}
.meet-lists li span{flex:1}.meet-lists li b{color:var(--meet-pink)}
.meet-contact-foot{display:flex;gap:6px;align-items:center;margin-top:6px}
.meet-assign{flex:1;min-width:0;font-size:12px;padding:4px 6px;border:1px solid var(--line);border-radius:7px;background:var(--field);color:var(--txt)}
.btn.ok{background:#12b886;color:#fff;border:0}.btn.ok:hover{background:#0ea875}
.cell-mail{display:block;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}
.table-users .num{width:92px;white-space:nowrap}
.table-users td.right{white-space:nowrap}
/* Le <select> de rÃ´le n'hÃ©ritait d'aucun style : il s'affichait avec le chrome clair
   du navigateur, en plein tableau sombre. */
.mini-select{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);
  font-family:var(--sans);font-size:13px;font-weight:600;padding:5px 8px;cursor:pointer;transition:.13s}
.mini-select:hover{border-color:var(--line2)}
.mini-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.table-users .geo{font-size:12px;color:var(--mut);margin-left:6px}
.table-users .geo-flag{font-size:14px}
.table-users .btn.sm{padding:5px 10px;font-size:12px}
.table-users td.right form+form{margin-left:6px}

/* Tableau membres : TOUT voir, JAMAIS de dÃ©filement horizontal.
   table-layout:fixed force les colonnes Ã  se partager la largeur du cadre : aucune colonne
   ne peut Ã©largir le tableau au-delÃ  de 100 %. Les textes trop longs sont tronquÃ©s (â€¦),
   et la colonne Actions passe Ã  la ligne au lieu de pousser le tableau. */
.table-scroll .table.table-users{min-width:0;width:100%;table-layout:fixed}
.table-users{font-size:13px}
.table-users th,.table-users td{padding:9px 8px;overflow:hidden;text-overflow:ellipsis}
/* Largeurs par colonne (somme = 100 %) â€” priment sur les min-width prÃ©cÃ©dents (nth-child). */
.table-users th:nth-child(1),.table-users td:nth-child(1){width:19%;min-width:0}
.table-users th:nth-child(2),.table-users td:nth-child(2){width:16%}
.table-users th:nth-child(3),.table-users td:nth-child(3){width:11%}
.table-users th:nth-child(4),.table-users td:nth-child(4){width:7%}
.table-users th:nth-child(5),.table-users td:nth-child(5){width:8%}
.table-users th:nth-child(6),.table-users td:nth-child(6){width:13%}
.table-users th:nth-child(7),.table-users td:nth-child(7){width:9%}
.table-users th:nth-child(8),.table-users td:nth-child(8){width:17%}
/* IdentitÃ© : avatar fixe + pseudo tronquÃ© dans sa cellule. */
.u-cell{min-width:0}
.u-cell .u-name{overflow:hidden;text-overflow:ellipsis;min-width:0}
.cell-mail{max-width:100%}
/* Actions : boutons compacts qui s'empilent dans leur colonne (jamais de scroll horizontal). */
.table-users td.right{white-space:normal;text-align:right}
.table-users td.right form{display:inline-block}
.table-users td.right>*{margin:2px 0 2px 4px}
.table-users .btn.sm{padding:4px 7px;font-size:11.5px}

/* Modal de confirmation (back-office) â€” remplace le confirm() natif par un popup on-brand. */
.confirm-backdrop{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.55);backdrop-filter:blur(2px);padding:20px;animation:confirm-fade .12s ease-out}
.confirm-backdrop[hidden]{display:none}
.confirm-box{background:var(--panel);border:1px solid var(--line);border-radius:14px;max-width:460px;width:100%;
  padding:22px 22px 18px;box-shadow:0 24px 64px rgba(0,0,0,.5)}
.confirm-box h3{margin:0 0 10px;font-size:18px;color:var(--txt)}
.confirm-box p{margin:0 0 20px;color:var(--mut);line-height:1.55;font-size:14px}
.confirm-actions{display:flex;justify-content:flex-end;gap:10px}
@keyframes confirm-fade{from{opacity:0}to{opacity:1}}

/* Rattacher des mÃ©dias dÃ©jÃ  prÃ©sents Ã  un album (page de gestion + album ouvert aux contributions). */
.album-add-existing{margin:14px 0}
.ae-panel{margin-top:10px}
.ae-toolbar{display:flex;align-items:center;gap:10px;margin:6px 0 12px;flex-wrap:wrap}
.ae-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px;max-height:440px;overflow:auto;padding:4px;margin-bottom:14px}
.ae-item{position:relative;cursor:pointer;border:2px solid transparent;border-radius:10px;overflow:hidden;background:var(--field)}
.ae-item input{position:absolute;top:6px;left:6px;z-index:2;width:18px;height:18px;cursor:pointer}
.ae-thumb{position:relative;display:block;aspect-ratio:1/1;background:#111}
.ae-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.ae-vid{position:absolute;right:6px;bottom:6px;background:rgba(0,0,0,.62);color:#fff;border-radius:6px;padding:1px 7px;font-size:12px}
.ae-t{display:block;padding:5px 7px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ae-item:has(input:checked){border-color:var(--accent)}
.table-users tr.is-deleted{opacity:.6}
.table-users tr.is-deleted .u-name{text-decoration:line-through}

.admin-topbar{margin:0 0 20px}
.admin-search{position:relative;max-width:580px;display:flex;align-items:center;gap:2px;
  background:var(--field);border:1px solid var(--line);border-radius:999px;padding:4px 16px;
  transition:border-color .18s,box-shadow .18s,background .18s}
.admin-search:hover{border-color:var(--line2)}
.admin-search:focus-within{border-color:var(--accent);background:var(--panel);
  box-shadow:0 0 0 4px rgba(225,29,42,.13),0 10px 30px -14px rgba(0,0,0,.7)}
.admin-search .search-ic{width:18px;height:18px;flex:none;color:var(--mut);transition:color .18s}
.admin-search:focus-within .search-ic{color:var(--accent)}
.admin-search input{flex:1;min-width:0;background:none;border:0;outline:none;color:var(--txt);
  font-family:inherit;font-size:14px;padding:10px 12px}
.admin-search input::placeholder{color:var(--mut2,#6b6b7a)}
.admin-search input::-webkit-search-cancel-button{filter:invert(.55)}

/* ---------- Barre de menu (sous le bandeau) + mÃ©ga-menus ---------- */
.menubar{position:relative;z-index:1;background:var(--panel2);border-bottom:1px solid var(--line)}
.menubar-inner{display:flex;align-items:stretch;gap:2px}
.mitem{position:relative}
.mlink{position:relative;display:inline-flex;align-items:center;gap:6px;height:46px;padding:0 16px;color:var(--txt);font-weight:600;font-size:13.5px;text-transform:uppercase;letter-spacing:.04em}
.mlink:hover{color:var(--accent)}
.mlink.active{color:var(--accent)}
.mlink.active::after{content:"";position:absolute;left:12px;right:12px;bottom:0;height:4px;background:var(--accent)}
.mcaret{font-size:10px;color:var(--mut)}
.mega{position:absolute;top:100%;left:0;min-width:330px;background:var(--panel);border:1px solid var(--line);
  border-top:2px solid var(--accent);border-radius:0 0 6px 6px;box-shadow:0 26px 52px -18px rgba(0,0,0,.6);
  padding:16px;display:none;gap:22px;z-index:50}
.mitem:hover .mega,.mitem:focus-within .mega{display:flex}
/* Menu Â« Rencontre Â» : poussÃ© Ã  droite, en bouton rouge texte blanc */
.mitem-cta{margin-left:auto;display:flex;align-items:center}
/* Lien « ← Médias » dans le module Rencontres : séparé visuellement de la nav du module. */
.mitem-back{margin-right:6px;padding-right:6px;border-right:1px solid var(--line);display:flex;align-items:center}
.mitem-back .mlink{color:var(--accent);font-weight:700}
.mlink-cta{height:34px;padding:0 18px;border-radius:6px;background:linear-gradient(120deg,var(--accent),#b3141f);
  color:#fff!important;transition:.15s}
.mlink-cta:hover{color:#fff!important;filter:brightness(1.08);transform:translateY(-1px)}
.mlink-cta.active::after{display:none}
@media(max-width:1024px){.menubar.open .mitem-cta{margin-left:0}.menubar.open .mlink-cta{height:auto;border-radius:0;background:none;color:var(--accent)!important;box-shadow:none}}
/* Colonne assez large pour que les libellés tiennent sur UNE ligne : « ASMR / Audio porno » ou
   « Baise en Public / Exhibition » se repliaient sur deux ou trois lignes, ce qui déformait la
   liste. Hauteur plafonnée : au-delà, la liste dépassait le bas de l'écran et la fin devenait
   inatteignable. */
.mcol{min-width:250px;max-width:290px;display:flex;flex-direction:column;gap:2px;
  max-height:min(62vh,520px);overflow-y:auto;overscroll-behavior:contain;padding-right:4px}
.mcol.wide{min-width:320px;max-width:380px}
/* Barre de défilement discrète : la colonne défile, elle ne doit pas s'annoncer. */
.mcol::-webkit-scrollbar{width:6px}
.mcol::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
.mcol::-webkit-scrollbar-track{background:transparent}
.mcol-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--mut);margin-bottom:6px}
/* nowrap : un libellé trop long est coupé par des points de suspension plutôt que replié sur
   plusieurs lignes. Le compteur reste visible, il ne se laisse pas comprimer. */
.mcol a{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:5px;color:var(--txt);font-size:14px;font-weight:500;text-transform:none;letter-spacing:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mcol a>span:not(.mn){overflow:hidden;text-overflow:ellipsis}
.mcol a:hover{background:rgba(225,29,42,.11);color:var(--accent)}
.mn{margin-left:auto;flex:none;font-size:11px;font-weight:700;color:var(--mut);background:var(--bg2);border:1px solid var(--line);border-radius:6px;padding:1px 8px}
.mav{width:26px;height:26px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:11px;color:#fff;background:linear-gradient(135deg,var(--accent),#6d0f1a)}
.mtags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.mtag{background:var(--field);border:1px solid var(--line);border-radius:6px;padding:5px 11px;font-size:13px;font-weight:600;color:var(--txt)}
.mtag:hover{border-color:var(--accent);color:var(--accent)}
.mall{font-size:13px;font-weight:700;color:var(--accent);display:inline-block;margin-top:8px}
/* Miniatures dans les sous-menus (derniers albums / derniÃ¨res vidÃ©os) */
.m-thumbs{display:flex;flex-direction:column;gap:6px}
.m-thumb{display:flex;align-items:center;gap:12px;padding:6px;border-radius:7px;color:var(--txt);text-transform:none;letter-spacing:0}
.m-thumb:hover{background:var(--hover)}
.m-thumb img,.m-thumb-ph{width:112px;height:64px;border-radius:6px;object-fit:cover;flex:none;background:var(--field);
  display:flex;align-items:center;justify-content:center;font-size:24px}
.m-thumb-t{font-size:13.5px;font-weight:600;line-height:1.3;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}

/* ---------- Flashes ---------- */
.flashes{margin-top:16px}
.flash{padding:11px 16px;border-radius:6px;margin-bottom:10px;font-size:14px;font-weight:500}
.flash.success{background:rgba(34,197,94,.12);border:1px solid rgba(34,197,94,.35);color:#86efac}
.flash.error{background:rgba(225,29,42,.12);border:1px solid rgba(225,29,42,.4);color:#ffb3b8}
html[data-theme="light"] .flash{color:var(--txt)}
html[data-theme="light"] .flash.success{background:#e7f6ec;border-color:#9ad6b0;color:#15803d}
html[data-theme="light"] .flash.error{background:#fdecec;border-color:#f0b4b4;color:#b3261e}

.main{padding:16px 24px 60px;min-height:60vh} /* peu d'air au-dessus du titre : le fil d'Ariane fait dÃ©jÃ  la respiration */

/* ---------- Hero ---------- */
.hero{padding:56px 0 44px;border-bottom:1px solid var(--line);margin-bottom:36px;position:relative}
/* Hero sans titre ni sous-titre (uniquement les boutons) : on resserre l'espace menu â†” boutons */
.hero-bare{padding:22px 0 26px;margin-bottom:24px}
.hero h1{font-family:var(--serif);font-weight:600;font-size:52px;line-height:1.04;letter-spacing:-1px;margin:0 0 16px;max-width:820px}
.hero h1 strong{color:var(--accent2);font-weight:600}
.hero p{color:var(--mut);font-size:19px;max-width:600px;margin:0 0 24px}
.hero-cta{display:flex;gap:12px;flex-wrap:wrap}

/* ---------- Hero enrichi (accueil) : mosaÃ¯que + accroche Ã  gauche, chiffres Ã  droite ---------- */
.hero-rich{position:relative;overflow:hidden;border:1px solid var(--line);border-radius:20px;
  padding:44px 48px;margin-bottom:38px;isolation:isolate;max-height:410px;
  background:radial-gradient(130% 150% at 14% -10%, #34101a 0%, #180a12 46%, #0b0710 100%)}
.hero-rich .hero-bg{position:absolute;inset:0;z-index:0;display:grid;overflow:hidden;
  grid-template-columns:repeat(auto-fill,minmax(115px,1fr));grid-auto-rows:118px;gap:3px;opacity:.5;
  filter:saturate(1.2) contrast(1.03);transform:scale(1.04)}
.hero-rich .hero-tile{background-size:cover;background-position:center}
.hero-rich .hero-bg::after{content:"";position:absolute;inset:0;
  background:radial-gradient(ellipse 82% 100% at 50% 48%, rgba(9,5,13,.74) 0%, rgba(9,5,13,.54) 56%, rgba(9,5,13,.28) 100%)}
/* Panneau sombre en diagonale cÃ´tÃ© accroche (inspiration : voile plus dense Ã  gauche) */
.hero-rich::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:linear-gradient(105deg, rgba(8,4,10,.86) 0%, rgba(8,4,10,.68) 36%, rgba(8,4,10,.28) 58%, rgba(8,4,10,.10) 100%)}
.hero-glow{position:absolute;z-index:0;top:-40%;left:-12%;width:58%;height:120%;
  background:radial-gradient(circle at center, rgba(225,29,42,.35), transparent 62%);filter:blur(30px);pointer-events:none}
.hero-inner{position:relative;z-index:1;width:100%;max-width:1080px;margin:0 auto;color:#fff;
  display:grid;grid-template-columns:1.35fr .9fr;gap:30px 56px;align-items:center}
.hero-lead{display:flex;flex-direction:column;align-items:center;text-align:center;min-width:0}
.hero-rich h1{font-family:var(--serif);font-weight:600;font-size:50px;line-height:1.04;letter-spacing:-1px;
  margin:20px 0 16px;color:#fff;text-shadow:0 2px 26px rgba(0,0,0,.55)}
.hero-rich h1 strong{color:#ff5a6a}
.hero-rich p{color:#fbe9ec;font-size:18.5px;max-width:560px;margin:0 0 24px;line-height:1.6;
  font-weight:500;text-shadow:0 1px 14px rgba(0,0,0,.6)}
/* Les badges (contenu non cliquable) regroupÃ©s dans un bloc Â« glass Â» cohÃ©rent et attractif */
.hero-badges{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px;max-width:100%;
  padding:9px 12px;border-radius:16px;margin-bottom:8px;
  background:linear-gradient(120deg, rgba(225,29,42,.18), rgba(255,255,255,.05) 60%, rgba(255,255,255,.02));
  border:1px solid rgba(255,255,255,.16);
  box-shadow:0 10px 34px -14px rgba(0,0,0,.7), inset 0 1px 0 rgba(255,255,255,.10);
  backdrop-filter:blur(9px)}
.hero-badge{font-size:12px;font-weight:700;color:#fff;background:rgba(255,255,255,.12);
  border:1px solid rgba(255,255,255,.20);border-radius:999px;padding:6px 13px;white-space:nowrap}
.hero-badge-hot{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent;
  box-shadow:0 4px 14px -4px rgba(225,29,42,.6)}
.hero-rule{display:block;width:64px;height:3px;border-radius:3px;margin:2px 0 24px;
  background:linear-gradient(90deg,var(--accent),transparent)}
/* Boutons Â« Voir les vidÃ©os Â» / Â« Parcourir les photos Â» : centrÃ©s dans le bloc gauche et rouges.
   SÃ©lecteur volontairement spÃ©cifique pour l'emporter sur le thÃ¨me clair (html[data-theme=light] .btn). */
.hero-rich .hero-cta{justify-content:center;gap:14px;margin:0;width:100%}
.hero-rich .hero-cta .btn{padding:12px 24px}
.hero-rich .hero-cta .btn.primary{background:linear-gradient(120deg,var(--accent),#b3141f);color:#fff;border-color:transparent}
.hero-rich .hero-cta .btn.primary:hover{filter:brightness(1.08)}
.hero-btn-main{box-shadow:0 10px 30px -10px rgba(225,29,42,.7)}
.hero-btn-cta{box-shadow:0 8px 26px -12px rgba(225,29,42,.75)}
/* Colonne droite : chiffres prÃ©sentÃ©s en lignes reliÃ©es par une puce (faÃ§on liste du visuel) */
.hero-feats{min-width:0;border-left:1px solid rgba(255,255,255,.12);padding-left:34px}
.hero-eyebrow{display:flex;align-items:center;gap:12px;font-size:12px;font-weight:800;
  letter-spacing:.14em;text-transform:uppercase;color:#ff8090;margin-bottom:22px}
.hero-eyebrow-line{width:34px;height:2px;background:var(--accent);flex:none}
.hero-stats{display:flex;flex-direction:column;gap:18px}
.hero-stat{display:grid;grid-template-columns:auto 1fr;column-gap:14px;align-items:center;line-height:1.1}
.hero-stat::before{content:"";grid-row:1/3;grid-column:1;width:10px;height:10px;border-radius:50%;
  background:var(--accent);box-shadow:0 0 0 4px rgba(225,29,42,.20);align-self:center}
.hero-stat b{grid-column:2;font-size:30px;font-weight:800;color:#fff;text-shadow:0 1px 10px rgba(0,0,0,.5)}
.hero-stat span{grid-column:2;font-size:12px;text-transform:uppercase;letter-spacing:.07em;color:rgba(255,235,238,.74);margin-top:4px}
@media(max-width:900px){.hero-inner{grid-template-columns:1fr;gap:26px}
  .hero-feats{border-left:0;border-top:1px solid rgba(255,255,255,.12);padding-left:0;padding-top:26px}
  .hero-stats{flex-direction:row;flex-wrap:wrap;gap:16px 34px}}
@media(max-width:720px){.hero-rich{padding:34px 22px;border-radius:16px}
  .hero-rich h1{font-size:33px;margin:14px 0 12px}.hero-rich p{font-size:16px;margin-bottom:22px}
  .hero-rich .hero-bg{grid-template-columns:repeat(5,1fr)}
  .hero-rich .hero-cta{width:100%}.hero-stat b{font-size:25px}}

/* ---------- Bandeau : carrousel 3 diapos (mÃªme fond partagÃ©) ---------- */
.hero-rich.has-slider{padding-bottom:46px}
/* Toutes les diapos occupent la MÃŠME cellule de grille â†’ le bandeau prend la hauteur de la plus
   grande (la diapo 1) ; les vitrines, plus courtes, sont centrÃ©es verticalement Ã  cette hauteur.
   La colonne explicite minmax(0,1fr) force la pleine largeur (Ã©vite vignettes gÃ©antes / contenu Ã©crasÃ©). */
.hero-slides{position:relative;z-index:1;display:grid;grid-template-columns:minmax(0,1fr)}
.hero-slide{grid-area:1/1;min-width:0;display:flex;flex-direction:column;justify-content:center;
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .4s ease}
.hero-slide.is-active{opacity:1;visibility:visible;pointer-events:auto}
/* Diapos vitrine (vidÃ©os / photos) : titre en exergue puis mosaÃ¯que de vignettes cliquables */
.hero-showcase{width:100%;max-width:1180px;min-width:0;margin:0 auto;padding:0 80px;color:#fff}
.hero-showcase .hero-eyebrow{justify-content:center;margin-bottom:14px}
/* Vignettes plus petites et plus nombreuses : elles remplissent tout le bandeau sur 2 rangÃ©es. */
.hero-sc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:10px;
  grid-auto-rows:88px;max-height:186px;overflow:hidden}
.hero-sc-tile{position:relative;display:block;border-radius:14px;overflow:hidden;
  background-size:cover;background-position:center;background-color:#1a0f14;
  box-shadow:0 12px 30px -14px rgba(0,0,0,.85);border:1px solid rgba(255,255,255,.08);
  transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease}
.hero-sc-tile::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg, rgba(0,0,0,0) 42%, rgba(6,3,8,.55) 100%);opacity:.85;transition:opacity .25s}
.hero-sc-tile:hover{transform:translateY(-4px) scale(1.03);border-color:rgba(225,29,42,.7);
  box-shadow:0 18px 40px -14px rgba(225,29,42,.55)}
.hero-sc-tile:hover::after{opacity:.4}
.hero-sc-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:1;
  width:32px;height:32px;display:flex;align-items:center;justify-content:center;
  border-radius:50%;background:rgba(225,29,42,.9);color:#fff;font-size:12px;padding-left:2px;
  box-shadow:0 6px 18px -4px rgba(0,0,0,.7);opacity:.92;transition:transform .25s, opacity .25s}
.hero-sc-tile:hover .hero-sc-play{transform:translate(-50%,-50%) scale(1.12);opacity:1}
/* Pastilles de navigation : rond plein = diapo courante, rond vide = les autres */
.hero-dots{position:absolute;left:0;right:0;bottom:12px;z-index:2;display:flex;justify-content:center;gap:2px}
/* LA CIBLE FAIT 28 px, LE ROND EN FAIT TOUJOURS 13.
   Mesurées dans le navigateur, ces pastilles faisaient 13 × 13 px de zone cliquable : sous les
   24 px du seuil WCAG 2.2, on rate le bouton au doigt. On agrandit la ZONE sans toucher au
   dessin — le rond reste posé par la bordure d'un pseudo-élément centré, et rien ne change à
   l'œil. Le `gap` compense l'espace que la zone occupe désormais. */
/* `flex:none` est indispensable : sans lui, le conteneur en flex écrase la cible à 16 × 6 px —
   soit pire qu'avant la correction. Une zone tactile qui se laisse comprimer n'en est pas une. */
.hero-dot{position:relative;flex:none;width:28px;height:28px;border:0;padding:0;background:transparent;
  cursor:pointer;border-radius:50%;transition:transform .2s}
.hero-dot::before{content:"";position:absolute;top:50%;left:50%;width:13px;height:13px;
  margin:-6.5px 0 0 -6.5px;border-radius:50%;border:2px solid var(--accent);
  background:transparent;transition:background .2s, box-shadow .2s}
.hero-dot:hover{transform:scale(1.15)}
.hero-dot.is-on::before{background:var(--accent);box-shadow:0 0 0 4px rgba(225,29,42,.22)}
@media(max-width:900px){.hero-showcase{padding:0 40px}}
@media(max-width:720px){.hero-showcase{padding:0}
  .hero-sc-grid{grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:8px;grid-auto-rows:70px;max-height:148px}}

/* ---------- Section head (editorial) ---------- */
.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin:0 0 20px}
.section-head h1,.section-head h2{font-family:var(--serif);font-weight:600;letter-spacing:-.4px;margin:0}
.section-head h1{font-size:32px}.section-head h2{font-size:25px}
/* Galeries /videos /photos : titre plus compact et tenu sur UNE seule ligne (troncature … si trop long). */
.browse-main .section-head h1{font-size:22px;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.browse-main .section-head h1 .muted{font-weight:400}
.section-head a:not(.btn):not(.see-all){color:var(--mut);font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid var(--accent);padding-bottom:2px}
section{margin-bottom:44px}

/* ---------- Chips ---------- */
.chips{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:24px}
.chip{background:var(--panel);border:1px solid var(--line);color:var(--txt);padding:7px 14px;border-radius:6px;font-weight:600;font-size:13px;transition:.15s}
.chip:hover{color:#fff;border-color:transparent;background:linear-gradient(120deg,var(--accent),#b3141f)}
.chip.on{color:#fff;border-color:transparent;background:linear-gradient(120deg,var(--accent),#b3141f)}

/* ---------- Media grid & cards ---------- */
/* Cartes plus compactes : davantage de mÃ©dias par ligne (230 -> 188 px). */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(188px,1fr));gap:14px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden;transition:.15s;display:block}
.card:hover{transform:translateY(-4px);border-color:var(--line2);box-shadow:0 22px 44px -24px rgba(0,0,0,.8)}
.card-thumb{position:relative;aspect-ratio:16/10;background:var(--field);overflow:hidden}
.card-thumb img{width:100%;height:100%;object-fit:cover}
.card-thumb.video::after{content:"\25B6";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:20px;color:#fff;background:rgba(0,0,0,.15);opacity:.92;text-shadow:0 3px 12px rgba(0,0,0,.7)}
.badge{position:absolute;top:9px;left:9px;font-size:11px;font-weight:800;padding:3px 8px;border-radius:4px;
  background:rgba(0,0,0,.62);color:#fff;text-transform:uppercase;letter-spacing:.04em;z-index:2}
.badge.video{background:rgba(225,29,42,.9)}
.badge.status{left:auto;right:9px;top:9px;background:rgba(0,0,0,.72)}
.badge.status.pending{background:rgba(251,191,36,.92);color:#3a2a04}
.badge.status.rejected{background:rgba(225,29,42,.92)}
.card-body{padding:10px 11px}
.card-title{font-weight:700;font-size:13px;line-height:1.3;margin-bottom:5px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  min-height:2.6em} /* rÃ©serve toujours 2 lignes â†’ toutes les cartes ont la mÃªme hauteur */
.card-meta{display:flex;justify-content:space-between;align-items:center;gap:8px;color:var(--mut);font-size:12px}
/* Carte gÃ©rable (album, propriÃ©taire/admin) : corbeille rouge Ã  droite, alignÃ©e sur le nom.
   Â« stretched link Â» : le lien couvre la carte (z-1) ; seule la corbeille passe au-dessus (z-2). */
.card-del-host{position:relative}
.card-stretch{position:absolute;inset:0;z-index:1;border-radius:inherit}
.card-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.card-title-row .card-title{flex:1;min-width:0;margin-bottom:5px}
.card-del-form{margin:0;flex:none;position:relative;z-index:2}
.card-del-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;background:#e11d2a;color:#fff;border-radius:7px;cursor:pointer;line-height:0;box-shadow:0 2px 7px rgba(0,0,0,.28);transition:background .15s,transform .1s}
.card-del-btn:hover{background:#b3121e;transform:translateY(-1px)}
.card-del-btn svg{width:18px;height:18px;stroke:#fff;fill:none}
.card-del-btn .ico{margin:0}
/* Honeypot anti-robot : masquÃ© hors Ã©cran (les robots le remplissent, pas les humains). */
.hp-field{position:absolute!important;left:-9999px!important;top:auto;width:1px;height:1px;overflow:hidden}
.contact-box{max-width:none}
.contact-captcha b{color:var(--accent)}
/* Intro d'une page de listing (ex. Albums) */
.browse-intro{margin:-2px 0 18px;max-width:74ch;font-size:14px;line-height:1.55}
/* Sources (back-office /admin/links) : deux colonnes VidÃ©os / Photos */
.src-panel .src-cols{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:14px}
@media(max-width:760px){.src-panel .src-cols{grid-template-columns:1fr}}
.src-col-h{font-weight:800;font-size:15px;margin-bottom:10px;display:flex;align-items:center;gap:8px}
.src-n{font-size:12px;font-weight:700;background:var(--field);border:1px solid var(--line);border-radius:20px;padding:1px 9px;color:var(--mut)}
.src-list{list-style:none;margin:0 0 12px;padding:0;display:flex;flex-direction:column;gap:6px}
.src-item{display:flex;align-items:center;gap:8px;background:var(--field);border:1px solid var(--line);border-radius:7px;padding:6px 10px}
.src-link{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--accent);font-size:13px;font-weight:600}
.src-del{flex:none;width:24px;height:24px;border:none;background:none;color:var(--mut2);font-size:18px;line-height:1;cursor:pointer;border-radius:50%;transition:.13s}
.src-del:hover{background:var(--accent);color:#fff}
.src-empty{padding:6px 2px}
.src-add{display:flex;gap:8px}
.src-add input{flex:1;background:var(--field);border:1px solid var(--line);border-radius:7px;color:var(--txt);padding:8px 11px;font-family:inherit}
.src-add input:focus{border-color:var(--accent);outline:none}
.card-creator{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.card-stats{display:inline-flex;gap:9px;flex:none;font-weight:600}
.card-stats span{display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
.card-stats .star{color:var(--star)}

/* Protection mÃ©dias (dissuasif : pas de glisser-enregistrer, pas de sÃ©lection, pas de menu long-press) */
.stage,.card-thumb img,.al-thumb img,.album-thumb img,.lb-stage img,.lb-sg img,.modthumb img,.admin-thumb,
.media-preview img,.channel-cover img,.prev img,.cat-card-photo,.mav,.avatar,
/* MODULE RENCONTRES — il manquait entièrement à cette liste.
   Les photos des fiches et des annonces sont pourtant celles qui appartiennent le plus
   directement à quelqu'un : elles se glissaient sur le bureau et s'enregistraient d'un
   appui long, alors que les vignettes de la médiathèque étaient protégées depuis longtemps. */
.mcard-ph img,.mprofile-photo img,.mprofile-photo-main,.mprofile-thumb,
.meet-adcard-img img,.meet-lb img,.meet-ph img,.meet-gal img{
  -webkit-user-drag:none;-khtml-user-drag:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}

/* ---------- Notation 5 Ã©toiles ---------- */
.rating{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}
.stars-static{position:relative;display:inline-block;font-size:17px;line-height:1;letter-spacing:1px}
.stars-bg{color:#4a4a58}
.stars-fill{position:absolute;top:0;left:0;color:var(--star);overflow:hidden;white-space:nowrap}
.rate-num{font-weight:700;font-size:14px}
.rate-form{display:inline-flex;align-items:center;gap:8px}
.rate-input{display:inline-flex;flex-direction:row-reverse}
.rate-star{background:none;border:0;cursor:pointer;font-size:21px;line-height:1;color:#4a4a58;padding:0 1px;transition:color .1s}
.rate-star.on{color:var(--star)}
.rate-input:hover .rate-star{color:#4a4a58}
.rate-input .rate-star:hover,.rate-input .rate-star:hover ~ .rate-star{color:var(--accent2)}
html[data-theme="light"] .stars-bg,html[data-theme="light"] .rate-star,html[data-theme="light"] .rate-input:hover .rate-star{color:#cfc9ba}
html[data-theme="light"] .rate-star.on{color:var(--star)}

/* RÃ©actions : pouce haut / bas + cÅ“ur (suivre l'auteur) */
.reactbar{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}
.reactbar .react{display:inline-flex;align-items:center;gap:6px;background:var(--field);border:1px solid var(--line);
  border-radius:99px;padding:6px 13px;font-size:14px;font-weight:700;color:var(--txt);cursor:pointer;transition:.13s;line-height:1}
.reactbar .react:hover{border-color:var(--accent2);background:var(--hover)}
.reactbar .react .react-ic{font-size:16px;filter:grayscale(.15)}
.reactbar .react:disabled{opacity:.55;cursor:default}
.reactbar .react.up.on{border-color:#3ea66d;background:rgba(62,166,109,.16);color:#7ee0a6}
.reactbar .react.down.on{border-color:#c9502f;background:rgba(201,80,47,.16);color:#f0a58e}
.reactbar .react.heart.on{border-color:var(--accent);background:rgba(225,29,42,.12);color:#ff9aa4}
.reactbar .react.heart .heart-ic{filter:none}
.creator-follow{margin-top:12px}
.card-stats.album-stats{display:flex;margin-top:6px;font-size:12px;color:var(--mut)}
html[data-theme="light"] .reactbar .react.up.on{color:#1f7a48}
html[data-theme="light"] .reactbar .react.down.on{color:#a83a1c}
html[data-theme="light"] .reactbar .react.heart.on{color:var(--accent)}

/* ---------- Journal d'activitÃ© (admin) ---------- */
.day-chips{display:flex;flex-wrap:wrap;gap:8px}
.day-chip{display:inline-flex;flex-direction:column;align-items:center;gap:2px;background:var(--field);border:1px solid var(--line);border-radius:6px;padding:6px 10px;min-width:52px}
.day-chip:hover{border-color:var(--accent)}
.day-chip-d{font-size:12px;color:var(--mut)}
.day-chip-n{font-weight:800;font-size:15px}
/* Purge d'une journÃ©e : la croix n'apparaÃ®t qu'au survol, pour Ã©viter les clics accidentels. */
.day-chip-wrap{position:relative;display:inline-flex}
.day-chip-del{margin:0;position:absolute;top:-6px;right:-6px;opacity:0;transition:opacity .15s}
.day-chip-wrap:hover .day-chip-del,.day-chip-del:focus-within{opacity:1}
.day-chip-del button{width:20px;height:20px;border-radius:99px;border:1px solid var(--accent);
  background:var(--accent);color:#fff;font-size:11px;line-height:1;cursor:pointer;padding:0;
  display:flex;align-items:center;justify-content:center}
.day-chip-del button:hover{background:#b91726;border-color:#b91726}
.day-head{font-family:var(--serif);font-size:17px;margin:18px 0 8px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.day-head:first-child{margin-top:0}
.act-row{display:grid;grid-template-columns:52px 26px 170px 1fr;gap:10px;align-items:center;padding:7px 4px;border-bottom:1px solid var(--line)}
.act-row:last-child{border-bottom:0}
.act-time{color:var(--mut);font-size:13px;font-variant-numeric:tabular-nums}
.act-ic{text-align:center;font-size:15px}
.act-who{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.act-what{font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.act-filter{margin-left:6px;color:var(--mut);text-decoration:none;font-size:12px;opacity:.65}
.act-filter:hover{opacity:1;color:var(--accent)}
.act-ip{margin-left:8px;font-size:12px;color:var(--mut);font-variant-numeric:tabular-nums}
@media(max-width:700px){.act-row{grid-template-columns:44px 22px 1fr}.act-who{grid-column:3}.act-what{grid-column:1/-1}}

/* ---------- Creators ---------- */
.creators-row{display:flex;gap:12px;flex-wrap:wrap}
.creator-pill{display:inline-flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--line);
  border-radius:6px;padding:7px 15px 7px 7px;font-weight:600}
.creator-pill.sm{padding:5px 12px 5px 5px}
.creator-pill small{display:block;color:var(--mut);font-weight:400;font-size:12px}
.avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--accent),#6d0f1a);
  display:inline-flex;align-items:center;justify-content:center;font-weight:800;color:#fff;flex:none}
.avatar.sm{width:28px;height:28px;font-size:12px}
.avatar.lg{width:60px;height:60px;font-size:24px;border-radius:8px}
.avatar.xl{width:84px;height:84px;font-size:34px;border-radius:10px}
/* Avatar renseignÃ© : l'image remplit la pastille (sinon on garde l'initiale). */
.avatar.has-img{padding:0;overflow:hidden;background:var(--field)}
/* Membre sans photo mais de genre connu : silhouette (homme/femme/couple) au lieu de l'initiale. */
.avatar.has-sil{padding:0;overflow:hidden;background:var(--meet-ph)}
.avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}
.avatar .meet-avatar{width:100%;height:100%;display:block;border-radius:inherit}
/* Ã‰dition de la photo de profil. */
.avatar-edit{display:flex;align-items:center;gap:16px;margin:4px 0 8px;flex-wrap:wrap}
.avatar-edit-ctrl{display:flex;flex-direction:column;gap:6px}
/* Recherche de membres (page /creators) avec autocomplÃ©tion. */
.creators-search{position:relative;max-width:520px;margin:0 0 20px;display:flex;align-items:center}
.creators-search input{width:100%;padding:11px 38px 11px 40px;border:1px solid var(--line);border-radius:10px;background:var(--field);color:var(--fg);font-size:15px}
.creators-search-ic{position:absolute;left:12px;width:18px;height:18px;color:var(--mut);pointer-events:none}
.creators-search-clear{position:absolute;right:12px;color:var(--mut);text-decoration:none;font-weight:700}
.creators-search .ac-av{width:34px;height:34px;border-radius:8px;overflow:hidden;flex:none;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--accent),#6d0f1a);color:#fff;font-weight:800}
.creators-search .ac-av img{width:100%;height:100%;object-fit:cover}
.creators-search .ac-txt{display:flex;flex-direction:column;line-height:1.25}
.creators-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:16px}
/* SUR TÉLÉPHONE, DEUX COLONNES — comme les fiches Rencontres, qui en donnent deux depuis
   toujours. Mesuré : à 390 px, cette grille n'en donnait qu'UNE, et l'on parcourait cinquante
   membres en cinquante écrans. Une carte de membre est surtout du texte : rien ne justifiait
   qu'elle occupe toute la largeur alors qu'une vignette de profil s'en contente de la moitié. */
@media(max-width:520px){
  .creators-grid{grid-template-columns:repeat(2,1fr);gap:10px}
  .creator-card{padding:14px 10px 12px}
  .creator-name{font-size:15px}
  .creator-stats{gap:1px;padding-top:9px}
  .creator-stats b{font-size:13px}
  .creator-stats i{font-size:10px;letter-spacing:0}
}
/* Colonne : les chiffres sont poussés en bas de carte (margin-top:auto sur .creator-stats),
   ce qui les aligne d'une carte à l'autre que la bio soit là ou non. */
.creator-card{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);
  border-radius:8px;padding:20px 16px 16px;text-align:center;transition:.15s}
.creator-card:hover{transform:translateY(-4px);border-color:var(--accent)}
.creator-card .avatar{margin:0 auto 12px}
/* Un pseudo long ne doit ni casser la carte ni la faire grandir : une ligne, point. */
.creator-name{font-family:var(--serif);font-weight:600;font-size:18px;margin-bottom:6px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Bio bornée à deux lignes : au-delà, les cartes se décalent et la grille perd son peigne. */
.creator-bio{color:var(--mut);font-size:13px;line-height:1.45;margin:0 0 12px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* LES CHIFFRES EN TROIS CASES, et non en une phrase : c'est ce qui permet de comparer deux
   membres d'un coup d'œil, la valeur au-dessus et ce qu'elle compte au-dessous. */
.creator-stats{margin-top:auto;padding-top:12px;border-top:1px solid var(--line);
  display:grid;grid-template-columns:repeat(3,1fr);gap:2px}
.creator-stats span{display:flex;flex-direction:column;min-width:0;line-height:1.15}
.creator-stats b{font-size:15px;font-weight:700;color:var(--txt);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.creator-stats i{font-style:normal;font-size:11px;color:var(--mut);margin-top:3px;
  letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Neuf membres sur dix n'ont rien publié : trois zéros n'apprenaient rien et criaient plus
   fort que les chiffres des autres. Une ligne discrète suffit à le dire. */
.creator-stats.empty{display:block;font-size:12px;color:var(--mut);font-style:italic}
.creator-head{display:flex;gap:22px;align-items:center;margin-bottom:28px;padding-bottom:24px;border-bottom:1px solid var(--line)}
.creator-head h1{font-family:var(--serif);font-weight:600;margin:0 0 6px;font-size:34px}

/* Bandeau de chaÃ®ne (page /channel) â€” fond sombre dans les 2 thÃ¨mes, texte clair d'office */
.channel-banner{position:relative;border-radius:12px;overflow:hidden;margin:0 0 30px;color:#fff;
  background:radial-gradient(120% 140% at 0% 0%,rgba(225,29,42,.35),transparent 55%),linear-gradient(120deg,#1b1b26,#0e0e15);
  border:1px solid var(--line)}
.channel-banner-inner{display:flex;align-items:center;gap:24px;padding:30px 30px 24px}
.channel-avatar{width:96px;height:96px;font-size:40px;border-radius:14px;border:3px solid rgba(255,255,255,.9);
  box-shadow:0 16px 40px -16px rgba(0,0,0,.7)}
.channel-id{min-width:0;flex:1}
.channel-kicker{text-transform:uppercase;letter-spacing:.14em;font-size:12px;font-weight:800;color:#ff9aa3;margin-bottom:6px}
.channel-id h1{font-family:var(--serif);font-weight:600;font-size:36px;letter-spacing:-.5px;margin:0 0 4px;color:#fff}
.channel-since{color:rgba(255,255,255,.7)!important;font-size:13px}
.channel-bio{color:rgba(255,255,255,.85);margin:10px 0 0;max-width:640px;font-size:14px;line-height:1.5}
.channel-actions{flex:none;margin-left:auto;align-self:flex-start;display:flex;flex-direction:column;gap:9px;align-items:stretch}
/* Sur le bandeau colorÃ©, les boutons reprennent le traitement translucide du cÅ“ur
   plutÃ´t que le fond sombre des barres d'outils, sinon ils font tache. */
.channel-actions .tbtn{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.25);color:#fff;justify-content:center}
.channel-actions .tbtn:hover{background:rgba(255,255,255,.2);border-color:rgba(255,255,255,.45);color:#fff}
.channel-actions .tbtn-primary{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent}
.channel-actions .tbtn-primary:hover{background:linear-gradient(120deg,var(--accent),#b3141f);filter:brightness(1.08)}
.channel-actions .reactbar{justify-content:center}
.tbtn-off{opacity:.55;cursor:default}
.channel-actions .tbtn-off:hover{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.25)}
.channel-actions .react.heart{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.25);color:#fff;padding:9px 18px}
.channel-actions .react.heart.on{background:rgba(225,29,42,.35);border-color:var(--accent);color:#fff}
.channel-stats{display:flex;flex-wrap:wrap;gap:1px;background:rgba(255,255,255,.08);border-top:1px solid rgba(255,255,255,.1)}
.chstat{flex:1 1 0;min-width:90px;display:flex;flex-direction:column;align-items:center;gap:2px;
  padding:14px 10px;background:rgba(10,10,16,.35)}
.chstat-n{font-family:var(--serif);font-weight:700;font-size:24px;line-height:1;color:#fff}
.chstat-l{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:rgba(255,255,255,.65)}
/* Stat Â« Favoris Â» cliquable vers les favoris du membre. */
.chstat-link{color:inherit;cursor:pointer;transition:background .14s}
.chstat-link:hover{background:rgba(225,29,42,.28)}
.chstat-star{color:var(--star);font-size:19px}
@media(max-width:640px){.channel-banner-inner{flex-wrap:wrap;gap:16px}.channel-actions{margin-left:0}.channel-id h1{font-size:28px}.channel-avatar{width:72px;height:72px;font-size:30px}}

/* En-tÃªte de galerie : compteur + sÃ©lecteur Â« par page Â» Ã  droite */
.browse-head-right{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
/* Barre au-dessus du contenu (sous le bandeau) : compteur Ã  gauche, sÃ©lecteur en haut Ã  droite */
.list-head{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;margin:0 0 18px}

/* ===================== CHAÃŽNES (regroupements de contenus) ===================== */
/* Bandeau faÃ§on catÃ©gorie : fond sombre (2 thÃ¨mes) + photo dÃ©bordante en bas Ã  gauche */
.chan-hero{position:relative;border-radius:12px;margin:0 0 42px;padding:34px 34px;color:#fff;min-height:160px;
  background:radial-gradient(120% 150% at 100% 0%,rgba(225,29,42,.28),transparent 55%),linear-gradient(120deg,#1b1b26,#0e0e15);
  background-size:cover;background-position:center;border:1px solid var(--line)}
.chan-hero.has-photo{padding-left:214px}
.chan-photo{position:absolute;left:26px;bottom:-26px;width:164px;height:164px;border-radius:14px;overflow:hidden;
  border:4px solid var(--bg);box-shadow:0 22px 46px -18px rgba(0,0,0,.85);z-index:2;background:#0e0e15}
.chan-photo img{width:100%;height:100%;object-fit:cover}
.chan-hero-inner{position:relative;z-index:1}
.chan-kicker{text-transform:uppercase;letter-spacing:.14em;font-size:12px;font-weight:800;color:#ff9aa3;margin-bottom:6px}
.chan-hero h1{font-family:var(--serif);font-weight:600;font-size:38px;letter-spacing:-.5px;margin:0 0 8px;color:#fff}
.chan-desc{max-width:660px;color:rgba(255,255,255,.85);margin:0 0 10px;line-height:1.5}
.chan-meta{font-size:14px;color:rgba(255,255,255,.75);display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.chan-meta a{color:#fff;font-weight:600}
.chan-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
@media(max-width:640px){.chan-hero.has-photo{padding-left:34px;padding-top:150px}.chan-photo{width:120px;height:120px;left:20px;top:16px;bottom:auto}.chan-hero h1{font-size:28px}}

/* Liste des chaÃ®nes */
.chan-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}
.chan-card{display:block;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden;transition:.15s}
.chan-card:hover{transform:translateY(-4px);border-color:var(--accent);box-shadow:0 22px 44px -24px rgba(0,0,0,.5)}
.chan-card-banner{position:relative;height:112px;background:linear-gradient(120deg,#1b1b26,#0e0e15);background-size:cover;background-position:center}
.chan-card-banner.no-cover::after{content:"\25C6";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:30px;color:rgba(255,255,255,.22)}
.chan-card-photo{position:absolute;left:14px;bottom:-20px;width:56px;height:56px;border-radius:10px;object-fit:cover;border:3px solid var(--panel);box-shadow:0 8px 20px -8px rgba(0,0,0,.7)}
.chan-card-body{padding:26px 16px 16px}
.chan-card-name{font-family:var(--serif);font-weight:600;font-size:18px;margin-bottom:2px}
.chan-card-stats{display:flex;gap:16px;margin-top:12px;font-size:13px;font-weight:700;color:var(--mut)}

/* Gestion Â« Mes chaÃ®nes Â» */
.chan-manage{margin-bottom:16px}
.chan-manage-top{display:flex;gap:20px;align-items:center;margin-bottom:14px}
.chan-manage-banner{position:relative;width:190px;height:84px;flex:none;border-radius:8px;border:1px solid var(--line);
  background:linear-gradient(120deg,#1b1b26,#0e0e15);background-size:cover;background-position:center}
.chan-manage-photo{position:absolute;left:8px;bottom:-12px;width:46px;height:46px;border-radius:8px;object-fit:cover;border:2px solid var(--panel)}
.chan-manage-info h2{margin:0 0 4px;font-size:20px;font-family:var(--serif)}
.chan-manage-actions{display:flex;gap:10px;margin-top:6px}
.chan-manage-btns{display:flex;gap:10px;align-items:center;margin-top:8px;flex-wrap:wrap}
/* Repli quand la chaÃ®ne n'a encore aucun visuel exploitable. */
.chan-manage-banner.no-cover::after{content:"\25C6";position:absolute;inset:0;display:flex;align-items:center;
  justify-content:center;font-size:24px;color:rgba(255,255,255,.22)}

/* ===== Bloc dÃ©pliable (details/summary) stylÃ© en bouton â€” sans JavaScript ===== */
.toggle-block{margin:0 0 18px}
.toggle-block>summary{display:inline-flex;align-items:center;gap:8px;cursor:pointer;list-style:none;user-select:none}
.toggle-block>summary::-webkit-details-marker{display:none}
.toggle-block>summary::marker{content:""}
.toggle-block[open]>summary{margin-bottom:12px}
.chan-manage .toggle-block{margin:0}
.chan-manage .toggle-block>form{margin-top:12px}
/* Le bloc Â« âž• Ajouter mes contenus Â» : dÃ©tachÃ© des rÃ©glages, aÃ©rÃ© et mis en avant. */
.chan-manage .chan-add-existing{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.chan-add-existing>summary.btn{padding:9px 16px;font-size:14px}
.chan-add-existing>summary.btn:hover{border-color:var(--accent);color:var(--accent)}
.chan-add-existing[open]>summary{margin-bottom:14px}
.chan-add-existing .ae-panel{margin-top:0}
.chan-add-existing [data-ae-submit]{margin-top:6px}

/* Select Â« joli Â» rÃ©utilisable (album, chaÃ®neâ€¦) â€” comme les autres selects du site */
.field-select{width:auto;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);
  padding:10px 34px 10px 12px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='7' viewBox='0 0 10 7'><path d='M1 1l4 4 4-4' fill='none' stroke='%238b90a3' stroke-width='1.6'/></svg>");
  background-repeat:no-repeat;background-position:right 12px center}
.field-select:hover{border-color:var(--line2)}
.field-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.album-row .field-select{flex:1;min-width:0}

/* Paywall (catÃ©gorie payante) */
.paywall{max-width:520px;margin:10px auto;text-align:center;background:var(--panel);border:1px solid var(--line2);
  border-radius:12px;padding:34px 30px}
.paywall-ic{font-size:42px;display:block;margin-bottom:8px}
.paywall h2{margin:0 0 10px;font-size:24px}
.paywall p{color:var(--txt);line-height:1.5;margin:0 0 16px}
.paywall form{margin:6px 0}
.paywall .btn{min-width:240px}

/* Champs de la dropzone + sÃ©lecteur de tags : mÃªme apparence que les autres champs */
.dz-form input:not([type=file]):not([type=checkbox]),
.tagpick-box input{width:100%;margin-top:7px;background:var(--field);border:1px solid var(--line);border-radius:6px;
  color:var(--txt);padding:11px 13px;font-family:inherit;font-size:15px;outline:none;font-weight:400}
.tagpick-box input{margin-top:0}
.dz-form input:not([type=file]):not([type=checkbox]):focus,
.tagpick-box input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
/* ChaÃ®nes */
.channels-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:18px}
.channel-card{display:block;background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden;transition:.15s}
.channel-card:hover{transform:translateY(-4px);border-color:var(--accent);box-shadow:0 22px 44px -24px rgba(0,0,0,.6)}
.channel-cover{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:2px;height:150px;background:var(--field)}
.channel-cover .cc{background-size:cover;background-position:center;position:relative}
.channel-cover .cc:first-child{grid-row:1 / span 2}
.channel-cover .cc.v::after{content:"\25B6";position:absolute;top:6px;left:6px;font-size:10px;background:rgba(0,0,0,.6);color:#fff;padding:1px 5px;border-radius:3px}
.channel-cover .cc.empty{background:var(--bg2)}
.channel-body{display:flex;align-items:center;gap:12px;padding:14px}
.channel-info{min-width:0}
.channel-name{font-family:var(--serif);font-weight:600;font-size:17px;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.channel-stats{display:flex;gap:12px;flex-wrap:wrap;font-size:13px;font-weight:600}

/* ---------- Page Tags ---------- */
.tag-search{position:relative;max-width:460px;margin:0 0 18px}
.tag-search input{width:100%;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);
  padding:12px 40px 12px 14px;font-size:15px;outline:none}
.tag-search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.tag-search-ic{position:absolute;right:14px;top:50%;transform:translateY(-50%);color:var(--mut);width:17px;height:17px;pointer-events:none}

/* Recherche de chaÃ®nes avec autocomplÃ©tion (page /channels). */
.chan-search{position:relative;max-width:460px;margin:0 0 18px}
.chan-search input{width:100%;background:var(--field);border:1px solid var(--line);border-radius:8px;color:var(--txt);
  padding:12px 40px 12px 14px;font-size:15px;outline:none;transition:.15s}
.chan-search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.chan-search-ic{position:absolute;right:14px;top:15px;color:var(--mut);width:17px;height:17px;pointer-events:none}
.chan-ac{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:60;max-height:340px;overflow-y:auto;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 20px 44px -18px rgba(0,0,0,.6);padding:5px}
.chan-ac-item{display:flex;flex-direction:column;gap:1px;padding:9px 12px;border-radius:7px;color:var(--txt)}
.chan-ac-item:hover,.chan-ac-item.on{background:rgba(225,29,42,.11)}
.chan-ac-item .cai-name{font-weight:700;font-size:14.5px}
.chan-ac-item .cai-name b{color:var(--accent)}
.chan-ac-item .cai-by{font-size:12.5px;color:var(--mut)}
.chan-ac-item .cai-by b{color:var(--txt);font-weight:700}
.chan-none{margin:0 0 18px}
/* Renommage en ligne + mise en avant d'une ligne ciblÃ©e depuis l'autocomplÃ©tion (admin). */
.ch-rename{display:flex;gap:8px;align-items:center;justify-content:flex-end;margin:0}
.ch-rename input{width:190px;max-width:100%;background:var(--field);border:1px solid var(--line);border-radius:6px;
  color:var(--txt);padding:7px 10px;font-family:inherit;font-size:13.5px}
.ch-rename input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.chan-row.row-flash{animation:rowflash 1.6s ease-out}
@keyframes rowflash{0%,55%{background:rgba(225,29,42,.12)}100%{background:transparent}}
.alpha-bar{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid var(--line)}
.alpha-bar a,.alpha-bar span{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;
  border-radius:5px;font-weight:700;font-size:13px}
.alpha-bar a{color:var(--txt);background:var(--panel);border:1px solid var(--line)}
.alpha-bar a:hover{border-color:var(--accent);color:var(--accent)}
.alpha-bar span.off{color:var(--mut2);opacity:.5}
.tag-group{margin-bottom:26px;scroll-margin-top:88px}
.tag-letter{font-family:var(--serif);font-weight:600;font-size:26px;color:var(--accent);margin:0 0 12px;
  padding-bottom:6px;border-bottom:1px solid var(--line)}
.tag-cols{list-style:none;margin:0;padding:0;columns:6 130px;column-gap:16px}
@media(max-width:1100px){.tag-cols{columns:4 130px}}
@media(max-width:820px){.tag-cols{columns:3 120px}}
@media(max-width:560px){.tag-cols{columns:2 110px}}
.tagx-item{break-inside:avoid;margin-bottom:2px}
.tagx-item a{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 10px;border-radius:5px;
  color:var(--txt);font-size:14px;font-weight:500}
.tagx-item a:hover{background:var(--hover)}
.tagx-item a:hover .tagx-name{color:var(--accent)}
.tagx-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tagx-n{font-size:11px;font-weight:700;color:var(--mut);background:var(--bg2);border:1px solid var(--line);border-radius:6px;padding:1px 8px;flex:none}

/* ---------- Pagination ---------- */
.pagination-bar{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-top:30px;
  border-top:1px solid var(--line);padding-top:16px}
.per-select{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--mut);font-weight:600}
.per-select label{display:inline-flex;align-items:center;gap:8px;margin:0}
/* ===== SÃ©lecteur Â« Afficher N Â» (public + back-office) : contrÃ´le stylÃ© unifiÃ© ===== */
.per-select select,.admin-per select{width:auto;margin:0;color:var(--txt);font-family:inherit;font-weight:700;font-size:13px;
  cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none;
  padding:7px 30px 7px 12px;border:1px solid var(--line);border-radius:8px;background-color:var(--field);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23999' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center;background-size:9px;
  transition:border-color .15s,box-shadow .15s}
.per-select select:hover,.admin-per select:hover{border-color:var(--line2)}
.per-select select:focus,.admin-per select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.per-total{font-weight:500}
/* Pagination numérotée : « ‹ 1 2 3 4 › » — page courante sur fond rouge. */
.pagination{display:flex;align-items:center;gap:6px;margin:0;flex-wrap:wrap}
.pagination .pg-num,.pagination .pg-arrow{display:inline-flex;align-items:center;justify-content:center;min-width:38px;height:38px;padding:0 10px;
  border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--txt);font-weight:700;font-size:14px;line-height:1;transition:border-color .15s,color .15s,background .15s}
.pagination a.pg-num:hover,.pagination a.pg-arrow:hover{border-color:var(--accent);color:var(--accent)}
.pagination .pg-num.on{background:var(--accent);border-color:var(--accent);color:#fff;cursor:default}
.pagination .pg-arrow.disabled{color:var(--mut);opacity:.45;background:transparent;cursor:default}
.pagination .pg-arrow{font-size:16px}
.pagination .pg-gap{color:var(--mut);padding:0 2px;user-select:none}
@media(max-width:520px){.pagination .pg-num,.pagination .pg-arrow{min-width:34px;height:34px;font-size:13px}}

/* ---------- Accueil : 2 colonnes + panneau catÃ©gories ---------- */
.home-grid{display:grid;grid-template-columns:1fr var(--ad-col);gap:28px;align-items:start}
.home-main{min-width:0}
/* Colonne de droite en flux normal : elle dÃ©file avec la page. En Â« sticky Â», son contenu
   (longue liste de catÃ©gories) dÃ©passe la hauteur de l'Ã©cran et son bas devient inatteignable. */
.home-side{display:flex;flex-direction:column;gap:18px}
.cat-panel{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:18px}
.cat-head h2{font-family:var(--serif);font-weight:600;font-size:20px;margin:0 0 12px}
.cat-search{position:relative;margin-bottom:12px}
.cat-search input{width:100%;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);
  padding:10px 34px 10px 12px;font-size:14px;outline:none}
.cat-search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.cat-search-ic{position:absolute;right:11px;top:50%;transform:translateY(-50%);color:var(--mut);width:15px;height:15px;pointer-events:none}
.cat-list{list-style:none;margin:0;padding:0;max-height:420px;overflow:auto}
.cat-item a{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 11px;border-radius:5px;color:var(--txt);font-weight:600;font-size:14px}
/* Survol rouge, identique aux autres boutons du site. Le rgba est volontairement fixe :
   ce rouge Ã  11 % fonctionne sur fond sombre comme sur fond clair, donc un seul jeu de
   rÃ¨gles pour les deux thÃ¨mes â€” pas de variable Ã  redÃ©finir ni d'oubli possible. */
.cat-item a:hover{background:rgba(225,29,42,.11);color:var(--accent)}
.cat-item .cat-count{font-size:12px;font-weight:700;color:var(--mut);background:var(--bg2);border:1px solid var(--line);border-radius:6px;padding:1px 9px;transition:.13s}
.cat-item a:hover .cat-count{color:var(--accent);border-color:rgba(225,29,42,.4);background:transparent}
.cat-empty{padding:10px 11px;font-size:14px}
.side-creators{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}
.side-creator{display:flex;align-items:center;gap:10px;padding:7px 8px;border-radius:6px;font-weight:600;font-size:14px;transition:.13s}
.side-creator:hover{background:rgba(225,29,42,.11);color:var(--accent)}
.side-creator small{display:block;color:var(--mut);font-weight:400;font-size:12px}
.cat-all{display:inline-block;color:var(--mut);font-weight:700;font-size:13px;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid var(--accent);padding-bottom:2px}
@media(max-width:900px){.home-grid{grid-template-columns:1fr}.home-side{position:static;flex-direction:row;flex-wrap:wrap}.cat-panel{flex:1;min-width:260px}}
@media(max-width:600px){.home-side{flex-direction:column}}

/* ---------- Player page ---------- */
.player-page{display:grid;grid-template-columns:1fr var(--ad-col);gap:30px}
.player{min-width:0}
/* Cadre 16/9 STRICTEMENT IDENTIQUE pour toutes les vidÃ©os (mÃªme largeur, mÃªme hauteur).
   Â« contain Â» garantit qu'une vidÃ©o verticale est vue en ENTIER, centrÃ©e, sans dÃ©formation :
   elle est simplement bordÃ©e de noir sur les cÃ´tÃ©s. */
.player .stage{width:100%;aspect-ratio:16/9;background:#000;border:1px solid var(--line);border-radius:8px;overflow:hidden;object-fit:contain}
.player .stage.embed{position:relative;width:100%;aspect-ratio:16/9;height:auto;overflow:hidden}
/* L'iframe Ã©pouse exactement le cadre. Tout en CSS : aucune dÃ©pendance Ã  JavaScript. */
.player .stage.embed iframe{position:absolute;top:0;left:0;width:100%;height:100%;max-width:100%;max-height:100%;
  border:0;display:block;transform:none}
/* Bouton PLEIN ECRAN du lecteur d'embed : overlay au-dessus de l'iframe (reste cliquable meme
   quand une pub du tube remplit le lecteur). En plein ecran, le stage occupe tout l'ecran. */
.player .stage.embed .embed-fs{position:absolute;top:8px;right:8px;z-index:3;width:34px;height:34px;border:0;
  border-radius:6px;background:rgba(0,0,0,.55);color:#fff;font-size:17px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;opacity:.7;transition:opacity .15s,background .15s}
.player .stage.embed .embed-fs:hover{opacity:1;background:rgba(0,0,0,.82)}
.player .stage.embed:fullscreen{aspect-ratio:auto;width:100vw;height:100vh;border:0;border-radius:0}
.player .stage.embed:fullscreen iframe{width:100vw;height:100vh}
/* ===== Fil d'Ariane ===== */
/* Le fil est serti dans un filet dÃ©gradÃ© (mÃªme langage visuel que .hr-sep), ce qui donne
   UNE seule bande lÃ©gÃ¨re au lieu d'empiler trait / fil / trait au-dessus du titre. */
.crumb-band{display:flex;align-items:center;gap:16px;margin:12px 0 14px}
.crumb-band::before,.crumb-band::after{content:"";flex:1;min-width:10px;height:1px}
.crumb-band::before{background:linear-gradient(90deg,transparent,var(--line2))}
.crumb-band::after{background:linear-gradient(90deg,var(--line2),transparent)}
.crumbs{margin:0;font-size:13px;min-width:0;flex:none;max-width:100%}
.crumbs ol{display:flex;align-items:center;gap:2px;margin:0;padding:0;list-style:none;
  flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none}
.crumbs ol::-webkit-scrollbar{display:none}          /* dÃ©filement discret sur mobile */
.crumbs li{display:flex;align-items:center;flex:none;min-width:0}
/* Chevron de sÃ©paration, dessinÃ© en CSS pour rester net Ã  toute taille. */
.crumbs li + li::before{content:"";flex:none;width:6px;height:6px;margin:0 4px;
  border-right:1.5px solid var(--mut2,#5b5b6b);border-bottom:1.5px solid var(--mut2,#5b5b6b);
  transform:rotate(-45deg);opacity:.65}
.crumbs a,.crumbs li.on span{display:inline-flex;align-items:center;gap:6px;
  padding:5px 9px;border-radius:7px;line-height:1.2;white-space:nowrap;
  max-width:34ch;overflow:hidden;text-overflow:ellipsis}
.crumbs a{color:var(--mut);font-weight:600;transition:color .15s,background .15s}
.crumbs a:hover{color:var(--accent);background:rgba(225,29,42,.09)}
.crumbs .crumb-home{font-size:15px;line-height:1;position:relative;top:-1px}
/* Page courante : mise en avant sobre, avec un point d'accent. */
.crumbs li.on span{color:var(--txt);font-weight:800;background:var(--field);border:1px solid var(--line)}
.crumbs li.on span::before{content:"";width:5px;height:5px;border-radius:99px;background:var(--accent);flex:none}
@media(max-width:640px){
  .crumb-band{gap:9px;margin:12px 0 16px}
  .crumbs{font-size:12px}
  .crumbs a,.crumbs li.on span{max-width:18ch;padding:4px 7px}
}

/* ===== Favoris : bouton Ã©toile + lecture enchaÃ®nÃ©e ===== */
.react.fav .fav-ic{font-size:17px;line-height:1}
.react.fav.on{border-color:#f5b301;color:#f5b301}
.react.fav.on .fav-ic{color:#f5b301}
.favplay{position:fixed;inset:0;z-index:210;display:flex;align-items:center;justify-content:center;padding:20px}
.favplay[hidden]{display:none}
.favplay-backdrop{position:absolute;inset:0;background:rgba(4,4,8,.94);backdrop-filter:blur(6px)}
.favplay-shell{position:relative;width:min(1100px,96vw);display:flex;flex-direction:column;gap:12px}
.favplay-x{position:absolute;top:-6px;right:-6px;z-index:2;background:var(--panel);border:1px solid var(--line2);
  color:var(--txt);width:34px;height:34px;border-radius:99px;cursor:pointer;font-size:15px}
.favplay-stage{width:100%;aspect-ratio:16/9;background:#000;border:1px solid var(--line2);border-radius:10px;
  overflow:hidden;display:flex;align-items:center;justify-content:center}
.favplay-stage img{max-width:100%;max-height:100%;object-fit:contain}
.favplay-stage video{width:100%;height:100%;object-fit:contain;background:#000}
.favplay-stage iframe{width:100%;height:100%;border:0;display:block}
/* Barres de progression des diaporamas : remplissage en temps rÃ©el. */
.favplay-prog,.lb-prog{height:3px;background:rgba(255,255,255,.12);border-radius:99px;overflow:hidden}
.favplay-prog[hidden],.lb-prog[hidden]{display:none}
.favplay-prog i,.lb-prog i{display:block;height:100%;width:0;border-radius:99px;
  background:linear-gradient(90deg,var(--accent),#ff5a64)}
/* Bouton DÃ©marrer / Pause : un seul libellÃ© visible selon l'Ã©tat. */
.favplay-toggle .i-pause{display:none}
.favplay.playing .favplay-toggle .i-play{display:none}
.favplay.playing .favplay-toggle .i-pause{display:inline}
.favplay-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.favplay-count{font-weight:800;color:var(--accent);flex:none}
.favplay-title{font-weight:600;flex:1;min-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.favplay-note{font-size:12px;color:var(--mut);flex:none}
@media(max-width:700px){.favplay-title{display:none}}

/* ===== PublicitÃ© en overlay sur le lecteur (au clic sur Â« play Â») ===== */
.stage-wrap{position:relative}
/* Couche qui capte le premier clic, y compris au-dessus d'une iframe.
   z-index au-dessus des commandes du lecteur maison (barre = 5) : sans quoi on pourrait
   lancer la lecture par le bouton Â« play Â» de la barre et sauter le prÃ©-roll. */
.vad-catch{position:absolute;inset:0;z-index:8;border:0;padding:0;cursor:pointer;background:rgba(0,0,0,.18);
  display:flex;align-items:center;justify-content:center;border-radius:8px}
.vad-catch:hover{background:rgba(0,0,0,.3)}
.vad-play{width:74px;height:74px;border-radius:99px;background:rgba(225,29,42,.92);color:#fff;font-size:28px;
  display:flex;align-items:center;justify-content:center;padding-left:5px;box-shadow:0 12px 34px -10px rgba(0,0,0,.8)}
.vad{position:absolute;inset:0;z-index:9;display:flex;align-items:center;justify-content:center;padding:14px;
  background:rgba(6,6,10,.92);border-radius:8px}
.vad[hidden]{display:none}
.vad-box{width:100%;max-width:640px;max-height:100%;display:flex;flex-direction:column;gap:10px}
.vad-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.vad-label{font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--mut)}
.vad-close{background:var(--panel);border:1px solid var(--line2);color:var(--txt);border-radius:8px;
  padding:7px 13px;font-family:inherit;font-size:13px;font-weight:700;cursor:not-allowed;opacity:.65}
.vad.can-close .vad-close{cursor:pointer;opacity:1;border-color:var(--accent);color:var(--accent)}
.vad-close .vad-x{display:none}
.vad.can-close .vad-close .vad-wait{display:none}
.vad.can-close .vad-close .vad-x{display:inline}
.vad-body{overflow:auto;text-align:center}
.vad-body img,.vad-body iframe{max-width:100%;height:auto}
/* MÃ©dia indisponible (fichier sur le PC distant hors ligne) */
.player .stage.unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:#0e0e15}
.stage.unavailable .unavail-ic{font-size:46px;opacity:.7}
.stage.unavailable .unavail-msg{font-weight:700;font-size:17px;color:#fff}
.player video.stage{background:#000;max-width:100%}

/* =====================================================================
   LECTEUR VIDÃ‰O MAISON (fichiers hÃ©bergÃ©s & liens directs uniquement).
   Le cadre 16/9 et l'object-fit:contain de .stage ne bougent pas : une
   vidÃ©o verticale reste entiÃ¨re, centrÃ©e, sans recadrage ni dÃ©formation.
   ===================================================================== */
.vplayer{position:relative;width:100%;line-height:0;border-radius:8px;overflow:hidden;background:#000;
  outline:none;-webkit-tap-highlight-color:transparent}
.vplayer:focus-visible{box-shadow:0 0 0 3px rgba(225,29,42,.45)}
.vplayer video.stage{display:block;border:0;border-radius:0;cursor:pointer}
/* Overlay « À suivre » (autoplay en fin de vidéo, lecteur maison). */
.vp-next{position:absolute;inset:0;z-index:9;display:flex;align-items:center;justify-content:center;line-height:1.35;
  background:rgba(0,0,0,.84);backdrop-filter:blur(3px)}
.vp-next[hidden]{display:none}
.vpn-box{text-align:center;max-width:88%;color:#fff}
.vpn-lbl{display:inline-block;font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--accent);font-weight:800;margin-bottom:10px}
.vpn-thumb{width:220px;max-width:60%;aspect-ratio:16/9;object-fit:cover;border-radius:8px;display:block;margin:0 auto 10px;border:1px solid rgba(255,255,255,.16)}
.vpn-title{font-weight:700;font-size:15px;margin:0 auto 6px;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vpn-count{color:#c9c9d2;font-size:13px;margin-bottom:14px}
.vpn-count b{color:#fff;font-size:16px}
.vpn-btns{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.vplayer.vp-idle{cursor:none}

/* Gros bouton central : visible Ã  l'arrÃªt et en fin de vidÃ©o, effacÃ© pendant la lecture. */
.vp-big{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:3;
  width:76px;height:76px;border-radius:50%;border:0;cursor:pointer;
  background:rgba(225,29,42,.92);color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:0 12px 34px -10px rgba(0,0,0,.8);transition:opacity .2s,transform .2s,background .15s}
.vp-big svg{width:34px;height:34px;margin-left:3px}
.vp-big:hover{background:var(--accent2);transform:translate(-50%,-50%) scale(1.06)}
.vplayer.vp-playing .vp-big{opacity:0;pointer-events:none;transform:translate(-50%,-50%) scale(.8)}
.vplayer.vp-ended .vp-big svg{margin-left:0}

/* Attente de donnÃ©es : anneau tournant, sans image externe. */
.vp-spin{position:absolute;left:50%;top:50%;width:46px;height:46px;margin:-23px 0 0 -23px;z-index:4;
  border:3px solid rgba(255,255,255,.22);border-top-color:#fff;border-radius:50%;
  opacity:0;pointer-events:none;transition:opacity .15s}
.vplayer.vp-wait .vp-spin{opacity:1;animation:vpspin .8s linear infinite}
.vplayer.vp-wait .vp-big{opacity:0}
@keyframes vpspin{to{transform:rotate(360deg)}}

/* Barre de commandes */
.vp-bar{position:absolute;left:0;right:0;bottom:0;z-index:5;display:flex;align-items:center;gap:10px;
  padding:26px 14px 11px;line-height:1;
  background:linear-gradient(transparent,rgba(0,0,0,.35) 30%,rgba(0,0,0,.82));
  opacity:1;transform:translateY(0);transition:opacity .22s,transform .22s}
.vplayer.vp-idle .vp-bar{opacity:0;transform:translateY(8px);pointer-events:none}
.vp-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  padding:0;border:0;border-radius:7px;background:transparent;color:#fff;cursor:pointer;transition:.14s}
.vp-btn:hover{background:rgba(255,255,255,.16)}
.vp-btn svg{width:20px;height:20px}
.vp-rate{width:auto;padding:0 9px;font-family:var(--sans);font-size:12.5px;font-weight:800;letter-spacing:.02em}
.vp-time{flex:none;font-family:var(--sans);font-size:12.5px;font-weight:700;color:#fff;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.vp-sep{opacity:.45;margin:0 4px}
.vp-dur{opacity:.7}

/* Progression : zone de clic gÃ©nÃ©reuse (14 px) mais trait fin, qui s'Ã©paissit au survol. */
.vp-seek{position:relative;flex:1;min-width:60px;height:14px;cursor:pointer;display:flex;align-items:center;touch-action:none}
.vp-seek::before{content:"";position:absolute;left:0;right:0;height:4px;border-radius:4px;
  background:rgba(255,255,255,.26);transition:height .13s}
.vp-buf,.vp-prog{position:absolute;left:0;height:4px;border-radius:4px;transition:height .13s}
.vp-buf{background:rgba(255,255,255,.34);width:0}
.vp-prog{background:var(--accent);width:0}
.vp-knob{position:absolute;top:50%;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;
  background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.55);opacity:0;transition:opacity .13s}
.vp-seek:hover::before,.vp-seek:hover .vp-buf,.vp-seek:hover .vp-prog{height:6px}
.vp-seek:hover .vp-knob,.vp-seek:focus-visible .vp-knob{opacity:1}
.vp-seek:focus-visible{outline:2px solid var(--accent2);outline-offset:3px;border-radius:4px}
/* Horodatage suivant le curseur */
.vp-hover{position:absolute;bottom:20px;transform:translateX(-50%);padding:3px 7px;border-radius:5px;
  background:rgba(0,0,0,.86);color:#fff;font-size:11.5px;font-weight:700;font-variant-numeric:tabular-nums;
  white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s}
.vp-seek:hover .vp-hover{opacity:1}

/* Volume : le curseur se dÃ©plie au survol pour ne pas manger la barre en permanence. */
.vp-volwrap{flex:none;display:flex;align-items:center}
.vp-vol{width:0;opacity:0;margin:0;padding:0;height:4px;cursor:pointer;
  -webkit-appearance:none;appearance:none;background:rgba(255,255,255,.3);border-radius:4px;
  transition:width .18s,opacity .18s,margin .18s}
.vp-volwrap:hover .vp-vol,.vp-vol:focus-visible{width:74px;opacity:1;margin:0 8px 0 4px}
.vp-vol::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;border-radius:50%;background:#fff;cursor:pointer}
.vp-vol::-moz-range-thumb{width:12px;height:12px;border:0;border-radius:50%;background:#fff;cursor:pointer}

/* =====================================================================
   Ã‰CRAN D'ATTENTE devant les lecteurs TIERS (iframe).
   Pendant le dÃ©compte, l'iframe n'a pas de `src` : rien du site tiers
   n'est chargÃ©. Le voile est donc un vrai Ã©cran, pas un cache.
   ===================================================================== */
.stage.embed.vp-gated iframe{opacity:0}
.vg-veil{position:absolute;inset:0;z-index:6;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:6px;padding:20px;text-align:center;
  background:radial-gradient(circle at 50% 42%, #14141b, #06060a 72%);
  transition:opacity .4s}
.vg-veil.vg-out{opacity:0;pointer-events:none}
.vg-brand{display:inline-flex;align-items:center;gap:12px;font-family:var(--serif);font-weight:600;
  letter-spacing:-1px;font-size:clamp(30px,6vw,58px);color:#fff;line-height:1}
.vg-dot{width:.36em;height:.36em;border-radius:50%;background:var(--accent);
  box-shadow:0 0 26px 6px rgba(225,29,42,.5);animation:vgpulse 2.4s ease-in-out infinite}
@keyframes vgpulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.65;transform:scale(.86)}}
.vg-slogan{font-size:clamp(11px,1.4vw,13px);font-weight:700;letter-spacing:.22em;text-transform:uppercase;
  color:var(--mut);margin-bottom:14px}

/* DÃ©compte : le chiffre au centre, l'anneau qui se vide autour. */
.vg-count{position:relative;width:74px;height:74px;display:flex;align-items:center;justify-content:center}
.vg-n{font-family:var(--serif);font-size:30px;font-weight:600;color:#fff;font-variant-numeric:tabular-nums}
.vg-ring{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}
.vg-ring circle{fill:none;stroke-width:5}
.vg-ring-bg{stroke:rgba(255,255,255,.13)}
.vg-ring-fg{stroke:var(--accent);stroke-linecap:round;transition:stroke-dashoffset 1s linear}
.vg-lbl{font-size:13.5px;color:var(--mut);margin-top:10px}
.vg-lbl .vg-n2{color:#fff;font-weight:700;font-variant-numeric:tabular-nums}
.vg-skip{margin-top:16px;display:inline-flex;align-items:center;gap:8px;padding:9px 18px;
  border:1px solid rgba(255,255,255,.26);border-radius:999px;background:rgba(255,255,255,.07);
  color:#fff;font-family:var(--sans);font-size:13.5px;font-weight:700;cursor:pointer;transition:.15s}
.vg-skip:hover{background:var(--accent);border-color:transparent}
.vg-arr{font-size:17px;line-height:1}
@media(max-width:600px){
  .vg-count{width:58px;height:58px}.vg-n{font-size:24px}
  .vg-slogan{margin-bottom:8px}.vg-skip{margin-top:12px}
}

/* Plein Ã©cran : la vidÃ©o occupe tout l'Ã©cran, le cadre 16/9 ne s'applique plus. */
.vplayer.vp-fs{border-radius:0}
.vplayer.vp-fs video.stage{width:100vw;height:100vh;aspect-ratio:auto}
.vp-errmsg{position:absolute;inset:0;z-index:6;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:6px;background:#0e0e15;color:#fff;line-height:1.4;text-align:center;padding:20px}
.vp-errmsg b{font-size:17px}
.vp-errmsg span{color:var(--mut);font-size:14px}
.vplayer.vp-error .vp-big,.vplayer.vp-error .vp-bar{display:none}
@media(max-width:600px){
  .vp-big{width:60px;height:60px}.vp-big svg{width:27px;height:27px}
  .vp-bar{gap:6px;padding:22px 8px 8px}
  .vp-rate{display:none}
  .vp-volwrap:hover .vp-vol{width:52px}
}
/* Photo : dimensionnÃ©e Ã  la zone en conservant les proportions (pas de forÃ§age 16/9) */
.photo-stage{position:relative;text-align:center}
.photo-stage .stage{cursor:zoom-in;display:inline-block;width:auto;height:auto;max-width:100%;max-height:78vh;aspect-ratio:auto;object-fit:contain;background:#0b0b0f;border:1px solid var(--line);border-radius:8px}
.p-title{font-family:var(--serif);font-weight:600;font-size:30px;letter-spacing:-.5px;margin:20px 0 10px}
.player-title{font-family:var(--serif);font-weight:600;font-size:28px;letter-spacing:-.5px;line-height:1.2;margin:0 0 14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.player-meta{display:flex;align-items:center;gap:13px;flex-wrap:wrap;color:var(--mut);margin:14px 0 16px}
.owner-reassign{display:inline-flex;align-items:center;gap:6px}
.owner-reassign select{max-width:200px;padding:5px 8px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--txt);font-size:13px}
.desc{color:var(--txt);white-space:normal;margin:0 0 16px;line-height:1.6}
.tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px}
.tag{color:var(--accent);font-size:13px;font-weight:600}

/* Tags du mÃ©dia : 10 affichÃ©s, le reste en accordÃ©on derriÃ¨re un bouton Â« Plus Â» centrÃ© */
.tags .tag{background:var(--field);border:1px solid var(--line);border-radius:99px;padding:5px 13px;transition:.13s}
.tags .tag:hover{border-color:var(--accent);background:rgba(225,29,42,.1)}
.tags .tag-extra{display:none}
.tags.expanded .tag-extra{display:inline-flex}
.tag-more-wrap{text-align:center;margin:2px 0 16px}
.tag-more-btn{display:inline-flex;align-items:center;gap:6px;background:var(--field);border:1px solid var(--line);
  border-radius:99px;padding:7px 18px;font-weight:700;font-size:13px;color:var(--accent);cursor:pointer;transition:.14s}
.tag-more-btn:hover{border-color:var(--accent);background:rgba(225,29,42,.08)}
.tag-more-btn .tmb-less{display:none}
.tag-more-btn[aria-expanded="true"] .tmb-more{display:none}
.tag-more-btn[aria-expanded="true"] .tmb-less{display:inline}
/* Tags membres : chip avec Ã— (proprio/admin), bouton Â« Ajouter Â», champ de la modale */
.tag-chip{display:inline-flex;align-items:center;gap:1px}
.tag-del{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;margin-left:-3px;padding:0;border:none;background:none;color:var(--mut2);font-size:16px;line-height:1;cursor:pointer;border-radius:50%;transition:.13s}
.tag-del:hover{color:#fff;background:var(--accent)}
.tag-add-btn{background:none;border:1px dashed var(--line);border-radius:99px;color:var(--mut);font-size:13px;font-weight:600;padding:4px 13px;cursor:pointer;transition:.13s}
.tag-add-btn:hover{border-color:var(--accent);color:var(--accent)}
.tagadd-field{position:relative;margin-top:6px}
.tagadd-field input{width:100%;background:var(--field);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:11px 13px;font-family:inherit}
.tagadd-field input:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.tagadd-msg{margin-top:10px;font-weight:600}
/* SÃ©lecteur de tags (Ã©dition) */
.tagpick-box{position:relative}
.tag-ac{position:absolute;top:100%;left:0;right:0;z-index:30;background:var(--panel);border:1px solid var(--line2);
  border-radius:6px;margin-top:4px;box-shadow:0 16px 36px -16px rgba(0,0,0,.6);max-height:240px;overflow:auto;padding:5px}
.tag-ac-item{display:block;width:100%;text-align:left;background:none;border:0;color:var(--txt);padding:8px 10px;
  border-radius:5px;cursor:pointer;font-size:14px;font-weight:600;font-family:inherit}
.tag-ac-item:hover{background:var(--hover);color:var(--accent)}
.tag-ac-empty{padding:8px 10px;color:var(--mut);font-size:13px}
.tag-ac-has{padding:8px 10px;color:var(--mut);font-size:13px;opacity:.75;cursor:default;border-top:1px solid var(--line)}
.tag-ac-has .muted{font-size:11px}
/* Suggestions de tags : bloc contenu et padÃ© â€” les chips ne touchent jamais les bords */
.tag-suggest{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;padding:12px 14px;background:var(--field);border:1px solid var(--line);border-radius:8px}
/* Notification inline d'enregistrement (page de gestion d'album) */
.album-meta-foot{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.album-meta-msg{font-weight:600;font-size:14px;padding:7px 13px;border-radius:6px}
.album-meta-msg.ok{color:#2f9e5f;background:rgba(62,166,109,.14);border:1px solid rgba(62,166,109,.4)}
.album-meta-msg.err{color:var(--accent);background:rgba(225,29,42,.1);border:1px solid rgba(225,29,42,.35)}
.tagchip{background:var(--field);border:1px solid var(--line);border-radius:99px;padding:5px 12px;font-size:13px;
  font-weight:600;color:var(--accent);cursor:pointer;transition:.12s;font-family:inherit}
.tagchip:hover{border-color:var(--accent);background:rgba(225,29,42,.1)}
/* Tags RETENUS : boutons rouges pleins, cliquables pour les retirer. */
.tag-selected{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 4px}
.tag-selected[hidden]{display:none}
.tagsel{display:inline-flex;align-items:center;gap:7px;background:var(--accent);border:1px solid var(--accent);
  color:#fff;border-radius:99px;padding:5px 11px;font-size:13px;font-weight:700;font-family:inherit;
  cursor:pointer;transition:.12s}
.tagsel:hover{background:#b91726;border-color:#b91726}
.tagsel-x{font-size:11px;line-height:1;opacity:.85}
.tagsel:hover .tagsel-x{opacity:1}
.embed-box,.report-box{border:1px solid var(--line);border-radius:6px;padding:14px 16px;margin-bottom:18px;background:var(--panel)}
.embed-box summary,.report-box summary{cursor:pointer;font-weight:700;color:var(--mut)}
.embed-box textarea{width:100%;height:56px;margin-top:10px;background:var(--field);border:1px solid var(--line);border-radius:5px;
  color:#c9d0e0;font-family:ui-monospace,monospace;font-size:12px;padding:9px;resize:none}
.inline-form{display:flex;gap:8px;margin-top:10px}
.inline-form input{flex:1;background:var(--field);border:1px solid var(--line);border-radius:5px;color:#fff;padding:9px 11px}
.comments{margin-top:0}
.comments h2{font-family:var(--serif);font-weight:600;font-size:22px;margin:0 0 14px}
/* SÃ©parateur dÃ©coratif entre les grandes sections de la page mÃ©dia (ligne dÃ©gradÃ©e + losange accent). */
.hr-sep{display:flex;align-items:center;justify-content:center;gap:18px;margin:24px 0;border:0}
.hr-sep::before,.hr-sep::after{content:"";flex:1;height:1px}
.hr-sep::before{background:linear-gradient(90deg,transparent,var(--line2))}
.hr-sep::after{background:linear-gradient(90deg,var(--line2),transparent)}
.hr-sep span{flex:none;color:var(--accent);font-size:12px;line-height:1;opacity:.85}
/* Variante resserrÃ©e : encadre le fil d'Ariane sans l'Ã©loigner du contenu. */
.hr-sep.tight{margin:9px 0;gap:14px}
.hr-sep.tight span{font-size:10px;opacity:.7}

/* ---------- Filet sous un titre de section ----------
   MÃªme langage visuel que .hr-sep, mais SANS balise supplÃ©mentaire : le filet
   s'accroche au titre lui-mÃªme. Ã‰vite d'aller semer un <div> sous chacun des
   titres du site, et garantit que l'espacement suit toujours le titre.

   Les deux segments sont deux dÃ©gradÃ©s posÃ©s Ã  gauche et Ã  droite, avec un vide
   de 34 px au centre oÃ¹ vient se loger le losange. Pas de pastille de fond Ã
   masquer : le trait ne passe jamais derriÃ¨re le symbole, donc le rendu reste
   juste quel que soit le fond (page, panneau, colonne latÃ©rale). */
/* RÃ‰SERVÃ‰ aux titres qui n'ont PAS dÃ©jÃ  un `partials/sep` sous eux â€” en pratique,
   les titres de colonne latÃ©rale. La convention du site est : `.section-head` suivi
   d'un `partials/sep` explicite. Poser le filet sur `.section-head` par CSS doublait
   donc le sÃ©parateur dans 28 vues : Ã  ne pas refaire.

   Le losange est Ã©crit en Ã©chappement CSS `\25C6` et non en caractÃ¨re littÃ©ral :
   c'est indÃ©pendant de l'encodage du fichier, et un octet mal interprÃ©tÃ© affichait
   Â« Ã¢â€”â€  Â» au lieu du symbole. */
.sec-title{position:relative;padding-bottom:15px;margin-bottom:18px}
.sec-title::before{
  content:"";position:absolute;left:0;right:0;bottom:5px;height:1px;
  background:
    linear-gradient(90deg,transparent,var(--line2)) left center/calc(50% - 16px) 1px no-repeat,
    linear-gradient(90deg,var(--line2),transparent) right center/calc(50% - 16px) 1px no-repeat;
}
.sec-title::after{
  content:"\25C6";position:absolute;left:50%;bottom:0;transform:translateX(-50%);
  color:var(--accent);font-size:10px;line-height:1;opacity:.75;
}
/* Variante discrÃ¨te pour les colonnes latÃ©rales Ã©troites. */
.sec-title.sm{padding-bottom:13px;margin-bottom:15px}
.sec-title.sm::after{font-size:9px;opacity:.65}
.comment-form{margin-bottom:20px}
.comment-form textarea{width:100%;height:80px;background:var(--panel);border:1px solid var(--line);border-radius:6px;color:#fff;padding:11px;resize:vertical;margin-bottom:10px}
.comment{display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}
.c-head{margin-bottom:3px}
.suggest h2{font-family:var(--serif);font-weight:600;font-size:20px;margin:0 0 14px}
.similar-block{margin-top:0}
.similar-block h2{font-family:var(--serif);font-weight:600;font-size:22px;margin:0 0 16px}
.suggest .card{margin-bottom:12px}
@media(max-width:900px){.player-page{grid-template-columns:1fr}.hero h1{font-size:36px}.p-title,.player-title{font-size:24px}}

/* ---------- Tiles / stats ---------- */
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin-bottom:22px}
.tiles.wide{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
.tile{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px 14px;container-type:inline-size}
/* Taille de police adaptÃ©e Ã  la LARGEUR du bloc (container query) : un grand nombre (ex. 2 383 939)
   se rÃ©duit pour tenir au lieu de dÃ©border ; chiffres tabulaires, jamais de retour Ã  la ligne. */
.tile .n{font-family:var(--serif);font-weight:600;font-size:clamp(17px,13cqi,30px);line-height:1.12;
  white-space:nowrap;font-variant-numeric:tabular-nums;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis}
.tile .l{color:var(--mut);font-size:13px;margin-top:2px}

/* ---------- Panels & tables ---------- */
.panel{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:22px;margin-bottom:22px}
.panel-head{display:flex;justify-content:space-between;align-items:center;gap:8px 12px;flex-wrap:wrap;margin-bottom:14px}
.panel-head > *{min-width:0}
.panel-head h2,.panel h2{font-family:var(--serif);font-weight:600;font-size:20px;margin:0 0 12px}
.split{display:grid;grid-template-columns:2fr 1fr;gap:22px}
@media(max-width:820px){.split{grid-template-columns:1fr}}
.table{width:100%;border-collapse:collapse;font-size:14px}
.table th,.table td{text-align:left;padding:11px 10px;border-bottom:1px solid var(--line);overflow-wrap:anywhere}
.table thead th{color:var(--mut);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.05em}
.table tr.banned{opacity:.55}
.pill{font-size:12px;font-weight:800;padding:3px 10px;border-radius:6px;display:inline-block}
.pill.published{background:rgba(34,197,94,.15);color:#4ade80}
.pill.pending{background:rgba(251,191,36,.16);color:#fbbf24}
.pill.rejected{background:rgba(225,29,42,.16);color:#ff8790}
html[data-theme="light"] .pill.published{background:#e7f6ec;color:#15803d}
html[data-theme="light"] .pill.pending{background:#fbf0d0;color:#8a5a06}
html[data-theme="light"] .pill.rejected{background:#fdecec;color:#b3261e}
.callout{background:rgba(225,29,42,.08);border:1px solid rgba(225,29,42,.28);color:var(--txt);border-radius:6px;padding:13px 18px;margin-bottom:22px}
/* Encart Â« Aucun rÃ©sultat pour X, rÃ©sultats pour Y Â» (recherche tolÃ©rante aux fautes) */
.search-corrected{background:rgba(225,29,42,.06);border:1px solid rgba(225,29,42,.22);border-radius:8px;padding:11px 15px;margin:0 0 18px;font-size:14px}
.search-corrected a{display:inline-block;margin-left:10px}
.callout a{color:var(--accent);font-weight:700}
/* Un bandeau vert quand tout va bien vaut mieux qu'une absence d'info : on sait que le contrÃ´le a eu lieu. */
.callout-ok{background:rgba(34,197,94,.09);border-color:rgba(34,197,94,.34)}
.callout-ok a{color:#22a35a}
.callout-bad{background:rgba(225,29,42,.10);border-color:rgba(225,29,42,.4)}

/* ---------- Forms ---------- */
.form label{display:block;margin-bottom:16px;font-weight:600;font-size:14px}
.form input,.form select,.form textarea{width:100%;max-width:100%;box-sizing:border-box;margin-top:7px;background:var(--field);border:1px solid var(--line);border-radius:6px;
  color:var(--txt);padding:11px 13px;font-family:inherit;font-size:15px;outline:none;font-weight:400}
/* Couleur du texte selon le theme : elle etait figee en blanc (#fff), pensee pour le front
   sombre. Dans le back-office (theme clair), « Membre » ou un nom de membre blanc sur champ clair
   etait illisible. var(--txt) vaut ~blanc en sombre, ~noir en clair : lisible des deux cotes, et
   cela corrige d'un coup tous les <select> et champs .form. */
/* Grille 2 colonnes : sans min-width:0 les colonnes refusent de rétrécir → le panneau déborde du cadre. */
.form-2col > *{min-width:0}
.panel .form{max-width:100%}
.form input:focus,.form select:focus,.form textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
/* Blocs .field (catÃ©gories, tagsâ€¦) : mÃªme respiration verticale que les <label>, libellÃ© au-dessus de ses contrÃ´les */
.form .field{margin-bottom:18px}
.field-lbl{display:block;font-weight:600;font-size:14px;margin-bottom:6px}
/* Marqueur Â« champ obligatoire Â» (rouge accent) sur les formulaires d'upload. */
.req{color:var(--accent);font-weight:700}
/* Poids cumulÃ© des mÃ©dias, Ã  cÃ´tÃ© du compteur des listes back-office. */
.size-total{color:var(--accent);font-weight:800}
/* Bouton Â« Suggestions d'informations Â» + retour d'exÃ©cution. */
.suggest-bar{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap;margin:0 0 10px;text-align:center}
.suggest-msg{font-size:13px;font-weight:600;line-height:1.4}
.suggest-msg.ok{color:#4ade80}
.suggest-msg.err{color:var(--accent)}
.form>.btn,.form .form-submit{margin-top:4px}
.form .row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:640px){.form .row{grid-template-columns:1fr}}
.authbox{max-width:420px;margin:20px auto;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:30px}
.authbox h1{margin:0 0 4px;font-size:28px}
.typetoggle{display:flex;gap:10px;margin-bottom:20px}
.typetoggle .type{flex:1;text-align:center;padding:12px;border:1px solid var(--line);border-radius:6px;cursor:pointer;font-weight:700;color:var(--mut)}
.typetoggle .type.on{border-color:var(--accent);background:rgba(225,29,42,.1);color:#fff}
.typetoggle .type input{display:none}
.modnote{background:var(--field);border:1px solid var(--line2);color:var(--mut);border-radius:6px;padding:10px 14px;font-size:13px;margin-bottom:16px}
.media-preview{display:flex;align-items:center;gap:14px;margin-bottom:18px}
.media-preview img{width:140px;height:88px;object-fit:cover;border-radius:6px;border:1px solid var(--line)}
.actions{display:flex;gap:12px;align-items:center}
.danger-zone{display:flex;align-items:center;justify-content:space-between;gap:14px;background:rgba(225,29,42,.06);
  border:1px solid rgba(225,29,42,.25);border-radius:6px;padding:14px 18px;margin-top:22px}

/* ---------- Moderation grid ---------- */
.modgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:18px}
.modcard{background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}
.modthumb{position:relative;display:block;aspect-ratio:16/9;background:var(--field)}
.modthumb img{width:100%;height:100%;object-fit:cover}
.modbody{padding:14px}
.modtitle{font-weight:700;margin-bottom:4px}
.modsdesc{color:var(--mut);font-size:13px;margin:8px 0 0}
.modactions{display:flex;gap:10px;margin-top:14px}

/* ---------- Footer ---------- */
.footer{border-top:1px solid var(--line);padding:26px 0;color:var(--mut);font-size:13px}
/* Bouton flottant Â« remonter en haut Â» (apparaÃ®t sur les pages longues) */
.scroll-top{position:fixed;right:24px;bottom:24px;z-index:95;width:48px;height:48px;border-radius:50%;border:none;
  background:var(--accent);color:#fff;font-size:22px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;
  box-shadow:0 8px 24px -6px rgba(0,0,0,.55);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(12px);transition:opacity .22s,transform .22s,background .15s}
.scroll-top.show{opacity:1;visibility:visible;pointer-events:auto;transform:none}
.scroll-top:hover{background:var(--accent2)}
@media(max-width:600px){.scroll-top{right:14px;bottom:14px;width:44px;height:44px;font-size:20px}}
.footer-inner{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}
/* Sites partenaires : 4 blocs alignÃ©s, chacun avec ses liens */
/* CINQ colonnes, et non quatre : les blocs trop longs sont redecoupes par footer_colonnes() pour
   que toutes aient une hauteur voisine. En quatre colonnes, l'une restait vide pendant que la
   plus longue imposait sa hauteur a tout le pied de page. */
.footer-partners{display:grid;grid-template-columns:repeat(5,1fr);gap:18px 22px;padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid var(--line)}
.fp-block{display:flex;flex-direction:column;gap:5px;min-width:0}
.fp-title{font-weight:700;color:var(--txt);font-size:13px;text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px}
.fp-link{color:var(--mut);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fp-link:hover{color:var(--accent)}
/* Paliers : cinq colonnes ne tiennent pas sous 1100 px sans tronquer les libelles. */
@media(max-width:1100px){.footer-partners{grid-template-columns:repeat(4,1fr)}}
@media(max-width:900px){.footer-partners{grid-template-columns:repeat(3,1fr)}}
@media(max-width:760px){.footer-partners{grid-template-columns:repeat(2,1fr);gap:16px}}
@media(max-width:420px){.footer-partners{grid-template-columns:1fr}}
/* Une colonne de continuation porte le meme intitule suivi de « (suite) » : on l'attenue pour
   qu'elle se lise comme un prolongement, pas comme une nouvelle rubrique. */
.fp-block.fp-suite .fp-title{opacity:.55;font-weight:600}
/* Back-office : grille de saisie des partenaires (2Ã—2) */
.partners-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:16px 0 20px}
@media(max-width:760px){.partners-grid{grid-template-columns:1fr}}
.partner-block{padding:16px}
.partner-blk-title{display:block;margin-bottom:12px;font-weight:600;font-size:14px}
.partner-links{display:flex;flex-direction:column;gap:8px}
.partner-row{display:grid;grid-template-columns:1fr 1.4fr;gap:8px}
@media(max-width:520px){.partner-row{grid-template-columns:1fr}}

/* ---------- Admin shell ---------- */
body.admin{background:var(--bg2)}
.admin-shell{display:grid;grid-template-columns:250px 1fr;min-height:100vh;transition:grid-template-columns .22s ease}
.admin-shell.side-collapsed{grid-template-columns:0 1fr}
.admin-side{background:var(--sidebar);border-right:1px solid var(--line);padding:22px 18px;display:flex;flex-direction:column;gap:6px;position:sticky;top:0;height:100vh;min-width:0;overflow:hidden;white-space:nowrap}
.admin-shell.side-collapsed .admin-side{padding-left:0;padding-right:0;border-right:0}
/* Bouton « / » de repli du menu (dans la barre du haut) */
.admin-side-toggle{flex:none;width:38px;height:38px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--txt);font-size:18px;font-weight:700;cursor:pointer;line-height:1;transition:border-color .15s,color .15s}
.admin-side-toggle:hover{border-color:var(--accent);color:var(--accent)}
.admin-side-foot{margin-top:auto;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.admin-version{margin-left:auto;font-size:12px;font-weight:700;color:var(--mut);text-decoration:none;
  padding:3px 8px;border:1px solid var(--line);border-radius:999px;transition:.15s}
.admin-version:hover{color:var(--fg);border-color:var(--mut)}
.admin-head-row{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin:6px 0 16px}
.changelog{line-height:1.6}
.changelog h1{font-size:22px;margin:2px 0 10px}
.changelog h2{font-size:18px;margin:22px 0 8px;padding-bottom:6px;border-bottom:1px solid var(--line)}
.changelog h3{font-size:14px;text-transform:uppercase;letter-spacing:.04em;color:var(--mut);margin:16px 0 6px}
.changelog ul{margin:0 0 10px;padding-left:20px}
.changelog li{margin:3px 0}
.changelog hr{border:0;border-top:1px solid var(--line);margin:18px 0}
.changelog code{background:var(--field);padding:1px 6px;border-radius:5px;font-size:.92em}
.admin-side .brand{margin-bottom:6px}
.admin-tag{color:var(--mut2);font-size:11px;text-transform:uppercase;letter-spacing:.12em;margin-bottom:16px}
/* Nav dÃ©filante (sinon coupÃ©e quand il y a beaucoup d'entrÃ©es) + regroupÃ©e par rubriques. */
.admin-side nav{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-height:0;overflow-y:auto;padding-right:4px}
.admin-side nav a{padding:8px 12px;border-radius:6px;color:var(--mut);font-weight:600}
.admin-side nav a:hover{color:var(--accent);background:rgba(225,29,42,.11)}
.admin-side nav a.on{color:#fff;background:rgba(225,29,42,.14);border:1px solid rgba(225,29,42,.35)}
.nav-group{display:flex;flex-direction:column}
.nav-group-h{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;background:none;border:0;cursor:pointer;font-family:inherit;font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);opacity:.62;margin:11px 0 3px;padding:5px 12px;border-radius:6px;text-align:left}
.nav-group-h:hover{opacity:1;color:var(--accent);background:rgba(225,29,42,.08)}
.nav-group-caret{font-size:10px;opacity:.8;transition:transform .16s ease;transform:rotate(-90deg)}
.nav-group.open>.nav-group-h .nav-group-caret{transform:none}
.nav-group-links{display:none;flex-direction:column;gap:2px}
.nav-group.open>.nav-group-links{display:flex}
.admin-side nav::-webkit-scrollbar{width:8px}
.admin-side nav::-webkit-scrollbar-thumb{background:var(--line2);border-radius:8px}
.admin-side .back{margin-top:auto;color:var(--mut);font-size:13px;font-weight:600}
.admin-main{padding:30px 34px}
.admin-main h1{font-size:30px;margin:0 0 22px}
@media(max-width:820px){.admin-shell{grid-template-columns:1fr}.admin-side{position:static;height:auto;flex-direction:row;flex-wrap:wrap;align-items:center}.admin-side nav{flex-direction:row;flex-wrap:wrap}.admin-side .back{margin:0}}

/* ---------- Error page ---------- */
.errpage{text-align:center;padding:80px 0}
.errcode{font-family:var(--serif);font-size:90px;font-weight:600;color:var(--accent)}

/* =====================================================================
   THÃˆME CLAIR
   ===================================================================== */
html[data-theme="light"]{
  --bg:#f6f5f1; --bg2:#efeee8; --panel:#ffffff; --panel2:#faf9f5;
  --line:#e6e2d8; --line2:#d7d2c6; --txt:#181920; --mut:#5c616e; --mut2:#8b8f9c;
  --gold:#9a6a12; --star:#e0930a; --field:#f2f1ea; --topbar:rgba(247,245,241,.9); --sidebar:#efeee7;
  --hover:#eae7dd;
}
html[data-theme="light"] body{background-image:radial-gradient(70% 60% at 100% -10%,rgba(225,29,42,.06),transparent 60%)}
html[data-theme="light"] .btn{background:linear-gradient(120deg,#f3f1e9,#e7e4da);color:var(--txt);border-color:transparent}
html[data-theme="light"] .btn.ghost{background:#fff;border:1px solid var(--line);color:var(--txt)}
html[data-theme="light"] .btn.ghost:hover{background:rgba(225,29,42,.06);border-color:var(--accent);color:var(--accent)}
/* primary / danger / ok gardent leur dÃ©gradÃ© colorÃ© (texte blanc) dans les deux thÃ¨mes.
   Ces trois rÃ¨gles sont INDISPENSABLES : `html[data-theme="light"] .btn` ci-dessus pÃ¨se
   (0,2,1) et l'emportait sur `.btn.primary` (0,2,0). En thÃ¨me clair, TOUS les boutons de
   validation Ã©taient donc repeints en beige â€” Enregistrer, Confirmer, Envoyerâ€¦ â€” et les
   boutons de suppression perdaient leur rouge d'alerte. Le bouton Â« Publier Â» du header y
   Ã©chappait dÃ©jÃ  grÃ¢ce Ã  son propre sÃ©lecteur renforcÃ©, ce qui masquait le problÃ¨me.
   En (0,3,1), ces rÃ¨gles reprennent la main sans recourir Ã  !important. */
html[data-theme="light"] .btn.primary{background:linear-gradient(120deg,var(--accent),#b3141f);color:#fff;border-color:transparent}
html[data-theme="light"] .btn.primary:hover{filter:brightness(1.08);color:#fff}
html[data-theme="light"] .btn.danger{background:linear-gradient(120deg,#e23b4e,#b3141f);color:#fff;border-color:transparent}
html[data-theme="light"] .btn.danger:hover{filter:brightness(1.07);color:#fff}
html[data-theme="light"] .btn.ok{background:linear-gradient(120deg,#22a35a,#158043);color:#fff;border-color:transparent}
html[data-theme="light"] .btn.ok:hover{filter:brightness(1.07);color:#fff}
html[data-theme="light"] .search input,html[data-theme="light"] .theme-btn,html[data-theme="light"] .menu-toggle,
html[data-theme="light"] .form input,html[data-theme="light"] .form select,html[data-theme="light"] .form textarea,
html[data-theme="light"] .comment-form textarea,html[data-theme="light"] .inline-form input,html[data-theme="light"] .embed-box textarea{color:var(--txt)}
html[data-theme="light"] .mainnav a:hover{color:var(--accent)}
html[data-theme="light"] .card:hover,html[data-theme="light"] .creator-card:hover{box-shadow:0 18px 40px -22px rgba(20,20,30,.28)}
html[data-theme="light"] .stage,html[data-theme="light"] .player video.stage,html[data-theme="light"] .player img.stage{background:#000}

/* =====================================================================
   CATÃ‰GORIES â€” index + page catÃ©gorie (banniÃ¨re + photo) + modale
   ===================================================================== */
/* Index des catÃ©gories */
/* Navigation par lettre (page /categories) */
.cat-alpha{display:flex;flex-wrap:wrap;gap:5px;margin:0 0 20px;position:sticky;top:0;z-index:6;background:var(--bg);padding:8px 0}
.cat-alpha a,.cat-alpha .off{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 7px;border-radius:7px;font-weight:700;font-size:13px;line-height:1}
.cat-alpha a{color:var(--txt);background:var(--field);border:1px solid var(--line);text-decoration:none;transition:.15s}
.cat-alpha a:hover{border-color:var(--accent);color:var(--accent)}
.cat-alpha .off{color:var(--mut2);opacity:.35;user-select:none}
.cat-letter{grid-column:1/-1;margin:14px 0 0;font-size:22px;font-weight:800;color:var(--accent);scroll-margin-top:78px;border-bottom:1px solid var(--line);padding-bottom:6px}
.cats-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:20px}
.cat-card{background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden;transition:.18s}
.cat-card:hover{transform:translateY(-3px);border-color:var(--line2);box-shadow:0 22px 44px -26px rgba(0,0,0,.7)}
.cat-card-cover{position:relative;height:172px;display:flex;align-items:center;justify-content:center;overflow:hidden;
  background:linear-gradient(135deg,#1c1c26,#101017);background-size:cover;background-position:center}
/* La miniature remplit tout le bloc (plus de fond noir visible quand une image est disponible) */
.cat-card-photo{position:absolute;inset:0;width:100%;height:100%;border:0;border-radius:0;box-shadow:none;object-fit:cover}
.cat-card-initial{font-family:var(--serif);font-size:40px;font-weight:700;color:#fff;opacity:.9;text-shadow:0 2px 12px rgba(0,0,0,.5)}
.cat-card-kind{position:absolute;top:10px;left:10px;background:rgba(11,11,15,.72);color:#fff;font-size:11px;font-weight:700;
  letter-spacing:.04em;padding:4px 9px;border-radius:6px;backdrop-filter:blur(4px)}
.cat-card-body{padding:13px 15px 15px}
.cat-card-name{font-family:var(--serif);font-size:18px;font-weight:600;margin-bottom:3px}

/* Page catÃ©gorie â€” banniÃ¨re de fond + photo Ã  gauche */
.cat-hero{position:relative;border-radius:8px;overflow:hidden;margin:0 0 26px;padding:38px 34px;
  background:linear-gradient(120deg,#16161f,#0e0e14);background-size:cover;background-position:center;border:1px solid var(--line)}
.cat-hero-inner{display:flex;align-items:center;gap:28px}
.cat-photo img,.cat-photo-ph{width:150px;height:150px;border-radius:8px;object-fit:cover;flex:none;
  border:3px solid rgba(255,255,255,.9);box-shadow:0 16px 40px -16px rgba(0,0,0,.7)}
.cat-photo-ph{display:flex;align-items:center;justify-content:center;font-family:var(--serif);font-size:64px;font-weight:700;
  color:#fff;background:linear-gradient(135deg,var(--accent),#7a1018)}
/* Le bandeau catÃ©gorie a TOUJOURS un fond sombre (les 2 thÃ¨mes) â†’ texte clair d'office. */
.cat-meta{color:#fff}
.cat-kicker{text-transform:uppercase;letter-spacing:.14em;font-size:18px;font-weight:800;color:#ff8a93;margin-bottom:8px}
.cat-meta h1{font-family:var(--serif);font-weight:600;letter-spacing:-.5px;font-size:38px;margin:0 0 8px;color:#fff}
.cat-desc{max-width:640px;color:rgba(255,255,255,.85);margin:0 0 16px}
.cat-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.cat-stats{font-size:14px;color:rgba(255,255,255,.82)}
.cat-stats strong{color:#fff}

/* Modale de connexion */
body.modal-open{overflow:hidden}
.modal{position:fixed;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;padding:20px}
.modal[hidden]{display:none}
/* Modale de connexion : titre + lien Â« Devenir membre Â» en rouge (accent) */
#loginModal h2{color:var(--accent)}
#loginModal p a{color:var(--accent);font-weight:700;text-decoration:underline;text-underline-offset:2px}
#loginModal p a:hover{opacity:.85}
.modal-backdrop{position:absolute;inset:0;background:rgba(6,6,10,.72);backdrop-filter:blur(4px)}
.modal-card{position:relative;width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line2);
  border-radius:8px;padding:30px 28px 24px;box-shadow:0 40px 90px -30px rgba(0,0,0,.8);animation:modalIn .18s ease}
@keyframes modalIn{from{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:none}}
.modal-card h2{font-size:24px;margin:0 0 6px}
.modal-card .form{margin-top:18px}
.modal-x{position:absolute;top:12px;right:12px;background:transparent;border:0;color:var(--mut);font-size:18px;cursor:pointer;
  width:32px;height:32px;border-radius:5px;line-height:1}
.modal-x:hover{background:var(--panel2);color:var(--txt)}

/* Liens lÃ©gaux du footer */
.footer-legal{flex-basis:100%;color:var(--mut);line-height:1.6}
.footer-legal a{color:var(--txt);font-weight:600;text-decoration:underline;text-underline-offset:2px}
.footer-legal a:last-child{margin-left:14px}

/* Modale bloquante Â« contenu sensible Â» (Ã¢ge) */
body.age-locked{overflow:hidden}
/* Blocage optionnel des pages de diffusion (rÃ©glage back-office) : contenu masquÃ© derriÃ¨re la modale. */
body.content-gated{overflow:hidden}
body.content-gated main{filter:blur(7px);pointer-events:none;user-select:none}
.modal.content-gate{z-index:190}
.modal.content-gate .modal-backdrop{background:rgba(4,4,8,.9);backdrop-filter:blur(8px)}
.modal.content-gate .modal-card h2{color:var(--accent)}
.gate-register{color:var(--accent)!important;font-weight:700}
.age-gate{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:20px;
  background:rgba(4,4,8,.9);backdrop-filter:blur(8px)}
/* Carte ÉLARGIE et raccourcie. En 480 px de large, la mention légale française
   s'étirait sur près de six cents pixels de haut : sur un portable, le bouton
   « Entrer » passait sous la ligne de flottaison. La hauteur est reprise sur
   trois postes — l'icône passe à côté du titre au lieu d'être au-dessus, les
   marges entre paragraphes se resserrent, et les deux boutons se rangent
   côte à côte. */
.age-card{width:100%;max-width:720px;background:var(--panel);border:1px solid var(--line2);border-radius:14px;
  padding:26px 32px 24px;text-align:left;box-shadow:0 50px 110px -30px rgba(0,0,0,.85);animation:modalIn .2s ease}
/* Icône et titre sur une même ligne : une soixantaine de pixels regagnés, et le
   pictogramme reste ce qu'on voit en premier. */
.age-head{display:flex;align-items:center;gap:14px;margin:0 0 14px}
.age-ic{font-size:38px;line-height:1;flex:0 0 auto}
.age-card h2{font-size:22px;line-height:1.25;margin:0}
/* Texte aligné à gauche : centrer un paragraphe de sept cents pixels rend
   chaque retour à la ligne difficile à suivre. */
.age-card p{color:var(--txt);line-height:1.5;margin:0 0 9px;font-size:14.5px}
.age-card p:last-of-type{margin-bottom:0}
.age-card p.muted{color:var(--mut)}
.age-card a{color:var(--accent2);font-weight:600}
/* Boutons en ligne. « Entrer » occupe l'espace disponible, « Quitter » reste
   à sa taille : le geste par défaut se voit, l'autre reste accessible sans
   inviter au clic. */
.age-actions{display:flex;gap:12px;margin-top:18px;align-items:center}
.age-actions .btn{justify-content:center}
.age-actions .btn.primary{flex:1 1 auto}
.age-actions .btn.ghost{flex:0 0 auto;padding-left:22px;padding-right:22px}
/* Sous 560 px, la largeur manque : on retrouve l'empilement, qui reste le plus
   sûr au pouce. */
@media (max-width:560px){
  .age-card{padding:22px 20px 20px}
  .age-head{gap:11px}
  .age-ic{font-size:32px}
  .age-card h2{font-size:19px}
  .age-actions{flex-direction:column;align-items:stretch}
  .age-actions .btn.ghost{padding-left:14px;padding-right:14px}
}

/* Pages lÃ©gales / informatives */
.legal-page{max-width:none}
.legal-page h2{font-size:19px;margin:26px 0 8px}
.legal-page p,.legal-page li{color:var(--txt);line-height:1.65}
.legal-page ul{margin:8px 0 8px 20px}
.legal-page li{margin-bottom:6px}
.legal-page a{color:var(--accent2);font-weight:600}

/* Onglet e-mails (admin) */
.form-2col{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media (max-width:640px){.form-2col{grid-template-columns:1fr}}
/* Trois colonnes pour les champs courts (taille, poids, oui/non) : les aligner par deux
   étirait un menu « Oui / Non » sur la moitié de l'écran. */
.form-3col{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.form-3col > *{min-width:0}
@media (max-width:900px){.form-3col{grid-template-columns:1fr 1fr}}
@media (max-width:640px){.form-3col{grid-template-columns:1fr}}
.tpl-block{border:1px solid var(--line);border-radius:8px;padding:14px 16px;margin:12px 0}
.tpl-block legend{padding:0 8px;font-weight:700;color:var(--txt)}
.tpl-block textarea{font-family:inherit}
.tag-add-form{margin-bottom:16px}
.tag-add-row{display:flex;gap:10px;margin-top:6px}
.tag-add-row input{flex:1}

/* Cases Ã  cocher multi-catÃ©gories (upload / Ã©dition) */
.checks{display:flex;flex-wrap:wrap;gap:0;margin-top:6px}
.check{display:inline-flex;align-items:center;gap:7px;background:var(--field);border:1px solid var(--line);
  border-radius:6px;padding:7px 13px;cursor:pointer;font-weight:600;font-size:13px;margin:4px;transition:.15s;flex:none}
.check:hover{border-color:var(--line2)}
.check input[type=checkbox]{flex:none;width:16px;height:16px;min-width:0;margin:0;padding:0;accent-color:var(--accent);cursor:pointer}
.check:has(input:checked){border-color:var(--accent);background:rgba(225,29,42,.12);color:var(--txt)}

/* Back-office â€” gestion des catÃ©gories */
.inline-add{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.inline-add input:not([type=checkbox]),.inline-add select{flex:1;min-width:200px;margin:0;background:var(--field);border:1px solid var(--line);
  border-radius:6px;color:var(--txt);padding:12px 14px;font-family:inherit;font-size:15px;line-height:1.3;outline:none}
.inline-add .desc-wide{flex:2.6}
.inline-add input:focus,.inline-add select:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.inline-add input::placeholder{color:var(--mut2)}
.inline-add .btn{flex:none;padding:12px 20px}
/* SÃ©lection de photos sans album Ã  la crÃ©ation d'un album */
.cat-admin-search{margin:0 0 18px}
.dup-warn{color:var(--accent2);font-size:13px;font-weight:700;margin-top:10px}
.dup-warn[hidden]{display:none}
/* Encart Â« ProblÃ¨mes dÃ©tectÃ©s Â» de la page Tags */
.tag-problems{border-color:rgba(225,29,42,.35);background:rgba(225,29,42,.05)}
.tag-prob-list{list-style:none;margin:8px 0 16px;padding:0;display:flex;flex-direction:column;gap:7px;max-height:320px;overflow:auto}
.tag-prob-list li{font-size:13.5px;line-height:1.5;padding-bottom:7px;border-bottom:1px solid var(--line)}
.tag-prob-list li:last-child{border-bottom:0}
.tag-prob-list code{background:var(--field);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12px}
.tag-prob-tag{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;
  border-radius:999px;padding:2px 9px;margin-right:6px;background:rgba(255,255,255,.08);border:1px solid var(--line);color:var(--mut)}
.tag-prob-tag.is-dup{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent;color:#fff}
.tag-prob-ok{color:var(--ok,#22a35a);font-weight:700;font-size:14px;margin:6px 0 18px}
.album-photo-pick{margin-top:14px;border:1px solid var(--line);border-radius:8px;padding:12px 14px;background:var(--field)}
.album-photo-pick summary{cursor:pointer;font-weight:700;color:var(--txt);list-style:revert}
.app-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0 10px}
.app-tools{display:flex;gap:8px}
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(94px,1fr));gap:8px;max-height:340px;overflow:auto;padding:2px}
.app-item{position:relative;cursor:pointer;border-radius:7px;overflow:hidden;aspect-ratio:1;border:2px solid transparent;background:var(--panel)}
.app-item img{width:100%;height:100%;object-fit:cover;display:block}
.app-item input{position:absolute;opacity:0;pointer-events:none}
.app-tick{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:50%;background:rgba(0,0,0,.5);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;opacity:0;transition:.12s}
.app-item:has(input:checked){border-color:var(--accent)}
.app-item:has(input:checked) .app-tick{opacity:1;background:var(--accent)}
.app-item:has(input:checked) img{filter:brightness(.68)}

/* Ã‰tat vide gÃ©nÃ©rique (listes) */
.empty-state{text-align:center;padding:40px 20px;color:var(--mut);background:var(--panel);border:1px dashed var(--line2);border-radius:8px}
.empty-state .es-ic{font-size:36px;display:block;margin-bottom:8px;opacity:.6}
.empty-state .es-msg{font-size:15px}
.empty-state .es-action{margin-top:16px}
/* Un Ã©tat vide dans une grille s'Ã©tale sur toute la largeur et reste centrÃ©. */
.grid>.empty-state,.grid-empty{grid-column:1/-1}
.grid>.muted{grid-column:1/-1;text-align:center;padding:34px 20px}
.cat-admin-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:18px}
.cat-admin{padding:15px 15px 16px}
.cat-admin-head{margin-bottom:11px}
/* Nom de catÃ©gorie en rouge, bien lisible. */
.cat-admin-name{font-family:var(--serif);font-size:18px;font-weight:700;color:var(--accent);line-height:1.25}
.cat-admin-previews{display:grid;grid-template-columns:80px 1fr;gap:10px;margin-bottom:14px}
.prev{background:var(--field);border:1px solid var(--line);border-radius:6px;overflow:hidden}
.prev img{width:100%;height:80px;object-fit:cover}
.prev.wide img{height:80px}
.prev-lbl{font-size:11px;color:var(--mut);padding:5px 8px;border-bottom:1px solid var(--line)}
.prev-empty{height:80px;display:flex;align-items:center;justify-content:center;color:var(--mut2);font-size:12px}
.cat-visuals-reload{grid-column:1/-1;margin:0}
.cat-visuals-btn{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--mut);background:var(--field);border:1px solid var(--line);border-radius:6px;padding:5px 10px;cursor:pointer;transition:color .15s,border-color .15s}
.cat-visuals-btn:hover{color:var(--accent);border-color:var(--accent)}
.cat-visuals-btn svg{flex:none}
.pill{display:inline-block;font-size:11px;font-weight:700;color:var(--txt);background:var(--field);border:1px solid var(--line2);border-radius:6px;padding:2px 8px;vertical-align:middle}

html[data-theme="light"] .cat-card,html[data-theme="light"] .modal-card,html[data-theme="light"] .cat-hero{border-color:#e6e3da}
html[data-theme="light"] .check:has(input:checked){color:var(--accent)}

/* =====================================================================
   Liens Â« Tout voir Â» (see-all) â€” pilule dÃ©gradÃ©e animÃ©e
   ===================================================================== */
/* Boutons Â« Tout voir Â» : jolis boutons rouges pleins */
.see-all{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:12.5px;letter-spacing:.04em;
  text-transform:uppercase;color:#fff;padding:8px 18px;border-radius:8px;border:1px solid transparent;
  background:linear-gradient(120deg,var(--accent),#b3141f);transition:.16s;white-space:nowrap}
.see-all:hover{color:#fff;filter:brightness(1.08);transform:translateY(-1px)}
.see-all:active{transform:translateY(0)}
.see-all .arr{transition:transform .2s}
.see-all:hover .arr{transform:translateX(4px)}
.cat-all.see-all{justify-content:center;width:100%;margin-top:12px}
html[data-theme="light"] .see-all,html[data-theme="light"] .see-all:hover{color:#fff;border-color:transparent;background:linear-gradient(120deg,var(--accent),#b3141f)}

/* =====================================================================
   Galerie photos/vidÃ©os â€” colonne latÃ©rale (tri + catÃ©gories)
   ===================================================================== */
.browse{display:grid;grid-template-columns:230px 1fr;gap:26px;align-items:start}
.browse.has-ads{grid-template-columns:230px 1fr var(--ad-col)}
/* Repli anti-trou : reflow.js pose .rail-off quand l'encart latéral n'est pas rendu (bloqueur
   de pub ou zone vide) ; on récupère la colonne réservée pour le contenu. Pas d'évasion. */
.browse.has-ads.rail-off{grid-template-columns:230px 1fr}
.browse.has-ads.rail-off .browse-ads{display:none}
.browse-ads{position:sticky;top:18px}
@media(max-width:1100px){.browse.has-ads{grid-template-columns:230px 1fr}.browse-ads{display:none}}
/* MÃªme raison que .home-side : la liste des catÃ©gories dÃ©passe l'Ã©cran, on la laisse dÃ©filer. */
.browse-side{display:flex;flex-direction:column;gap:18px}
.side-block{background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}
.side-h{font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);
  padding:13px 16px 9px}
.sortlist,.catlist2{list-style:none;margin:0;padding:0 8px 10px}
.sortopt,.catlist2 a{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:5px;font-weight:600;
  font-size:14px;color:var(--txt);transition:.13s}
.sortopt-ic{width:22px;text-align:center;color:var(--mut);font-size:15px}
.sortopt:hover,.catlist2 a:hover{background:rgba(225,29,42,.11);color:var(--accent)}
.sortopt:hover .sortopt-ic{color:var(--accent)}
.sortopt.on{background:linear-gradient(120deg,var(--accent),#b3141f);color:#fff}
.sortopt.on .sortopt-ic{color:#fff}
.catlist2 a{justify-content:space-between}
.catlist2 a>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.catlist2-n{flex:none;font-size:12px;font-weight:700;color:var(--mut);background:var(--field);border:1px solid var(--line);
  border-radius:6px;padding:1px 9px;min-width:30px;text-align:center}
.catlist2 a.on{color:#fff;background:linear-gradient(120deg,var(--accent),#b3141f)}
.catlist2 a.on .catlist2-n{border-color:rgba(255,255,255,.5);color:#fff;background:rgba(255,255,255,.15)}
/* AccordÃ©on Â« Afficher plus Â» des catÃ©gories (20 visibles par dÃ©faut) */
.catlist2 .cat-extra{display:none}
.catlist2.expanded .cat-extra{display:block}
.cat-more-btn{display:block;width:calc(100% - 16px);margin:2px 8px 12px;padding:8px 10px;background:var(--field);
  border:1px solid var(--line);border-radius:6px;color:var(--accent);font-weight:700;font-size:13px;cursor:pointer;text-align:center;transition:.13s}
.cat-more-btn:hover{border-color:var(--accent);background:rgba(225,29,42,.08)}
.cat-more-btn .cmb-less{display:none}
.cat-more-btn[aria-expanded="true"] .cmb-more{display:none}
.cat-more-btn[aria-expanded="true"] .cmb-less{display:inline}
html[data-theme="light"] .side-block{border-color:#e6e3da}
.browse-main{min-width:0}

/* Pays de connexion (admin > membres) */
.geo{display:inline-flex;align-items:center;gap:7px;font-weight:600}
.geo-flag{font-size:18px;line-height:1}

/* Double curseur de durÃ©e (page vidÃ©os) */
.dur{margin-top:2px;padding:0 16px 14px}
.dur-track{position:relative;height:30px;display:flex;align-items:center}
.dur-track::before{content:"";position:absolute;left:0;right:0;height:6px;top:50%;transform:translateY(-50%);background:var(--line2);border-radius:4px}
.dur-fill{position:absolute;height:6px;top:50%;transform:translateY(-50%);background:var(--accent);border-radius:4px}
.dur-track input[type=range]{position:absolute;left:0;right:0;top:0;width:100%;height:30px;margin:0;-webkit-appearance:none;appearance:none;background:transparent;pointer-events:none}
.dur-track input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;pointer-events:all;width:18px;height:18px;border-radius:5px;background:var(--accent);border:2px solid #fff;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.5)}
.dur-track input[type=range]::-moz-range-thumb{pointer-events:all;width:16px;height:16px;border-radius:5px;background:var(--accent);border:2px solid #fff;cursor:pointer}
.dur-scale{display:flex;justify-content:space-between;font-size:10px;color:var(--mut);margin-top:5px;padding:0 2px}
.dur-readout{display:flex;justify-content:space-between;align-items:center;margin-top:9px}
.dur-readout #durLabel{font-weight:700;font-size:13px}
.dur-reset{font-size:12px;font-weight:600;color:var(--accent)}
.dur-badge{top:auto;left:auto;right:9px;bottom:9px;background:rgba(0,0,0,.82);color:#fff}

/* Back-office : liste des mÃ©dias, recherche, commentaires supprimables, entÃªte catÃ©gorie */
.admin-search{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
.admin-bulkbar{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
/* SÃ©lecteur Â« par page Â» du back-office, alignÃ© Ã  droite au-dessus de la liste */
/* Rubriques Photos / VidÃ©os du back-office (catÃ©gories). */
.kind-tabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 16px}
.kind-tab{display:inline-flex;align-items:center;gap:8px;padding:8px 15px;border:1px solid var(--line);
  border-radius:999px;background:var(--field);color:var(--mut);font-size:13.5px;font-weight:700;transition:.14s}
.kind-tab:hover{border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.08)}
.kind-tab.on{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent;color:#fff}
.kind-tab-n{font-size:12px;font-weight:800;background:rgba(255,255,255,.09);border-radius:999px;padding:1px 8px}
.kind-tab.on .kind-tab-n{background:rgba(255,255,255,.22)}
.kind-tab-note{margin-left:6px}

/* Page de contribution Ã  l'album d'un autre membre. */
.contrib-head{display:flex;justify-content:space-between;align-items:flex-start;gap:22px;flex-wrap:wrap;
  padding:18px 20px;margin-bottom:18px;border-radius:12px;
  background:rgba(62,166,109,.07);border:1px solid rgba(62,166,109,.32)}
.ch-kicker{font-size:11.5px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:#4ec98a;margin-bottom:6px}
.ch-main h2{margin:0 0 10px;font-size:24px}
.ch-main .album-byline{margin:0}
.ch-note{max-width:390px;margin:0;line-height:1.55}
html[data-theme="light"] .contrib-head{background:rgba(31,122,72,.07);border-color:rgba(31,122,72,.3)}
html[data-theme="light"] .ch-kicker{color:#1f7a48}

.contrib-gallery-head{margin-top:26px}
.contrib-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.cg-item{position:relative;margin:0;background:var(--panel);border:1px solid var(--line);
  border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
.cg-item img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;background:var(--field)}
.cg-item figcaption{padding:7px 9px;font-size:12.5px;color:var(--mut);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* RepÃ©rer ses propres dÃ©pÃ´ts au milieu de ceux des autres. */
.cg-item.is-mine{border-color:rgba(62,166,109,.55)}
.cg-badge{position:absolute;top:7px;left:7px;padding:2px 8px;border-radius:99px;
  background:rgba(62,166,109,.92);color:#fff;font-size:10.5px;font-weight:800;letter-spacing:.02em}
.cg-status{position:absolute;top:7px;right:7px;padding:2px 8px;border-radius:99px;
  background:rgba(0,0,0,.7);color:#fbbf24;font-size:10.5px;font-weight:800}

/* Renommage d'une catÃ©gorie : nom et rubrique sur une mÃªme ligne. */
/* Formulaire d'Ã©dition de catÃ©gorie : champs compacts et denses. */
.cat-admin .form>*+*{margin-top:10px}
.form label.cat-f{display:block;font-size:9.5px;font-weight:600;color:var(--mut);margin-bottom:0;text-transform:uppercase;letter-spacing:.03em}
.cat-admin .form .cat-f input,
.cat-admin .form .cat-f select,
.cat-admin .form .cat-f textarea{width:100%;margin-top:4px;font-size:13px;padding:7px 9px;font-weight:400;color:var(--txt)}
.cat-admin .form .cat-f select{cursor:pointer}
.cat-admin .form .cat-f input[type=file]{font-size:12px;padding:5px 0}
/* Rubrique Â· Affichage Â· Prix (et les deux images) alignÃ©s en colonnes Ã©gales. */
.cat-rename-selects{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.cat-f-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:12px}
.cat-f-foot code{font-size:11.5px}
@media(max-width:520px){.cat-rename-selects{grid-template-columns:1fr}}
/* CatÃ©gorie masquÃ©e : carte estompÃ©e + liserÃ© rouge, repÃ©rable au premier coup d'Å“il. */
.cat-admin.cat-hidden{opacity:.72;border-color:rgba(225,29,42,.4)}
.cat-admin.cat-hidden:hover{opacity:1}
.cat-admin-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end;margin-left:auto}
.cat-mask-wrap{display:inline-flex;align-items:center;gap:4px;font-size:13px;white-space:nowrap}
.cat-mask-scope{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--fg);padding:5px 6px;font-size:13px}
@media(max-width:560px){.cat-rename{grid-template-columns:1fr}.cat-admin-actions{flex-direction:column}}

/* Stockage : une ligne par type de mÃ©dia (back-office â†’ ParamÃ©trage). */
.storage-split{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-bottom:6px}
.st-row{background:var(--field);border:1px solid var(--line);border-radius:10px;padding:14px 16px}
.st-row label{margin-bottom:0}
.st-state{margin:8px 0 0;line-height:1.5}
.st-state code{font-size:12px;word-break:break-all}
@media(max-width:820px){.storage-split{grid-template-columns:1fr}}

/* Zone de dÃ©pÃ´t d'un fichier vidÃ©o (page Â« Publier une vidÃ©o Â»). */
.vdrop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  min-height:150px;padding:24px 20px;text-align:center;cursor:pointer;
  border:2px dashed var(--line2);border-radius:12px;background:var(--field);transition:.16s}
.vdrop:hover{border-color:var(--accent);background:rgba(225,29,42,.05)}
.vdrop.over{border-color:var(--accent);background:rgba(225,29,42,.11);transform:scale(1.005)}
.vdrop.has-file{border-style:solid;border-color:rgba(34,197,94,.5);background:rgba(34,197,94,.07)}
.vdrop-ic{font-size:30px;color:var(--accent);line-height:1}
.vdrop.has-file .vdrop-ic{color:#4ade80}
.vdrop-txt{font-size:14.5px;line-height:1.55;font-weight:600}
.vdrop-fmt{font-size:11.5px;font-weight:800;letter-spacing:.08em;color:var(--mut);text-transform:uppercase}
.vdrop-file{display:block;font-size:13.5px;font-weight:700;color:#7ee0a6;
  word-break:break-all;padding:6px 12px;border-radius:7px;background:rgba(0,0,0,.18)}
/* Progression d'un envoi vidÃ©o â€” l'attente peut dÃ©passer l'heure. */
.vup-progress{margin:18px 0 6px;padding:16px 18px;border:1px solid var(--line);border-radius:12px;background:var(--field)}
.vup-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:9px;
  font-size:14px;font-weight:700}
.vup-pct{font-family:var(--serif);font-size:20px;font-variant-numeric:tabular-nums}
.vup-track{height:10px;border-radius:99px;background:rgba(255,255,255,.09);overflow:hidden}
.vup-bar{height:100%;width:0;border-radius:99px;background:linear-gradient(90deg,var(--accent),#ff5a63);
  transition:width .25s ease-out}
.vup-meta{display:flex;justify-content:space-between;gap:12px;margin-top:8px;font-size:12.5px;
  color:var(--mut);font-variant-numeric:tabular-nums}
.vup-warn{margin:10px 0 0}
/* Transfert fini, serveur au travail : la barre s'anime pour montrer que Ã§a vit encore. */
.vup-working .vup-bar{width:100%!important;
  background:linear-gradient(90deg,var(--accent),#ff5a63,var(--accent));background-size:200% 100%;
  animation:vupflow 1.2s linear infinite}
@keyframes vupflow{from{background-position:0 0}to{background-position:200% 0}}
.vup-error{border-color:rgba(225,29,42,.5);background:rgba(225,29,42,.08)}
.vup-error .vup-bar{background:var(--accent);animation:none}

/* Champ qui vient d'Ãªtre rempli automatiquement : un bref halo pour le repÃ©rer. */
.field-flash{animation:fieldflash 1.6s ease-out}
@keyframes fieldflash{
  0%,60%{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.2)}
  100%{border-color:var(--line);box-shadow:none}
}

/* Poids du site & sauvegardes (tableau de bord du back-office). */
.stor-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:22px}
.stor-grid > *{min-width:0}
.stor-panel{margin-bottom:0;min-width:0}
.stor-legend li{min-width:0}
.stor-legend li span:not(.sl-dot){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bk-list li{min-width:0}
.bk-list a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stor-big{display:flex;align-items:baseline;gap:8px;margin:2px 0 16px}
.stor-n{font-family:var(--serif);font-size:44px;font-weight:600;line-height:1;letter-spacing:-1.5px}
.stor-u{font-size:16px;font-weight:800;color:var(--mut)}
.stor-bar{display:flex;height:10px;border-radius:99px;overflow:hidden;background:var(--field);margin-bottom:14px}
.stor-bar span{height:100%}
.sb-a{background:var(--accent)} .sb-b{background:#5b6bd6} .sb-c{background:#c9a45e}
.sb-d{background:#3f8f6a} .sb-e{background:#6b7080}
.stor-legend{list-style:none;margin:0 0 12px;padding:0;display:flex;flex-direction:column;gap:7px}
.stor-legend li{display:flex;align-items:center;gap:9px;font-size:13.5px}
.stor-legend b{margin-left:auto;font-variant-numeric:tabular-nums}
.sl-dot{width:10px;height:10px;border-radius:3px;flex:none}
.bk-state{padding:9px 13px;border-radius:8px;font-size:13.5px;font-weight:600;margin-bottom:14px;
  border:1px solid var(--line);background:var(--field)}
.bk-state.ok{border-color:rgba(34,197,94,.4);background:rgba(34,197,94,.08);color:#7ee0a6}
.bk-state.warn{border-color:rgba(251,191,36,.42);background:rgba(251,191,36,.09);color:#fbbf24}
.bk-state.bad{border-color:rgba(225,29,42,.45);background:rgba(225,29,42,.10);color:#ff8790}
.bk-list{list-style:none;margin:0 0 10px;padding:0}
.bk-list li{display:flex;align-items:center;gap:10px;padding:7px 0;border-top:1px solid var(--line);font-size:13.5px}
.bk-list li:first-child{border-top:0}
.bk-list a{font-weight:700}
.bk-list a:hover{color:var(--accent)}
.bk-acts{margin-left:auto;display:flex;align-items:center;gap:2px}
.bk-acts form{margin:0}
.bk-restore{font-size:15px;line-height:1}
.bk-restore:hover{color:var(--accent);background:rgba(225,29,42,.1)}
.bk-restore-legend{color:var(--accent);font-weight:700}
@media(max-width:900px){.stor-grid{grid-template-columns:1fr}}

/* Conseils avant prod : catÃ©gories actives peu fournies (back-office â†’ Liens de diffusion). */
.advice-panel{border-color:rgba(251,191,36,.4);background:rgba(251,191,36,.05)}
.advice-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;margin-top:6px}
.advice-cat{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--field)}
.advice-cat.is-empty{border-color:rgba(225,29,42,.4)}
.advice-cat .ac-n{flex:none;min-width:38px;height:38px;border-radius:8px;display:flex;align-items:center;justify-content:center;
  font-family:var(--serif);font-size:18px;font-weight:600;background:var(--panel);border:1px solid var(--line)}
.advice-cat.is-empty .ac-n{color:var(--accent);border-color:rgba(225,29,42,.45)}
.advice-cat .ac-info{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.35}
.advice-cat .ac-info a{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.advice-cat .ac-info a:hover{color:var(--accent)}

/* RÃ©partition des sources Ã  lien stable (back-office â†’ Liens de diffusion). */
.host-list{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 20px}
.host-h{font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.host-chip{display:inline-flex;align-items:center;gap:8px;padding:5px 12px;border-radius:999px;
  background:var(--field);border:1px solid var(--line);font-size:13px;font-weight:600}
.host-chip b{font-size:12px;color:var(--accent)}

/* Champ Â« page d'origine Â» + Ã©tat du lien de diffusion (Ã©dition d'une vidÃ©o). */
.src-field .src-state{margin-top:8px;padding:10px 13px;border-radius:8px;font-size:13.5px;line-height:1.5;
  border:1px solid var(--line);background:var(--field)}
.src-field .src-state.ok{border-color:rgba(34,197,94,.4);background:rgba(34,197,94,.08);color:#7ee0a6}
.src-field .src-state.warn{border-color:rgba(251,191,36,.42);background:rgba(251,191,36,.09);color:#fbbf24}
.src-field .src-state.bad{border-color:rgba(225,29,42,.45);background:rgba(225,29,42,.10);color:#ff8790}
.src-hint{display:block;margin-top:4px;color:var(--mut);font-weight:600}

/* Bandeau Â« liens de diffusion cassÃ©s Â» en tÃªte des listes de vidÃ©os. */
.broken-links{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  margin:0 0 20px;padding:14px 18px;border-radius:10px;
  background:rgba(225,29,42,.09);border:1px solid rgba(225,29,42,.34)}
.bl-txt{display:flex;flex-direction:column;gap:3px;min-width:0}
.bl-txt b{font-size:14.5px}
.bl-actions{display:flex;gap:8px;align-items:center}

.admin-listhead{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.admin-listhead>h1{margin:0}
.admin-per{margin:0 0 12px auto;display:flex;justify-content:flex-end}
.admin-listhead .admin-per{margin:0}
.admin-per label{font-size:13px;color:var(--mut);font-weight:600;display:inline-flex;align-items:center;gap:8px}
/* Simulation de membre par l'admin : select dans la nav + banniÃ¨re */
.mitem-impersonate{display:flex;align-items:center}
.impersonate-form{margin:0}
.impersonate-select{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:6px 9px;font-family:inherit;font-size:13px;cursor:pointer;max-width:190px}
.impersonate-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.impersonate-bar{background:rgba(225,29,42,.1);border-bottom:1px solid rgba(225,29,42,.3)}
.impersonate-bar-inner{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:9px 0;flex-wrap:wrap;font-size:14px}
.impersonate-bar form{margin:0}
/* ===== Tableau de bord membre : sections aÃ©rÃ©es + cartes de gestion ===== */
.dash-sec{margin-top:36px}
.dash-head{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--line)}
.dash-head h2{margin:0;font-size:22px;display:flex;align-items:baseline;gap:8px}
.dash-n{color:var(--mut);font-weight:600;font-size:14px}
.dash-empty{color:var(--mut);background:var(--panel);border:1px dashed var(--line2);border-radius:10px;padding:20px;text-align:center;font-size:14px}
/* Pagination client des grilles du tableau de bord (gÃ©nÃ©rÃ©e par JS quand > 25 Ã©lÃ©ments) */
.dash-pagebar{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin:0 0 14px}
.dash-per{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--mut)}
.dash-per select{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);
  font-family:var(--sans);font-size:13px;font-weight:600;padding:5px 8px;cursor:pointer}
.dash-per-total{font-size:12px}
.dash-pager{display:flex;align-items:center;justify-content:center;gap:16px;margin:18px 0 4px}
/* Appel Ã  l'action des Ã©tats vides : en rouge accent pour Ãªtre repÃ©rable. */
.dash-empty a{color:var(--accent);font-weight:700;text-decoration:underline;text-underline-offset:3px}
.dash-empty a:hover{color:var(--accent2)}
.mgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}
.mcard{position:relative;background:var(--panel);border:1px solid var(--line);border-radius:11px;overflow:hidden;display:flex;flex-direction:column}
.mcard-thumb{position:relative;display:block;aspect-ratio:16/10;background:var(--field)}
.mcard-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.mcard-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;display:flex;align-items:center;justify-content:center;font-size:15px}
.mcard-badge{position:absolute;top:8px;right:8px;font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;background:rgba(0,0,0,.6);color:#fff}
.mcard-badge.pending{background:#b7791f}.mcard-badge.rejected{background:var(--accent)}
.mcard-pick{position:absolute;top:8px;left:8px;z-index:2;background:rgba(255,255,255,.9);border-radius:5px;padding:2px;line-height:0}
.mcard-pick input{width:18px;height:18px;cursor:pointer;margin:0}
.mcard-body{padding:10px 12px;display:flex;flex-direction:column;gap:6px;flex:1}
.mcard-title{font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mcard-cats{display:flex;flex-wrap:wrap;gap:5px}
.mc-cat{font-size:11px;background:var(--field);border:1px solid var(--line);border-radius:20px;padding:2px 8px;color:var(--mut);white-space:nowrap}
.mc-cat-none{font-style:italic;opacity:.75}
.mcard-meta{font-size:12px;color:var(--mut);margin-top:auto}
/* ChaÃ®ne oÃ¹ le mÃ©dia est rangÃ© (carte du tableau de bord) */
.mcard-chan{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--mut);min-width:0}
.mcard-chan .ico{color:var(--accent);flex:none}
.mcard-chan>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mcard-chan a{color:var(--mut);font-weight:600}
.mcard-chan a:hover{color:var(--accent)}
.mcard-actions{display:flex;gap:8px;flex-wrap:wrap;padding:10px 12px;border-top:1px solid var(--line)}
.mcard-actions .btn{flex:1 1 auto;justify-content:center;text-align:center}
.mcard-actions form{flex:1 1 auto;margin:0}.mcard-actions form .btn{width:100%}
.assign-bar{display:flex;align-items:center;gap:16px;flex-wrap:wrap;background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:10px 14px;margin-bottom:14px}
.assign-bar .check{margin:0}
.assign-form{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0}
.ch-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px}
.ch-card{background:var(--panel);border:1px solid var(--line);border-radius:11px;padding:12px;display:flex;flex-direction:column;gap:12px}
.ch-card-main{display:flex;gap:12px;align-items:center}
.ch-av{width:46px;height:46px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:19px;flex:none}
.ch-info{min-width:0}.ch-name{font-weight:600;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ch-actions{display:flex;gap:8px}.ch-actions .btn{flex:1;text-align:center}.ch-actions form{flex:1;margin:0}.ch-actions form .btn{width:100%}
/* ===== Page album : en-tÃªte + colonne de droite (suggestions) ===== */
/* Trois Ã©tages lisibles : identitÃ© (titre + auteur), description, puis UNE barre d'outils.
   Auparavant cinq contrÃ´les hÃ©tÃ©rogÃ¨nes (bouton, select, lien) se disputaient la ligne du titre. */
.album-title{font-family:var(--serif);font-weight:600;letter-spacing:-.4px;font-size:32px;margin:0 0 10px;line-height:1.15}
.album-byline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px}
.byl-owner,.byl-chip{display:inline-flex;align-items:center;gap:7px;height:28px;padding:0 12px;
  border:1px solid var(--line);border-radius:20px;background:var(--field);
  font-size:13px;font-weight:700;color:var(--mut);white-space:nowrap}
.byl-owner{color:var(--txt);transition:.15s}
.byl-owner:hover{border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.07)}
.byl-owner .ico{color:var(--mut)}
.byl-owner:hover .ico{color:var(--accent)}
.byl-private{border-color:rgba(225,29,42,.45);background:rgba(225,29,42,.10);color:var(--accent)}
/* Album ouvert aux contributions : vert et pointillÃ© â€” une invitation, pas une action
   d'administration. Le pointillÃ© reprend le langage des zones de dÃ©pÃ´t du site. */
.byl-contrib{border-style:dashed;border-color:rgba(62,166,109,.55);background:rgba(62,166,109,.10);color:#4ec98a;transition:.15s}
a.byl-contrib:hover{border-style:solid;background:rgba(62,166,109,.2);color:#7ee0a6}
.byl-contrib .ico{color:currentColor}
.byl-plus{font-size:14px;line-height:1;margin-left:1px;opacity:.75}
a.byl-contrib:hover .byl-plus{opacity:1}
.byl-contrib-info{opacity:.85;cursor:default}
html[data-theme="light"] .byl-contrib{color:#1f7a48;border-color:rgba(31,122,72,.5);background:rgba(31,122,72,.09)}
html[data-theme="light"] a.byl-contrib:hover{background:rgba(31,122,72,.16);color:#15603a}
.album-desc{margin:0 0 18px;max-width:760px;line-height:1.55}

/* Barre d'outils : rÃ©actions Ã  gauche, actions Ã  droite, tout Ã  la mÃªme hauteur (36px). */
.album-toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  padding-top:14px;border-top:1px solid var(--line)}
.atb-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.atb-actions form{margin:0}
.tbtn{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;
  border:1px solid var(--line);border-radius:8px;background:var(--field);color:var(--txt);
  font-family:var(--sans);font-size:13.5px;font-weight:700;cursor:pointer;transition:.15s;white-space:nowrap}
.tbtn:hover{border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.07)}
.tbtn-primary{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent;color:#fff}
.tbtn-primary:hover{background:linear-gradient(120deg,var(--accent),#b3141f);border-color:transparent;color:#fff;filter:brightness(1.08)}
.tbtn-danger{border-color:rgba(225,29,42,.5);color:var(--accent);background:transparent}
.tbtn-danger:hover{background:var(--accent);border-color:transparent;color:#fff}
.tbtn-icon{padding:0;width:36px;justify-content:center}
.atb-actions .btn{height:36px;padding-top:0;padding-bottom:0;line-height:34px}
/* RÃ©actions Ã  la mÃªme hauteur que les actions ; on leur garde la forme en pilule,
   qui les distingue au premier coup d'Å“il des boutons d'action. */
.album-toolbar .reactbar .react,
.player-meta .reactbar .react{height:36px;padding:0 14px}
.ico{flex:none;vertical-align:-2px}
@media(max-width:640px){
  .album-toolbar{align-items:stretch;flex-direction:column}
  .atb-actions{justify-content:flex-start}
}
.album-layout{display:grid;grid-template-columns:1fr var(--ad-col);gap:30px;margin-top:24px;align-items:start}
.album-main{min-width:0}
.album-count-head{margin-bottom:16px}
/* Album : pagination centrÃ©e en bas du bloc de gauche (le sÃ©lecteur Â« par page Â» est en haut Ã  droite) */
.album-main .pagination-bar{justify-content:center}
.album-side{align-self:start} /* dÃ©file normalement avec le contenu (pas d'Ã©pinglage) */
.album-side h2{margin:24px 0 14px}
/* Â« De X Â» alignÃ© sur Â« N mÃ©dia(s) Â» : on reprend la hauteur de bloc du titre principal
   (25px Ã— 1.2 = 30px, puis 16px de marge). Le texte reste plus petit, centrÃ© dans ce bloc,
   si bien que les deux colonnes commencent exactement Ã  la mÃªme ligne. */
.album-side h2:first-child{margin:0 0 16px;line-height:30px}
@media(max-width:900px){.album-layout{grid-template-columns:1fr}.album-side{margin-top:8px}}
/* ===== Listing galerie : cartes photo & album de MÃŠME hauteur ===== */
.grid>.card,.grid>.album-cell{height:100%}
.grid>.card{display:flex;flex-direction:column}
.grid>.card>.card-body{flex:1 1 auto}
.grid>.album-cell>.album-card{height:100%;display:flex;flex-direction:column}
.grid>.album-cell>.album-card>.album-card-body{flex:1 1 auto}
.grid .album-card-cover{height:auto;aspect-ratio:16/10}
/* Les cartes internes remplissent la hauteur uniformisÃ©e par JS (equalizeGrids) sur l'accueil et les chaÃ®nes. */
.album-cards>.album-cell>.album-card{height:100%;display:flex;flex-direction:column}
.album-cards>.album-cell>.album-card>.album-card-body{flex:1 1 auto}
.chan-grid>.chan-card{display:flex;flex-direction:column}
.chan-grid>.chan-card>.chan-card-body{flex:1 1 auto}
/* ===== Onglets de catÃ©gorie Â« dossier Â» (VidÃ©os / Photos), pleine largeur ===== */
.cat-tabwrap{width:100%;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--panel);margin:4px 0 26px}
/* Les onglets doivent TOUJOURS tenir dans le cadre : ils se partagent la largeur, passent à la ligne
   si nécessaire, et leur libellé peut se replier sur deux lignes plutôt que déborder. */
.cat-tabs{display:flex;flex-wrap:wrap;width:100%;max-width:100%;background:var(--field);border-bottom:1px solid var(--line)}
.cat-tabs .cat-tab{flex:1 1 auto;min-width:0;justify-content:center;text-align:center;white-space:normal;overflow-wrap:anywhere}
.media-tabs{margin-bottom:16px;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.media-tabs .cat-tab:last-child{border-right:0}
.cat-tab{display:inline-flex;align-items:center;gap:9px;padding:15px 26px;font-weight:700;font-size:15px;color:var(--mut);
  border-right:1px solid var(--line);transition:.15s}
.cat-tab:hover{color:var(--accent)}
.cat-tab.on{background:var(--panel);color:var(--txt);margin-bottom:-1px} /* l'onglet actif recouvre la ligne et se Â« connecte Â» au panneau */
.cat-tab-n{font-size:12px;font-weight:600;background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:1px 9px;color:var(--mut)}
.cat-tab.on .cat-tab-n{background:var(--field);color:var(--txt)}
.cat-tabpanel{padding:22px 20px}
/* Le panneau a dÃ©jÃ  son padding : le 1er bloc ne rajoute pas de marge haute (sinon gros vide sous les onglets). */
.cat-tabpanel > :first-child{margin-top:0}
.cat-tabpanel > .dash-sec:first-child,.cat-tabpanel > .channel-section:first-child{margin-top:0}
/* Partage social : bouton Â« Partager Â» + menu dÃ©roulant (rÃ©utilise .dd/.dd-menu) */
.share-bar{margin:14px 0}
.share-toggle{display:inline-flex;align-items:center;gap:8px}
.share-ic{width:17px;height:17px;flex:none}
.share-menu{min-width:212px}
.share-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;background:none;border:0;color:var(--txt);padding:9px 10px;border-radius:6px;cursor:pointer;font-size:14px;font-weight:600;font-family:inherit;text-decoration:none}
.share-item:hover{background:var(--hover)}
.share-item .si{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;flex:none}
.share-item .si svg{width:20px;height:20px;display:block}
.si-x{color:var(--txt)}.si-fb{color:#1877f2}.si-wa{color:#25d366}.si-tg{color:#229ed9}.si-rd{color:#ff4500}.si-mail{color:var(--mut)}.si-link{color:var(--mut)}

/* =======================================================================
   HABILLAGE â€” appliquÃ© Ã  tout le front via la classe `dressed` du <body>.
   Aucune couleur d'accent n'est touchÃ©e : le rouge (boutons, filtres actifs,
   catÃ©gorie sÃ©lectionnÃ©eâ€¦) reste exactement le mÃªme.
   Tout est en CSS, rÃ©versible en supprimant ce bloc.
   ======================================================================= */

/* 3. Le fond n'est plus un aplat noir : halo trÃ¨s doux derriÃ¨re le haut de page. */
body.dressed{
  background:
    radial-gradient(1100px 460px at 50% -140px, rgba(225,29,42,.10), transparent 72%),
    linear-gradient(180deg, var(--bg2), var(--bg) 420px);
  background-attachment:fixed;
}

/* 1. Le conteneur devient PLUS SOMBRE que les cartes : elles s'en dÃ©tachent enfin
      (jusqu'ici conteneur et cartes partageaient exactement la mÃªme couleur). */
.dressed .home-main section,
.dressed .browse-main,
.dressed .album-top,
.dressed .album-main,
.dressed .legal-page{
  background:var(--bg2);border:1px solid var(--line);border-radius:14px;
  padding:20px 20px 22px;box-shadow:0 18px 44px -30px rgba(0,0,0,.9);
}
/* Onglets (catÃ©gories, tableau de bord, favoris, chaÃ®ne) : mÃªme principe,
   le conteneur passe sous la couleur des cartes qu'il contient. */
.dressed .cat-tabwrap{background:var(--bg2);box-shadow:0 18px 44px -30px rgba(0,0,0,.9)}
.dressed .cat-tabpanel{background:transparent}
.dressed .legal-page{padding:26px 28px 28px;background:var(--panel)}
/* L'en-tÃªte d'album n'a rien sous lui : on referme le cadre au ras du contenu. */
.dressed .album-top{padding-bottom:14px}
.dressed .album-top>*:last-child{margin-bottom:0}
.dressed .album-desc{margin-bottom:12px}
/* Les deux panneaux se suffisent : on resserre le filet â—† qui les sÃ©pare. */
.page-album .hr-sep{margin:16px 0}
.page-album .album-layout{margin-top:16px}
/* Â« De X Â» doit rester alignÃ© sur Â« N mÃ©dia(s) Â», dÃ©calÃ© par la bordure + le padding du panneau. */
.page-album .album-side h2:first-child{margin-top:21px}
.dressed .home-main section{margin-bottom:22px}
.dressed .home-main section:last-child{margin-bottom:0}
/* Le titre de section se cale sur le bord du panneau, sans double filet. */
.dressed .home-main section>.section-head{margin-top:0}
.dressed .browse-main .pagination-bar{margin-bottom:0}

/* 2. Ã‰lÃ©vation au repos, franchement renforcÃ©e au survol. */
.dressed .card,
.dressed .album-card,
.dressed .chan-card,
.dressed .creator-card,
.dressed .mcard,
.dressed .uc-card{box-shadow:0 3px 14px -6px rgba(0,0,0,.8)}
.dressed .card:hover,
.dressed .album-card:hover,
.dressed .chan-card:hover,
.dressed .creator-card:hover,
.dressed .mcard:hover,
.dressed .uc-card:hover{box-shadow:0 24px 46px -20px rgba(0,0,0,.9)}

/* 4. Habillage des zones restÃ©es Â« nues Â» : bandeau d'accroche et colonnes latÃ©rales. */
.dressed .hero{
  background:linear-gradient(155deg, var(--panel), var(--bg2) 70%);
  border:1px solid var(--line);border-bottom:1px solid var(--line);
  border-radius:16px;padding:44px 34px 38px;margin-bottom:28px;
  box-shadow:0 20px 50px -34px rgba(0,0,0,.95);
}
.dressed .hero-bare{padding:26px 30px}
.dressed .cat-panel,
.dressed .side-block,
.dressed .panel,
.dressed .channel-banner{box-shadow:0 3px 14px -6px rgba(0,0,0,.7)}

/* ThÃ¨me clair : ombres bien plus lÃ©gÃ¨res, sinon l'effet devient sale. */
html[data-theme="light"] body.dressed{
  background:radial-gradient(1100px 460px at 50% -140px, rgba(225,29,42,.06), transparent 72%), var(--bg);
}
html[data-theme="light"] .dressed .card,
html[data-theme="light"] .dressed .album-card,
html[data-theme="light"] .dressed .chan-card,
html[data-theme="light"] .dressed .creator-card,
html[data-theme="light"] .dressed .mcard,
html[data-theme="light"] .dressed .uc-card,
html[data-theme="light"] .dressed .cat-panel,
html[data-theme="light"] .dressed .panel,
html[data-theme="light"] .dressed .channel-banner,
html[data-theme="light"] .dressed .side-block{box-shadow:0 2px 10px -6px rgba(20,20,30,.28)}
html[data-theme="light"] .dressed .hero{box-shadow:0 12px 34px -28px rgba(20,20,30,.4)}
html[data-theme="light"] .dressed .home-main section,
html[data-theme="light"] .dressed .browse-main,
html[data-theme="light"] .dressed .album-top,
html[data-theme="light"] .dressed .album-main,
html[data-theme="light"] .dressed .legal-page,
html[data-theme="light"] .dressed .cat-tabwrap{box-shadow:0 10px 30px -26px rgba(20,20,30,.35)}
@media(max-width:640px){
  .dressed .home-main section,
  .dressed .browse-main,
  .dressed .album-top,
  .dressed .album-main,
  .dressed .legal-page{padding:16px 14px 18px;border-radius:12px}
}
@media(max-width:640px){.cat-tab{flex:1;justify-content:center;padding:13px 8px}}
.admin-bulkbar .check{margin:0}
.chk-col{width:34px;text-align:center}
.chk-col input{width:16px;height:16px;cursor:pointer}
.admin-search input{flex:1;min-width:200px;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:9px 12px;font-family:inherit}
/* Selects et date de la barre de filtres admin + champs .meet-fi (onglets Rencontres) : même style unifié. */
.admin-search select,.admin-search input[type=date],.admin-main .meet-fi{background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:9px 12px;font-family:inherit;font-size:14px}
.admin-search select{cursor:pointer;min-width:150px;flex:0 0 auto}
.admin-search input[type=date]{flex:0 0 auto;min-width:0}
.admin-search select:hover,.admin-search input[type=date]:hover,.admin-main .meet-fi:hover{border-color:var(--line2)}
.admin-search select:focus,.admin-search input:focus,.admin-search input[type=date]:focus,.admin-main .meet-fi:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
/* Textarea de la modale de signalement — même style « champ » que le reste du site. */
.report-ta{width:100%;background:var(--field);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:11px 13px;font-family:inherit;font-size:15px;line-height:1.5;resize:vertical;outline:none;margin:6px 0}
.report-ta::placeholder{color:var(--mut);opacity:.8}
.report-ta:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
/* Cellule d'actions de tableau qui peut revenir à la ligne (évite le scroll horizontal). */
td.mad-cell{white-space:normal}
td.mad-cell>.btn,td.mad-cell>form{margin:2px 0 2px 5px;display:inline-block;vertical-align:middle}
/* Rangée d'actions sous le média : « Partager » + « Signaler » côte à côte. */
.content-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 24px}
.content-actions .share-bar{margin:0}
/* Bloc « À découvrir » : mosaïque 2×2 d'images aléatoires, sans texte, remplissant tout le bloc. */
.discover-mosaic{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:3px;aspect-ratio:16/10;border-radius:6px;overflow:hidden;background:var(--panel2);border:1px solid var(--line)}
/* Cross-sell Rencontres sur les pages vidéo (barre latérale). */
.meet-cross{margin-bottom:24px}
.meet-cross-sub{margin:-8px 0 10px}
.meet-cross-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.meet-cross-grid .mcard{border-radius:10px}
.meet-cross-grid .mcard-name{font-size:13px}
.meet-cross-grid .mcard-type{font-size:11px}
.meet-cross-cta{display:block;text-align:center;margin-top:10px}
.discover-mosaic .dm-cell{display:block;overflow:hidden;min-height:0;min-width:0}
.discover-mosaic .dm-cell img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .25s}
.discover-mosaic .dm-cell:hover img{transform:scale(1.06)}
/* Tables du back-office Rencontres : tiennent dans la largeur (pas le min-width 1120px des grandes tables). */
.table-scroll .table.mad-table{min-width:0;width:100%}
.mad-table td.right,.mad-table td.nowrap{white-space:normal}
.mad-table td .btn.sm,.mad-table td form{margin:2px 0 2px 4px}
.admin-thumb{width:168px;height:104px;object-fit:cover;border-radius:6px;border:1px solid var(--line);display:block;cursor:pointer;transition:.15s}
.admin-thumb:hover{border-color:var(--accent);transform:scale(1.02)}
.admin-thumb-ph{width:168px;height:104px;display:inline-flex;align-items:center;justify-content:center;background:var(--field);color:var(--mut);font-size:26px;border-radius:6px;border:1px solid var(--line)}
/* AperÃ§u mÃ©dia en modale (back-office) */
.media-modal{position:fixed;inset:0;z-index:200;display:none;align-items:center;justify-content:center;padding:24px}
.media-modal:not([hidden]){display:flex}
.mm-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.82)}
.mm-box{position:relative;max-width:min(1100px,94vw);max-height:92vh;display:flex;flex-direction:column;align-items:center}
.mm-x{position:absolute;top:-14px;right:-14px;width:40px;height:40px;border-radius:50%;border:none;background:var(--panel);color:var(--txt);font-size:18px;cursor:pointer;box-shadow:0 6px 20px rgba(0,0,0,.55);z-index:2}
.mm-stage{display:flex;align-items:center;justify-content:center}
.mm-stage img,.mm-stage video{max-width:94vw;max-height:88vh;border-radius:8px;display:block;background:#000}
.mm-stage iframe{width:min(1000px,94vw);height:min(562px,80vh);border:0;border-radius:8px;background:#000}
.dur-inline{white-space:nowrap}
/* Bouton Â« TÃ©lÃ©charger Â» (appÃ¢t inscription pour visiteurs non connectÃ©s) */
.dl-btn{border-color:var(--accent);color:var(--accent);font-weight:700}
.dl-btn:hover{background:rgba(225,29,42,.09);color:var(--accent)}
/* Bloc des mÃ©dias orphelins (auteur supprimÃ©) */
.orphan-block{background:rgba(225,29,42,.05);border:1px solid rgba(225,29,42,.28);border-radius:10px;padding:16px 16px 18px;margin:0 0 22px}
.orphan-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.orphan-head h2{margin:0;font-size:19px}
.orphan-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(184px,1fr));gap:14px}
.orphan-card{background:var(--panel);border:1px solid var(--line);border-radius:9px;overflow:hidden;display:flex;flex-direction:column}
.orphan-thumb{position:relative;display:block;aspect-ratio:16/10;background:var(--field)}
.orphan-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.orphan-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:38px;height:38px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}
.orphan-body{padding:9px 11px;display:flex;flex-direction:column;gap:5px;flex:1}
.orphan-title{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.orphan-actions{display:flex;gap:6px;align-items:center;margin-top:auto}
.orphan-reassign{flex:1;margin:0}
.orphan-reassign select{width:100%;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:5px 6px;font-family:inherit;font-size:12px;cursor:pointer}
.cat-admin-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px 12px;margin-bottom:12px;flex-wrap:wrap}
.cat-admin-head > :first-child{flex:1 1 180px;min-width:0}
.c-main{flex:1;min-width:0}
.c-del{margin-left:6px}
.linkbtn{background:transparent;border:0;color:var(--mut);cursor:pointer;font-size:12px;padding:2px 5px;border-radius:5px}
.linkbtn:hover{background:var(--hover);color:var(--accent2)}

/* Encart publicitaire (barre latÃ©rale) */
.ad-slot{background:var(--panel);border:1px dashed var(--line2);border-radius:8px;padding:12px;overflow:hidden}
.ad-label{font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--mut2);margin-bottom:8px}
.ad-body{max-width:100%;overflow:hidden}
.ad-body img{max-width:100%;height:auto}
/* Emplacement pub de la colonne. La zone rÃ©serve EXACTEMENT le format choisi au
   back-office (300x250, 300x300, 300x600, 300x100) : la rÃ©gie sert un crÃ©atif Ã
   dimensions fixes, une zone plus Ã©troite le fait rogner par l'overflow du .ad-slot. */
.ad-block{padding:12px}
/* La zone réserve EXACTEMENT le format acheté : une régie sert une iframe aux dimensions
   fixes, et une zone plus haute laisse un vide, une zone plus basse fait rogner. `height` et
   non `min-height` — c'est ce qui garantit que la page ne saute pas à l'arrivée du créatif. */
.ad-slot-fixed{width:var(--ad-w);height:var(--ad-h);margin:0 auto;display:flex;align-items:center;justify-content:center}
.ad-slot-fixed img,.ad-slot-fixed iframe{max-width:100%}
/* Sous la largeur de bascule, la colonne disparaÃ®t ou passe sous le contenu :
   l'encart doit alors pouvoir rÃ©trÃ©cir plutÃ´t que dÃ©border l'Ã©cran. */
/* Sous 900 px, la zone s'adapte à la largeur disponible SANS dépasser le format acheté :
   un créatif de 728 px sur un écran de 360 provoquerait un débordement horizontal de la page. */
@media(max-width:900px){
  .ad-slot-fixed{width:auto;max-width:min(100%,var(--ad-w));height:auto;min-height:var(--ad-h)}
  /* Les formats que les régies ne vendent pas au mobile ne réservent rien du tout. */
  .ad-desktop{display:none}
}
/* Champ en erreur (ex. catÃ©gorie obligatoire non cochÃ©e) */
.field-error{outline:2px solid var(--accent);outline-offset:6px;border-radius:6px}

/* ParamÃ©trage (rÃ©glages) */
.switch{display:flex;align-items:center;gap:10px;font-weight:600;margin-bottom:16px}
/* Case suivie de sa phrase d'explication : les 16 px de la case + la marge par dÃ©faut du
   <p> faisaient dÃ©crocher la phrase de la case Ã  laquelle elle se rapporte. */
.switch.has-note{margin-bottom:5px}
.switch-note-p{margin:0 0 18px;padding-left:26px;line-height:1.45}
.storage-hybrid{border:1px solid var(--line);border-radius:8px;padding:14px 16px;margin:8px 0 16px;background:var(--field)}
.storage-hybrid .switch{margin-bottom:10px}
.switch input{width:auto;margin:0}
.form textarea.mono{font-family:ui-monospace,"Cascadia Code","Consolas",monospace;font-size:13px;line-height:1.5}
.form h2{font-family:var(--serif);font-size:19px;margin:24px 0 6px;padding-top:18px;border-top:1px solid var(--line);
  display:flex;align-items:center;gap:10px}
.form h2 .ico{color:var(--mut)}
.form h2:first-of-type{border-top:0;padding-top:0;margin-top:0}
.form-foot{margin-top:24px;padding-top:20px;border-top:1px solid var(--line)}
/* Interrupteur Â« de tÃªte Â» : encadrÃ©, car c'est un rÃ©glage de confidentialitÃ© et non
   une simple case Ã  cocher perdue dans une liste. */
.switch-lead{align-items:flex-start;gap:12px;background:var(--field);border:1px solid var(--line);
  border-radius:10px;padding:14px 16px;margin-bottom:12px;font-weight:400}
.switch-lead input{margin-top:3px}
.switch-lead b{font-weight:700;font-size:14.5px}
.switch-note{display:block;margin-top:5px;font-size:13px;line-height:1.5;color:var(--mut);font-weight:400}

/* ChaÃ®nes & tags (back-office) */
.ch-name{display:inline-flex;align-items:center;gap:9px;font-weight:600}
.tag-rename{display:flex;gap:6px;align-items:center}
.tag-rename input{width:auto;margin:0;min-width:120px;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:6px 9px;font-family:inherit}

/* =====================================================================
   Visionneuse d'album photo (flÃ¨ches + miniatures) + lightbox/diaporama
   ===================================================================== */
.pa-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:3;width:44px;height:44px;border-radius:50%;
  background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:26px;line-height:0;
  box-shadow:0 6px 18px -6px rgba(0,0,0,.6);transition:.15s;font-weight:700}
.pa-nav:hover{background:var(--accent2);transform:translateY(-50%) scale(1.07)}
.pa-nav.prev{left:10px}.pa-nav.next{right:10px}
.pa-hint{position:absolute;bottom:10px;right:10px;background:rgba(0,0,0,.62);color:#fff;font-size:11px;font-weight:600;padding:4px 9px;border-radius:6px;pointer-events:none}
.pa-count{position:absolute;bottom:10px;left:10px;background:rgba(0,0,0,.62);color:#fff;font-size:12px;font-weight:700;padding:4px 10px;border-radius:6px}
.album-strip{display:flex;gap:8px;overflow-x:auto;padding:12px 2px 4px;margin-top:6px}
.album-thumb{flex:0 0 auto;width:96px;height:64px;border-radius:6px;overflow:hidden;border:2px solid transparent;opacity:.65;transition:.15s}
.album-thumb img{width:100%;height:100%;object-fit:cover}
.album-thumb:hover{opacity:1}
.album-thumb.on{border-color:var(--accent);opacity:1}

.lightbox{position:fixed;inset:0;z-index:130;display:flex}
.lightbox[hidden]{display:none}
.lb-backdrop{position:absolute;inset:0;background:rgba(4,4,8,.93)}
.lb-shell{position:relative;z-index:1;margin:auto;width:min(1200px,96vw);height:min(92vh,900px);display:grid;grid-template-columns:1fr var(--ad-col);gap:14px;padding:14px}
.lb-x{position:absolute;top:0;right:0;z-index:5;background:rgba(0,0,0,.5);border:0;color:#fff;width:38px;height:38px;border-radius:50%;font-size:17px;cursor:pointer}
.lb-x:hover{background:var(--accent)}
.lb-main{display:flex;flex-direction:column;min-width:0;min-height:0}
.lb-stage{position:relative;flex:1;display:flex;align-items:center;justify-content:center;min-height:0;min-width:0}
.lb-stage img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;border-radius:6px}
.lb-nav{position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px;border-radius:50%;background:var(--accent);color:#fff;border:0;font-size:28px;line-height:0;cursor:pointer;z-index:2}
.lb-nav:hover{background:var(--accent2)}
.lb-nav.prev{left:6px}.lb-nav.next{right:6px}
.lb-bar{display:flex;align-items:center;gap:14px;padding:10px 4px 2px}
.lb-play{background:var(--accent);border:0;color:#fff;font-weight:700;border-radius:6px;padding:8px 14px;cursor:pointer;font-family:inherit}
.lb-play:hover{background:var(--accent2)}
.lb-play .i-pause{display:none}
.lightbox.playing .lb-play .i-play{display:none}
.lightbox.playing .lb-play .i-pause{display:inline}
.lb-count{font-weight:700;font-size:14px;color:#fff}
.lb-title{color:#bbb;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Pouces d'Ã©valuation dans le diaporama : poussÃ©s Ã  droite, face au bouton Diaporama */
.lb-react{margin-left:auto;display:inline-flex;gap:8px;align-items:center;flex:none}
.lb-thumb{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);color:#fff;font-weight:700;font-size:14px;border-radius:8px;padding:7px 13px;cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;gap:5px;transition:.12s}
.lb-thumb:hover{background:rgba(255,255,255,.22)}
.lb-thumb.up.on{background:rgba(62,166,109,.9);border-color:#3ea66d}
.lb-thumb.down.on{background:rgba(201,80,47,.9);border-color:#c9502f}
.lb-thumb:disabled{opacity:.6;cursor:default}
/* Bouton Supprimer du diaporama (propriÃ©taire / admin uniquement). */
.lb-del{background:rgba(225,29,42,.85);border-color:rgba(225,29,42,.9)}
.lb-del:hover{background:var(--accent);border-color:var(--accent)}
.lb-del[hidden]{display:none}
.lb-side{overflow-y:auto;display:flex;flex-direction:column;gap:12px}
.lb-suggest h3{font-family:var(--serif);font-size:16px;color:#fff;margin:0 0 6px}
.lb-sg{display:flex;gap:9px;padding:6px;border-radius:8px;background:rgba(255,255,255,.05)}
.lb-sg:hover{background:rgba(255,255,255,.11)}
.lb-sg img{width:74px;height:50px;object-fit:cover;border-radius:5px;flex:none}
.lb-sg-info{display:flex;flex-direction:column;min-width:0;gap:1px}
.lb-sg-t{color:#fff;font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lb-sg-m{font-size:12px;color:#c9ccd6}
.lb-sg-c{font-size:12px;color:#8b90a3}

/* =====================================================================
   Albums (espace membre) : cartes, upload, grille drag & drop
   ===================================================================== */
.album-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:8px}
.album-row select{width:auto;margin:0;min-width:220px}
.al-up-row{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap}
.al-up-row .grow{flex:1;min-width:220px}
.al-up-row label{margin:0}
.album-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:14px}
/* Pages de GESTION (tableau de bord, /albums) : mÃªmes blocs que les vidÃ©os (220 px) pour que
   les actions Modifier / Supprimer tiennent cÃ´te Ã  cÃ´te sans dÃ©border. */
.album-cards.album-cards-manage{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}

/* Page chaÃ®ne : rubriques (Albums / VidÃ©os / Photos) */
.channel-section{margin:0 0 40px;padding-bottom:32px;border-bottom:1px solid var(--line)}
.channel-section:last-child{border-bottom:0;margin-bottom:12px}
.channel-section .section-head{align-items:center;margin-bottom:18px}
.sec-count{color:var(--mut);font-family:var(--sans);font-weight:700;font-size:16px;margin-left:4px}
.section-sort{flex:none;background:var(--field);color:var(--txt);border:1px solid var(--line);border-radius:6px;
  padding:7px 30px 7px 12px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='7' viewBox='0 0 10 7'><path d='M1 1l4 4 4-4' fill='none' stroke='%238b90a3' stroke-width='1.6'/></svg>");
  background-repeat:no-repeat;background-position:right 11px center}
.section-sort:hover{border-color:var(--line2)}
.section-sort:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.album-cell{display:flex;flex-direction:column;gap:8px}
.album-card{display:block;background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden;transition:.15s}
.album-card:hover{border-color:var(--accent)}
/* Actions d'album (Modifier / Supprimer) : cÃ´te Ã  cÃ´te si Ã§a tient, sinon empilÃ©es â€” jamais de dÃ©bordement de la carte */
.album-actions{display:flex;gap:8px;flex-wrap:wrap}
.album-actions>.btn,.album-actions>form{flex:1 1 0;min-width:0;margin:0}
.album-actions>.btn.primary{flex:1 1 100%}
.album-actions .btn{justify-content:center}
.album-actions form>.btn{width:100%}
/* Â« Modifier Â» en ROUGE (spÃ©cificitÃ© suffisante pour l'emporter sur le thÃ¨me clair) et Â« Supprimer Â» SANS ombre */
.modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:8px}
.album-card-lock{position:absolute;top:8px;left:8px;background:rgba(0,0,0,.72);border-radius:6px;padding:2px 7px;font-size:13px}
.aa-block{margin-bottom:16px}
.aa-block:last-child{margin-bottom:0}
.aa-h{font-size:14px;font-weight:700;margin:0 0 8px;display:inline-flex;align-items:center;gap:8px}
.aa-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line)}
.aa-row:last-child{border-bottom:0}
.aa-name{display:inline-flex;align-items:center;gap:9px;font-weight:600}
.album-cover-blur{filter:blur(6px);transform:scale(1.06)}
.album-locked{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:rgba(11,11,15,.4)}
.al-lock-ic{font-size:26px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.6))}
.al-lock-txt{font-size:12px;font-weight:700;color:#fff;background:var(--accent);padding:4px 11px;border-radius:99px;box-shadow:0 4px 12px -4px rgba(0,0,0,.6)}
.album-card:hover .al-lock-txt{background:var(--accent2)}
/* Ajouter Ã  une chaÃ®ne (select mis en avant comme un bouton) + retrait sur la page chaÃ®ne */
.add-to-channel{display:inline-flex;margin:0}
/* Bouton Â« chaÃ®ne Â» : c'est le <span> qui donne la largeur (donc pas de vide),
   le <select> natif est superposÃ© transparent et reste pleinement cliquable. */
.tbtn-ch{position:relative;border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.08)}
.tbtn-ch:hover{border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.14)}
.tbtn-ch .ch-caret{font-size:10px;line-height:1;opacity:.85;margin-left:-2px}
.tbtn-ch:focus-within{outline:none;box-shadow:0 0 0 3px rgba(225,29,42,.18)}
.ch-native{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;border:0;
  opacity:0;cursor:pointer;font:inherit;-webkit-appearance:none;appearance:none;background:transparent}
.chan-item{position:relative}
/* En mode gestion, chaque carte est enveloppÃ©e dans .chan-item : on rÃ©tablit l'Ã©galisation de
   hauteur (sinon .grid>.card / .grid>.album-cell ne matchent plus et les cartes sont inÃ©gales). */
.grid>.chan-item{height:100%}
.grid>.chan-item>.card,
.grid>.chan-item>.album-cell{height:100%}
.grid>.chan-item>.card{display:flex;flex-direction:column}
.grid>.chan-item>.card>.card-body{flex:1 1 auto}
.grid>.chan-item>.album-cell>.album-card{height:100%;display:flex;flex-direction:column}
.grid>.chan-item>.album-cell>.album-card>.album-card-body{flex:1 1 auto}
.chan-remove{position:absolute;top:8px;right:8px;z-index:4;margin:0}
.chan-remove-btn{width:30px;height:30px;border-radius:50%;border:none;background:rgba(11,11,15,.72);color:#fff;font-size:13px;cursor:pointer;display:flex;align-items:center;justify-content:center}
.chan-remove-btn:hover{background:var(--accent)}
/* ===== Messagerie interne ===== */
.msg-nav{position:relative;padding:8px 12px;font-size:16px;overflow:visible}
/* Pastille en haut Ã  GAUCHE, chevauchant l'enveloppe : posÃ©e sur l'icÃ´ne elle-mÃªme, elle se
   remarque bien mieux que collÃ©e au coin extÃ©rieur du bouton. Le liserÃ© reprend la couleur du
   bandeau pour dÃ©tacher la pastille du glyphe qu'elle recouvre. */
.msg-nav-badge{position:absolute;top:1px;left:2px;z-index:2;
  background:var(--accent);color:#fff;font-size:10px;font-weight:800;
  min-width:18px;height:18px;line-height:16px;text-align:center;border-radius:99px;padding:0 4px;
  border:2px solid var(--panel2);box-shadow:0 2px 6px rgba(0,0,0,.45);
  animation:msgpop .34s cubic-bezier(.2,1.5,.4,1)}
@keyframes msgpop{from{transform:scale(.4);opacity:0}to{transform:scale(1);opacity:1}}
html[data-theme="light"] .msg-nav-badge{border-color:#fff;box-shadow:0 2px 6px rgba(20,20,30,.25)}
/* =====================================================================
   MESSAGERIE â€” deux panneaux : conversations Ã  gauche, discussion Ã  droite.
   Une seule page pour /messages et /messages/{id} ; le clic sur une
   conversation ne recharge que le panneau de droite (voir app.js).
   ===================================================================== */
.msg-app{display:grid;grid-template-columns:320px 1fr;gap:0;height:min(72vh,720px);
  border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--panel)}
.msg-badge{flex:none;background:var(--accent);color:#fff;font-size:11px;font-weight:800;
  min-width:20px;height:20px;line-height:20px;text-align:center;border-radius:99px;padding:0 6px}
.msg-badge-h{vertical-align:middle;font-size:12px;height:22px;line-height:22px}

/* ---- Colonne de gauche ---- */
.msg-side{display:flex;flex-direction:column;min-width:0;border-right:1px solid var(--line);background:var(--bg2)}
.msg-search{padding:12px;border-bottom:1px solid var(--line);flex:none}
.msg-search input{width:100%;background:var(--field);border:1px solid var(--line);border-radius:99px;
  color:var(--txt);padding:9px 15px;font-family:inherit;font-size:13.5px}
.msg-search input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.msg-convs{flex:1;overflow-y:auto;min-height:0}
.msg-conv{display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--line);
  color:inherit;position:relative;transition:background .13s}
.msg-conv:last-child{border-bottom:none}
.msg-conv:hover{background:rgba(225,29,42,.07)}
/* Conversation ouverte : liserÃ© rouge Ã  gauche, pour la repÃ©rer sans relire les noms. */
.msg-conv.on{background:rgba(225,29,42,.12)}
.msg-conv.on::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent)}
.msg-conv .avatar{width:42px;height:42px;flex:none}
.msg-conv-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.msg-conv-top{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
.msg-conv-top strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}
.msg-conv-preview{color:var(--mut);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mc-you{color:var(--mut2,#6b7080)}
.msg-conv.unread .msg-conv-preview{color:var(--txt);font-weight:600}
.msg-conv.unread .msg-conv-top strong{font-weight:800}
.msg-side-empty,.msg-none{padding:18px 16px;line-height:1.6}

/* ---- Panneau de droite ---- */
.msg-main{display:flex;flex-direction:column;min-width:0;min-height:0}
.mx-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none;
  padding:11px 16px;border-bottom:1px solid var(--line);background:var(--panel2)}
.mx-who{display:flex;align-items:center;gap:11px;min-width:0;color:inherit}
.mx-who .avatar{width:38px;height:38px;flex:none}
.mx-who-txt{display:flex;flex-direction:column;min-width:0;line-height:1.3}
.mx-who-txt b{font-size:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mx-who:hover b{color:var(--accent)}
.mx-head-actions{display:flex;align-items:center;gap:7px;flex:none}
.mx-head-actions form{margin:0}
.mx-head-actions .tbtn{height:32px}
.mx-head-actions .tbtn-icon{width:32px;font-size:14px}

.mx-thread{flex:1;min-height:0;overflow-y:auto;padding:18px 16px;display:flex;flex-direction:column;gap:3px;
  background:linear-gradient(180deg,var(--bg2),var(--panel) 260px)}
.mx-first{margin:auto}
/* SÃ©parateur de jour */
.mx-day{display:flex;align-items:center;gap:12px;margin:14px 0 10px;color:var(--mut);font-size:11.5px;font-weight:700}
.mx-day::before,.mx-day::after{content:"";flex:1;height:1px;background:var(--line)}
.mx-row{display:flex;align-items:flex-end;gap:9px;margin-bottom:6px}
.mx-row.mine{justify-content:flex-end}
.mx-av{width:26px;height:26px;font-size:11px;flex:none;margin-bottom:2px}
.mx-bubble{max-width:min(74%,520px);background:var(--field);border:1px solid var(--line);
  border-radius:14px 14px 14px 4px;padding:9px 13px 6px}
.mx-bubble.mine{background:linear-gradient(135deg,rgba(225,29,42,.22),rgba(225,29,42,.13));
  border-color:rgba(225,29,42,.34);border-radius:14px 14px 4px 14px}
.mx-b-body{font-size:14px;line-height:1.5;word-break:break-word;white-space:pre-wrap}
.mx-b-time{font-size:10.5px;color:var(--mut);margin-top:3px;text-align:right;letter-spacing:.02em}
.mx-read{color:#4ec98a;font-weight:800;margin-left:2px}

/* Zone de saisie : le textarea grandit avec le texte (voir app.js). */
.mx-compose{display:flex;align-items:flex-end;gap:10px;flex:none;padding:12px 14px;
  border-top:1px solid var(--line);background:var(--panel2);margin:0}
.mx-compose textarea{flex:1;background:var(--field);border:1px solid var(--line);border-radius:20px;
  color:var(--txt);padding:11px 16px;font-family:inherit;font-size:14px;line-height:1.45;
  resize:none;max-height:150px;overflow-y:auto}
.mx-compose textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.mx-send{flex:none;width:42px;height:42px;border:0;border-radius:50%;cursor:pointer;
  background:linear-gradient(120deg,var(--accent),#b3141f);color:#fff;font-size:16px;
  display:flex;align-items:center;justify-content:center;transition:.15s}
.mx-send:hover{filter:brightness(1.1);transform:scale(1.05)}
.mx-blocked{flex:none;margin:0;padding:14px 16px;border-top:1px solid var(--line);
  background:var(--panel2);color:var(--mut);text-align:center;font-size:13.5px}
.mx-blocked .linkbtn{color:var(--accent);font-weight:700}

/* Aucune conversation ouverte */
.mx-empty{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;padding:30px;text-align:center}
.mx-empty-ic{font-size:46px;opacity:.35}
.mx-empty b{font-size:17px}
.mx-empty .muted{max-width:300px;line-height:1.55}

.msg-main .report-member,.msg-main .access-banner{margin:12px 14px 0;flex:none}
html[data-theme="light"] .mx-bubble.mine{background:rgba(225,29,42,.10)}
html[data-theme="light"] .mx-thread{background:linear-gradient(180deg,var(--bg2),var(--panel) 260px)}

/* Sur mobile : une seule colonne Ã  la fois, comme une application de messagerie. */
@media(max-width:820px){
  .msg-app{grid-template-columns:1fr;height:auto;min-height:70vh}
  .msg-app .msg-main{display:none}
  .msg-app.has-active .msg-side{display:none}
  .msg-app.has-active .msg-main{display:flex;min-height:70vh}
  .mx-head::before{content:"â†";order:-1;font-size:20px;padding-right:4px;cursor:pointer}
}
/* Propositions de contenu en attente de validation du propriÃ©taire de la chaÃ®ne. */
.prop-panel{border-color:rgba(225,29,42,.35)}
.prop-panel h2{display:flex;align-items:center;gap:10px;margin:0 0 4px;font-size:20px}
.prop-row{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;
  padding:11px 0;border-top:1px solid var(--line)}
.prop-row .prop-txt{flex:1;min-width:240px;line-height:1.45}
.prop-row .prop-actions{display:flex;gap:8px;flex:none}
.prop-row form{margin:0}
/* Conversation bloquÃ©e + formulaire Â« dÃ©noncer un membre Â». */
.msg-blocked{margin-top:16px;padding:14px 16px;border:1px solid var(--line2);border-radius:8px;background:var(--panel);color:var(--mut);text-align:center}
.msg-blocked .linkbtn{color:var(--accent);font-weight:700}
.report-member{display:flex;gap:8px;margin:12px 0 0;padding:12px 14px;border:1px solid rgba(225,29,42,.35);border-radius:8px;background:rgba(225,29,42,.06)}
.report-member input{flex:1;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:8px 11px;font-family:inherit;font-size:14px}
.report-member input:focus{outline:none;border-color:var(--accent)}
.report-member .btn{flex:none}
.locked-actions{display:inline-flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center}
.locked-actions form{margin:0}
/* Formulaire de demande d'accÃ¨s (message obligatoire) sur un album verrouillÃ©. */
.access-req-form{display:flex;flex-direction:column;gap:10px;width:min(460px,100%);text-align:left;margin:0 auto}
.access-req-label{font-size:13px;color:var(--mut);font-weight:600}
.access-req-form textarea{background:var(--field);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:10px 12px;font-family:inherit;font-size:14px;resize:vertical}
.access-req-form textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
/* BanniÃ¨re de demande d'accÃ¨s dans la conversation (propriÃ©taire). */
.access-banner{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;
  background:rgba(225,29,42,.08);border:1px solid rgba(225,29,42,.30);border-radius:10px;padding:12px 16px;margin-bottom:12px}
.access-banner.ok{background:rgba(52,168,83,.10);border-color:rgba(52,168,83,.35)}
.access-banner .ab-txt{flex:1;min-width:220px;line-height:1.45}
.access-banner .ab-actions{display:flex;gap:8px;flex:none}
.access-banner form{margin:0}
.album-tag{display:inline-block;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:#fff;background:var(--accent);border-radius:4px;padding:1px 6px;vertical-align:middle;margin-right:2px}
.lb-sg-ph{width:74px;height:50px;flex:none;display:flex;align-items:center;justify-content:center;font-size:22px;background:rgba(255,255,255,.08);border-radius:5px}

/* DÃ©tection de vidÃ©o externe (page d'upload vidÃ©o) */
.detect-row{display:flex;gap:10px;margin-top:6px}
.detect-row input{flex:1;margin:0}
.detect-row .btn{flex:none}
.detect-result{margin:12px 0 16px}
.detect-status{display:block;font-size:13px;font-weight:600;margin-bottom:8px}
.detect-status.ok{color:var(--ok)}
.detect-status.err{color:var(--accent2)}
.detect-status.warn{color:var(--star)}
.detect-embed input{opacity:.9;font-size:13px}
.album-card-cover{position:relative;height:130px;background:linear-gradient(135deg,#1c1c26,#101017);display:flex;align-items:center;justify-content:center;overflow:hidden}
.album-card-cover img{width:100%;height:100%;object-fit:cover}
.album-card-empty{font-size:40px;color:var(--mut2)}
.album-card-count{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.7);color:#fff;font-size:11px;font-weight:700;padding:3px 8px;border-radius:6px}
.album-card-contrib{position:absolute;top:8px;left:8px;background:#fff;color:#111;font-size:12px;line-height:1;padding:4px 6px;border-radius:6px;border:1px solid rgba(0,0,0,.15);box-shadow:0 1px 4px rgba(0,0,0,.3)}
/* Tooltip global stylé (remplace l'info-bulle native pour tout élément à `title`) — petite fenêtre grise, coins arrondis, texte noir. */
#appTip{position:fixed;z-index:9999;background:#ececf0;color:#111;border:1px solid rgba(0,0,0,.18);border-radius:8px;padding:6px 10px;font-size:12px;font-weight:600;line-height:1.35;max-width:280px;box-shadow:0 6px 18px rgba(0,0,0,.22);pointer-events:none;opacity:0;transform:translateY(2px);transition:opacity .12s,transform .12s;white-space:normal}
#appTip.show{opacity:1;transform:translateY(0)}
/* Détecteur de doublons (back-office) */
.dup-group{margin:14px 0;padding-top:10px;border-top:1px solid var(--line)}
.dup-row{display:flex;flex-wrap:wrap;gap:12px}
.dup-item{width:150px;margin:0}
.dup-item img{width:150px;height:150px;object-fit:cover;border-radius:8px;border:1px solid var(--line);display:block;background:var(--field)}
.dup-item figcaption{display:flex;align-items:center;gap:6px;margin-top:5px;flex-wrap:wrap}
.dup-id{font-weight:700;font-size:12px}
.album-card-body{padding:9px 11px}
.album-card-title{font-family:var(--serif);font-size:14px;font-weight:600;line-height:1.3;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  min-height:2.6em} /* rÃ©serve toujours 2 lignes â†’ toutes les cartes album ont la mÃªme hauteur */

.al-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px}
.album-finish{margin-top:26px;padding-top:20px;border-top:1px solid var(--line);max-width:420px}
.album-finish .btn{font-size:15px;padding:13px}
.al-item{background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden}
.al-item.dragging{opacity:.45;outline:2px dashed var(--accent)}
.al-badge{position:absolute;bottom:6px;left:6px;z-index:2;background:var(--warn);color:#3a2a00;font-size:10px;font-weight:800;padding:2px 7px;border-radius:5px}

/* Grille LÃ‰GÃˆRE : uniquement les vignettes, denses. L'Ã©dition passe par la modale. */
.al-hint{margin:0 0 12px}
.al-handle-ic{opacity:.7;letter-spacing:-1px}
.al-grid-lite{grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}
.al-grid-lite .al-item{position:relative;border-radius:8px}
.al-grid-lite .al-handle{position:absolute;top:6px;left:6px;z-index:2;background:rgba(0,0,0,.6);color:#fff;
  border-radius:5px;padding:1px 6px;font-size:12px;cursor:grab;letter-spacing:-1px;opacity:0;transition:opacity .13s}
.al-grid-lite .al-item:hover .al-handle{opacity:1}
.al-open{display:block;width:100%;padding:0;border:0;background:var(--field);cursor:pointer;aspect-ratio:1/1}
.al-open img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .18s}
.al-open:hover img{transform:scale(1.04)}
.al-open:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
/* Pseudo du membre ayant ajoutÃ© la photo (lÃ©gende) + repÃ¨re si contribution d'un autre membre */
.al-grid-lite .al-owner{display:block;font-size:11px;line-height:1.3;color:var(--mut);padding:5px 7px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}
.al-grid-lite .al-owner-contrib{color:var(--accent);font-weight:700}
.al-edit-owner{margin-bottom:8px}
.al-edit-owner.is-contrib{color:var(--accent);font-weight:700}

/* Modale d'Ã©dition d'une photo */
.al-edit-card{max-width:640px;width:calc(100% - 32px)}
.al-edit-preview{background:#0b0b0f;border-radius:10px;overflow:hidden;margin-bottom:14px;text-align:center}
.al-edit-preview img{max-width:100%;max-height:44vh;object-fit:contain;display:inline-block}
.al-edit-fields label{display:block;margin-bottom:12px;font-weight:600;font-size:14px}
.al-edit-fields input,.al-edit-fields textarea{width:100%;margin-top:6px;background:var(--field);border:1px solid var(--line);
  border-radius:7px;color:var(--txt);padding:9px 12px;font-family:inherit;font-size:14px;outline:none;resize:vertical}
.al-edit-fields input:focus,.al-edit-fields textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.al-edit-actions{display:flex;align-items:center;gap:10px;margin-top:4px}
.al-edit-actions form{margin:0}
.al-edit-actions #aeSave{margin-left:auto}
.al-saved{color:var(--ok);font-size:12px;font-weight:700}

/* Zone de dÃ©pÃ´t (album) */
.dropzone{padding:16px}
.dz-drop{border:2px dashed var(--line2);border-radius:10px;padding:26px 20px;text-align:center;transition:.15s;background:var(--field)}
.dz-drop.over{border-color:var(--accent);background:rgba(225,29,42,.06)}
.dz-drop.busy{opacity:.7;pointer-events:none}
.dz-ic{display:block;font-size:30px;margin-bottom:8px;color:var(--mut)}
.dz-text{font-size:15px}
.dz-or{color:var(--mut2);font-size:12px;margin:10px 0;text-transform:uppercase;letter-spacing:.1em}
.dz-actions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.dz-actions .btn{cursor:pointer}
.dz-picked{margin-top:12px}
.dz-row{display:flex;gap:12px;align-items:flex-end;margin-top:14px}
.dz-row .grow{flex:1;margin:0}
.dz-row .grow input{width:100%;margin-top:6px;background:var(--field);border:1px solid var(--line);border-radius:6px;color:var(--txt);padding:12px 14px;font-family:inherit;font-size:15px;outline:none}
.dz-row .grow input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.dz-row .btn{flex:none;padding:12px 22px}
/* Champs du dropzone (album) : espacement vertical pour aÃ©rer la mise en page */
/* Espacement vertical CONSTANT entre tous les Ã©lÃ©ments du formulaire d'envoi
   (empÃªche tout bloc â€” ex. suggestions de tags â€” de coller au suivant, ici le dropzone). */
.dz-form > * + *{margin-top:20px}
.dz-form .field-lbl{display:block;font-size:14px;font-weight:600;margin-bottom:2px}
.dz-submit-row{justify-content:flex-end}
/* Bouton Â« Valider Â» centrÃ© en bas du formulaire d'envoi de photos. */
.dz-submit-center{display:flex;justify-content:center;margin-top:24px;padding-top:20px;border-top:1px solid var(--line)}
.dz-submit-center .btn{min-width:220px;font-size:15px;padding:13px 28px}
/* Boutons d'envoi des uploads : rouge garanti (l'id gagne sur l'override thÃ¨me clair) + contenu centrÃ©. */
#dzSubmit,#dzSubmit2,#vupSubmit{justify-content:center;background:linear-gradient(120deg,var(--accent),#b3141f);color:#fff;border-color:transparent}
#dzSubmit:hover,#dzSubmit2:hover,#vupSubmit:hover{filter:brightness(1.08)}
.vup-submit-center{display:flex;justify-content:center;margin-top:8px}
.vup-submit-center #vupSubmit{min-width:220px;width:auto}
.dz-progress{margin-top:16px}
.dz-plabel{display:flex;justify-content:space-between;gap:10px;font-size:13px;font-weight:600;margin-bottom:6px}
.dz-pcount{color:var(--accent);flex:none}
.dz-track{height:10px;background:var(--field);border:1px solid var(--line);border-radius:99px;overflow:hidden}
.dz-bar{height:100%;width:0;background:linear-gradient(90deg,var(--accent),#ff5a64);transition:width .2s ease;border-radius:99px}
/* Miniatures des photos sÃ©lectionnÃ©es / envoyÃ©es, sous la barre de progression. */
.dz-thumbs{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:8px;margin-top:14px}
.dz-thumb{position:relative;margin:0;aspect-ratio:1;border:1px solid var(--line);border-radius:8px;overflow:hidden;
  background:var(--field);display:flex;align-items:center;justify-content:center;transition:border-color .15s,opacity .15s}
.dz-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.dz-thumb-zip{font-size:26px}
.dz-thumb-more{font-weight:800;color:var(--mut);font-size:15px}
.dz-thumb-state{position:absolute;top:4px;right:4px;width:18px;height:18px;border-radius:99px;display:none;
  align-items:center;justify-content:center;font-size:11px;font-weight:800;color:#fff;line-height:1}
.dz-thumb.is-ok{border-color:#34a853}
.dz-thumb.is-ok .dz-thumb-state{display:flex;background:#34a853}
.dz-thumb.is-ok .dz-thumb-state::after{content:"\2713"}
.dz-thumb.is-ko{border-color:var(--accent);opacity:.55}
.dz-thumb.is-ko .dz-thumb-state{display:flex;background:var(--accent)}
.dz-thumb.is-ko .dz-thumb-state::after{content:"\2715"}
@media(max-width:600px){.dz-thumbs{grid-template-columns:repeat(auto-fill,minmax(66px,1fr))}}
/* Barre d'ordre d'affichage (tri auto + inverser) au-dessus des vignettes. */
.dz-sortbar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:14px;padding:8px 10px;
  border:1px solid var(--line);border-radius:10px;background:var(--field)}
.dz-sortbar-lbl{font-weight:700;font-size:13px}
.dz-sortbar-hint{margin-left:auto}
.dz-sortbar.busy{opacity:.6;pointer-events:none}
/* Vignettes rÃ©ordonnables : curseur Â« saisir Â» + repÃ¨re visuel pendant le glisser. */
.dz-thumbs.dz-reorderable .dz-thumb{cursor:grab}
.dz-thumbs.dz-reorderable .dz-thumb:active{cursor:grabbing}
.dz-thumbs.dz-reorderable .dz-thumb::before{content:"\2194";position:absolute;top:3px;left:4px;z-index:2;
  font-size:11px;font-weight:800;color:#fff;background:rgba(0,0,0,.45);border-radius:5px;padding:0 4px;
  opacity:0;transition:opacity .15s;pointer-events:none}
.dz-thumbs.dz-reorderable .dz-thumb:hover::before{opacity:1}
.dz-thumb.dz-dragging{opacity:.4;outline:2px dashed var(--accent);outline-offset:-2px}
/* Commentaire d'album inline sur la page d'upload. */
.album-comment textarea{width:100%;margin-top:7px;background:var(--field);border:1px solid var(--line);border-radius:6px;
  color:var(--fg);padding:11px 13px;font-family:inherit;font-size:15px;outline:none;resize:vertical}
.album-comment textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.album-comment #albumCommentHint{display:block;margin-top:5px}
/* Bouton + modale Â« CrÃ©er un tag Â» du sÃ©lecteur de tags. */
.tag-create-btn{margin-left:8px;vertical-align:middle}
#tagCreateInput{width:100%;margin-top:6px}
#tagCreateModal .modal-actions{align-items:center}
#tagCreateModal #tagCreateMsg{margin-right:auto}
/* PropriÃ©taire externe d'une vidÃ©o : deux champs cÃ´te Ã  cÃ´te (formulaires) + crÃ©dit Ã  droite (page mÃ©dia). */
.owner-row{display:flex;gap:10px;flex-wrap:wrap}
.owner-row input{flex:1 1 200px}
/* Second bouton d'envoi, sous les miniatures (visible seulement quand des photos sont prÃªtes).
   Rouge franc (pas le dÃ©gradÃ©) pour Ãªtre immÃ©diatement identifiÃ© comme l'action finale. */
.dz-validate{margin-top:14px;background:var(--accent);font-size:15px;padding:13px}
.dz-validate:hover{background:var(--accent2)}
.dz-validate[hidden]{display:none}
/* Fichiers en attente de validation : le message doit sauter aux yeux. */
.dz-picked.pending{color:var(--accent);font-weight:700;font-size:14px;
  background:rgba(225,29,42,.08);border:1px solid rgba(225,29,42,.32);border-radius:8px;padding:9px 12px;margin-top:10px}

/* Page de choix d'upload (photos / vidÃ©o) */
/* Page Â« Publier Â» : deux cartes de choix + une colonne de contexte, au lieu de deux
   boutons perdus dans une page vide. Les cartes annoncent les rÃ¨gles rÃ©elles du site. */
.uc-layout{display:grid;grid-template-columns:1fr 280px;gap:26px;align-items:start}
.uc-side{display:flex;flex-direction:column;gap:16px}
.uc-side .panel{margin-bottom:0;padding:16px 18px}
.uc-stats{display:flex;flex-wrap:wrap;gap:10px 22px}
.uc-stats .side-h{flex-basis:100%;padding:0;margin-bottom:2px}
.uc-stat{display:flex;flex-direction:column}
.uc-stat-n{font-family:var(--serif);font-size:24px;font-weight:600;line-height:1.1}
.uc-stat-l{font-size:12px;color:var(--mut);font-weight:600}
.uc-links{display:flex;flex-direction:column;gap:2px}
.uc-links .side-h{padding:0;margin-bottom:8px}
.uc-links a{padding:7px 0;font-size:14px;font-weight:600;color:var(--mut);transition:.13s}
.uc-links a:hover{color:var(--accent)}
.uc-feats{list-style:none;margin:4px 0 0;padding:0;text-align:left;width:100%;
  border-top:1px solid var(--line);padding-top:14px}
.uc-feats li{position:relative;padding-left:22px;margin-bottom:7px;font-size:13.5px;line-height:1.45;color:var(--mut)}
.uc-feats li::before{content:"\2713";position:absolute;left:0;top:0;color:var(--accent);font-weight:800;font-size:12px}
.uc-feats li.uc-off{color:var(--mut2)}
.uc-feats li.uc-off::before{content:"\2014";color:var(--mut2)}
.uc-go{display:inline-flex;align-items:center;gap:9px;margin-top:auto;padding-top:14px;
  font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--mut)}
.uc-arr{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;
  border-radius:50%;background:var(--field);border:1px solid var(--line);color:var(--txt);
  font-size:13px;transition:.16s}
.uc-card:hover .uc-go{color:var(--accent)}
.uc-card:hover .uc-arr{background:var(--accent);border-color:transparent;color:#fff;transform:translateX(3px)}
@media(max-width:900px){.uc-layout{grid-template-columns:1fr}}

.upload-choose{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.uc-card{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:30px 24px 24px;
  background:var(--panel);border:1px solid var(--line);border-radius:12px;transition:.15s}
.uc-card:hover{border-color:var(--accent);transform:translateY(-3px)}
/* Pastille ronde plutÃ´t qu'un glyphe nu : les deux cartes ont enfin le mÃªme point d'ancrage visuel. */
.uc-ic{display:inline-flex;align-items:center;justify-content:center;width:62px;height:62px;border-radius:50%;
  background:rgba(225,29,42,.10);border:1px solid rgba(225,29,42,.28);
  font-size:26px;color:var(--accent);line-height:1;transition:.16s}
.uc-card:hover .uc-ic{background:rgba(225,29,42,.18);transform:scale(1.05)}
.uc-title{font-family:var(--serif);font-size:22px;font-weight:600}
.uc-desc{color:var(--mut);font-size:14px;line-height:1.5;max-width:320px;margin-bottom:4px}
@media(max-width:600px){.upload-choose{grid-template-columns:1fr}}

/* =====================================================================
   RESPONSIVE â€” tablettes & mobiles
   ===================================================================== */
@media(max-width:960px){
  .browse,.browse.has-ads{grid-template-columns:1fr}
  .browse-side{position:static;flex-direction:row;flex-wrap:wrap;gap:12px}
  .browse-side .side-block{flex:1;min-width:200px}
  .sortlist{display:flex;flex-wrap:wrap;gap:6px}
  .sortlist li{flex:1;min-width:130px}
  .menu-toggle{display:inline-flex;align-items:center}
  .topbar-inner{flex-wrap:wrap;gap:12px}
  .brand{margin-right:auto}
  .search.big{order:5;flex-basis:100%;max-width:none}
  .tools{flex-wrap:wrap;gap:8px}
  .menubar{display:none}
  .menubar.open{display:block}
  .menubar.open .menubar-inner{flex-direction:column;align-items:stretch;padding:6px 0}
  .menubar.open .mlink{height:auto;padding:12px 4px;text-transform:none;border-bottom:1px solid var(--line)}
  .menubar.open .mega{display:none!important}
  .hero h1{font-size:38px}
}
@media(max-width:700px){
  .wrap{padding:0 16px}
  .main{padding:22px 16px 48px}
  .grid{grid-template-columns:repeat(2,1fr);gap:12px}
  .hero{padding:40px 0 32px}
  .hero h1{font-size:31px}
  .hero p{font-size:16px}
  .section-head{flex-wrap:wrap;gap:6px}
  .section-head h1{font-size:26px}
  .cat-hero{padding:24px 20px}
  .cat-hero-inner{flex-direction:column;align-items:flex-start;gap:16px;text-align:left}
  .cat-photo img,.cat-photo-ph{width:110px;height:110px}
  .cat-meta h1{font-size:28px}
  .cat-admin-grid{grid-template-columns:1fr}
  .tiles{grid-template-columns:repeat(2,1fr)}
  .panel{overflow-x:auto}
  .admin-main{padding:22px 16px}
  .danger-zone{flex-direction:column;align-items:flex-start;gap:10px}
  .modgrid{grid-template-columns:1fr}
  .lb-shell{grid-template-columns:1fr;height:94vh;gap:8px}
  .lb-side{max-height:34vh}
  .lb-suggest{display:none}
  .album-thumb{width:76px;height:52px}
}
@media(max-width:420px){
  .grid{grid-template-columns:1fr}
  .brand-slogan{display:none}
}


/* ---- Oeil d'affichage du mot de passe (ajoute par assets/js/app.js) ----
   Le bouton se pose PAR-DESSUS le champ, a droite, sans changer sa largeur :
   reduire le champ aurait decale tous les formulaires existants.
   Le padding droit du champ evite que le texte saisi passe sous l'icone. */
.pw-boite { position: relative; display: block; }
.pw-boite > input[type="password"],
.pw-boite > input[type="text"] { width: 100%; padding-right: 42px; }
.pw-oeil {
    position: absolute; top: 50%; right: 6px; transform: translateY(-50%);
    width: 32px; height: 32px; padding: 0;
    display: flex; align-items: center; justify-content: center;
    background: none; border: 0; border-radius: 6px;
    font-size: 15px; line-height: 1; cursor: pointer;
    opacity: .5; transition: opacity .15s, background .15s;
}
.pw-oeil:hover { opacity: .9; background: rgba(255, 255, 255, .07); }
/* Etat « mot de passe visible » : l'icone reste franche pour rappeler que le
   texte est en clair a l'ecran. */
.pw-oeil.pw-actif { opacity: 1; }
/* Le focus doit rester visible : c'est un bouton atteignable au clavier. */
.pw-oeil:focus-visible { outline: 2px solid var(--accent, #e11d2a); outline-offset: 2px; opacity: 1; }

/* =====================================================================
   Formulaire de profil Rencontres (views/meeting/edit.php)
   Une soixantaine de champs : sans repères, on ne sait ni où l'on en est
   ni où retrouver un champ déjà vu. D'où trois éléments — une barre de
   navigation collante, des sections nettement séparées, et une barre
   d'enregistrement fixe.
   ===================================================================== */

/* Navigation : collante sous l'en-tête du site, défilable horizontalement
   sur mobile plutôt que repliée sur trois lignes. */
.meet-formnav{
  position:sticky; top:64px; z-index:20;
  display:flex; gap:6px; overflow-x:auto; scrollbar-width:none;
  margin:0 0 16px; padding:8px;
  background:var(--panel); border:1px solid var(--line); border-radius:12px;
}
.meet-formnav::-webkit-scrollbar{display:none}
.meet-formnav a{
  flex:0 0 auto; padding:7px 13px; border-radius:8px;
  font-size:13px; font-weight:600; color:var(--mut); text-decoration:none;
  white-space:nowrap; transition:background .15s,color .15s;
}
.meet-formnav a:hover{background:var(--hover); color:var(--txt)}
.meet-formnav a.on{background:var(--accent); color:#fff}
.meet-formnav a[hidden]{display:none}

/* Sections : le titre porte la hiérarchie, un filet la referme. Le
   scroll-margin évite que la barre collante recouvre le titre visé. */
.meet-sec{padding:0 0 26px; margin:0 0 26px; border-bottom:1px solid var(--line); scroll-margin-top:124px}
.meet-sec:last-of-type{border-bottom:0; margin-bottom:8px}
.meet-sec[hidden]{display:none}
.meet-sec > h2{
  margin:0 0 4px; font-family:var(--serif); font-size:20px; font-weight:700;
  display:flex; align-items:center; gap:9px;
}
.meet-sec > h2::before{content:""; width:3px; height:20px; border-radius:2px; background:var(--accent)}
.meet-sec-help{margin:0 0 16px; color:var(--mut); font-size:13.5px; line-height:1.5}

/* Sous-blocs : un cran de moins que la section, sans l'imbrication de
   fieldsets qui empilait trois bordures autour d'un seul champ. */
.meet-sub{margin:16px 0 0; padding:14px 15px; background:var(--panel2); border-radius:10px}
.meet-sub[hidden]{display:none}
.meet-sub > h3{margin:0 0 11px; font-size:14px; font-weight:700; letter-spacing:.02em; text-transform:uppercase; color:var(--mut)}
.meet-sub-lbl{margin:14px 0 8px; font-size:14px; font-weight:700; letter-spacing:.02em; text-transform:uppercase; color:var(--mut)}
.meet-sub > *:last-child{margin-bottom:0}

/* Grille tarifaire : des champs courts, donc autant par ligne que la
   largeur le permet — six durées alignées par deux faisaient une colonne
   de trois rangées pour six nombres. */
.meet-rates{display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:12px}

/* =====================================================================
   AGENDA DE TOURNÉE
   ===================================================================== */

/* SAISIE — une étape par ligne : ville large, deux dates, une croix.
   La ville prend tout l'espace restant (1fr) et les dates leur largeur
   propre, sinon un sélecteur de date natif se retrouve tronqué. */
.tour-row{
  display:grid; grid-template-columns:1fr 160px 160px auto;
  gap:10px; align-items:end; margin-bottom:10px;
}
.tour-row > label{margin:0}
.tour-row .tour-del{align-self:end; height:38px; padding:0 12px; font-size:18px; line-height:1}
.tour-actions{display:flex; align-items:center; gap:12px; margin-top:4px}
.tour-actions .btn[disabled]{opacity:.5; cursor:not-allowed}
/* Sous 720 px la ligne s'empile : trois champs de 160 px côte à côte
   débordent, et un champ de date qui déborde n'est plus cliquable. */
@media (max-width:720px){
  .tour-row{grid-template-columns:1fr 1fr; }
  .tour-row > label:first-child{grid-column:1 / -1}
  .tour-row .tour-del{grid-column:1 / -1; justify-self:start}
}

/* AFFICHAGE SUR LA FICHE — l'étape en cours se distingue de celles à venir
   par la couleur d'accent ET par la mention « sur place » : la couleur
   seule ne dit rien à qui ne la voit pas. */
.mtour-agenda{padding:12px 14px}
.mtour-l{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:8px;
  padding:7px 0; border-bottom:1px solid var(--line);
}
.mtour-l:last-child{border-bottom:0}
.mtour-l time{color:var(--mut); font-size:13px}
.mtour-l.on{color:var(--accent)}
.mtour-l.on time{color:inherit}
.mtour-now{
  font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
  padding:2px 7px; border-radius:999px; background:var(--accent); color:#fff;
}

/* BADGE DE CARTE — « de passage du 3 au 7 septembre ». Sur une ligne, coupé
   par des points de suspension : la carte a une hauteur fixe, et une ville au
   nom long ne doit pas décaler celles d'à côté. */
.mcard-tour{
  font-size:11.5px; font-weight:600; color:var(--accent);
  margin:2px 0 1px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* PROCHAINS PASSAGES (pages de ville) — une liste, pas une grille de cartes :
   ce sont des dates qu'on parcourt à l'œil, et douze cartes prendraient la
   hauteur de la page pour une information qui tient en une ligne chacune. */
.mtour-ville{list-style:none; margin:0 0 22px; padding:0;
  display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:2px 18px}
.mtour-ville li{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:7px;
  padding:7px 0; border-bottom:1px solid var(--line); font-size:14px;
}
.mtour-ville li > a{font-weight:600; text-decoration:none}
.mtour-ville li > a:hover{text-decoration:underline}
.mtour-ville .muted{font-size:12.5px}
.mtour-ville time{margin-left:auto; color:var(--mut); font-size:12.5px; white-space:nowrap}
.mtour-cert{color:var(--accent); font-size:12px}

/* Code postal, devant la ville comme sur une enveloppe : en chasse fixe et
   légèrement en retrait, il se lit comme une donnée et non comme du texte. */
.mprofile-cp{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:.92em; color:var(--mut); letter-spacing:.03em}

/* =====================================================================
   VÉRIFICATION PAR SELFIE DATÉ
   ===================================================================== */

/* CÔTÉ MEMBRE — la page de dépôt. Deux colonnes : à gauche ce qu'il faut faire,
   à droite ce que devient la photo. La seconde n'est pas un aparté : c'est la
   contrepartie de la demande, et elle doit être lue en même temps. */
.mverif-cols{display:grid; grid-template-columns:1.15fr 1fr; gap:26px; align-items:start}
@media (max-width:900px){ .mverif-cols{grid-template-columns:1fr; gap:18px} }
.mverif-h2{font-size:19px; margin:0 0 8px}
.mverif-cols aside .mverif-h2:not(:first-child){margin-top:22px}

/* Les trois lignes à recopier, chacune isolée : un pavé de texte se recopie mal,
   et une erreur de recopie fait rejeter une vérification honnête. */
.mverif-code{display:flex; flex-direction:column; gap:8px; margin:12px 0}
.mvc-l{display:flex; align-items:center; gap:12px; padding:10px 14px;
  background:var(--panel2); border-radius:9px}
.mvc-l > span{flex:0 0 22px; height:22px; border-radius:50%; background:var(--line);
  color:var(--mut); font-size:12px; font-weight:700; display:flex; align-items:center; justify-content:center}
.mvc-l > b{font-size:17px}
/* Le code lui-même en chasse fixe et très espacé : c'est LUI qu'on recopie,
   et l'espacement sépare visuellement des signes qui se confondent à l'écriture. */
.mvc-l.code{background:var(--accent); }
.mvc-l.code > span{background:rgba(255,255,255,.28); color:#fff}
.mvc-l.code > b{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:26px; letter-spacing:.16em; color:#fff}

.mverif-form{margin-top:16px; padding:16px}
.mverif-form label{display:block; margin-bottom:4px}
.mverif-promesses{margin:0 0 4px; padding-left:20px}
.mverif-promesses li{margin-bottom:9px; font-size:13.5px; line-height:1.5}

.mverif-etat{display:flex; gap:13px; align-items:flex-start; padding:14px 16px; margin-bottom:18px;
  border-left:4px solid var(--line)}
.mverif-etat > svg{flex:0 0 auto; margin-top:2px}
.mverif-etat.ok{border-left-color:#12b886} .mverif-etat.ok > svg{color:#12b886}
.mverif-etat.vieux, .mverif-etat.attente{border-left-color:#e0a800}
.mverif-etat.vieux > svg, .mverif-etat.attente > svg{color:#e0a800}
.mverif-etat.refus{border-left-color:#e03131} .mverif-etat.refus > svg{color:#e03131}
.mverif-etat p{margin:3px 0 0}

/* CÔTÉ ADMINISTRATION — la photo et le code attendu côte à côte : le contrôle
   consiste à lire l'un sur l'autre, rien d'autre ne doit s'interposer. */
.mverif-grille{display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr));
  gap:16px; padding:14px}
.mverif-carte{display:flex; flex-direction:column; padding:0; overflow:hidden}
.mverif-carte img{width:100%; height:270px; object-fit:contain; background:#000; display:block}
.mverif-info{display:flex; flex-direction:column; gap:3px; padding:11px 13px 6px}
.mverif-attendu{margin:5px 0 2px; padding:7px 10px; background:var(--panel2); border-radius:7px}
.mverif-attendu b{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:17px; letter-spacing:.12em}
.mverif-actions{display:flex; flex-wrap:wrap; gap:7px; padding:0 13px 13px; margin-top:auto}
.mverif-actions form{display:flex; gap:6px; align-items:center; margin:0}
.mverif-actions input{min-width:0; flex:1 1 130px; font-size:12.5px}
.admin-alerte{padding:10px 13px; border-radius:8px; background:rgba(224,49,49,.12);
  border-left:4px solid #e03131; font-size:13px}

/* =====================================================================
   COLLECTIONS ÉDITORIALES
   ===================================================================== */

/* INDEX — un sommaire de magazine, pas une grille de vignettes : chaque entrée
   porte son texte, parce que c'est le texte qui distingue une sélection d'une
   catégorie. Une carte réduite à une image ne dirait pas pourquoi elle existe. */
.coll-index{display:flex; flex-direction:column; gap:18px}
.coll-carte{display:flex; gap:18px; align-items:flex-start;
  padding-bottom:18px; border-bottom:1px solid var(--line)}
.coll-carte:last-child{border-bottom:0}
.coll-vig{flex:0 0 260px; display:block; border-radius:10px; overflow:hidden; background:#000}
.coll-vig img{width:100%; height:160px; object-fit:cover; display:block}
.coll-corps{flex:1 1 auto; min-width:0}
.coll-corps h2{margin:0 0 4px; font-size:21px; line-height:1.25}
.coll-corps h2 a{text-decoration:none}
.coll-corps h2 a:hover{text-decoration:underline}
.coll-meta{margin:0 0 8px; font-size:12.5px; color:var(--mut)}
.coll-intro{margin:0 0 10px; font-size:14.5px; line-height:1.55}
.coll-lire{font-size:13.5px; font-weight:600; text-decoration:none}
.coll-lire:hover{text-decoration:underline}
@media (max-width:700px){
  .coll-carte{flex-direction:column; gap:12px}
  .coll-vig{flex-basis:auto; width:100%}
}

/* PAGE — le texte occupe la largeur de lecture, pas celle de l'écran : au-delà
   de ~70 caractères par ligne l'œil perd le début de la ligne suivante, et une
   introduction qu'on ne lit pas ne sert à rien. */
.coll-page{max-width:1100px; margin:0 auto}
.coll-tete h1{margin:0 0 6px; font-size:30px; line-height:1.2}
.coll-intro-longue{max-width:66ch; margin:14px 0 26px; font-size:16px; line-height:1.7}
.coll-brouillon{padding:12px 16px; margin-bottom:18px;
  border-left:4px solid #e0a800; background:rgba(224,168,0,.1)}
.coll-items{list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:20px}
.coll-item{position:relative}
/* Le RANG est visible : dans une sélection, la place est une information —
   « la troisième » n'est pas « une des dix ». */
.coll-rang{position:absolute; top:-9px; left:-9px; z-index:2;
  width:30px; height:30px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  background:var(--accent); color:#fff; font-size:14px; font-weight:800; font-variant-numeric:tabular-nums;
  box-shadow:0 2px 8px rgba(0,0,0,.35)}
.coll-note{margin:8px 0 0; font-size:13.5px; line-height:1.5; color:var(--mut);
  border-left:2px solid var(--line); padding-left:10px}
.coll-retour{margin:30px 0 0}

/* ADMINISTRATION — liste à gauche, édition à droite. */
.coll-admin{display:grid; grid-template-columns:300px 1fr; gap:18px; align-items:start}
@media (max-width:900px){ .coll-admin{grid-template-columns:1fr} }
.coll-admin-liste .panel{margin-bottom:10px}
.coll-admin-ul{list-style:none; margin:0; padding:0}
.coll-admin-ul li{border-bottom:1px solid var(--line)}
.coll-admin-ul li:last-child{border-bottom:0}
.coll-admin-ul a{display:flex; flex-direction:column; gap:3px; padding:10px 13px; text-decoration:none}
.coll-admin-ul li.on a{background:var(--panel2); box-shadow:inset 3px 0 0 var(--accent)}
.coll-admin-ul a:hover{background:var(--panel2)}
.coll-admin-etats{display:flex; flex-wrap:wrap; gap:5px; margin-top:2px}
.coll-admin-form{padding:14px}
.coll-admin-form textarea{width:100%; font-family:inherit; font-size:14px; line-height:1.6}
.coll-admin-actions{display:flex; gap:7px; align-items:center}
.coll-add{display:flex; gap:12px; align-items:end; padding:14px 14px 6px}
.coll-add label{flex:1 1 auto; margin:0}
.coll-add input{width:100%}

/* =====================================================================
   CLASSEMENT ASSISTÉ DES MÉDIAS
   ===================================================================== */
.mrang-liste{display:flex; flex-direction:column; gap:14px}
.mrang{display:flex; gap:16px; padding:14px 16px; align-items:flex-start}
.mrang-vig{flex:0 0 150px; display:block; border-radius:8px; overflow:hidden; background:#000}
.mrang-vig img{width:150px; height:96px; object-fit:cover; display:block}
.mrang-corps{flex:1 1 auto; min-width:0}
.mrang-titre b{display:block; font-size:15px; margin-bottom:2px}
.mrang-manque{display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin:8px 0 4px}
.mrang-bloc{display:flex; flex-wrap:wrap; gap:7px; align-items:center; margin:8px 0}
.mrang-lbl{font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
  color:var(--mut); flex:0 0 68px}
/* Une proposition = une pastille cliquable. La RAISON est dans la pastille, en filet :
   c'est ce qui permet de décider sans ouvrir le média. */
.mrang-chk{display:inline-flex; align-items:center; gap:6px; margin:0;
  padding:5px 10px; border-radius:999px; background:var(--panel2); cursor:pointer; font-size:13px}
.mrang-chk input{margin:0}
.mrang-chk em{font-style:normal; font-size:11px}
/* Proposition SÛRE (le nom est dans le titre) : précochée, et signalée comme telle. */
.mrang-chk.sure{box-shadow:inset 0 0 0 1px rgba(18,184,134,.6)}
.mrang-chk:hover{background:var(--line)}
.mrang-libre{display:block; margin:10px 0 0; font-size:12.5px; color:var(--mut)}
.mrang-libre input{width:100%; max-width:420px; margin-top:3px}
/* Barre collante : vingt blocs font une page qu'on fait défiler, et remonter chercher le
   bouton après avoir tout revu est le frottement qui fait abandonner au troisième lot. */
.mrang-barre{position:sticky; bottom:0; display:flex; align-items:center; gap:14px;
  margin-top:18px; padding:12px 16px; background:var(--panel);
  border-top:1px solid var(--line); border-radius:10px 10px 0 0}
.tile.on{box-shadow:inset 0 0 0 2px var(--accent)}

/* =====================================================================
   « PRÈS DE CHEZ VOUS » — la proximité, devenue un ONGLET
   ===================================================================== */
/* C'était un pavé posé au-dessus des onglets. Il repoussait tout le reste vers
   le bas, réaffichait des profils que la liste allait remontrer, et surtout il
   DISPARAISSAIT quand la ville était inconnue : la fonction n'existait alors
   plus du tout, sans même un bouton pour la réclamer. Un onglet ne coûte aucune
   hauteur, reste là quand on ne sait rien, et peut être celui d'arrivée. */
.meet-tab-geo{display:inline-flex; align-items:center; gap:6px}
/* L'épingle prend la couleur d'accent quand l'onglet est au repos ; active, elle
   passe en blanc avec le reste du libellé — sans quoi elle disparaîtrait sur le
   fond rose. */
.meet-tabs a.meet-tab-geo .mic{color:var(--accent)}
.meet-tabs a.meet-tab-geo.on .mic{color:#fff}
/* La note sous les onglets : elle porte la seule chose qu'un libellé ne peut pas
   dire — d'où vient la ville proposée, et comment la corriger. */
.meet-tabs-note{margin:-8px 0 14px; display:flex; flex-wrap:wrap; gap:4px 10px; align-items:baseline}
.meet-tabs-note a{text-decoration:none; white-space:nowrap}
.meet-tabs-note a:hover{text-decoration:underline}
.meet-proches-h3{margin:18px 0 8px; font-size:14px; font-weight:700;
  text-transform:uppercase; letter-spacing:.03em; color:var(--mut)}
@media (max-width:620px){
  /* Quatre onglets ne tiennent pas sur une ligne étroite : ils défilent plutôt
     que de passer à la ligne, ce qui déplacerait toute la grille sous eux. */
  .meet-tabs{overflow-x:auto; scrollbar-width:none; -ms-overflow-style:none}
  .meet-tabs::-webkit-scrollbar{display:none}
  .meet-tabs a{flex:none; padding:7px 13px}
}

/* =====================================================================
   MISE EN AVANT PAYANTE
   ===================================================================== */
.mboost-intro{padding:16px 18px; margin-bottom:20px}
.mboost-intro p{margin:0 0 8px}
.mboost-intro p:last-child{margin-bottom:0}
.mboost-prix{font-size:22px}
.mboost-prix .muted{font-size:13px; font-weight:400}

/* Une carte par ville. Trois états visuellement distincts — libre, à moi, pleine — parce que
   « il reste des places » et « il n'y en a plus » commandent deux gestes opposés. */
.mboost-villes{display:grid; grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); gap:14px}
.mboost-ville{padding:14px 16px; display:flex; flex-direction:column; gap:8px}
.mboost-ville.on{border-left:4px solid #12b886}
.mboost-ville.pleine{opacity:.72}
.mbv-h{display:flex; justify-content:space-between; align-items:baseline; gap:10px}
.mbv-h b{font-size:16px}
.mbv-etat{margin:0; font-size:13.5px}
.mbv-etat.on{color:#12b886; font-weight:600}
.mbv-etat.pleine{color:var(--mut); font-weight:600}
.mboost-ville form{margin:0}

/* Back-office : l'occupation ville par ville, lisible d'un regard — c'est le tableau qui dit
   où il reste des places à vendre. */
.mboost-occ{display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:8px; padding:14px}
.mbo{display:flex; justify-content:space-between; align-items:baseline; gap:8px;
  padding:8px 11px; border-radius:7px; background:var(--panel2); font-size:13px}
.mbo.partielle{box-shadow:inset 0 0 0 1px rgba(224,168,0,.5)}
.mbo.pleine{background:rgba(224,168,0,.16); box-shadow:inset 0 0 0 1px rgba(224,168,0,.75)}
.mbo > span{color:var(--mut); font-variant-numeric:tabular-nums}
.mboost-grant{display:flex; flex-wrap:wrap; gap:12px; align-items:end; padding:0 14px 14px}
.mboost-grant label{margin:0}

/* =====================================================================
   ALERTE DE VILLE — « Prévenez-moi quand une escorte arrive à Toulouse »
   ===================================================================== */
.meet-alerte-ville{
  display:flex; align-items:center; gap:14px;
  margin:0 0 18px; padding:13px 16px;
  background:var(--panel2); border-radius:10px;
  border-left:4px solid var(--accent);
}
/* Une fois abonné, la bordure d'accent tombe : le bloc a fait son travail et
   ne doit plus attirer l'œil autant qu'une proposition. */
.meet-alerte-ville.on{border-left-color:var(--line)}
.meet-alerte-ville .mav-ic{color:var(--accent); display:flex; flex:0 0 auto}
.meet-alerte-ville.on .mav-ic{color:var(--mut)}
.meet-alerte-ville .mav-txt{display:flex; flex-direction:column; gap:2px; min-width:0; flex:1 1 auto}
.meet-alerte-ville .mav-txt b{font-size:14.5px}
.meet-alerte-ville .mav-txt span{font-size:12.5px; color:var(--mut)}
.meet-alerte-ville form{margin:0; flex:0 0 auto}
/* Sous 620 px le bouton passe sous le texte : à trois éléments sur une ligne,
   c'est lui qui se comprime, et un bouton étroit se rate au doigt. */
@media (max-width:620px){
  .meet-alerte-ville{flex-wrap:wrap}
  .meet-alerte-ville .mav-txt{flex-basis:calc(100% - 34px)}
  .meet-alerte-ville form, .meet-alerte-ville > .btn{width:100%}
  .meet-alerte-ville form .btn{width:100%}
}

.meet-callout{
  margin:0 0 16px; padding:14px; border-radius:10px;
  background:var(--panel2); border-left:4px solid var(--accent);
}
.meet-dispo{margin-top:16px}

/* Barre d'enregistrement : toujours accessible. Le bouton se trouvait au
   bout de plus de deux mètres de page. */
.meet-savebar{
  position:sticky; bottom:0; z-index:15;
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  margin:8px -18px -18px; padding:14px 18px;
  background:var(--topbar); backdrop-filter:blur(8px);
  border-top:1px solid var(--line);
}
@media (max-width:640px){
  .meet-formnav{top:56px}
  .meet-sec{scroll-margin-top:112px}
  .meet-savebar .muted{display:none}   /* place au bouton, d'abord */
}

/* =====================================================================
   Formulaires de réglages en onglets (assets/js/adminform.js)
   Dix-sept sections empilées dans un seul formulaire ne se lisent pas :
   on les découpe à l'affichage, sans rien changer côté serveur.
   ===================================================================== */
.adm-formsearch{
  width:100%; max-width:380px; margin:0 0 12px;
  padding:9px 12px; border-radius:9px;
  border:1px solid var(--line); background:var(--field); color:var(--txt); font:inherit;
}
.adm-formsearch:focus{outline:2px solid var(--accent); outline-offset:1px; border-color:var(--accent)}

.adm-formnav{
  position:sticky; top:0; z-index:12;
  display:flex; flex-wrap:wrap; gap:6px;
  margin:0 0 18px; padding:10px;
  background:var(--panel2); border:1px solid var(--line); border-radius:12px;
}
.adm-tab{
  padding:7px 13px; border-radius:8px; border:1px solid transparent;
  background:transparent; color:var(--mut); font:inherit; font-size:13px; font-weight:600;
  cursor:pointer; white-space:nowrap; transition:background .14s, color .14s;
}
.adm-tab:hover{background:var(--hover); color:var(--txt)}
.adm-tab.on{background:var(--accent); color:#fff}
.adm-tab[hidden]{display:none}
/* Pendant une recherche, les onglets qui répondent se signalent même quand
   ils ne sont pas ouverts. */
.adm-tab.trouve:not(.on){border-color:var(--accent); color:var(--txt)}

.adm-sec{animation:admFade .16s ease}
.adm-sec[hidden]{display:none}
.adm-sec > h2, .adm-sec > h3{
  margin:0 0 14px !important; padding:0 0 10px !important;
  border-top:0 !important; border-bottom:1px solid var(--line);
  font-size:18px !important; font-weight:700;
}
@keyframes admFade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* Barre d'enregistrement ancrée : le bouton était au bout de plusieurs mètres
   de page, et il fallait remonter pour vérifier ce qu'on venait de changer. */
.adm-savebar{
  position:sticky; bottom:0; z-index:11;
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  margin:22px -18px -18px; padding:14px 18px;
  background:var(--topbar); backdrop-filter:blur(8px);
  border-top:1px solid var(--line);
}
@media (max-width:640px){
  .adm-formnav{padding:8px; gap:4px}
  .adm-tab{padding:6px 10px; font-size:12.5px}
  .adm-savebar .muted{display:none}
}

/* =====================================================================
   Prestations à trois états (formulaire) — ✔ proposé · ✖ refusé · — sans réponse.
   Des boutons radio habillés : les trois états s'excluent, et le clavier
   les parcourt nativement. Le libellé reste lisible en toutes lettres,
   la couleur ne porte jamais l'information seule.
   ===================================================================== */
.msv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:8px;margin:0 0 14px}
.msv{
  display:flex;align-items:center;gap:10px;justify-content:space-between;
  padding:7px 9px 7px 12px;border-radius:9px;
  background:var(--panel);border:1px solid var(--line);
}
.msv-lbl{font-size:13.5px;line-height:1.35;min-width:0}
/* Repère après un ajout : la prestation existait déjà, on l'amène à l'œil
   plutôt que d'en créer un doublon. */
.msv-flash{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--panel))}
.msv-choix{display:inline-flex;flex:0 0 auto;border:1px solid var(--line2);border-radius:8px;overflow:hidden}
.msv-choix input{position:absolute;opacity:0;width:0;height:0}
.msv-choix label{
  padding:4px 10px;font-size:13px;line-height:1.3;cursor:pointer;
  color:var(--mut2);background:var(--field);
  border-right:1px solid var(--line2);transition:background .13s,color .13s;
}
.msv-choix label:last-child{border-right:0}
.msv-choix label:hover{background:var(--hover);color:var(--txt)}
.msv-choix input:checked + label.msv-oui{background:var(--ok,#22c55e);color:#08210f;font-weight:700}
.msv-choix input:checked + label.msv-non{background:#ef4444;color:#fff;font-weight:700}
.msv-choix input:checked + label.msv-vide{background:var(--line2);color:var(--txt)}
.msv-choix input:focus-visible + label{outline:2px solid var(--accent);outline-offset:-2px}
.msv-k{color:var(--ok,#22c55e)}
.msv-x{color:#ef4444}
/* Champ d'ajout : la liste de suggestions se pose par-dessus le contenu. */
.msv-add{position:relative;max-width:460px;margin:2px 0 8px}
.msv-add input{width:100%}

/* =====================================================================
   Erreurs de formulaire, SOUS leur champ (assets/js/formcheck.js).
   La couleur ne porte pas l'information seule : il y a un texte, et un
   liseré à gauche du champ que le daltonisme ne masque pas.
   ===================================================================== */
.field-err{
  margin:-8px 0 12px; padding:6px 0 0 10px;
  border-left:3px solid #ef4444; color:#ef4444;
  font-size:12.5px; line-height:1.45; font-weight:600;
}
.field-err[hidden]{display:none}
.form input.is-err, input.is-err{border-color:#ef4444 !important}
.form input.is-ok, input.is-ok{border-color:var(--ok,#22c55e) !important}

/* Texte réservé aux lecteurs d'écran : présent dans le document, absent de l'écran.
   Le ✔ et le ✖ sont marqués aria-hidden ; sans ce relais, une liste de services
   se lirait comme une suite de libellés sans savoir lesquels sont refusés. */
.u-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
      clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* Fiche escorte : la ville complète le pseudo dans le H1, en plus discret —
   c'est la requête tapée (« escorte Bordeaux »), elle doit y figurer sans
   voler la vedette au nom. */
.mprofile-h1sub{font-weight:400;font-size:.62em;opacity:.78;white-space:nowrap}
@media (max-width:520px){.mprofile-h1sub{display:block;font-size:.7em}}

/* Fiche publique : « Services », deux colonnes de ✔ et de ✖ (cf. pres.png). */
.mprofile-services{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:5px 18px;margin:2px 0 0}
.mprofile-services li{display:flex;gap:8px;align-items:flex-start;font-size:13.5px;line-height:1.4}
.mprofile-services .sv-o{color:var(--ok,#22c55e);font-weight:700;flex:0 0 auto}
.mprofile-services .sv-n{color:#ef4444;font-weight:700;flex:0 0 auto}
.mprofile-services .sv-non-txt{color:var(--mut)}

/* =====================================================================
   Robustesse du mot de passe (assets/js/password.js)
   Jauge à 5 segments + conseil + bouton de génération.
   La couleur ne porte JAMAIS l'information seule : le niveau est toujours
   écrit en toutes lettres à côté (« Faible », « Robuste »…), pour rester
   lisible en cas de daltonisme comme en impression noir et blanc.
   ===================================================================== */
.pwd-tools { margin: -6px 0 14px; }
.pwd-meter { display: flex; gap: 4px; margin-bottom: 6px; }
.pwd-meter i {
  flex: 1; height: 4px; border-radius: 2px;
  background: var(--line2, #2e2e3d);
  transition: background .18s ease;
}
/* Trois paliers, trois couleurs — Faible, Moyen, Fort. Les segments allumés
   prennent la teinte du palier atteint, les autres restent neutres. */
.pwd-tools.p0 .pwd-meter i.on, .pwd-tools.p0 .pwd-label { color: #ef4444; background: #ef4444; }
.pwd-tools.p1 .pwd-meter i.on, .pwd-tools.p1 .pwd-label { color: var(--warn, #fbbf24); background: var(--warn, #fbbf24); }
.pwd-tools.p2 .pwd-meter i.on, .pwd-tools.p2 .pwd-label { color: var(--ok, #22c55e); background: var(--ok, #22c55e); }
/* Le libellé est du TEXTE : il reprend la couleur du niveau, jamais son fond. */
.pwd-tools .pwd-label { background: none !important; font-weight: 600; }

.pwd-note { margin: 0 0 8px; font-size: 13px; line-height: 1.45; min-height: 19px; }
.pwd-note .pwd-tip { color: var(--mut, #8b90a3); }
.pwd-gen { font-size: 13px; }
.pwd-copy {
  margin: 8px 0 0; padding: 8px 10px; border-radius: 6px;
  background: rgba(255, 255, 255, .04);
  border-left: 3px solid var(--gold, #c9a45e);
}
/* Le mot de passe généré est long : il doit rester lisible d'un coup d'œil,
   sans césure au milieu d'un caractère spécial. */
input[data-pwd-tools][type="text"] { font-family: ui-monospace, "Cascadia Mono", Consolas, monospace; letter-spacing: .02em; }
/* ------------------------------------------------------------------------------------------
   .sr-only : lu par les moteurs de recherche et les lecteurs d'ecran, invisible a l'oeil.
   Sert aux <h1> de repli des pages dont le titre visible est desactive au back-office --
   une page sans h1 prive Google de son principal indice sur le sujet traite.
   On n'utilise NI display:none NI visibility:hidden : ces deux-la retirent l'element de
   l'arbre d'accessibilite, et Google les traite comme du contenu masque.
   ------------------------------------------------------------------------------------------ */
.sr-only {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ------------------------------------------------------------------------------------------
   Pied de page : colonnes de liens INTERNES (maillage SEO).
   Reprend la grille des blocs partenaires, avec deux differences : les liens ne sortent pas du
   site, et la colonne est un peu plus dense car elle porte jusqu'a 13 entrees.
   ------------------------------------------------------------------------------------------ */
.footer-seo{margin-bottom:18px}
/* 1.75 etait genereux : sur une colonne de neuf liens, cela faisait a lui seul une cinquantaine
   de pixels de plus que necessaire. 1.5 reste largement au-dessus du minimum de confort. */
.footer-seo .fp-link{line-height:1.5}
/* Dans le module Rencontres, .meet-foot n'a AUCUN rembourrage (seul .meet-foot-in en porte) :
   les titres de colonnes se retrouvaient collés a la bordure superieure du pied de page.
   On le pose ici, sur le bloc lui-meme, pour ne pas toucher au pied de page du site principal
   qui, lui, respire deja grace a .footer{padding:26px 0}. */
.meet-foot-seo{padding-top:26px}

/* Page Partenariat -------------------------------------------------------------------------- */
.partner-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin:14px 0 26px}
.partner-stat{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 12px;text-align:center}
.partner-stat b{display:block;font-size:24px;color:var(--txt);line-height:1.2}
.partner-stat span{display:block;font-size:12px;color:var(--mut);margin-top:4px}

.partner-offers{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin:14px 0 26px}
.partner-offer{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px}
.partner-offer h3{margin:0 0 6px;font-size:16px}
.partner-offer p{margin:0;font-size:14px;line-height:1.6;color:var(--mut)}

.partner-rules{margin:12px 0 18px;padding-left:20px;line-height:1.75}
.partner-rules li{margin-bottom:6px}

/* Reglages du pied de page au back-office ---------------------------------------------------- */
.partner-seo-opts{display:flex;flex-wrap:wrap;gap:18px;margin:10px 0 14px}
.partner-seo-titles{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:6px}

/* Edition des liens de pied de page (back-office) : deux colonnes libelle / destination. */
.footer-links-edit{display:grid;gap:8px;margin:10px 0 14px}
.footer-links-edit .partner-row{display:grid;grid-template-columns:1fr 1.4fr;gap:8px}
@media(max-width:640px){.footer-links-edit .partner-row{grid-template-columns:1fr}}

/* Reordonnancement des vignettes par glisser-deposer (fiches et annonces) --------------------- */
.meet-editgal[data-photo-order] .meet-editgal-item{cursor:grab;touch-action:none;transition:transform .12s,box-shadow .12s}
.meet-editgal[data-photo-order] .meet-editgal-item.is-dragging{cursor:grabbing;opacity:.65;transform:scale(.96);box-shadow:0 6px 18px rgba(0,0,0,.35)}
.meet-editgal.is-reordering{user-select:none}
.meet-editgal.is-saving{opacity:.7}
/* La premiere vignette EST la photo principale : on le montre, sinon le geste n'a pas d'effet visible. */
.meet-editgal[data-photo-order] .meet-editgal-item.is-main-photo{outline:2px solid var(--ok);outline-offset:-2px;border-radius:10px}
.meet-editgal[data-photo-order] .meet-editgal-item.is-main-photo::after{
    content:"Principale";position:absolute;top:4px;left:4px;z-index:2;
    background:var(--ok);color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px;
    letter-spacing:.03em;pointer-events:none}
.meet-editgal[data-photo-order] .meet-editgal-item{position:relative}

/* Meme geste dans le BACK-OFFICE (fiche et annonce) : la grille y est .mad-photos, avec ses
   propres vignettes. Les regles ci-dessus etant liees a .meet-editgal, il faut les redire ici —
   les fusionner obligerait a toucher au balisage des deux ecrans, pour un gain nul. */
.mad-photos[data-photo-order] .mad-photo{position:relative;cursor:grab;touch-action:none;transition:transform .12s,box-shadow .12s}
.mad-photos[data-photo-order] .mad-photo.is-dragging{cursor:grabbing;opacity:.65;transform:scale(.96);box-shadow:0 6px 18px rgba(0,0,0,.35)}
.mad-photos.is-reordering{user-select:none}
.mad-photos.is-saving{opacity:.7}
.mad-photos[data-photo-order] .mad-photo.is-main-photo{outline:2px solid var(--ok);outline-offset:-2px}
.mad-photos[data-photo-order] .mad-photo.is-main-photo::after{
    content:"Principale";position:absolute;top:4px;left:4px;z-index:2;
    background:var(--ok);color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px;
    letter-spacing:.03em;pointer-events:none}

/* ------------------------------------------------------------------------------------------
   Page d'atterrissage d'une ville (/rencontres/ville/<slug>).
   Les styles vivaient dans deux blocs <style> au milieu du corps du document : reecrits a
   chaque affichage, invisibles a la recherche, et impossibles a mettre en cache.
   Regle d'ensemble : l'icone accompagne le libelle, elle ne le remplace jamais.
   ------------------------------------------------------------------------------------------ */
.meet-ville-h1{display:flex;align-items:center;gap:10px;margin:0}
.meet-ville-h1 .mic{color:var(--accent);flex:none}
.meet-ville-h2{display:flex;align-items:center;gap:9px;font-size:20px;margin:26px 0 12px}
.meet-ville-h2 .mic{color:var(--accent);flex:none}

/* Compteurs en pastilles : l'information cherchee en arrivant, lisible d'un coup d'oeil. */
.meet-ville-stats{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 0}
.meet-ville-stats .mvs{display:inline-flex;align-items:center;gap:7px;
    padding:6px 12px;border-radius:999px;background:var(--panel);border:1px solid var(--line);
    font-size:13.5px;color:var(--mut);white-space:nowrap}
.meet-ville-stats .mvs .mic{color:var(--accent);flex:none}
.meet-ville-stats .mvs b{color:var(--txt);font-size:15px}
.meet-ville-stats .mvs-dep{color:var(--mut)}

/* Appel vers les escortes de la ville : la requete la plus demandee du module. */
.meet-ville-esc{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
    padding:14px 16px;margin:0 0 18px;border-radius:12px;text-decoration:none;color:var(--txt);
    background:var(--panel);border:1px solid var(--line);border-left:4px solid var(--accent);
    transition:border-color .14s,background .14s}
.meet-ville-esc:hover{background:var(--hover)}
.meet-ville-esc-ic{display:inline-flex;flex:none;color:var(--accent)}
.meet-ville-esc-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.meet-ville-esc-txt b{font-size:16px}
.meet-ville-esc-txt span{color:var(--mut);font-size:13.5px}
.meet-ville-esc-go{display:inline-flex;align-items:center;gap:5px;margin-left:auto;
    color:var(--accent2);font-weight:600;white-space:nowrap}

/* Les annonces de la ville s'affichent desormais avec la MEME carte que la page des annonces
   (partials/meet_adcard, grille .meet-adgrid) : image, type, extrait, auteur. L'ancienne liste
   a puces .meet-ville-ads n'est plus employee nulle part — regle retiree pour ne pas laisser
   de style orphelin derriere soi. */

/* Villes voisines en pastilles cliquables : lisible au-dela de trois entrees, et assez
   grand pour etre atteint au doigt — une liste separee par des points ne l'etait pas. */
.meet-ville-proches{display:flex;flex-wrap:wrap;gap:8px}
.meet-ville-proches .mvp{display:inline-flex;align-items:center;gap:6px;
    padding:7px 13px;border-radius:999px;background:var(--panel);border:1px solid var(--line);
    color:var(--txt);text-decoration:none;font-size:13.5px;transition:background .14s,border-color .14s}
.meet-ville-proches .mvp:hover{background:var(--hover);border-color:var(--accent)}
.meet-ville-proches .mvp .mic{color:var(--accent);flex:none}

.meet-ville-vide{display:inline-flex;align-items:center;gap:8px}
.meet-ville-vide .mic{color:var(--mut);flex:none}

.meet-ville-cta{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:24px;padding:16px}
.meet-ville-cta .mvc-ic{display:inline-flex;flex:none;color:var(--accent)}
.meet-ville-cta .mvc-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.meet-ville-cta .btn{margin-left:auto}
@media(max-width:560px){.meet-ville-cta .btn,.meet-ville-esc-go{margin-left:0}}

/* Saisie rapide d'une escorte (admin) -------------------------------------------------------- */
.escrap h2{display:flex;align-items:center;gap:8px;font-size:16px;margin:22px 0 10px;
    padding-top:16px;border-top:1px solid var(--line)}
.escrap h2:first-of-type{border-top:0;padding-top:0;margin-top:6px}
.escrap h2 .mic{color:var(--accent);flex:none}
.escrap-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.escrap-rates{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-bottom:12px}
.escrap-pseudo{display:flex;gap:6px;align-items:center}
.escrap-pseudo input{flex:1;min-width:0}
.escrap-pseudo .btn{flex:none;padding:8px 11px;font-size:15px;line-height:1}
.escrap-fam{margin-bottom:12px;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.escrap-fam-t{padding:8px 12px;background:var(--panel);font-weight:700;font-size:13px;
    text-transform:uppercase;letter-spacing:.04em;color:var(--mut)}
.escrap-srv{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
    padding:7px 12px;border-top:1px solid var(--line);font-size:14px}
.escrap-srv-r{display:flex;gap:12px;flex:none}
.escrap-srv-r label{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:var(--mut);margin:0}
.escrap-oui{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;margin:10px 0}
.escrap-o{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;
    background:var(--panel);border:1px solid var(--line);border-radius:9px;font-size:14px}
.escrap-o b{flex:1;min-width:0}
.escrap-o label{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:var(--mut);margin:0}
.escrap-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px;padding-top:16px;border-top:1px solid var(--line)}

/* Raccourci d'administration dans le pied de page du module. */
.meet-foot-admin{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;
    background:var(--panel);border:1px dashed var(--accent);color:var(--accent2);
    font-size:12px;font-weight:600;text-decoration:none;white-space:nowrap}
.meet-foot-admin:hover{background:var(--hover)}
.meet-foot-admin .mic{flex:none}

/* Inscription escorte en libre-service : les trois etapes annoncees en tete. */
.escrap-etapes{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin:0 0 20px}
.escrap-etapes .ee{display:flex;flex-direction:column;gap:3px;padding:14px 16px;
    background:var(--panel);border:1px solid var(--line);border-radius:12px;border-left:3px solid var(--accent)}
.escrap-etapes .ee-n{display:inline-flex;align-items:center;justify-content:center;
    width:24px;height:24px;border-radius:50%;background:var(--accent);color:#fff;
    font-size:13px;font-weight:700;margin-bottom:4px}
/* Les cases de consentement respirent : un engagement ne se coche pas au milieu d'une grille. */
.escrap-consent{align-items:flex-start;gap:10px;padding:12px 14px;margin:8px 0;
    background:var(--panel);border:1px solid var(--line);border-radius:10px;line-height:1.55}

/* ---------- Dépôt d'un dossier d'escorte (import .txt + images/) ---------- */
/* La zone existe parce qu'un <input multiple> n'envoie que les fichiers cochés : le
   sous-dossier images/ n'était jamais transmis. Le récapitulatif au-dessus des vignettes
   rend la chose vérifiable d'un coup d'oeil AVANT l'analyse. */
.ddz{border:2px dashed var(--line);border-radius:14px;padding:22px 18px;text-align:center;cursor:pointer;transition:border-color .15s,background .15s}
.ddz:hover,.ddz.drag{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,transparent)}
.ddz-in{display:flex;flex-direction:column;align-items:center;gap:6px}
.ddz-ico{color:var(--accent);opacity:.85}
.ddz-input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.ddz-files{margin:14px 0 4px}
.ddz-recap{font-size:13px;color:var(--mut);margin-bottom:10px}
.ddz-recap b{color:var(--txt)}
.ddz-warn{color:var(--warn,#e0a800)}
.ddz-list{list-style:none;padding:0;margin:0 0 12px;display:flex;flex-direction:column;gap:4px}
.ddz-txt{display:flex;align-items:center;gap:9px;font-size:13px;padding:5px 9px;background:var(--panel);border:1px solid var(--line);border-radius:8px}
.ddz-ic{font-size:10px;font-weight:700;letter-spacing:.06em;color:var(--accent);border:1px solid currentColor;border-radius:4px;padding:1px 4px}
.ddz-nom{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ddz-poids{color:var(--mut);font-size:12px}
.ddz-vignettes{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:8px}
.ddz-vig{position:relative;width:84px;height:112px;border-radius:8px;overflow:hidden;background:var(--panel)}
.ddz-vig img{width:100%;height:100%;object-fit:cover;display:block}
.ddz-main{position:absolute;left:0;bottom:0;right:0;font-size:10px;background:rgba(0,0,0,.62);color:#fff;padding:2px 0}
.ddz-del{position:absolute;top:2px;right:2px;border:0;border-radius:50%;width:20px;height:20px;line-height:1;cursor:pointer;background:rgba(0,0,0,.55);color:#fff;font-size:12px}
.ddz-txt .ddz-del{position:static;width:18px;height:18px;background:transparent;color:var(--mut)}
.ddz-del:hover{background:var(--danger,#c62828);color:#fff}/* Avertissement d'age hors bornes sous le menu de la saisie rapide. */
.escrap-age-warn{color:var(--danger,#c62828)}
/* ---------- Editeur des colonnes du pied de page (back-office) ---------- */
/* Cinq colonnes de saisie cote a cote : c'est la disposition du pied de page lui-meme, et voir
   les cases dans l'ordre ou les liens sortiront evite de compter les colonnes de tete. */
.footer-cols-edit{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin:0 0 16px}
@media(max-width:1400px){.footer-cols-edit{grid-template-columns:repeat(3,1fr)}}
@media(max-width:1000px){.footer-cols-edit{grid-template-columns:repeat(2,1fr)}}
@media(max-width:680px){.footer-cols-edit{grid-template-columns:1fr}}
.footer-cols-edit .partner-block{padding:12px}
.footer-cols-edit .partner-row{grid-template-columns:1fr;gap:4px}
.footer-cols-edit input{font-size:13px}
/* Colonnes automatiques : les cases restent LISIBLES (elles montrent ce qui est affiche) mais
   attenuees, pour qu'on ne croie pas saisir quelque chose qui sera pris en compte. */
.footer-cols-edit[data-inactif]{opacity:.5}
.footer-cols-edit[data-inactif] input{pointer-events:none;background:var(--field)}
/* ---------- Pied de page : repli des colonnes de maillage ---------- */
/* Cinq colonnes de neuf liens font dix lignes de haut sur CHAQUE page. On n'en montre que
   quatre par colonne ; un bouton unique deplie TOUTES les colonnes a la fois.
   Les liens replies restent dans le HTML — de vraies balises <a href>, simplement masquees par
   le CSS : un robot les lit et les suit, le maillage interne reste entier. */
.footer-seo-wrap{position:relative}
.fp-link.fp-more{display:none}
/* Case a cocher masquee a l'oeil mais FOCALISABLE : le repli reste actionnable au clavier,
   et tout fonctionne sans une ligne de JavaScript. */
.footer-seo-check{position:absolute;width:1px;height:1px;opacity:0;margin:0;pointer-events:none}
.footer-seo-check:checked ~ .footer-seo .fp-link.fp-more{display:block}
.footer-seo-toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;
    color:var(--mut);padding:2px 0;margin:-8px 0 14px;user-select:none}
.footer-seo-toggle:hover{color:var(--accent)}
.footer-seo-toggle::before{content:"▾";font-size:11px;transition:transform .15s}
.footer-seo-check:checked ~ .footer-seo-toggle::before{transform:rotate(180deg)}
.footer-seo-toggle .fst-moins,
.footer-seo-check:checked ~ .footer-seo-toggle .fst-plus{display:none}
.footer-seo-check:checked ~ .footer-seo-toggle .fst-moins{display:inline}
/* Contour visible quand on l'atteint au clavier : sans lui, le focus serait invisible. */
.footer-seo-check:focus-visible ~ .footer-seo-toggle{outline:2px solid var(--accent);outline-offset:3px;border-radius:4px}
/* La nav portait la marge basse ; c'est le bouton qui la porte maintenant. */
.footer-seo-wrap .footer-seo{margin-bottom:8px;padding-bottom:0;border-bottom:0}
.footer-seo-wrap{padding-bottom:18px;margin-bottom:18px;border-bottom:1px solid var(--line)}/* Carte d'une FICHE d'escorte au milieu des annonces : meme gabarit, pastille distincte pour
   que l'on sache ou l'on va avant de cliquer. */
.meet-adcard-profil .meet-adtype{background:var(--accent);color:#fff}
/* ---------- Page d'une ville : deux colonnes ---------- */
/* Les deux listes s'empilaient : trente profils PUIS dix-huit annonces faisaient une page qu'on
   ne finissait pas de derouler, et les annonces n'etaient jamais vues. Cote a cote, la hauteur
   devient celle de la plus longue au lieu de leur somme. */
.meet-ville-cols{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start;margin:6px 0 4px}
@media(max-width:1000px){.meet-ville-cols{grid-template-columns:1fr;gap:8px}}
.mvcol{min-width:0}                       /* sans quoi une carte large deborde la colonne */
.mvcol-sub{margin:-6px 0 10px}
.mvcol-more{margin:2px 0 0}
/* Dans une demi-largeur, les vignettes doivent retrecir sans quoi il n'en tient qu'une par ligne. */
.meet-ville-cols .meet-grid{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:10px;margin-bottom:10px}
.meet-ville-cols .meet-adgrid{grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:10px;margin-bottom:10px}
.meet-ville-texte{margin:14px 0 16px}
/* Marge en haut : detache la description des pastilles de stats (profils, annonces...) qui,
   collees, paraissaient faire partie du meme bloc. */
.mvh-dep{font-weight:400;opacity:.72}

/* Pastille « escortes » du bandeau de compteurs : c'est un LIEN, on le montre. */
.mvs-esc{text-decoration:none;transition:background .15s,border-color .15s}
.mvs-esc:hover{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent)}

/* Blocs de liens de bas de page, sur deux colonnes eux aussi. */
.meet-ville-liens{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start;margin-top:10px}
@media(max-width:800px){.meet-ville-liens{grid-template-columns:1fr;gap:4px}}
/* Compteur accole au libelle d'un type : on sait avant de cliquer ce qu'on va trouver. */
.mvp-n{display:inline-block;min-width:18px;padding:0 5px;margin-left:4px;border-radius:9px;
    background:var(--field);font-size:11px;font-weight:700;line-height:16px;text-align:center}
/* Cartes COMPACTES dans les colonnes d'une page de ville.
   Les cartes carrees pleine taille etaient le vrai cout de la hauteur : trente profils en
   faisaient dix rangees. Ici, meme balisage, seule la disposition change — les profils
   retrecissent, les annonces passent en lignes horizontales. On tient ainsi PLUS de liens dans
   MOINS de hauteur, ce qui est exactement ce qu'on cherche sur une page d'atterrissage. */
.meet-ville-cols .meet-grid{grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:9px;margin-bottom:10px}
.meet-ville-cols .mcard{border-radius:9px}
.meet-ville-cols .mcard-b{padding:6px 7px}
.meet-ville-cols .meet-card-name{font-size:12.5px}
.meet-ville-cols .mcard-badges{transform:scale(.82);transform-origin:top left}
.meet-ville-cols .mcard-rate,.meet-ville-cols .mcard-dist{font-size:10px;padding:1px 5px}

/* Annonces en LIGNES : vignette a gauche, texte a droite. Une annonce occupe alors 76 px au lieu
   des ~200 px d'une carte en grille. */
.meet-adlist{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.meet-adlist .meet-adcard{flex-direction:row;align-items:stretch;border-radius:9px}
.meet-adlist .meet-adcard-img{flex:0 0 68px;width:68px;aspect-ratio:1;border-radius:0}
.meet-adlist .meet-adcard-body{padding:7px 10px;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:2px}
.meet-adlist .meet-card-name{font-size:13px}
/* La pastille de type revient dans le texte : sur 68 px de large elle couvrait la photo. */
.meet-adlist .meet-adtype{position:static;align-self:flex-start;margin:0 0 1px;font-size:10px;padding:1px 6px}
.meet-adlist .meet-adcard-img .meet-adtype{display:none}
.meet-adlist .meet-adcard-by{font-size:11.5px}
@media(max-width:1000px){
    /* Une seule colonne : on rend aux profils une taille confortable au doigt. */
    .meet-ville-cols .meet-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
}/* Colonne de continuation : pas de titre, mais sa HAUTEUR est reservee pour que les liens de
   toutes les colonnes restent alignes sur la meme ligne de depart. */
.fp-title-vide{visibility:hidden}
.fp-title-vide::before{content:"\00a0"}
/* ---------- Page de paiement ---------- */
/* Deux colonnes sur écran large : ce qu'on achète à gauche, comment on paie à droite. Une seule
   colonne dès qu'on n'a plus la place — un récapitulatif que l'on doit faire défiler pour
   trouver le bouton fait abandonner. */
.pay-wrap{max-width:920px;margin:0 auto}
.pay-grid{display:grid;grid-template-columns:1fr 340px;gap:18px;align-items:start}
@media(max-width:820px){.pay-grid{grid-template-columns:1fr}}
.pay-h2{font-size:17px;margin:0 0 14px}
.pay-ligne{display:flex;justify-content:space-between;gap:16px;align-items:baseline;
  padding-bottom:14px;border-bottom:1px solid var(--line)}
.pay-ligne b{display:block;font-size:16px}
.pay-ligne .muted{display:block;margin-top:2px}
.pay-montant{font-size:18px;font-weight:700;white-space:nowrap;font-variant-numeric:tabular-nums}
.pay-avantages{margin:14px 0;padding-left:18px}
.pay-avantages li{margin-bottom:6px}
.pay-total{display:flex;justify-content:space-between;align-items:baseline;
  padding-top:14px;border-top:2px solid var(--line);font-size:17px}
.pay-total b{font-size:22px;font-variant-numeric:tabular-nums}
.pay-periode{margin:4px 0 0}
/* L'avertissement de reconduction : visible sans être alarmiste. Le cacher serait la faute. */
.pay-avert{margin:14px 0 0;padding:12px 14px;border-radius:10px;
  background:var(--warn-soft,#fbf3e6);border:1px solid var(--warn,#a8681a);font-size:14px}
.pay-moyen{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;margin-bottom:10px;
  border:1px solid var(--line);border-radius:12px;cursor:pointer;transition:border-color .12s}
.pay-moyen:hover{border-color:var(--accent,#e11d2a)}
.pay-moyen input{margin-top:3px;flex:none}
.pay-moyen-txt{display:flex;flex-direction:column;gap:2px}
.pay-cta{margin-top:6px}
.pay-sortie{margin:12px 0 0;line-height:1.5}
.pay-indispo{margin:0;padding:14px;border-radius:10px;background:var(--panel2);border:1px solid var(--line)}
.pay-legal{margin-top:18px}
.pay-dl{margin:0}
.pay-dl dt{font-weight:600;margin-top:14px}
.pay-dl dt:first-child{margin-top:0}
.pay-dl dd{margin:4px 0 0;color:var(--mut);line-height:1.55}
.pay-desc{font-family:ui-monospace,monospace;background:var(--panel2);padding:1px 6px;border-radius:4px}
.pay-cgv{margin:16px 0 0;padding-top:14px;border-top:1px solid var(--line)}

/* ---------- Retrait de filigrane (back-office) ---------- */
.wm-intro{margin-bottom:18px}
.wm-h2{font-size:20px;margin:26px 0 12px}
.wm-h3{font-size:16px;margin:0 0 10px}
.wm-depot{display:flex;flex-wrap:wrap;gap:12px;align-items:center}
.wm-depot p{flex-basis:100%;margin:0}
.wm-detect{border-left:3px solid var(--ok,#2f6f4f)}
.wm-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start}
@media(max-width:900px){.wm-grid{grid-template-columns:1fr}}
/* Le rectangle se trace SUR l'image : le conteneur doit donc porter le repère de position. */
.wm-canvas{position:relative;display:inline-block;max-width:100%;cursor:crosshair;
  user-select:none;-webkit-user-select:none;line-height:0}
.wm-canvas img{max-width:100%;height:auto;display:block}
.wm-zone{position:absolute;border:2px solid #e11d2a;background:rgba(225,29,42,.22);
  pointer-events:none;box-shadow:0 0 0 9999px rgba(0,0,0,.18)}
.wm-champs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin:12px 0}
.wm-champs label{display:flex;flex-direction:column;gap:4px;font-size:13px;color:var(--mut)}
.wm-champs input{width:100%}
.wm-methode{border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin:14px 0}
.wm-methode legend{padding:0 6px;font-size:13px;color:var(--mut)}
.wm-methode .check{display:flex;gap:10px;align-items:flex-start;margin-bottom:8px}
.wm-methode .check:last-child{margin-bottom:0}
.wm-apercu img{max-width:100%;height:auto;display:block;border-radius:8px}
.wm-lancer p{margin:0 0 12px}
.wm-resultats{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:14px;margin-top:14px}
.wm-res{margin:0}
.wm-res img{width:100%;height:auto;border-radius:8px;display:block}
.wm-res figcaption{font-size:12px;color:var(--mut);margin-top:6px;word-break:break-all}

/* Réglage du voile (retrait de filigrane) */
.wm-voile{border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin:14px 0}
.wm-voile legend{padding:0 6px;font-size:13px;color:var(--mut)}
.wm-voile p{margin:0 0 10px}
.wm-estim{border-left:3px solid var(--ok,#2f6f4f);padding-left:10px}
.wm-alpha{display:flex;align-items:center;gap:10px;margin-bottom:10px;font-size:14px}
.wm-alpha input[type=range]{flex:1}
.wm-alpha output{font-family:ui-monospace,monospace;min-width:52px;text-align:right}
.wm-couleur{display:flex;align-items:center;gap:10px;font-size:14px;margin-bottom:10px}
.wm-couleur input[type=color]{width:48px;height:30px;padding:0;border:1px solid var(--line);border-radius:6px}

/* ===== ÉVALUATIONS 5 ÉTOILES (fiches Rencontres et annonces) =====================
   Le remplissage partiel se fait en superposant DEUX rangées identiques et en rognant
   celle du dessus à la largeur voulue. Une moyenne de 3,6 se voit alors comme 3,6, là
   où le choix « étoile pleine ou vide » l'aurait arrondie à 4 — et une note arrondie
   à la hausse sur une fiche commerciale n'est pas une approximation neutre. */
.notation{margin:14px 0 4px}
.notation-score{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.etoiles{position:relative;display:inline-block;line-height:1;font-size:19px;letter-spacing:2px;white-space:nowrap}
.etoiles-vides{color:var(--line,#cfcfcf)}
.etoiles-pleines{position:absolute;inset:0 auto 0 0;overflow:hidden;color:#e8b53a;white-space:nowrap}
.notation-chiffre{font-size:17px;font-variant-numeric:tabular-nums}
.notation-etat,.notation-regle{margin:6px 0 0}

/* Le formulaire de vote. flex-direction:row-reverse remet à l'endroit des boutons écrits
   de 5 à 1 dans le HTML : c'est ce qui permet à `button:hover ~ button` d'allumer les
   étoiles PRÉCÉDENTES au survol, un sélecteur CSS ne pouvant pas remonter vers la gauche. */
.notation-vote{display:flex;align-items:center;gap:8px;margin-top:8px;flex-wrap:wrap}
.notation-invite{font-size:13px;color:var(--mut)}
.notation-etoiles{display:inline-flex;flex-direction:row-reverse;gap:1px}
.notation-btn{background:none;border:0;padding:1px 2px;margin:0;cursor:pointer;line-height:1;
    font-size:23px;color:var(--line,#cfcfcf);transition:color .12s,transform .12s}
.notation-btn:hover,.notation-btn:focus-visible,
.notation-btn:hover ~ .notation-btn,.notation-btn:focus-visible ~ .notation-btn{color:#e8b53a}
.notation-btn:hover{transform:scale(1.14)}
.notation-btn:focus-visible{outline:2px solid var(--acc,#a5182a);outline-offset:2px;border-radius:3px}
@media (prefers-reduced-motion:reduce){.notation-btn{transition:none}.notation-btn:hover{transform:none}}

/* Champs des tableaux de sélections. Le formulaire d'ordre ne peut pas porter « form » : cette
   classe met width:100% et une marge haute sur chaque champ, ce qui déformerait les cellules.
   On reprend donc les MÊMES tokens que .form — fond de champ, bordure, coins, halo à la
   sélection — sans en emporter la mise en page. Les deux doivent rester identiques à l'œil :
   un champ de tableau qui ne ressemble pas aux autres passe pour un texte figé, pas pour une
   case à remplir. */
.coll-admin .table input{background:var(--field); border:1px solid var(--line); border-radius:6px;
  color:#fff; padding:8px 10px; font-family:inherit; font-size:14px; outline:none; box-sizing:border-box}
.coll-admin .table input:focus{border-color:var(--accent); box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.coll-admin .table input::placeholder{color:var(--mut); opacity:.7}
.coll-admin .table input.coll-rang{width:64px; text-align:center; font-variant-numeric:tabular-nums}
.coll-admin .table td input[name^="note"]{width:100%}
/* La classe « form » fait des <label> des blocs à marge basse : dans la barre d'ajout, qui est
   une ligne, on la neutralise — sans quoi le bouton se décale de 16 px vers le bas. */
.coll-add label{margin-bottom:0}

/* Rangement : la ligne de titre porte désormais un bouton de suppression à droite. */
.mrang-titre{display:flex; align-items:flex-start; justify-content:space-between; gap:12px}
.mrang-titre-t{min-width:0}
.mrang-del{flex:0 0 auto; align-self:flex-start}
/* Le formulaire de suppression est un porteur technique, sans rien à montrer : il ne doit ni
   occuper de place ni s'intercaler dans la grille des blocs. */
.mrang-delform{display:none}

/* ---- Barre d'actions d'une fiche : TOUS LES BOUTONS À LA MÊME HAUTEUR ----
   La barre mêle des liens (<a class="btn">) et des boutons enfermés dans un <form> — le jeton
   CSRF impose un formulaire pour toute action qui écrit. Or l'élément de la grille flexible
   n'est pas le même dans les deux cas : c'est le lien d'un côté, le FORMULAIRE de l'autre. Le
   lien s'étirait donc à la hauteur de la ligne, tandis que le bouton gardait la hauteur de son
   contenu à l'intérieur d'un formulaire étiré — d'où un « ♡ 0 » visiblement plus bas que
   « Lui écrire » juste à côté.

   On rend donc le formulaire lui-même flexible : son bouton devient un élément étirable, et
   suit la hauteur de la ligne comme les liens. Aucune hauteur n'est fixée en dur — un intitulé
   plus long, une police plus grande ou une traduction resteront alignés d'eux-mêmes. */
.mprofile-actions,
.mprofile-secondary{align-items:stretch}
.mprofile-actions > form,
.mprofile-secondary > form{display:flex}
.mprofile-actions > form > .btn,
.mprofile-secondary > form > .btn{width:100%; justify-content:center}

/* Réseaux sociaux au pied de page. Les icônes héritent de currentColor : elles suivent donc le
   thème clair comme le sombre sans qu'aucune couleur ne soit fixée ici. La cible de clic fait
   34 px de côté — en dessous, on rate le lien au doigt sur téléphone. */
.footer-social{display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap}
.footer-social a{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  border-radius:8px;color:var(--mut);text-decoration:none;transition:color .15s,background .15s}
.footer-social a:hover{color:var(--accent);background:rgba(225,29,42,.09)}
.footer-social a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.ico-social{display:block}
@media (prefers-reduced-motion:reduce){.footer-social a{transition:none}}

/* Ancres de la page Doublons : le navigateur place le haut de la section sous la barre fixe du
   back-office si on ne lui réserve pas la marge. Sans cela, le titre de la section arrive
   caché derrière l'en-tête et l'on croit avoir atterri au mauvais endroit. */
.dup-sec{scroll-margin-top:84px}

/* Sauvegardes : sélection multiple. La liste défile au-delà de dix lignes plutôt que d'allonger
   indéfiniment le tableau de bord — on doit pouvoir toutes les voir sans y perdre la page. */
.bk-list{max-height:340px;overflow-y:auto}
.bk-list li{display:flex;align-items:center;gap:8px}
.bk-chk{flex:0 0 auto;margin:0;cursor:pointer}
.bk-lot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:10px 0 4px;
  padding-top:10px;border-top:1px solid var(--line)}
.bk-lot-all{margin:0;font-size:13px}
/* Bouton inactif : il doit avoir l'air inactif, sinon on clique et rien ne se passe. */
.bk-lot .btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none}

/* ---- Rangement : champs au style du site, sélection multiple, autocomplétion ----
   Le champ « Ajouter des tags » était une case blanche par défaut au milieu d'une interface
   sombre : on reprend les mêmes tokens que .form (fond de champ, bordure, halo à la sélection)
   sans emporter sa mise en page, qui casserait la ligne du bloc. */
.mrang-libre input{background:var(--field); border:1px solid var(--line); border-radius:6px;
  color:#fff; padding:9px 11px; font-family:inherit; font-size:14px; outline:none; box-sizing:border-box}
.mrang-libre input:focus{border-color:var(--accent); box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.mrang-libre input::placeholder{color:var(--mut); opacity:.7}

.mrang-actions{display:inline-flex; align-items:center; gap:8px; flex:0 0 auto}
.mrang-pick{display:inline-flex; align-items:center; margin:0; cursor:pointer; padding:4px}
.mrang-pick input{width:17px; height:17px; margin:0; cursor:pointer}
/* Un bouton de suppression inactif doit AVOIR L'AIR inactif : sinon on clique et rien ne bouge. */
.mrang-barre .btn:disabled{opacity:.45; cursor:not-allowed; transform:none; box-shadow:none}

/* Liste d'autocomplétion : ancrée sous le champ, au-dessus du reste. Une par bloc. */
.mrang-tagbox{position:relative; display:block; max-width:420px}
.mrang-ac{position:absolute; z-index:40; left:0; right:0; top:100%; margin-top:3px;
  background:var(--panel); border:1px solid var(--line); border-radius:8px; overflow:hidden;
  max-height:230px; overflow-y:auto; box-shadow:0 14px 30px -14px rgba(0,0,0,.7)}
.mrang-ac-item{display:block; width:100%; text-align:left; background:none; border:0;
  padding:7px 11px; font:inherit; font-size:13.5px; color:var(--txt); cursor:pointer}
.mrang-ac-item:hover,.mrang-ac-item.on{background:var(--panel2); color:var(--accent)}

/* En-têtes de tableau cliquables (tri) — back-office Rencontres. */
.mad-tri{color:inherit;text-decoration:none;display:inline-block;white-space:nowrap}
.mad-tri:hover{color:var(--accent)}
.mad-tri.on{color:var(--accent);font-weight:700}

/* ---- Console Rencontres : les champs hors formulaire « .form » ----
   Une vingtaine de champs vivent dans des panneaux sans la classe « form » — accorder une place,
   filtrer, régler une durée. Ils tombaient donc sur le rendu par défaut du navigateur : cases
   blanches au milieu d'une interface sombre, avec un cadre gris qui ne ressemble à rien du reste.

   La règle reprend EXACTEMENT les tokens de .form (fond de champ, bordure, coins, halo rouge à
   la sélection) mais ne touche PAS à la mise en page — ni largeur imposée, ni marge : ces champs
   sont posés dans des lignes horizontales que .form casserait.

   Le `:not()` évite de repasser sur ce qui est déjà habillé, et d'entrer en conflit de
   spécificité avec .form là où les deux se croiseraient. */
.admin-main form:not(.form) input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=hidden]),
.admin-main form:not(.form) select,
.admin-main form:not(.form) textarea{
  background:var(--field); border:1px solid var(--line); border-radius:6px; color:var(--txt);
  padding:9px 11px; font-family:inherit; font-size:14px; outline:none; box-sizing:border-box}
.admin-main form:not(.form) input:not([type=checkbox]):not([type=radio]):focus,
.admin-main form:not(.form) select:focus,
.admin-main form:not(.form) textarea:focus{
  border-color:var(--accent); box-shadow:0 0 0 3px rgba(225,29,42,.15)}
.admin-main form:not(.form) input::placeholder{color:var(--mut); opacity:.7}
/* Les champs de la barre « Accorder une place » restent sur une ligne, à largeur mesurée. */
.mboost-grant input[type=number]{width:110px}
.mboost-grant select{min-width:190px}
.mboost-grant label{display:flex; flex-direction:column; gap:4px; font-size:13px; color:var(--mut)}

/* Vérification de l'adresse Bitcoin au back-office : le QR à scanner avec son propre portefeuille. */
.btc-verif{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:10px;padding:14px;margin:10px 0 14px}
.btc-verif-qr{background:#fff;border-radius:8px;padding:6px;flex:0 0 auto;image-rendering:pixelated}
.btc-verif-adr{display:inline-block;font-family:ui-monospace,monospace;font-size:12.5px;
  word-break:break-all;background:var(--field);border:1px solid var(--line);border-radius:6px;padding:6px 8px}
.btc-verif .danger{color:var(--accent)}

/* ===== RETOUCHE : masquer une partie d'une photo ================================
   L'image est affichée aussi grande que possible : on vise parfois un visage petit dans le
   cadre, et un aperçu réduit rendrait le tracé impraticable. */
.retouche-intro{padding:14px 16px;margin-bottom:16px}
.retouche-intro p{margin:0 0 6px}
.retouche-intro p:last-child{margin-bottom:0}
.retouche-avance{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.retouche-jauge{flex:1 1 220px;height:8px;background:var(--field);border-radius:4px;overflow:hidden}
.retouche-jauge i{display:block;height:100%;background:var(--accent);transition:width .2s}
.retouche-grid{display:grid;grid-template-columns:1fr 340px;gap:18px;align-items:start}
@media (max-width:900px){.retouche-grid{grid-template-columns:1fr}
  .retouche-cote{position:static;max-height:none;overflow:visible}
  .retouche-canvas img{max-height:62vh;width:auto}}
.retouche-scene{padding:14px}
/* `touch-action:none` : sans lui, le glisser du doigt fait défiler la page au lieu de tracer. */
.retouche-canvas{position:relative;display:inline-block;max-width:100%;line-height:0;
  cursor:crosshair;touch-action:none;user-select:none}
.retouche-canvas img{max-width:100%;height:auto;display:block;border-radius:6px}
.rt-zone{position:absolute;background:rgba(225,29,42,.28);border:2px solid var(--accent);
  border-radius:3px;cursor:pointer;box-sizing:border-box}
.rt-zone.en-cours{background:rgba(225,29,42,.18);border-style:dashed;cursor:crosshair}
.rt-zone:not(.en-cours):hover{background:rgba(225,29,42,.42)}
.retouche-aide{margin:0}
.retouche-cote{padding:16px;display:flex;flex-direction:column;gap:10px;
  position:sticky;top:96px;max-height:calc(100vh - 112px);overflow-y:auto}
.retouche-titre{font-weight:700;font-size:15px;word-break:break-word}
.retouche-form{display:flex;flex-direction:column;gap:10px;margin:6px 0 0}
.retouche-compte{padding:8px 10px;border-radius:6px;background:var(--field);border:1px solid var(--line);
  font-size:13px;color:var(--mut);text-align:center}
.retouche-compte.on{color:var(--accent);border-color:var(--accent);font-weight:700}
.retouche-force select{width:100%;background:var(--field);border:1px solid var(--line);border-radius:6px;
  color:#fff;padding:9px 11px;font-family:inherit;font-size:14px;margin-top:4px}
.retouche-force{font-size:13px;color:var(--mut)}
/* Un bouton de destruction inactif doit AVOIR L'AIR inactif. */
.retouche-form .btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none}
.retouche-passer{margin:0}

/* Proposition de masquage à la fin d'un envoi par la zone de dépôt. */
.dz-retouche{border:1px solid var(--accent);border-radius:10px;padding:16px 18px;margin:14px 0;
  background:rgba(225,29,42,.06)}
.dz-retouche p{margin:6px 0 12px;color:var(--mut);font-size:14px;line-height:1.55}
.dz-retouche-b{display:flex;gap:10px;flex-wrap:wrap}

/* Aperçu du rendu : le canvas se superpose exactement à l'image qu'il remplace. */
.retouche-canvas canvas{position:absolute;inset:0;width:100%;height:100%;display:block;border-radius:6px}
.retouche-canvas.en-apercu{cursor:default}
.retouche-barre{display:flex;flex-direction:column;gap:8px;margin:0}
.retouche-barre .btn{width:100%;justify-content:center}
.retouche-barre:empty{display:none}

/* Preuve du masquage précédent : vignette + confirmation, en tête de l'écran suivant. */
.retouche-fait{display:flex;gap:14px;align-items:center;padding:12px 14px;margin-bottom:14px;
  border-left:3px solid var(--ok,#12b886)}
.retouche-fait img{width:96px;height:72px;object-fit:cover;border-radius:6px;flex:none;background:#000}
.retouche-fait b{color:var(--ok,#12b886)}

/* ===== Bandeau d'album : une rangée, quatre intentions =========================
   Neuf boutons de même poids sur trois rangées devenaient illisibles ; la suppression y
   voisinait l'action principale, dans la même couleur. */
.menu-hote{position:relative;display:inline-block}
.menu-panneau{
  position:absolute;top:calc(100% + 6px);left:0;min-width:238px;z-index:60;
  background:var(--panel);border:1px solid var(--line);border-radius:11px;padding:6px;
  box-shadow:0 18px 38px -16px rgba(0,0,0,.55);
}
.menu-panneau.menu-droite{left:auto;right:0}
.menu-panneau[hidden]{display:none}
.menu-panneau form{margin:0}
.menu-item{
  display:flex;align-items:center;gap:9px;width:100%;text-align:left;
  background:none;border:0;border-radius:7px;padding:9px 11px;
  font-family:inherit;font-size:14px;font-weight:500;color:var(--txt);
  text-decoration:none;cursor:pointer;
}
.menu-item:hover{background:var(--panel2)}
.menu-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.menu-item.menu-rouge{color:var(--accent)}
.menu-item.menu-rouge:hover{background:rgba(225,29,42,.09)}
.menu-sep{height:1px;background:var(--line);margin:6px 4px}
.menu-titre{
  font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--txt);
  padding:9px 11px 5px;font-weight:800;
}
.menu-panneau>.menu-titre:not(:first-child){
  border-top:1px solid var(--line);margin-top:7px;padding-top:13px}
/* Le partiel « ajouter à une chaîne » garde son propre habillage : on l'insère tel quel
   plutôt que de le réécrire pour le menu — il porte un <select> superposé qui lui est propre. */
.menu-brut{padding:2px 4px;display:flex;flex-direction:column;gap:6px}
.menu-brut .add-to-channel{display:flex;width:100%}
.menu-brut .tbtn{width:100%;justify-content:flex-start}
.menu-caret{display:inline-block;opacity:.6;font-size:11px;transition:transform .15s}
.menu-hote .tbtn[aria-expanded="true"]{
  border-color:var(--accent);color:var(--accent);background:rgba(225,29,42,.10)}
.menu-hote .tbtn[aria-expanded="true"] .menu-caret{opacity:1;transform:rotate(180deg)}
.atb-plus{margin-left:auto}

/* L'état public / privé : un voyant, pas un ordre à interpréter. */
.atb-etat{display:inline-flex;align-items:center;gap:8px}
.atb-voyant{width:9px;height:9px;border-radius:50%;background:#12b886;flex:none}
.atb-etat.prive{color:#f0b429;border-color:rgba(240,180,41,.42)}
.atb-etat.prive .atb-voyant{background:#f0b429}

/* L'avertissement d'irréversibilité : MÊME TAILLE que le texte qui l'entoure.
   Il portait « small muted » — plus petit et plus pâle que l'invitation à masquer, sur la seule
   action de l'écran qui ne se défait pas. Il se signale par un filet et par la couleur de son
   amorce, jamais par un rapetissement. */
.retouche-avert{
  margin:10px 0 0;padding:10px 0 10px 13px;
  border-left:3px solid var(--accent);
  color:var(--txt);
}
.retouche-avert b:first-child{color:var(--accent)}

/* SUPPRIMER, DANS UNE GRILLE DE CARTES : rouge au survol, pas au repos.
   Le rouge n'avertit que s'il est rare. Dix cartes portant chacune un bouton rouge plein en
   font un fond d'écran, et l'action irréversible se noie dans la plus banale. Ce variant garde
   le libellé et l'icône rouge — on voit ce que c'est — mais rend la masse colorée au moment où
   la main s'y porte. Les modales de confirmation, elles, restent franchement rouges : c'est là
   que la couleur veut dire quelque chose. Sur un écran de détail, où l'action est unique et
   attendue, `.btn.danger` reste le bon choix. */
.btn.danger-quiet{background:var(--field);border-color:var(--line);color:var(--mut);box-shadow:none}
.btn.danger-quiet svg{color:var(--accent);opacity:.8}
.btn.danger-quiet:hover,.btn.danger-quiet:focus-visible{
  background:rgba(225,29,42,.10);border-color:var(--accent);color:var(--accent);box-shadow:none}
.btn.danger-quiet:hover svg,.btn.danger-quiet:focus-visible svg{opacity:1}
/* =====================================================================================
   CONSENTEMENT AUX COOKIES
   =====================================================================================
   LA PASTILLE VA EN BAS À GAUCHE : le bas-droit est déjà occupé par .scroll-top, et deux
   pastilles rondes superposées dans le même coin se recouvriraient au pixel près.
   Le z-index reste SOUS celui de la vérification d'âge (.age-gate) : tant que la personne
   n'a pas déclaré être majeure, rien ne doit passer devant cette porte-là. */
.cook-pastille{
  position:fixed;left:18px;bottom:18px;z-index:70;
  display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 16px 0 13px;
  border:1px solid var(--line);border-radius:24px;background:var(--panel);color:var(--txt);
  font-family:var(--sans);font-size:13.5px;font-weight:700;cursor:pointer;
  box-shadow:0 14px 34px -16px rgba(0,0,0,.65);transition:.16s}
.cook-pastille:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-2px)}
.cook-pastille:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.cook-pastille-ic{font-size:18px;line-height:1}
@media (max-width:560px){
  .cook-pastille{padding:0;width:44px;justify-content:center}
  .cook-pastille-txt{display:none}
}

/* PAS DE VOILE OPAQUE. Le fond reste lisible : un mur qui interdit la lecture tant qu'on n'a
   pas accepté extorque le consentement au lieu de le recueillir. Il sert à capter le clic
   hors fenêtre, pas à masquer le site. */
.cook-modal{position:fixed;inset:0;z-index:75;display:flex;align-items:center;justify-content:center;padding:18px}
.cook-modal[hidden]{display:none}
.cook-fond{position:absolute;inset:0;background:rgba(0,0,0,.45);backdrop-filter:blur(2px)}
.cook-carte{
  position:relative;width:min(760px,100%);max-height:min(86vh,860px);display:flex;flex-direction:column;
  background:var(--panel);border:1px solid var(--line);border-radius:16px;
  box-shadow:0 40px 90px -30px rgba(0,0,0,.8);outline:none;overflow:hidden}
.cook-head{display:flex;align-items:center;gap:12px;padding:18px 20px 14px;border-bottom:1px solid var(--line)}
.cook-head h2{margin:0;font-size:21px;flex:1}
.cook-x{background:none;border:0;color:var(--mut);font-size:19px;cursor:pointer;padding:4px 6px;border-radius:6px;line-height:1}
.cook-x:hover{color:var(--accent);background:rgba(225,29,42,.09)}
.cook-corps{padding:16px 20px 20px;overflow-y:auto}
.cook-intro{margin:0 0 8px}
.cook-intro:last-of-type{margin-bottom:16px}

.cook-cat{border:1px solid var(--line);border-radius:11px;padding:13px 15px;margin:0 0 10px;background:var(--field)}
.cook-cat.est-oblig{opacity:.92}
.cook-cat-head{display:flex;align-items:flex-start;gap:14px}
.cook-cat-nom{flex:1;min-width:0}
.cook-cat-nom b{font-size:15px}
.cook-cat-nom p{margin:3px 0 0}

/* « Toujours actifs » plutôt qu'un interrupteur verrouillé : un curseur qu'on ne peut pas
   bouger fait croire à un choix qui n'existe pas. */
.cook-toujours{
  flex:none;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--mut);border:1px solid var(--line);border-radius:20px;padding:6px 11px;white-space:nowrap}

.cook-switch{flex:none;display:flex;align-items:center;gap:9px;cursor:pointer;user-select:none}
.cook-switch input{position:absolute;opacity:0;width:0;height:0}
.cook-piste{
  display:block;width:44px;height:25px;border-radius:14px;background:var(--line);
  border:1px solid var(--line);position:relative;transition:.16s;flex:none}
.cook-piste::after{
  content:"";position:absolute;top:2px;left:2px;width:19px;height:19px;border-radius:50%;
  background:var(--panel);transition:.16s;box-shadow:0 2px 6px -2px rgba(0,0,0,.7)}
.cook-switch input:checked+.cook-piste{background:var(--accent);border-color:var(--accent)}
.cook-switch input:checked+.cook-piste::after{transform:translateX(19px);background:#fff}
.cook-switch input:focus-visible+.cook-piste{outline:2px solid var(--accent);outline-offset:3px}
.cook-etat{font-size:12px;font-weight:700;color:var(--mut);min-width:46px}
.cook-switch input:checked~.cook-etat{color:var(--accent)}

.cook-detail{margin-top:11px}
.cook-detail summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--mut);padding:4px 0}
.cook-detail summary:hover{color:var(--accent)}
.cook-detail[open] summary{margin-bottom:8px}
/* Le tableau défile DANS son cadre : trois colonnes de texte ne tiennent pas sur un téléphone,
   et la page entière ne doit jamais partir en travers. */
.cook-table{width:100%;border-collapse:collapse;font-size:12.5px;display:block;overflow-x:auto}
.cook-table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--mut);padding:0 10px 6px 0;font-weight:800;white-space:nowrap}
.cook-table td{padding:7px 10px 7px 0;border-top:1px solid var(--line);vertical-align:top;color:var(--txt)}
.cook-table code{font-size:12px;color:var(--accent);display:block;white-space:nowrap}
.cook-role{display:block;font-size:11px;color:var(--mut);margin-top:2px;white-space:nowrap}
.cook-duree{white-space:nowrap;color:var(--mut)}
.cook-refus{margin:10px 0 0;font-size:12.5px;color:var(--mut);
  padding-left:11px;border-left:2px solid var(--line)}

/* LES TROIS BOUTONS ONT LA MÊME LARGEUR ET LE MÊME POIDS. Refuser doit demander le même
   effort qu'accepter (délibération CNIL n° 2020-091) : un « Tout accepter » plein face à un
   lien gris serait une infraction, pas un parti pris de mise en page. La couleur distingue
   l'action mise en avant, jamais la facilité du geste — les trois sont à un clic. */
.cook-actions{display:flex;gap:10px;margin-top:16px}
.cook-actions .cook-btn{flex:1 1 0;min-width:0;justify-content:center;text-align:center}
@media (max-width:620px){.cook-actions{flex-direction:column}}
.cook-pied{margin:14px 0 0}
body.cook-ouvert{overflow:hidden}
/* « Créer une chaîne » dans le méga-menu Chaînes : une ACTION, pas un lien de navigation de plus.
   On la démarque par la couleur d'accent et un léger fond au survol, sans changer la trame des
   autres entrées (même hauteur, même retrait) — elle se distingue, elle ne dépasse pas. */
.mcol a.mcreate{color:var(--accent);font-weight:700;margin-top:2px}
.mcol a.mcreate:hover{background:rgba(225,29,42,.08)}
/* Disponibilité du nom affiché : un mot sous le champ, vert si libre, rouge si pris. */
.nom-msg{display:block;font-size:12.5px;margin-top:5px}
.nom-msg-ok{color:var(--ok,#12b886)}
.nom-msg-err{color:var(--accent)}
input.is-ok{border-color:var(--ok,#12b886)}
input.is-err{border-color:var(--accent)}
/* Corps de l'annonce : panneau au fond legerement teinte (var(--bg2)), pour le distinguer des
   panneaux blancs d'information (contacts, a propos) sans ajouter de couleur etrangere au site.
   La marge basse le separe des blocs qui suivent. */
.meet-adbody{background:var(--bg2);margin:0 0 14px}
.meet-adbody .meet-bio{margin:0}
/* ACCUSÉ DE LECTURE (façon WhatsApp), sur MES messages uniquement : un ✓ « envoyé », deux ✓✓
   « lu ». Sur la bulle rouge, le tic non lu est blanc atténué ; une fois lu, il vire au bleu
   clair — le même repère universel, lisible sur le rouge. */
.meet-tick{margin-left:6px;font-weight:700;letter-spacing:-2px;opacity:.75}
.meet-tick.lu{color:#7ec8ff;opacity:1}
/* SUPPRIMER UNE CONVERSATION depuis la liste — bouton corbeille en frère du lien (un <a> ne
   contient pas de bouton), posé au bord droit de la ligne. Discret au repos pour ne pas
   encombrer, franc au survol ; il reste visible (opacité partielle) là où il n'y a pas de
   survol, pour rester atteignable au doigt. */
.msg-conv-wrap,.meet-msg-conv-wrap{position:relative}
.msg-conv-del{position:absolute;top:50%;right:8px;transform:translateY(-50%);margin:0;z-index:2;
  opacity:.35;transition:opacity .14s}
.msg-conv-wrap:hover .msg-conv-del,.meet-msg-conv-wrap:hover .msg-conv-del,
.msg-conv-del:focus-within{opacity:1}
.msg-conv-del button{display:inline-flex;align-items:center;justify-content:center;line-height:0;
  background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:6px;cursor:pointer;
  color:var(--mut);box-shadow:0 2px 8px -4px rgba(0,0,0,.5)}
.msg-conv-del button:hover{color:var(--accent);border-color:var(--accent);background:rgba(225,29,42,.09)}
/* La ligne garde de la place à droite pour que la corbeille ne recouvre pas l'horodatage. */
.msg-conv-wrap .msg-conv{padding-right:40px}
/* HONEYPOT ANTI-BOT : hors de vue et hors de portee d'un humain, present pour les robots.
   Positionne hors ecran (et non display:none, que certains robots ignorent), non tabulable,
   et masque aux lecteurs d'ecran par aria-hidden dans le HTML. */
.antibot-hp{position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;overflow:hidden}