/* ===== Thème "Alcovae" — palette bordeaux/laiton, fond sombre =====
   Recolorage complet du site sur la charte graphique fournie : le bordeaux devient la matière
   dominante, le velours les surfaces élevées (cartes, modales), le sable le texte courant, le
   laiton l'unique couleur d'action. Mise en page et forme des composants n'ont pas été touchées ;
   seule exception typographique : Fraunces (police "display" de la charte) sur le nom de marque
   dans la navbar et le pied de page (voir --display, .navbar-brand, .site-footer-brand). */
:root {
    /* --- Palette Alcovae --- */
    --display: 'Fraunces', Georgia, serif;
    --rideau: #17110F;
    --bordeaux: #4C1B27;
    --velours: #7C2B3B;
    --sable: #E9D9C3;
    --laiton: #C6A461;
    --laiton-dark: #A9803D;
    --sauge: #8A9A82;
    --ambre: #E29B4C;

    /* --- Accents secondaires réservés aux statuts/paliers (VIP, Premium, Exclusif, Boost...),
       dérivés de la même famille de teintes profondes et saturées que la palette principale,
       pour rester lisiblement distincts les uns des autres sans jamais revenir aux couleurs
       Bootstrap par défaut. --- */
    --grenat: #C1445E;
    --grenat-dark: #96334A;
    --rubis: #B23B35;
    --rubis-dark: #86281F;
    --amethyste: #9B5AA0;
    --amethyste-dark: #6E3B72;
    --saphir: #4F8FBA;
    --saphir-dark: #285A7C;
    --emeraude: #3FAF9E;
    --emeraude-dark: #257567;
    --cuivre: #C98A52;
    --cuivre-dark: #93602F;
    --argent: #B9AFA0;
    --argent-dark: #8B8275;

    /* --- Palette catégorielle des graphiques (staffadmin::analytics_*) ---
       Dérivée des 7 accents ci-dessus (mêmes teintes, même esprit) mais réajustée en OKLCH
       (luminosité/chroma) et réordonnée spécifiquement pour rester lisible comme MARQUES DE
       GRAPHIQUE sur fond sombre : les 7 accents d'origine échouaient la validation CVD (voir
       dataviz skill, scripts/validate_palette.js) — bande de luminosité dépassée pour 3 teintes,
       chroma trop faible pour 2 (--saphir, --argent), et deux paires trop proches en teinte
       (grenat/rubis, cuivre/argent) une fois adjacentes dans l'ordre catégoriel. Ces 7 jetons
       sont un jeu à part, réservé aux graphiques (barres colorées par produit/type) : les accents
       d'origine restent inchangés pour leurs usages existants (paliers de cadeaux, classement Top
       annonceurs...). Toujours utilisés avec un libellé direct (axe ou légende) à côté de chaque
       marque — jamais la couleur seule comme identifiant, cohérent avec l'état "WARN" (pas "FAIL")
       de la séparation CVD/contraste validée pour cet ordre précis : ne pas réordonner sans
       revalider. */
    --chart-1: #C1445F;
    --chart-2: #A17003;
    --chart-3: #009C8A;
    --chart-4: #B23B34;
    --chart-5: #2690CE;
    --chart-6: #C16F0F;
    --chart-7: #9A5AA0;

    /* --- Jetons génériques réutilisés dans tout le fichier --- */
    --brand: var(--laiton);
    --brand-dark: var(--laiton-dark);
    --brand-light: rgba(198, 164, 97, .16);
    --accent: var(--grenat);
    --ink: var(--sable);
    --muted: rgba(233, 217, 195, .62);
    --surface: var(--velours);
    --surface-alt: var(--bordeaux);
    /* Fond dégradé des widgets (cartes, barre de filtres, sidebar...) — repris à l'identique de
       .navbar/body : le velours (surface élevée) glisse vers le bordeaux plutôt qu'un aplat.
       Toujours utilisé via la propriété `background` (raccourci), jamais `background-color`, qui
       n'accepte pas les dégradés. */
    --surface-gradient: linear-gradient(135deg, var(--velours), var(--bordeaux));
    --radius-lg: 1rem;
    --radius-md: 0.65rem;
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);
    --shadow-md: 0 8px 24px rgba(0, 0, 0, .45);
    --shadow-lg: 0 16px 40px rgba(0, 0, 0, .55);

    /* --- Recolorage des variables Bootstrap (voir data-bs-theme="dark" sur <html> dans
       templates/base.html) : la plupart des composants Bootstrap 5.3 (dropdown, modal,
       list-group, table, badges...) lisent ces jetons via var(), donc les redéfinir ici suffit
       à les faire basculer sur la palette Alcovae sans surcharger chaque composant un par un. --- */
    --bs-body-bg: var(--surface-alt);
    --bs-body-color: var(--ink);
    --bs-emphasis-color: var(--sable);
    --bs-secondary-color: var(--muted);
    --bs-secondary-bg: var(--velours);
    --bs-tertiary-bg: var(--rideau);
    --bs-border-color: rgba(233, 217, 195, .16);
    --bs-border-color-translucent: rgba(233, 217, 195, .12);
    --bs-link-color: var(--laiton);
    --bs-link-hover-color: var(--sable);
    --bs-link-color-rgb: 198, 164, 97;
    --bs-link-hover-color-rgb: 233, 217, 195;
    --bs-primary: var(--laiton);
    --bs-primary-rgb: 198, 164, 97;
    --bs-primary-text-emphasis: var(--laiton);
    --bs-primary-bg-subtle: rgba(198, 164, 97, .14);
    --bs-primary-border-subtle: rgba(198, 164, 97, .4);
    --bs-secondary: var(--muted);
    --bs-success: var(--sauge);
    --bs-success-rgb: 138, 154, 130;
    --bs-danger: var(--rubis);
    --bs-danger-rgb: 178, 59, 53;
    --bs-warning: var(--cuivre);
    --bs-warning-rgb: 201, 138, 82;
    --bs-info: var(--saphir);
    --bs-info-rgb: 79, 143, 186;
    --bs-dark: var(--rideau);
    --bs-dark-rgb: 23, 17, 15;
    --bs-light: #F3EADA;
    --bs-light-rgb: 243, 234, 218;
    --bs-focus-ring-color: rgba(198, 164, 97, .3);
    --bs-form-valid-color: var(--sauge);
    --bs-form-valid-border-color: var(--sauge);
    --bs-form-invalid-color: var(--rubis);
    --bs-form-invalid-border-color: var(--rubis);

    /* .alert-success/-danger/-warning/-info/-secondary (bandeau sitewide, messages Django) lisent
       ces jetons "-text-emphasis"/"-bg-subtle"/"-border-subtle" plutôt que --bs-success etc.
       directement — sans ça ils gardent les teintes grises par défaut du mode sombre Bootstrap. */
    --bs-success-text-emphasis: var(--sauge);
    --bs-success-bg-subtle: rgba(138, 154, 130, .16);
    --bs-success-border-subtle: rgba(138, 154, 130, .4);
    --bs-danger-text-emphasis: var(--rubis);
    --bs-danger-bg-subtle: rgba(178, 59, 53, .16);
    --bs-danger-border-subtle: rgba(178, 59, 53, .4);
    --bs-warning-text-emphasis: var(--cuivre);
    --bs-warning-bg-subtle: rgba(201, 138, 82, .16);
    --bs-warning-border-subtle: rgba(201, 138, 82, .4);
    --bs-info-text-emphasis: var(--saphir);
    --bs-info-bg-subtle: rgba(79, 143, 186, .16);
    --bs-info-border-subtle: rgba(79, 143, 186, .4);
    --bs-secondary-text-emphasis: var(--sable);
    --bs-secondary-bg-subtle: rgba(233, 217, 195, .1);
    --bs-secondary-border-subtle: rgba(233, 217, 195, .3);
}

/* Les classes utilitaires Bootstrap (.d-flex, .d-block...) posent `display` en !important, ce
   qui masque sinon l'attribut `hidden` sans jamais l'emporter sur elles. */
[hidden] { display: none !important; }

/* `{{ form.non_field_errors }}`/`{{ field.errors }}` (tous les formulaires du site) génèrent une
   <ul class="errorlist"><li>...</li></ul> — sans ce reset, la marge native du <ul> crée un faux
   saut de ligne visible dans les bandeaux d'erreur (ex. connexion, inscription). */
.errorlist {
    margin: 0;
    padding: 0;
    list-style: none;
}

body {
    /* Fond dominé par le noir rideau (pas le bordeaux, réservé aux widgets ci-dessous) : un
       dégradé subtil dans la même famille de noirs plutôt qu'un aplat, fixe (n'avance pas avec
       le scroll) pour ne jamais donner l'impression d'un motif qui se répète sur les pages
       longues. */
    background: linear-gradient(115deg, var(--rideau) 0%, #241a15 100%);
    background-attachment: fixed;
    color: var(--ink);
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

a { color: var(--brand); text-decoration: none; }
a:hover { color: var(--sable); }

/* Bootstrap compile chaque variante .btn-xxx avec ses propres jetons --bs-btn-* (couleurs au
   littéral, pas de var(--bs-primary) etc.) : les redéfinir ici, plutôt que de surcharger
   directement `background-color`/`color`, est ce qui permet aux états hover/active/disabled
   (gérés par les règles .btn:hover/.btn:disabled de Bootstrap, qui lisent ces mêmes jetons) de
   suivre automatiquement la palette Alcovae. */
.btn-primary {
    --bs-btn-color: var(--rideau);
    --bs-btn-bg: var(--laiton);
    --bs-btn-border-color: var(--laiton);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--sable);
    --bs-btn-hover-border-color: var(--sable);
    --bs-btn-focus-shadow-rgb: 198, 164, 97;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--laiton-dark);
    --bs-btn-active-border-color: var(--laiton-dark);
    --bs-btn-disabled-color: var(--rideau);
    --bs-btn-disabled-bg: var(--laiton);
    --bs-btn-disabled-border-color: var(--laiton);
}
.btn-secondary {
    --bs-btn-color: var(--ink);
    --bs-btn-bg: rgba(233, 217, 195, .12);
    --bs-btn-border-color: rgba(233, 217, 195, .3);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--sable);
    --bs-btn-hover-border-color: var(--sable);
    --bs-btn-focus-shadow-rgb: 233, 217, 195;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--sable);
    --bs-btn-active-border-color: var(--sable);
    --bs-btn-disabled-color: var(--muted);
    --bs-btn-disabled-bg: rgba(233, 217, 195, .12);
    --bs-btn-disabled-border-color: rgba(233, 217, 195, .3);
}
.btn-success {
    --bs-btn-color: var(--rideau);
    --bs-btn-bg: var(--sauge);
    --bs-btn-border-color: var(--sauge);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: #a0af99;
    --bs-btn-hover-border-color: #a0af99;
    --bs-btn-focus-shadow-rgb: 138, 154, 130;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: #798a71;
    --bs-btn-active-border-color: #798a71;
    --bs-btn-disabled-color: var(--rideau);
    --bs-btn-disabled-bg: var(--sauge);
    --bs-btn-disabled-border-color: var(--sauge);
}
.btn-danger {
    --bs-btn-color: #fff;
    --bs-btn-bg: var(--rubis);
    --bs-btn-border-color: var(--rubis);
    --bs-btn-hover-color: #fff;
    --bs-btn-hover-bg: var(--rubis-dark);
    --bs-btn-hover-border-color: var(--rubis-dark);
    --bs-btn-focus-shadow-rgb: 178, 59, 53;
    --bs-btn-active-color: #fff;
    --bs-btn-active-bg: var(--rubis-dark);
    --bs-btn-active-border-color: var(--rubis-dark);
    --bs-btn-disabled-color: #fff;
    --bs-btn-disabled-bg: var(--rubis);
    --bs-btn-disabled-border-color: var(--rubis);
}
.btn-warning {
    --bs-btn-color: var(--rideau);
    --bs-btn-bg: var(--cuivre);
    --bs-btn-border-color: var(--cuivre);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: #d69f68;
    --bs-btn-hover-border-color: #d69f68;
    --bs-btn-focus-shadow-rgb: 201, 138, 82;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--cuivre-dark);
    --bs-btn-active-border-color: var(--cuivre-dark);
    --bs-btn-disabled-color: var(--rideau);
    --bs-btn-disabled-bg: var(--cuivre);
    --bs-btn-disabled-border-color: var(--cuivre);
}
.btn-outline-primary {
    --bs-btn-color: var(--laiton);
    --bs-btn-border-color: var(--laiton);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--laiton);
    --bs-btn-hover-border-color: var(--laiton);
    --bs-btn-focus-shadow-rgb: 198, 164, 97;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--laiton);
    --bs-btn-active-border-color: var(--laiton);
    --bs-btn-disabled-color: var(--laiton);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--laiton);
}
.btn-outline-secondary {
    --bs-btn-color: var(--muted);
    --bs-btn-border-color: rgba(233, 217, 195, .32);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--sable);
    --bs-btn-hover-border-color: var(--sable);
    --bs-btn-focus-shadow-rgb: 233, 217, 195;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--sable);
    --bs-btn-active-border-color: var(--sable);
    --bs-btn-disabled-color: var(--muted);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: rgba(233, 217, 195, .32);
}
.btn-outline-success {
    --bs-btn-color: var(--sauge);
    --bs-btn-border-color: var(--sauge);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--sauge);
    --bs-btn-hover-border-color: var(--sauge);
    --bs-btn-focus-shadow-rgb: 138, 154, 130;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--sauge);
    --bs-btn-active-border-color: var(--sauge);
    --bs-btn-disabled-color: var(--sauge);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--sauge);
}
.btn-outline-danger {
    --bs-btn-color: var(--rubis);
    --bs-btn-border-color: var(--rubis);
    --bs-btn-hover-color: #fff;
    --bs-btn-hover-bg: var(--rubis);
    --bs-btn-hover-border-color: var(--rubis);
    --bs-btn-focus-shadow-rgb: 178, 59, 53;
    --bs-btn-active-color: #fff;
    --bs-btn-active-bg: var(--rubis);
    --bs-btn-active-border-color: var(--rubis);
    --bs-btn-disabled-color: var(--rubis);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--rubis);
}
.btn-outline-warning {
    --bs-btn-color: var(--cuivre);
    --bs-btn-border-color: var(--cuivre);
    --bs-btn-hover-color: var(--rideau);
    --bs-btn-hover-bg: var(--cuivre);
    --bs-btn-hover-border-color: var(--cuivre);
    --bs-btn-focus-shadow-rgb: 201, 138, 82;
    --bs-btn-active-color: var(--rideau);
    --bs-btn-active-bg: var(--cuivre);
    --bs-btn-active-border-color: var(--cuivre);
    --bs-btn-disabled-color: var(--cuivre);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--cuivre);
}
.text-primary { color: var(--brand) !important; }
.bg-primary, .badge.bg-primary { background-color: var(--brand) !important; color: var(--rideau) !important; }
.btn, .form-control, .form-select, .card, .badge { border-radius: var(--radius-md); }

/* --- Champs de formulaire (texte, select) recolorés à la charte : fond translucide sombre et
   texte sable (même recette que .champ input/textarea de la charte graphique), halo/bordure de
   focus en laiton plutôt que le bleu Bootstrap par défaut, et chevron du <select> en laiton
   (SVG recopié de Bootstrap avec juste la couleur du trait changée). --- */
.form-control, .form-select {
    background-color: rgba(23, 17, 15, .35);
    color: var(--ink);
    border-color: rgba(233, 217, 195, .18);
}
.form-control::placeholder { color: rgba(233, 217, 195, .4); }
.form-control:hover, .form-select:hover { border-color: rgba(198, 164, 97, .5); }
.form-control:focus, .form-select:focus {
    background-color: rgba(23, 17, 15, .35);
    color: var(--ink);
    border-color: var(--brand);
    box-shadow: 0 0 0 .2rem var(--brand-light);
}
.form-select {
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23c6a461' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
}
.form-select option { background-color: var(--rideau); color: var(--ink); }
/* Bootstrap fond ce badge sur --bs-tertiary-bg (le rideau, presque noir, réservé ailleurs aux
   sections de rupture) : à côté d'un .form-control bien plus clair et translucide, l'écart de
   fond entre les deux moitiés d'un même champ ressortait trop fort. Même recette translucide que
   .form-control, pour qu'ils se lisent comme un seul champ. */
.input-group-text {
    background-color: rgba(23, 17, 15, .35);
    border-color: rgba(233, 217, 195, .18);
    color: var(--brand);
}
.btn { font-weight: 500; }
.btn-lg, .rounded-pill { border-radius: 50rem !important; }

/* Bootstrap code la couleur des cases à cocher/radios cochées en dur (#0d6efd), sans passer par
   --bs-primary : sans cette règle, tout <input type="checkbox"/"radio"> Bootstrap brut (case de
   la pop-up d'âge, formulaires staffadmin...) resterait bleu une fois coché. */
.form-check-input:checked {
    background-color: var(--laiton);
    border-color: var(--laiton);
}
.form-check-input:focus {
    border-color: var(--laiton);
    box-shadow: 0 0 0 .25rem var(--brand-light);
}

/* ===== Navbar ===== */
.navbar {
    background: linear-gradient(115deg, var(--rideau), var(--bordeaux)) !important;
    box-shadow: var(--shadow-md);
    padding-top: .7rem;
    padding-bottom: .7rem;
}
.navbar .badge.bg-danger {
    font-size: .6rem;
    vertical-align: top;
}
/* Wordmark repris tel quel de la charte (voir <h1 class="wordmark">ALCOV<em>AE</em></h1>) : Fraunces
   Light, tiret bas de casse serré, le "AE" seul en italique et en laiton — même traitement ici et
   sur .site-footer-brand, à une échelle de logo plutôt que de titre de page. La signature
   ("L'élégance du secret...", voir .brand-tagline) vient se glisser juste dessous, en beaucoup
   plus petit et discret pour rester secondaire au nom de marque. */
.navbar-brand {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
}
.navbar-brand-word {
    font-family: var(--display);
    font-weight: 300;
    font-size: 1.85rem;
    letter-spacing: -.025em;
    color: var(--sable);
}
.navbar-brand-word em {
    font-style: italic;
    color: var(--laiton);
}
.brand-tagline {
    display: block;
    font-family: var(--display);
    font-style: italic;
    font-weight: 300;
    font-size: .82rem;
    line-height: 1.3;
    letter-spacing: .01em;
    color: rgba(233, 217, 195, .5);
}
.navbar-nav .nav-link {
    font-weight: 500;
    border-radius: 50rem;
    padding: .45rem .85rem !important;
    transition: background-color .15s ease, color .15s ease;
}
.navbar-nav .nav-link:hover,
.navbar-nav .nav-link:focus {
    background: rgba(233, 217, 195, .1);
    color: #fff;
}
.navbar-nav .nav-link.dropdown-toggle::after { margin-left: .45rem; vertical-align: .1em; }

.btn-publish {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    background: var(--laiton);
    color: var(--rideau) !important;
    border: none;
    border-radius: 50rem;
    padding: .5rem 1.15rem;
    font-weight: 600;
    font-size: .92rem;
    box-shadow: 0 4px 14px rgba(198, 164, 97, .35);
    transition: transform .15s ease, box-shadow .15s ease, background-color .15s ease;
}
.btn-publish:hover,
.btn-publish:focus {
    background: var(--sable);
    color: var(--rideau);
    transform: translateY(-1px);
    box-shadow: 0 6px 18px rgba(198, 164, 97, .45);
}

/* --- Menu utilisateur --- */
.user-menu-toggle {
    display: flex;
    align-items: center;
    gap: .5rem;
    background: rgba(233, 217, 195, .1);
}
.user-menu-toggle:hover { background: rgba(233, 217, 195, .18); }
.user-menu-toggle .bi-person-circle { font-size: 1.3rem; }
.user-menu-avatar {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    object-fit: cover;
}
.user-menu {
    width: 270px;
    padding: 0;
    overflow: hidden;
    border: none;
    box-shadow: var(--shadow-lg);
}
.user-menu-header {
    display: flex;
    align-items: center;
    gap: .8rem;
    padding: 1rem;
    background: var(--brand-light);
}
.user-menu-avatar-lg {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.user-menu-avatar-placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--velours);
    color: var(--sable);
    font-size: 1.3rem;
}
.user-menu-name { font-weight: 700; color: var(--ink); }
.user-menu-header .badge {
    background: var(--brand);
    color: var(--rideau);
    font-weight: 600;
    font-size: .68rem;
}
.user-menu .dropdown-item {
    display: flex;
    align-items: center;
    gap: .65rem;
    padding: .6rem 1rem;
    font-size: .9rem;
}
.user-menu .dropdown-item i { width: 1.1rem; text-align: center; color: var(--brand); flex-shrink: 0; }
.user-menu .dropdown-item.text-danger i { color: var(--accent); }
/* Fond de survol distinct de var(--surface-alt), utilisé aussi comme fond du menu lui-même (celui
   de .dropdown-menu par défaut) : les deux étant identiques, le survol ne se voyait pas. */
.user-menu .dropdown-item:hover { background: var(--brand-light); }
.user-menu .dropdown-item.text-danger:hover { background: rgba(178, 59, 53, .16); }
.user-menu form { margin: 0; }
.user-menu form button.dropdown-item { border: none; background: none; }

/* --- Sélecteur de langue --- */
.lang-switcher-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.4rem;
    height: 2.4rem;
    padding: 0 !important;
    background: rgba(233, 217, 195, .1);
    border-radius: 50%;
    font-size: 1.1rem;
}
.lang-switcher-toggle:hover { background: rgba(233, 217, 195, .18); }
.lang-switcher-toggle::after { display: none; }
.lang-switcher-menu {
    min-width: 190px;
    padding: .35rem;
    border: none;
    box-shadow: var(--shadow-lg);
}
.lang-switcher-menu .dropdown-item {
    display: flex;
    align-items: center;
    gap: .6rem;
    padding: .55rem .75rem;
    font-size: .9rem;
    border-radius: var(--radius-md);
}
.lang-switcher-menu .dropdown-item:hover { background: var(--brand-light); }
.lang-switcher-menu .dropdown-item.active {
    background: var(--brand-light);
    color: var(--brand);
    font-weight: 600;
}
.lang-flag {
    font-size: 1.35rem;
    border-radius: 3px;
}
.lang-switcher-toggle .lang-flag { font-size: 1.15rem; }

/* ===== Bannière sitewide (pages.Banner, gérée en /staff/) ===== */
.site-banner {
    border-radius: 0;
    border-left: 0;
    border-right: 0;
    text-align: center;
    font-weight: 600;
    font-size: .88rem;
    padding: .6rem 2.5rem .6rem 1rem;
}
.site-banner i { margin-right: .35rem; }
/* Bootstrap positionne .btn-close en absolute avec un padding fixe (1.25rem 1rem) pensé pour le
   padding vertical par défaut d'une .alert (1rem) : avec le padding réduit de .site-banner
   (.6rem), ce padding fixe pousse la croix sous le centre du bandeau plutôt qu'au milieu. */
.site-banner .btn-close {
    top: 50%;
    right: .85rem;
    padding: 0;
    transform: translateY(-50%);
}

/* ===== Cards / surfaces ===== */
.card {
    background: var(--surface-gradient);
    color: var(--ink);
    border: none;
    box-shadow: var(--shadow-sm);
}

/* ===== Barre de filtres ===== */
.filter-bar {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-md);
    overflow: hidden;
}
.filter-bar-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 1rem 1.25rem;
    cursor: pointer;
    user-select: none;
    background: linear-gradient(135deg, var(--brand-light), var(--surface) 70%);
}
.filter-bar-header h2 {
    font-size: 1rem;
    font-weight: 700;
    margin: 0;
    color: var(--ink);
    display: flex;
    align-items: center;
    gap: .5rem;
}
.filter-bar-header .chevron {
    transition: transform .25s ease;
    color: var(--brand);
    font-size: 1.2rem;
}
.filter-bar.is-collapsed .filter-bar-header .chevron { transform: rotate(-90deg); }
.filter-bar-body {
    padding: 1.25rem;
    border-top: 1px solid rgba(233, 217, 195, .1);
}
.filter-bar.is-collapsed .filter-bar-body { display: none; }
.filter-bar .form-label {
    font-size: .8rem;
    font-weight: 600;
    color: var(--muted);
    text-transform: uppercase;
    letter-spacing: .02em;
    margin-bottom: .3rem;
}
.filter-section-label {
    font-size: .72rem;
    font-weight: 700;
    color: var(--brand);
    text-transform: uppercase;
    letter-spacing: .06em;
    margin-bottom: .5rem;
    display: flex;
    align-items: center;
    gap: .4rem;
}
.filter-group {
    background: var(--surface-alt);
    border-radius: var(--radius-md);
    padding: 1rem;
    margin-bottom: 1rem;
}
.filter-group:last-child { margin-bottom: 0; }
#advancedFiltersToggle {
    color: var(--brand);
    font-weight: 600;
    font-size: .9rem;
}
/* Même convention que .chevron sur .filter-bar-header (Filtres/Trier par) : replié -> vers la
   droite, déplié -> vers le bas (l'icône bi-chevron-down pointe déjà nativement vers le bas, il
   suffit donc de la faire pivoter uniquement à l'état replié). display:inline-block est
   nécessaire : un <i> reste "inline" par défaut, et `transform` n'a aucun effet sur les éléments
   inline (contrairement à .chevron, "blockifiée" du fait d'être un enfant flex de
   .filter-bar-header) — sans lui la rotation ne s'applique tout simplement jamais. */
#advancedFiltersToggle i {
    display: inline-block;
    transition: transform .2s ease;
    transform: rotate(-90deg);
}
#advancedFiltersToggle[aria-expanded="true"] i { transform: rotate(0deg); }
.filter-reset-link {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    color: var(--muted);
    font-size: .82rem;
    font-weight: 500;
    text-decoration: none;
}
.filter-reset-link:hover { color: var(--accent); }
.filter-reset-link i { font-size: .9rem; }

.filter-toggle {
    position: relative;
    display: inline-flex;
    cursor: pointer;
}
.filter-toggle-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.filter-toggle-pill {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    padding: .55rem 1rem;
    border-radius: 999px;
    background: var(--surface-gradient);
    border: 1px solid rgba(233, 217, 195, .18);
    color: var(--muted);
    font-size: .85rem;
    font-weight: 600;
    line-height: 1.1;
    transition: background .15s ease, border-color .15s ease, color .15s ease;
    user-select: none;
}
.filter-toggle-pill i { font-size: .95em; }
.filter-toggle:hover .filter-toggle-pill { border-color: var(--brand); }
.filter-toggle-input:checked + .filter-toggle-pill {
    background: var(--brand-light);
    border-color: var(--brand);
    color: var(--brand);
}
.filter-toggle-input:focus-visible + .filter-toggle-pill {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
}
.filter-toggle-input:checked + #vipTogglePill {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    border-color: var(--laiton);
    color: var(--rideau);
}
.filter-toggle-input:checked + #exclusiveTogglePill {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    border-color: var(--laiton);
    color: var(--laiton);
}
/* Pastille "Exclusif" grisée pour les visiteurs non Client Exclusif (listings/listing_list.html)
   — pas de case à cocher (rien à filtrer tant que les annonces exclusives sont de toute façon
   exclues du résultat, voir Listing.objects.public), juste un lien vers la page d'achat du
   statut, avec un rendu volontairement inerte pour signaler que c'est verrouillé. */
.filter-toggle-pill--locked {
    background: rgba(233, 217, 195, .05);
    border-style: dashed;
    color: var(--muted);
    opacity: .75;
}
.filter-toggle:hover .filter-toggle-pill--locked {
    opacity: 1;
    border-color: var(--laiton);
    color: var(--laiton);
}
/* Nombre d'annonces exclusives disponibles, affiché dans la pastille "Exclusif seulement" même
   verrouillée — donne envie de devenir Client Exclusif en montrant ce qui est accessible. */
.filter-toggle-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.3rem;
    height: 1.3rem;
    padding: 0 .35rem;
    border-radius: 999px;
    background: rgba(23, 17, 15, .4);
    font-size: .72rem;
    font-weight: 700;
}

#listingResults { transition: opacity .15s ease; }
#listingResults.is-loading { opacity: .5; pointer-events: none; }

.plan-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 1rem;
    margin-top: .75rem;
}
.plan-card-label { display: block; cursor: pointer; }
.plan-card-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.plan-card {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: .25rem;
    padding: 1.5rem 1.1rem 1.25rem;
    border-radius: var(--radius-lg);
    border: 2px solid rgba(233, 217, 195, .14);
    background: var(--surface-gradient);
    text-align: center;
    box-shadow: var(--shadow-sm);
    transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.plan-card-label:hover .plan-card {
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
}
.plan-card-input:checked + .plan-card {
    border-color: var(--brand);
    background: var(--brand-light);
    box-shadow: var(--shadow-md);
}
.plan-card-input:focus-visible + .plan-card {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
}
.plan-card-tier {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    align-self: center;
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    padding: .2rem .6rem;
    border-radius: 999px;
    margin-bottom: .5rem;
    background: rgba(233, 217, 195, .08);
    color: var(--muted);
}
.plan-card-tier--premium {
    background: linear-gradient(135deg, var(--sauge), #5c6e52);
    color: #fff;
}
.plan-card-tier--value {
    background: linear-gradient(135deg, var(--brand), var(--brand-dark));
    color: var(--rideau);
}
.plan-card-name i { color: var(--brand); margin-right: .2rem; }
.plan-card-name { font-weight: 700; font-size: 1.05rem; }
.plan-card-price { font-size: 1.6rem; font-weight: 800; color: var(--brand); margin-top: .15rem; }
.plan-card-per-day { font-size: .8rem; color: var(--muted); }
.plan-card-perk {
    font-size: .76rem;
    color: var(--muted);
    margin-top: .5rem;
    padding-top: .5rem;
    border-top: 1px dashed rgba(233, 217, 195, .12);
}
.plan-card-perk i { color: var(--brand); }
.plan-card-tier--vip {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    color: var(--rideau);
}

/* Tuile non achetable invitant à contacter le support pour un format sur mesure (ex. packs
   multi-annonces, payments/templates/payments/listing_plan_packs.html) — même gabarit que
   .plan-card mais bordure pointillée et fond neutre pour ne jamais se confondre avec une offre
   sélectionnable au clic (pas de <label>/radio associé, contrairement aux .plan-card normales). */
.plan-card--custom {
    border-style: dashed;
    border-color: rgba(233, 217, 195, .25);
    background: var(--surface-alt);
    box-shadow: none;
    justify-content: center;
}
.plan-card--custom .plan-card-tier {
    background: rgba(233, 217, 195, .08);
    color: var(--muted);
}

/* ===== Forfaits (checkout) : un seul widget par famille (Basique/Premium/Exclusif — voir
   payments.ListingPlan.TIER_CHOICES) avec un sélecteur de durée en pastilles, plutôt qu'une
   carte par durée — reste lisible même avec de nombreux forfaits (3/7/15/30/60 jours). Le prix
   affiché suit la pastille cochée ; tant qu'aucune pastille de la famille n'est cochée (une
   autre famille est le forfait réellement choisi), la première pastille sert de simple aperçu,
   avec un style pointillé pour rester distinguable d'une vraie sélection — voir
   static/js/checkout.js::updateTierCards. ===== */
.plan-tier-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 1rem;
    margin-top: .75rem;
}
.plan-tier-card {
    padding: 1.25rem;
    border-radius: var(--radius-lg);
    border: 2px solid rgba(233, 217, 195, .14);
    background: var(--surface-gradient);
    box-shadow: var(--shadow-sm);
    transition: border-color .12s ease, box-shadow .12s ease, background .12s ease;
}
.plan-tier-card--basic { border-color: rgba(233, 217, 195, .35); }
.plan-tier-card--premium { border-color: rgba(138, 154, 130, .35); }
.plan-tier-card--exclusive { border-color: rgba(198, 164, 97, .3); }
.plan-tier-card--selected {
    border-color: var(--brand);
    background: var(--brand-light);
    box-shadow: var(--shadow-md);
}
/* Chaque famille a sa propre couleur une fois sélectionnée (durée cliquée) — Basique en sable
   chaud, Premium en sauge fumée, Exclusif en noir/or (voir plus bas) — pour que l'encadré entier
   signale visuellement quel forfait est choisi, pas seulement la pastille de durée. Basique et
   Premium restent volontairement en teinte translucide (pas un dégradé qui s'estompe vers le
   blanc, sans quoi la teinte devient à peine visible sur un fond sombre) : un fond trop soutenu
   masquerait la différence entre la pastille cochée (remplie, voir
   .plan-duration-pill-input:checked) et les autres — c'est cette différence qui indique quelle
   durée est choisie. */
.plan-tier-card--basic.plan-tier-card--selected {
    border-color: var(--sable);
    background: rgba(233, 217, 195, .14);
}
.plan-tier-card--premium.plan-tier-card--selected {
    border-color: var(--sauge);
    background: rgba(138, 154, 130, .16);
}
.plan-tier-card--exclusive.plan-tier-card--selected {
    border-color: var(--laiton);
    background: linear-gradient(160deg, #241b16, var(--rideau) 65%);
}
.plan-tier-card-head { margin-bottom: .75rem; }
/* Étiquette au-dessus de chaque rangée de pastilles quand une carte palier en a plusieurs (durée,
   puis nombre d'annonces — voir payments/templates/payments/listing_plan_packs.html) : sans ça,
   rien ne distingue visuellement à quoi correspond chaque rangée une fois qu'il y en a plus d'une. */
.plan-tier-card-selector-label {
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--muted);
    margin: .85rem 0 .35rem;
}
.plan-tier-card-desc { font-size: .8rem; color: var(--muted); margin: .3rem 0 0; }
.plan-tier-card-desc--premium {
    display: flex;
    align-items: center;
    gap: .35rem;
    color: var(--sauge);
    font-weight: 700;
    font-size: .85rem;
}
.plan-tier-card-desc--exclusive {
    display: flex;
    align-items: center;
    gap: .35rem;
    color: var(--laiton);
    font-weight: 700;
    font-size: .85rem;
}
/* Une fois sélectionnée, la carte Exclusif passe à un fond sombre (.plan-tier-card--selected
   ci-dessus) : le texte/icônes doivent rester en clair/or pour rester lisibles. */
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-desc--exclusive,
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-price-value,
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-perk--badge {
    color: var(--laiton);
}
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-perk i {
    color: var(--laiton);
}
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-price-per-day,
.plan-tier-card--exclusive.plan-tier-card--selected .plan-tier-card-perk {
    color: var(--muted);
}
/* flex-wrap: nowrap + pastilles à largeur égale (flex:1) plutôt que wrap : les 5 durées tiennent
   toujours sur une seule ligne quel que soit le nombre de forfaits configurés (voir
   payments.ListingPlan), sans dépendre d'une largeur de carte précise. */
.plan-duration-pills { display: flex; flex-wrap: nowrap; gap: .35rem; }
.plan-duration-pill-label { display: block; flex: 1 1 0; min-width: 0; cursor: pointer; position: relative; }
.plan-duration-pill-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.plan-duration-pill {
    display: flex;
    align-items: baseline;
    justify-content: center;
    gap: .1rem;
    padding: .5rem .4rem;
    border-radius: 999px;
    border: 1.5px solid rgba(233, 217, 195, .18);
    background: var(--surface-alt);
    color: var(--ink);
    font-weight: 700;
    font-size: .9rem;
    transition: background .12s ease, border-color .12s ease, color .12s ease;
}
.plan-duration-pill small { font-weight: 600; font-size: .7em; }
.plan-duration-pill-label:hover .plan-duration-pill { border-color: var(--brand); }
.plan-duration-pill-input:checked + .plan-duration-pill {
    background: var(--brand);
    border-color: var(--brand);
    color: var(--rideau);
}
.plan-tier-card--basic .plan-duration-pill-input:checked + .plan-duration-pill {
    background: var(--sable);
    border-color: var(--sable);
    color: var(--rideau);
}
.plan-tier-card--premium .plan-duration-pill-input:checked + .plan-duration-pill {
    background: var(--sauge);
    border-color: var(--sauge);
    color: #fff;
}
.plan-tier-card--exclusive .plan-duration-pill-input:checked + .plan-duration-pill {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    border-color: var(--laiton);
    color: var(--laiton);
}
.plan-duration-pill-input:focus-visible + .plan-duration-pill {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
}
.plan-tier-card-price { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem; margin-top: 1rem; }
/* Bon appliqué (voir static/js/checkout.js::updateTierCards) : prix et prix/jour d'origine barrés
   sur leur propre ligne — flex-basis 100% les fait occuper toute la largeur de .plan-tier-card-price
   (display:flex), ce qui pousse le nouveau montant (price-value/price-per-day, inchangés dans le
   DOM) à la ligne suivante sans avoir à restructurer leur imbrication. */
.plan-tier-card-price-original { flex: 1 0 100%; font-size: .78rem; color: var(--muted); }
.plan-tier-card-price-original s { margin-right: .5rem; }
.plan-tier-card-price-value { font-size: 1.6rem; font-weight: 800; color: var(--brand); }
.plan-tier-card-price-value.text-success { color: var(--sauge) !important; }
.plan-tier-card--basic .plan-tier-card-price-value { color: var(--sable); }
.plan-tier-card--premium .plan-tier-card-price-value { color: var(--sauge); }
.plan-tier-card--exclusive .plan-tier-card-price-value { color: var(--laiton); }
.plan-tier-card-price-per-day { font-size: .8rem; color: var(--muted); }
.plan-tier-card-price-per-day.text-success { color: var(--sauge) !important; }
.plan-tier-card-perk {
    font-size: .76rem;
    color: var(--muted);
    margin-top: .5rem;
    padding-top: .5rem;
    border-top: 1px dashed rgba(233, 217, 195, .12);
}
.plan-tier-card-perk i { color: var(--brand); }
.plan-tier-card--basic .plan-tier-card-perk i { color: var(--sable); }
.plan-tier-card--premium .plan-tier-card-perk i { color: var(--sauge); }
.plan-tier-card--exclusive .plan-tier-card-perk i { color: var(--laiton); }
.plan-tier-card-perk--badge { font-weight: 600; color: var(--ink); }

/* Bloc "Besoin d'un autre format ?" du widget de packs (payments/templates/payments/
   listing_plan_packs.html) : sous les trois cartes palier plutôt qu'une 4e tuile de la même
   taille au milieu d'elles, pour rester lisible comme une invite à part (contacter le support)
   plutôt qu'une offre de plus parmi les paliers achetables — même esprit pointillé/neutre que
   l'ancien .plan-card--custom, mais en pleine largeur avec plus de place pour le texte. */
.plan-custom-box {
    display: flex;
    align-items: center;
    gap: 1.5rem;
    border: 2px dashed rgba(233, 217, 195, .25);
    background: var(--surface-alt);
    box-shadow: none;
}
.plan-custom-box-icon {
    flex: 0 0 auto;
    width: 3.5rem;
    height: 3.5rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--brand-light);
    color: var(--brand);
    font-size: 1.5rem;
}
.plan-custom-box-body { flex: 1 1 auto; min-width: 0; }

/* Séparateur "OU" entre le widget Forfait et le widget "Bons multi-annonces" (payments/templates/
   payments/checkout.html) : signale sans ambiguïté que payer un forfait et utiliser un bon sont
   deux options concurrentes, pas cumulables. .or-divider ne réserve qu'un espace de 2rem entre les
   deux .account-card (aucune des deux ne reçoit de marge automatique ici, la règle .account-card +
   .account-card ne s'applique pas puisqu'aucune des deux n'est adjacente à l'autre) ; la pastille,
   positionnée en absolu et plus grande que cet espace, déborde d'1rem dans le padding de chaque
   carte pour vraiment les toucher toutes les deux — pastille pleine (dégradé + ombre), pas un
   simple contour, pour rester bien visible même sur ce fond neutre. */
.or-divider {
    height: 2rem;
    margin: 0;
    position: relative;
    z-index: 3;
}
.or-divider span {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 4rem;
    height: 4rem;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--brand), var(--brand-dark));
    color: var(--rideau);
    font-weight: 800;
    font-size: .9rem;
    letter-spacing: .04em;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 3px solid var(--surface-alt);
    box-shadow: 0 6px 16px rgba(198, 164, 97, .4);
}

/* ===== Highlight box family — bandeaux d'option mise en avant (VIP, Boost, Renouvellement auto,
   Packs, Bons, Client Exclusif ci-dessous) : même structure icône + corps pour tous, déclinée par
   couleur via un modificateur --xxx (même esprit que .promo-box/.promo-box--boost etc. plus bas).
   Marges (mt/mb) et détails propres à un seul emplacement restent sur le modificateur plutôt que
   sur la base, chaque bandeau vivant dans un seul gabarit. */
.highlight-box {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    padding: 1.25rem;
    border-radius: var(--radius-lg);
    border: 2px solid transparent;
    box-shadow: var(--shadow-sm);
}
.highlight-box-icon {
    flex: 0 0 auto;
    width: 2.75rem;
    height: 2.75rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 1.3rem;
    box-shadow: var(--shadow-sm);
}
.highlight-box-body { flex: 1 1 auto; min-width: 0; }
.highlight-box-title { font-weight: 700; margin-bottom: .35rem; }
/* Titre avec badge de palier inline (VIP, Client Exclusif) plutôt que texte seul. */
.highlight-box-title--badge { display: flex; align-items: center; gap: .5rem; }
.highlight-box-text { font-size: .85rem; margin-bottom: .75rem; }

/* Doré — Option VIP mise en avant dans sa propre carte "Options" (payments/templates/payments/
   checkout.html), décorrélée du choix de forfait plutôt que logée dans le widget Forfait comme
   avant — même traitement doré que le badge VIP des annonces, pour qu'elle attire davantage
   l'œil qu'un simple toggle. */
.highlight-box--gold {
    margin-top: 1.5rem;
    border-color: var(--laiton);
    background: linear-gradient(135deg, rgba(198, 164, 97, .16), rgba(226, 155, 76, .08) 60%, rgba(198, 164, 97, .12));
}
.highlight-box--gold .highlight-box-icon { background: linear-gradient(135deg, var(--ambre), var(--laiton)); color: var(--rideau); }
.highlight-box--gold .highlight-box-title { color: var(--laiton); }
.highlight-box--gold .highlight-box-text { color: var(--muted); }
.highlight-box--gold .highlight-box-body .filter-toggle { display: flex; justify-content: center; }

/* Saphir — Widget d'achat du Boost (fiche annonce, propriétaire uniquement), pour rester distinct
   du VIP (or) et du Client Exclusif (noir/or, voir plus bas). */
.highlight-box--blue {
    margin-top: 1rem;
    border-color: var(--saphir);
    background: linear-gradient(135deg, rgba(79, 143, 186, .16), rgba(79, 143, 186, .07) 60%, rgba(79, 143, 186, .12));
}
.highlight-box--blue .highlight-box-icon { background: linear-gradient(135deg, var(--saphir), var(--saphir-dark)); }
.highlight-box--blue .highlight-box-title { color: var(--saphir); }
.highlight-box--blue .highlight-box-text { color: var(--muted); }

/* Sauge — Renouvellement automatique + préférence "bon en priorité" (payments/templates/payments/
   checkout.html), en sauge (couleur de confiance de la charte) pour rester distinct du VIP (or)
   et du Boost (saphir). Le sous-réglage "bon en priorité" vit dans la même carte (séparé par un
   simple filet), pas dans une carte séparée : c'est une dépendance directe du réglage au-dessus
   (n'a d'effet que si le renouvellement auto est actif), pas une option indépendante. */
.highlight-box--green {
    margin-top: 1.5rem;
    border-color: var(--sauge);
    background: linear-gradient(135deg, rgba(138, 154, 130, .16), rgba(138, 154, 130, .07) 60%, rgba(138, 154, 130, .12));
}
.highlight-box--green .highlight-box-icon { background: linear-gradient(135deg, var(--sauge), #5c6e52); color: var(--rideau); }
.highlight-box--green .highlight-box-title { color: var(--sauge); }
.highlight-box--green .highlight-box-text { color: var(--muted); }
.highlight-box-suboption {
    margin-top: .85rem;
    padding-top: .85rem;
    border-top: 1px dashed rgba(138, 154, 130, .25);
}
.highlight-box-subtext { font-size: .78rem; color: var(--sauge); margin: .4rem 0 0; }

/* Émeraude — Bandeau "Vos bons disponibles" (payments/templates/payments/listing_plan_packs.html),
   pour ne pas se confondre avec le widget "Pourquoi acheter un pack ?" juste au-dessus (voir
   .feature-list-card) — et une marge basse nettement plus large que l'espacement standard entre
   .account-card pour ne pas coller au widget de packs qui suit. Pas de paragraphe -text (le corps
   enchaîne directement sur la liste de bons). */
.highlight-box--teal {
    margin-bottom: 2rem;
    border-color: var(--emeraude);
    background: linear-gradient(135deg, rgba(63, 175, 158, .16), rgba(63, 175, 158, .07) 60%, rgba(63, 175, 158, .12));
}
.highlight-box--teal .highlight-box-icon { background: linear-gradient(135deg, var(--emeraude), var(--emeraude-dark)); }
.highlight-box--teal .highlight-box-title { color: var(--emeraude); margin-bottom: .6rem; }

/* Grenat — Bandeau "Pourquoi les cadeaux comptent" (accounts/templates/accounts/my_gifts.html),
   en grenat chaleureux pour rester distinct de toutes les autres variantes déjà attribuées (or=VIP,
   saphir=Boost, sauge=renouvellement, marque=explicatif générique, émeraude=bons, noir/or=Exclusif). */
.highlight-box--pink {
    margin-bottom: 1.5rem;
    border-color: var(--grenat);
    background: linear-gradient(135deg, rgba(193, 68, 94, .16), rgba(193, 68, 94, .07) 60%, rgba(193, 68, 94, .12));
}
.highlight-box--pink .highlight-box-icon { background: linear-gradient(135deg, var(--grenat), var(--grenat-dark)); }
.highlight-box--pink .highlight-box-title { color: var(--grenat); }
.highlight-box--pink .highlight-box-text { color: var(--muted); }

/* Cadeaux par palier (accounts/templates/accounts/_gift_tier_counts.html, utilisé par my_gifts.html
   et public_profile.html) : un badge circulaire dégradé par palier, même langage visuel que
   .highlight-box-icon ci-dessus, plutôt qu'une icône uniforme text-primary — Rose/Bouquet/Diamant
   doivent se distinguer au premier coup d'œil, pas juste par leur libellé. */
.gift-tier-counts { display: flex; justify-content: center; gap: 1.75rem; flex-wrap: wrap; }
.gift-tier-count { text-align: center; }
.gift-tier-count-icon {
    width: 3rem;
    height: 3rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 1.4rem;
    margin: 0 auto .4rem;
    box-shadow: var(--shadow-sm);
}
.gift-tier-count-value { font-weight: 700; font-size: 1.1rem; }
.gift-tier-count-label { font-size: .78rem; color: var(--muted); }
.gift-tier-count-icon--rose { background: linear-gradient(135deg, var(--grenat), var(--grenat-dark)); }
.gift-tier-count-icon--bouquet { background: linear-gradient(135deg, var(--amethyste), var(--amethyste-dark)); }
.gift-tier-count-icon--diamond { background: linear-gradient(135deg, var(--saphir), var(--saphir-dark)); }

/* Badge de palier sur chaque ligne "Qui vous a envoyé un cadeau" (my_gifts.html) — même dégradé
   par palier que .gift-tier-count-icon ci-dessus, décliné en badge plutôt qu'en cercle. */
.gift-tier-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .35rem .7rem;
    border-radius: 999px;
    color: #fff;
    font-size: .8rem;
    font-weight: 600;
    box-shadow: var(--shadow-sm);
}
.gift-tier-badge--rose { background: linear-gradient(135deg, var(--grenat), var(--grenat-dark)); }
.gift-tier-badge--bouquet { background: linear-gradient(135deg, var(--amethyste), var(--amethyste-dark)); }
.gift-tier-badge--diamond { background: linear-gradient(135deg, var(--saphir), var(--saphir-dark)); }

/* Grille "Mettre en avant" (dashboard/my_listings.html) : trois options de visibilité
   indépendantes (Boost, Renouvellement de fraîcheur, Urgent) présentées côte à côte dans un
   panneau rétractable (Bootstrap collapse) par annonce. Structure partagée (.promo-box), déclinée
   en couleur par modificateur — même esprit que .highlight-box/.highlight-box--blue ci-dessus,
   mais pensée pour trois cartes compactes plutôt qu'un widget seul en pleine largeur. */
.listing-promo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
    gap: 1rem;
}
.promo-box {
    display: flex;
    flex-direction: column;
    gap: .55rem;
    padding: 1.1rem;
    border-radius: var(--radius-lg);
    border: 2px solid transparent;
    box-shadow: var(--shadow-sm);
}
.promo-box-icon {
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 1.15rem;
    box-shadow: var(--shadow-sm);
}
.promo-box-title { font-weight: 700; }
.promo-box-text { font-size: .82rem; margin-bottom: 0; flex-grow: 1; }
.promo-box-status { font-size: .78rem; }
.promo-box .btn { align-self: flex-start; }

.promo-box--boost {
    border-color: var(--saphir);
    background: linear-gradient(135deg, rgba(79, 143, 186, .16), rgba(79, 143, 186, .07) 60%, rgba(79, 143, 186, .12));
}
.promo-box--boost .promo-box-icon { background: linear-gradient(135deg, var(--saphir), var(--saphir-dark)); }
.promo-box--boost .promo-box-title { color: var(--saphir); }
.promo-box--boost .promo-box-text,
.promo-box--boost .promo-box-status { color: var(--muted); }

.promo-box--bump {
    border-color: var(--sauge);
    background: linear-gradient(135deg, rgba(138, 154, 130, .16), rgba(138, 154, 130, .07) 60%, rgba(138, 154, 130, .12));
}
.promo-box--bump .promo-box-icon { background: linear-gradient(135deg, var(--sauge), #5c6e52); color: var(--rideau); }
.promo-box--bump .promo-box-title { color: var(--sauge); }
.promo-box--bump .promo-box-text,
.promo-box--bump .promo-box-status { color: var(--muted); }

.promo-box--urgent {
    border-color: var(--rubis);
    background: linear-gradient(135deg, rgba(178, 59, 53, .16), rgba(178, 59, 53, .07) 60%, rgba(178, 59, 53, .12));
}
.promo-box--urgent .promo-box-icon { background: linear-gradient(135deg, var(--rubis), var(--rubis-dark)); }
.promo-box--urgent .promo-box-title { color: var(--rubis); }
.promo-box--urgent .promo-box-text,
.promo-box--urgent .promo-box-status { color: var(--muted); }

/* Étiquette de forfait sur la page d'achat du statut Client Exclusif, même noir/or que le
   bandeau --dark ci-dessous (VIP = or plein, Premium = sauge fumée, Exclusif = noir et or). */
.plan-card-tier--exclusive {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    color: var(--laiton);
}
/* Noir/or — Rappel du statut Client Exclusif déjà actif (payments/templates/payments/
   exclusive.html), identité visuelle à part de la famille .highlight-box (VIP = or plein,
   Premium = sauge fumée, Exclusif = noir et or). */
.highlight-box--dark {
    margin-top: 1.5rem;
    border-color: var(--laiton);
    background: linear-gradient(135deg, #241b16, var(--rideau) 60%, #0d0906);
}
.highlight-box--dark .highlight-box-icon { background: linear-gradient(135deg, var(--laiton), var(--cuivre-dark)); color: var(--rideau); }
.highlight-box--dark .highlight-box-title { color: var(--laiton); }
.highlight-box--dark .highlight-box-text { color: var(--muted); }
.filter-toggle-input:checked + #exclusiveTogglePill {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    border-color: var(--laiton);
    color: var(--laiton);
}

/* Séparateur "ou" entre l'Express Checkout Element (Apple Pay/Google Pay/Link...) et le formulaire
   carte, à l'intérieur d'une même carte "Moyen de paiement" (payments/templates/payments/*.html) —
   contrairement à .or-divider ci-dessus, pensé pour deux .account-card distinctes : ici un simple
   trait avec texte centré, discret, entre deux éléments du même bloc plutôt qu'une pastille flottante
   surdimensionnée qui n'a pas sa place dans ce contexte plus étroit. */
.payment-method-divider {
    display: flex;
    align-items: center;
    gap: .75rem;
    margin: 1rem 0;
    color: var(--muted);
    font-size: .75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
}
.payment-method-divider::before,
.payment-method-divider::after {
    content: '';
    flex: 1 1 auto;
    height: 1px;
    background: rgba(233, 217, 195, .14);
}

/* ===== Widget "Résumé & Paiement" — un seul .account-card partagé par les 4 tunnels d'achat
   (payments/templates/payments/checkout.html, credits.html, listing_plan_packs.html, exclusive.html) :
   lignes de récap (choix + prix, réductions), ligne de total, puis le paiement Stripe intégré au
   même bloc (voir _stripe_payment_section.html et .payment-method-divider ci-dessus) — remplace
   l'ancien duo de cartes "Récapitulatif" + "Moyen de paiement", visuellement disjoint. */
.payment-summary-field {
    padding-bottom: 1rem;
    margin-bottom: 1rem;
    border-bottom: 1px dashed rgba(233, 217, 195, .14);
}
.payment-summary-rows {
    list-style: none;
    margin: 0;
    padding: 0;
}
.payment-summary-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: .5rem;
    padding: .35rem 0;
}
.payment-summary-total {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    padding-top: .75rem;
    margin-top: .25rem;
    border-top: 1px solid rgba(233, 217, 195, .14);
    font-weight: 800;
    font-size: 1.15rem;
}
/* Sépare le bloc récap du bloc paiement à l'intérieur de la même carte — plus discret que
   .payment-method-divider (réservé à "carte OU portefeuille" dans le bloc paiement lui-même). */
.payment-summary-section-divider {
    height: 1px;
    background: rgba(233, 217, 195, .14);
    margin: 1.5rem 0;
    border: none;
}

/* Widget "Bons multi-annonces" du checkout (payments/templates/payments/checkout.html) : une
   carte sélectionnable par forfait détenu en bon, positionnée juste sous le widget "Forfait" pour
   présenter le choix payer/utiliser un bon comme deux options concurrentes plutôt qu'une case à
   cocher discrète noyée dans le récapitulatif — voir static/js/checkout.js::selectVoucherPlan. */
.voucher-pack-grid {
    display: flex;
    flex-wrap: wrap;
    gap: .75rem;
    margin-top: .75rem;
}
.voucher-pack-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .25rem;
    min-width: 160px;
    padding: 1rem 1.25rem;
    border-radius: var(--radius-md);
    border: 2px solid rgba(233, 217, 195, .14);
    background: var(--surface-alt);
    text-align: center;
    cursor: pointer;
    transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.voucher-pack-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-sm);
}
.voucher-pack-card-icon { font-size: 1.4rem; color: var(--brand); }
.voucher-pack-card-name { font-weight: 700; }
.voucher-pack-card-count { font-size: .78rem; color: var(--muted); }
.voucher-pack-card--selected {
    border-color: var(--sauge);
    background: rgba(138, 154, 130, .14);
    box-shadow: var(--shadow-md);
}
.voucher-pack-card--selected .voucher-pack-card-icon,
.voucher-pack-card--selected .voucher-pack-card-name { color: var(--sauge); }
.voucher-pack-card--selected .voucher-pack-card-count { color: var(--sauge); }
/* Même carte réutilisée en pur affichage (payments/templates/payments/listing_plan_packs.html,
   "Vos bons disponibles") : ni cliquable ni sélectionnable ici, donc pas de curseur pointeur ni
   d'effet de survol qui suggérerait une interaction inexistante. */
.voucher-pack-card--display { cursor: default; }
.voucher-pack-card--display:hover { transform: none; box-shadow: none; }

/* État vide du même widget : explique l'intérêt d'un pack (économie à l'achat groupé) plutôt que
   de simplement masquer le widget quand l'utilisateur n'a aucun bon — sert de rappel/upsell vers
   payments:buy_listing_pack au moment le plus pertinent (juste avant de payer un forfait seul). */
.voucher-pack-empty {
    text-align: center;
    padding: 1.5rem 1rem;
    color: var(--muted);
}
.voucher-pack-empty i { font-size: 1.8rem; color: var(--brand); }

/* Fond distinct pour délimiter visuellement le widget catégories dans la carte "Informations
   générales" (entre le titre et la description) — sans ça, rien n'indiquait où il commençait
   ni où il s'arrêtait. */
.category-picker {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 1rem;
    background: var(--surface-alt);
    border: 1px solid rgba(233, 217, 195, .1);
    border-radius: var(--radius-md);
    padding: 1rem;
}
.category-section-title {
    display: flex;
    align-items: center;
    gap: .4rem;
    font-size: .78rem;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: .5rem;
}
.category-section-title i { color: var(--brand); }
.category-section-options {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    align-items: center;
}

.sort-toggle {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}
.report-link {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    background: none;
    border: none;
    padding: 0;
    color: var(--muted);
    font-size: .8rem;
    font-weight: 500;
    text-decoration: none;
}
.report-link:hover { color: var(--accent); }
.report-link.disabled { color: var(--muted); opacity: .6; cursor: default; }

/* ===== Autocomplétion de villes ===== */
.city-autocomplete {
    position: relative;
}
.city-suggestions {
    position: absolute;
    z-index: 20;
    top: calc(100% + .3rem);
    left: 0;
    right: 0;
    max-height: 260px;
    overflow-y: auto;
    border-radius: var(--radius-md);
    overflow-x: hidden;
    /* Filet de sécurité en plus du fond de chaque .list-group-item ci-dessous : le conteneur a
       lui aussi un fond plein, pour qu'aucun pixel de la liste ouverte ne laisse deviner ce qu'il
       y a derrière (page, texte d'aide...), même sur les coins arrondis ou pendant le chargement
       des suggestions. */
    background: var(--rideau);
    box-shadow: var(--shadow-md);
}
.city-suggestions .list-group-item {
    cursor: pointer;
    background: var(--rideau);
    border-color: rgba(233, 217, 195, .1);
    font-size: .92rem;
}
.city-suggestions .list-group-item.active,
.city-suggestions .list-group-item:hover {
    background: var(--brand-light);
    color: var(--brand);
}

/* ===== Menu déroulant maison (Région/Département/Rayon du filtre — voir static/js/
   custom-select.js) : même habillage que .city-suggestions ci-dessus, pour que les deux menus
   ouverts sur un même formulaire (villes en saisie libre, ces trois-là en choix fermé) se lisent
   comme une seule et même famille de composant plutôt que deux styles différents. ===== */
.custom-select { position: relative; }
.custom-select-toggle {
    display: block;
    width: 100%;
    text-align: left;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.custom-select-menu {
    position: absolute;
    z-index: 20;
    top: calc(100% + .3rem);
    left: 0;
    right: 0;
    max-height: 260px;
    overflow-y: auto;
    overflow-x: hidden;
    border-radius: var(--radius-md);
    background: var(--rideau);
    box-shadow: var(--shadow-md);
}
.custom-select-menu .list-group-item {
    cursor: pointer;
    background: var(--rideau);
    border-color: rgba(233, 217, 195, .1);
    font-size: .92rem;
}
.custom-select-menu .list-group-item.active,
.custom-select-menu .list-group-item:hover {
    background: var(--brand-light);
    color: var(--brand);
}
/* Barre ville + département fusionnée en un seul champ visuel : la ville prend 2/3, le
   département (déduit automatiquement, lecture seule) 1/3, séparés par un simple trait plutôt
   que d'être deux champs distincts dont l'un reste vide tant qu'aucune ville n'est choisie. */
.city-department-group {
    display: flex;
    align-items: stretch;
    border: 1px solid rgba(233, 217, 195, .2);
    border-radius: var(--radius-md);
    background: rgba(23, 17, 15, .35);
}
.city-department-group:focus-within {
    border-color: var(--laiton);
    box-shadow: 0 0 0 .25rem var(--brand-light);
}
.city-department-group .city-autocomplete {
    flex: 2 1 66%;
    min-width: 0;
}
.city-department-group .city-autocomplete .form-control {
    border: none;
    box-shadow: none;
    background: transparent;
}
.city-department-group .city-autocomplete .form-control:focus {
    box-shadow: none;
}
.city-department-suffix {
    flex: 1 1 34%;
    display: flex;
    align-items: center;
    padding: 0 .75rem;
    font-size: .85rem;
    font-weight: 600;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    border-left: 1px solid rgba(233, 217, 195, .16);
    background: rgba(23, 17, 15, .2);
    border-top-right-radius: var(--radius-md);
    border-bottom-right-radius: var(--radius-md);
}
.city-department-suffix:empty::before {
    content: attr(data-placeholder);
    color: var(--muted);
    font-weight: 500;
}
.city-chips {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
    margin-top: .5rem;
}
.city-chips:empty { margin-top: 0; }
.city-chip {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    background: var(--velours);
    color: var(--sable);
    font-size: .82rem;
    font-weight: 600;
    padding: .3rem .5rem .3rem .75rem;
    border-radius: 50rem;
}
.city-chip-remove {
    border: none;
    background: rgba(233, 217, 195, .18);
    color: var(--sable);
    width: 1.1rem;
    height: 1.1rem;
    border-radius: 50%;
    line-height: 1;
    font-size: .85rem;
    display: flex;
    align-items: center;
    justify-content: center;
}
.city-chip-remove:hover { background: rgba(233, 217, 195, .32); }

/* ===== Grille d'annonces / carte produit ===== */
.listing-card {
    position: relative;
    border-radius: var(--radius-lg);
    overflow: hidden;
    background: var(--surface-gradient);
    transition: transform .18s ease, box-shadow .18s ease;
    height: 100%;
}
.listing-card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-lg);
}
/* Annonces VIP : bordure dorée pour rester repérables dans la grille, quel que soit le tri —
   voir listings/views.py::listing_list (order_by('-is_vip', ...)) pour l'épinglage en tête. */
.listing-card--vip {
    box-shadow: 0 0 0 2px var(--laiton);
}
.listing-card--vip:hover {
    box-shadow: 0 0 0 2px var(--laiton), var(--shadow-lg);
}
.vip-badge-inline {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    color: var(--rideau);
}
/* Annonces Premium : même traitement que le VIP ci-dessus, en sauge fumée pour rester distinguable
   d'un simple coup d'œil. */
.listing-card--premium {
    box-shadow: 0 0 0 2px var(--sauge);
}
.listing-card--premium:hover {
    box-shadow: 0 0 0 2px var(--sauge), var(--shadow-lg);
}
.premium-badge-inline {
    background: linear-gradient(135deg, var(--sauge), #5c6e52);
    color: #fff;
}
.exclusive-badge-inline {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    color: var(--laiton);
}
.urgent-badge-inline {
    background: linear-gradient(135deg, var(--rubis), var(--rubis-dark));
    color: #fff;
}
.boost-badge-inline {
    background: linear-gradient(135deg, var(--saphir), var(--saphir-dark));
    color: #fff;
}
/* Annonces exclusives : noir/or pour rester distinct du VIP (or plein) et du Premium (sauge fumée).
   N'a la priorité sur l'anneau de la carte que si l'annonce n'est ni VIP ni Premium (voir
   _listing_card.html, chaîne if/elif) — mais son badge s'affiche toujours en plus des deux
   autres si applicable (voir .listing-card-badge-stack ci-dessous), une annonce pouvant être à
   la fois VIP/Premium ET exclusive. */
.listing-card--exclusive {
    box-shadow: 0 0 0 2px var(--rideau);
}
.listing-card--exclusive:hover {
    box-shadow: 0 0 0 2px var(--rideau), var(--shadow-lg);
}
/* Annonce exclusive d'un annonceur, visible mais inaccessible pour ce visiteur (profil public,
   voir accounts/views.py::public_profile, locked_listings) : reprend le vocabulaire "verrouillé"
   déjà utilisé pour la pastille de filtre Exclusif (.filter-toggle-pill--locked ci-dessus —
   bordure pointillée, opacité réduite) plutôt que le noir/or plein de .listing-card--exclusive,
   pour bien distinguer "j'y ai accès" de "je n'y ai pas accès". C'est un <a>, pas un <div> comme
   les autres cartes (pas de bouton favori à isoler dessus, toute la carte est cliquable). */
.listing-card--locked {
    display: block;
    color: inherit;
    text-decoration: none;
    opacity: .7;
    border: 2px dashed rgba(233, 217, 195, .15);
}
.listing-card--locked:hover {
    opacity: 1;
    color: inherit;
    border-color: var(--laiton);
}
.listing-card--locked .locked-overlay {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    font-size: 2rem;
    color: var(--muted);
    background: var(--surface-alt);
}
/* Distinct de .description-preview (masqué par défaut hors de #listingResults.view-list, propre
   au bascule cartes/liste de listing_list.html) : ce texte est le seul contenu explicatif de la
   carte verrouillée, il doit rester visible partout où elle est incluse (profil public compris,
   qui n'a pas ce conteneur). */
.listing-card--locked .locked-card-note {
    font-size: .8rem;
    color: var(--muted);
    display: flex;
    align-items: center;
    gap: .35rem;
}
/* Empile les badges VIP/Premium/Exclusif en bas à gauche de la vignette (le haut est déjà
   occupé par le chip de catégorie et le bouton favori) — remplace l'ancien positionnement
   individuel de chaque badge, pour qu'ils puissent s'empiler proprement quand plusieurs
   s'appliquent à la fois. */
.listing-card-badge-stack {
    position: absolute;
    bottom: .7rem;
    left: .7rem;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .35rem;
}
.listing-card-badge-stack .suspect-badge,
.listing-card-badge-stack .vip-badge,
.listing-card-badge-stack .premium-badge,
.listing-card-badge-stack .exclusive-badge,
.listing-card-badge-stack .urgent-badge,
.listing-card-badge-stack .boost-badge,
.listing-card-badge-stack .new-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .02em;
    padding: .3rem .6rem;
    border-radius: 50rem;
    box-shadow: 0 1px 4px rgba(0, 0, 0, .4);
}
.listing-card-badge-stack .vip-badge {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    color: var(--rideau);
}
.listing-card-badge-stack .premium-badge {
    background: linear-gradient(135deg, var(--sauge), #5c6e52);
    color: #fff;
}
.listing-card-badge-stack .exclusive-badge {
    background: linear-gradient(135deg, #241b16, var(--rideau));
    color: var(--laiton);
    border: 1px solid rgba(198, 164, 97, .5);
}
.listing-card-badge-stack .urgent-badge {
    background: linear-gradient(135deg, var(--rubis), var(--rubis-dark));
    color: #fff;
}
/* .suspect-badge (base, plus haut) reste une pastille translucide dans le reste du site (lisible
   sur un fond de page uni) ; ici, posée sur une vignette photo souvent sombre elle-même, cette
   même transparence la rendait à peine visible — comme ses voisines ci-dessus, elle passe donc en
   remplissage plein sur les cartes d'annonce. */
.listing-card-badge-stack .suspect-badge {
    background: linear-gradient(135deg, var(--cuivre), var(--cuivre-dark));
    color: #fff;
}
.listing-card-badge-stack .boost-badge {
    background: linear-gradient(135deg, var(--saphir), var(--saphir-dark));
    color: #fff;
}
/* Distinct du sauge déjà utilisé pour le renouvellement auto (highlight-box--green) : émeraude
   plus vif pour rester lisible en petit badge sur une vignette. */
.listing-card-badge-stack .new-badge {
    background: linear-gradient(135deg, var(--emeraude), var(--emeraude-dark));
    color: #fff;
}

/* Classement "Top annonceurs du mois" (accounts/templates/accounts/top_advertisers.html) : rang
   numéroté, or/argent/cuivre pour le podium — même vocabulaire visuel que le badge VIP (or)
   ailleurs sur le site, décliné pour les rangs 2/3. */
.top-advertiser-rank {
    flex: 0 0 auto;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    background: var(--surface-alt);
    color: var(--muted);
}
.top-advertiser-rank--1 { background: linear-gradient(135deg, var(--ambre), var(--laiton)); color: var(--rideau); }
.top-advertiser-rank--2 { background: linear-gradient(135deg, var(--argent), var(--argent-dark)); color: var(--rideau); }
.top-advertiser-rank--3 { background: linear-gradient(135deg, var(--cuivre), var(--cuivre-dark)); color: #fff; }
.top-advertiser-row--1 { background: linear-gradient(135deg, rgba(198, 164, 97, .14), var(--surface)); }

/* ===== Widget album privé (profil public) ===== */
.private-album-carousel {
    border-radius: var(--radius-lg);
    overflow: hidden;
    box-shadow: 0 0 0 2px var(--laiton), var(--shadow-sm);
}
.private-album-carousel .carousel-item img {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    cursor: zoom-in;
}
.private-album-carousel .carousel-control-prev,
.private-album-carousel .carousel-control-next {
    width: 2.5rem;
}
.private-album-carousel .carousel-control-prev-icon,
.private-album-carousel .carousel-control-next-icon {
    width: 1.5rem;
    height: 1.5rem;
    background-color: rgba(23, 17, 15, .55);
    border-radius: 50%;
    padding: .3rem;
    background-origin: content-box;
}
/* Ces contrôles se posent sur une photo, indépendamment du thème de la page : le mode sombre de
   Bootstrap (data-bs-theme="dark" sur <html>, voir templates/base.html) inverserait sinon leurs
   icônes/pastilles en noir, les rendant invisibles sur la photo. */
[data-bs-theme=dark] .private-album-carousel .carousel-control-prev-icon,
[data-bs-theme=dark] .private-album-carousel .carousel-control-next-icon {
    filter: none;
}
.private-album-indicators {
    margin-bottom: .6rem;
}
.private-album-indicators [data-bs-target] {
    width: .45rem;
    height: .45rem;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, .6);
    border: none;
    opacity: 1;
    transition: background-color .15s ease;
}
[data-bs-theme=dark] .private-album-indicators [data-bs-target] {
    background-color: rgba(255, 255, 255, .6);
}
.private-album-indicators [data-bs-target].active,
[data-bs-theme=dark] .private-album-indicators [data-bs-target].active {
    background-color: var(--laiton);
}

/* ===== Widget de déblocage d'album privé — distinct des autres actions du profil (suivre,
   signaler, cadeaux) : traitement doré cohérent avec le badge VIP et les indicateurs de l'album,
   pour signaler un contenu premium plutôt qu'une simple action parmi d'autres. */
.unlock-widget {
    text-align: center;
    padding: 1.5rem 1.25rem;
    border-radius: var(--radius-lg);
    background: linear-gradient(160deg, #241b16, var(--surface));
    border: 1px solid rgba(198, 164, 97, .35);
    box-shadow: var(--shadow-sm);
}
.unlock-widget-icon {
    width: 56px;
    height: 56px;
    margin: 0 auto .75rem;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    color: var(--rideau);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    box-shadow: 0 6px 16px rgba(198, 164, 97, .35);
}
.unlock-widget-title {
    font-weight: 700;
    color: var(--ink);
    margin-bottom: .35rem;
}
.unlock-widget-text {
    color: var(--muted);
    font-size: .85rem;
    margin-bottom: 1.1rem;
}
.unlock-widget-btn {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    border: none;
    color: var(--rideau);
    font-weight: 600;
}
.unlock-widget-btn:hover, .unlock-widget-btn:focus {
    background: linear-gradient(135deg, var(--laiton), var(--laiton-dark));
    color: var(--rideau);
}

.listing-card .media {
    position: relative;
    aspect-ratio: 4 / 3;
    overflow: hidden;
    background: var(--surface-alt);
}
.listing-card .media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform .35s ease;
}
.listing-card:hover .media img {
    transform: scale(1.06);
}
.listing-card .media .no-image {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--brand);
    font-size: 2.5rem;
}

/* ===== Carrousel photo des cartes d'annonce (grille "Annonces") — défilement manuel : flèches
   et pastilles au survol de la carte, jamais automatique (voir _listing_card.html pour le
   pourquoi). Le zoom au survol de .media img ci-dessus s'applique tel quel à l'image active,
   sans règle propre. ===== */
.listing-card-carousel,
.listing-card-carousel .carousel-inner,
.listing-card-carousel .carousel-item {
    height: 100%;
}
.listing-card-carousel .carousel-control-prev,
.listing-card-carousel .carousel-control-next {
    z-index: 3;
    width: 2.25rem;
    opacity: 0;
    transition: opacity .15s ease;
}
.listing-card:hover .listing-card-carousel .carousel-control-prev,
.listing-card:hover .listing-card-carousel .carousel-control-next {
    opacity: 1;
}
.listing-card-carousel .carousel-control-prev-icon,
.listing-card-carousel .carousel-control-next-icon {
    width: 1.6rem;
    height: 1.6rem;
    background-color: rgba(23, 17, 15, .55);
    border-radius: 50%;
    padding: .3rem;
    background-origin: content-box;
}
/* Ces contrôles se posent sur une photo, indépendamment du thème de la page : le mode sombre de
   Bootstrap (data-bs-theme="dark" sur <html>) inverserait sinon leurs icônes/pastilles en noir,
   les rendant invisibles sur la photo — même correctif que .private-album-carousel plus haut. */
[data-bs-theme=dark] .listing-card-carousel .carousel-control-prev-icon,
[data-bs-theme=dark] .listing-card-carousel .carousel-control-next-icon {
    filter: none;
}
.listing-card-carousel-indicators {
    z-index: 3;
    margin: 0 3.5rem .6rem;
    opacity: 0;
    transition: opacity .15s ease;
}
.listing-card:hover .listing-card-carousel-indicators { opacity: 1; }
.listing-card-carousel-indicators [data-bs-target],
[data-bs-theme=dark] .listing-card-carousel-indicators [data-bs-target] {
    width: .4rem;
    height: .4rem;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, .6);
    border: none;
    opacity: 1;
    margin: 0 .2rem;
}
.listing-card-carousel-indicators [data-bs-target].active,
[data-bs-theme=dark] .listing-card-carousel-indicators [data-bs-target].active {
    background-color: var(--laiton);
}

/* Légende posée sur le visuel de substitution (static/img/photo-blurred.svg, désormais purement
   graphique — voir listings/templates/listings/_listing_card.html et listing_detail.html) : le
   texte vit ici, traduisible via {% trans %}, plutôt que gravé dans le SVG (jamais traduisible). */
.blurred-photo-caption {
    position: absolute;
    inset: auto 0 .6rem 0;
    margin: 0 .6rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .35rem;
    text-align: center;
    color: #e2e8f0;
    background: rgba(15, 23, 42, .55);
    border-radius: 50rem;
    padding: .25rem .7rem;
    font-size: .68rem;
    font-weight: 600;
}
.blurred-photo-caption--large {
    inset: auto 0 1.2rem 0;
    margin: 0 auto;
    max-width: fit-content;
    left: 0;
    right: 0;
    font-size: .85rem;
    padding: .4rem 1rem;
}
.listing-card .category-chip {
    position: absolute;
    top: .7rem;
    left: .7rem;
    background: rgba(23, 17, 15, .72);
    color: #fff;
    font-size: .72rem;
    font-weight: 600;
    padding: .3rem .65rem;
    border-radius: 50rem;
    backdrop-filter: blur(2px);
}
.category-chip-extra { opacity: .8; }
.photo-count-badge {
    position: absolute;
    bottom: .75rem;
    right: .75rem;
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    background: rgba(23, 17, 15, .72);
    color: #fff;
    font-size: .78rem;
    font-weight: 600;
    padding: .35rem .7rem;
    border-radius: 50rem;
    backdrop-filter: blur(2px);
}
.listing-card .body {
    padding: 1rem;
}
.listing-card .title {
    font-weight: 600;
    font-size: 1rem;
    margin-bottom: .25rem;
    color: var(--ink);
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.listing-card .title a {
    color: inherit;
    text-decoration: none;
}
.listing-card .meta {
    color: var(--muted);
    font-size: .82rem;
}
.listing-card .description-preview {
    display: none;
}

/* ===== Bascule vue carte / vue liste (page "Annonces") =====
   Le conteneur #listingResults est le seul élément stable à travers les rafraîchissements
   AJAX des filtres (seul son innerHTML est remplacé) : la classe .view-list vit donc sur lui,
   jamais sur ses enfants, pour survivre à chaque nouveau rendu des résultats. */
.view-toggle {
    display: inline-flex;
    border: 1px solid rgba(233, 217, 195, .16);
    border-radius: var(--radius-md);
    overflow: hidden;
}
.view-toggle-btn {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .45rem .85rem;
    background: var(--surface-gradient);
    color: var(--muted);
    border: none;
    font-size: .85rem;
    font-weight: 600;
    cursor: pointer;
}
.view-toggle-btn + .view-toggle-btn { border-left: 1px solid rgba(233, 217, 195, .16); }
.view-toggle-btn.active { background: var(--brand-light); color: var(--brand); }

#listingResults.view-list .row > .col {
    flex: 0 0 100%;
    max-width: 100%;
}
#listingResults.view-list .listing-card {
    display: flex;
    flex-direction: row;
    align-items: stretch;
}
#listingResults.view-list .listing-card .media {
    aspect-ratio: auto;
    width: 220px;
    flex-shrink: 0;
}
#listingResults.view-list .listing-card .body {
    flex: 1 1 auto;
    min-width: 0;
}
#listingResults.view-list .listing-card .title {
    -webkit-line-clamp: 2;
}
#listingResults.view-list .listing-card .description-preview {
    display: -webkit-box;
    color: var(--muted);
    font-size: .85rem;
    margin: .5rem 0 0;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
@media (max-width: 575px) {
    #listingResults.view-list .listing-card { flex-direction: column; }
    #listingResults.view-list .listing-card .media { width: 100%; aspect-ratio: 16 / 9; }
}

/* ===== Boutons de contact (page d'annonce) — pilules dégradées, cohérentes avec les autres
   pastilles du site (badge VIP, filter-toggle-pill) plutôt que de simples boutons Bootstrap.
   Les icônes WhatsApp/Instagram/Telegram/Snapchat gardent la couleur de marque officielle de
   chaque application (repère visuel immédiat) ; seul le bouton "Téléphone", sans couleur de
   marque propre, reprend l'identité du site. */
.contact-links { display: flex; flex-direction: column; gap: .55rem; }
.contact-btn {
    display: flex;
    align-items: center;
    gap: .65rem;
    padding: .5rem .9rem .5rem .5rem;
    border-radius: 999px;
    font-weight: 700;
    font-size: .92rem;
    color: #fff;
    text-decoration: none;
    box-shadow: var(--shadow-sm);
    transition: transform .15s ease, box-shadow .15s ease;
}
.contact-btn:hover {
    transform: translateY(-2px);
    color: #fff;
}
.contact-btn-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, .25);
}
.contact-btn-icon i { font-size: 1.05rem; }
.contact-btn-phone { background: linear-gradient(135deg, var(--velours), var(--bordeaux)); }
.contact-btn-phone:hover { box-shadow: 0 10px 22px rgba(124, 43, 59, .45); }
.contact-btn-whatsapp { background: linear-gradient(135deg, #3ee382, #1fae57); }
.contact-btn-whatsapp:hover { box-shadow: 0 10px 22px rgba(31, 174, 87, .35); }
.contact-btn-instagram { background: linear-gradient(135deg, #f6a145, #dd2a7b 55%, #7b3fe4); }
.contact-btn-instagram:hover { box-shadow: 0 10px 22px rgba(221, 42, 123, .35); }
.contact-btn-telegram { background: linear-gradient(135deg, #4dc0f0, #229ed9); }
.contact-btn-telegram:hover { box-shadow: 0 10px 22px rgba(34, 158, 217, .35); }
.contact-btn-snapchat { background: #fffc00; color: var(--rideau); }
.contact-btn-snapchat:hover { color: var(--rideau); box-shadow: 0 10px 22px rgba(230, 223, 0, .5); }
.contact-btn-snapchat .contact-btn-icon { background: rgba(23, 17, 15, .12); color: var(--rideau); }
/* Numéro secondaire : même forme de pilule, mais en retrait (contour) pour rester secondaire
   sans rompre la cohérence visuelle avec les autres boutons de contact. */
.contact-btn-outline {
    background: var(--surface-gradient);
    border: 1.5px solid rgba(233, 217, 195, .16);
    color: var(--ink);
    box-shadow: none;
}
.contact-btn-outline .contact-btn-icon { background: var(--brand-light); color: var(--brand); }
.contact-btn-outline:hover {
    border-color: var(--brand);
    color: var(--ink);
    box-shadow: var(--shadow-sm);
}
.contact-btn-value { font-weight: 500; opacity: .85; }

/* Bouton like */
.like-btn {
    position: absolute;
    top: .6rem;
    right: .6rem;
    width: 2.1rem;
    height: 2.1rem;
    border-radius: 50%;
    border: none;
    background: rgba(255, 255, 255, .9);
    color: var(--rideau);
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: var(--shadow-sm);
    z-index: 3;
    transition: transform .12s ease, background .12s ease;
    text-decoration: none;
}
.like-btn:hover { transform: scale(1.08); color: var(--accent); }
/* line-height:1 : sans lui l'icône hérite de l'interligne du corps de texte (1.5), qui gonfle sa
   boîte verticalement bien au-delà du glyphe lui-même — .like-btn centre alors cette boîte trop
   grande plutôt que le cœur, qui paraît décalé dans son cercle. */
.like-btn i { font-size: 1.05rem; line-height: 1; pointer-events: none; }
.like-btn.is-liked, .like-btn.is-liked:hover { color: var(--accent); }

.like-btn.like-btn-block {
    position: static;
    width: 100%;
    height: auto;
    border-radius: 50rem;
    padding: .6rem 1rem;
    background: var(--surface-gradient);
    border: 1px solid var(--accent);
    color: var(--accent);
    font-weight: 600;
    gap: .5rem;
}
.like-btn.like-btn-block:hover { transform: none; background: var(--accent); color: #fff; }
.like-btn.like-btn-block.is-liked { background: var(--accent); color: #fff; }
.like-btn.like-btn-block i { font-size: 1.1rem; }

/* Rend toute la carte cliquable sauf le bouton like */
.listing-card .stretched-link::after { z-index: 2; }

.avatar-preview {
    width: 96px;
    height: 96px;
    object-fit: cover;
    border-radius: 50%;
}

.rating-stars { color: var(--laiton); }

/* ===== Widget "laisser un avis" — étoiles + mise en avant du mode édition ===== */
.review-form-widget {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    padding: 1.5rem;
    border-left: 4px solid var(--brand-light);
}
.review-form-widget.is-editing {
    border-left-color: var(--laiton);
    background: linear-gradient(160deg, #241b16, var(--surface) 65%);
}
.review-form-header {
    display: flex;
    align-items: flex-start;
    gap: .75rem;
    margin-bottom: 1.1rem;
}
.review-form-header > i {
    width: 36px;
    height: 36px;
    flex-shrink: 0;
    border-radius: 50%;
    background: var(--velours);
    color: var(--sable);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .95rem;
}
.review-form-widget.is-editing .review-form-header > i {
    background: linear-gradient(135deg, var(--ambre), var(--laiton));
    color: var(--rideau);
}
.star-rating {
    display: flex;
    flex-direction: row-reverse;
    justify-content: flex-end;
    gap: .2rem;
}
.star-rating input {
    position: absolute;
    opacity: 0;
    width: 1px;
    height: 1px;
}
.star-rating label {
    cursor: pointer;
    font-size: 1.9rem;
    line-height: 1;
    color: rgba(233, 217, 195, .18);
    transition: color .1s ease;
}
.star-rating label:hover,
.star-rating label:hover ~ label,
.star-rating input:checked ~ label {
    color: var(--laiton);
}
.star-rating input:focus-visible + label {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
    border-radius: 4px;
}

/* ===== Espace "Mon compte" ===== */
.account-sidebar {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-md);
    overflow: hidden;
    position: sticky;
    top: 1rem;
}
.account-sidebar-profile {
    background: linear-gradient(135deg, var(--velours), var(--bordeaux));
    color: #fff;
    padding: 1.75rem 1.25rem;
    text-align: center;
}
.account-sidebar-profile .avatar-preview {
    border: 3px solid rgba(255, 255, 255, .5);
    width: 76px;
    height: 76px;
}
.account-sidebar-profile i.bi-person-circle { font-size: 4rem; line-height: 1; }
.account-sidebar-profile h5 { margin: .6rem 0 .35rem; font-weight: 700; }
.account-sidebar-profile .badge { background: rgba(255, 255, 255, .22); font-weight: 600; }
.account-sidebar-profile .verified-badge { background: rgba(255, 255, 255, .22); margin-left: .3rem; }
.account-sidebar-profile .exclusive-client-badge { background: rgba(255, 255, 255, .22); color: #fcd88f; margin-left: .3rem; }
.account-sidebar-profile .suspect-badge { background: rgba(255, 255, 255, .22); margin-left: .3rem; }

/* --- Vérification / badge "Vérifié" — sauge, couleur de confiance de la charte. --- */
.verified-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: rgba(138, 154, 130, .16);
    color: var(--sauge);
    font-weight: 600;
}
.verified-badge i { font-size: .85em; }

/* --- Tag de vigilance posé par le staff (Listing.is_suspect / accounts.Profile.is_suspect) —
   voir staffadmin/views.py::listing_mark_suspect / profile_mark_suspect. Cuivre plutôt que rouge
   (déjà pris par "Suspendue"/"Banni") : un avertissement, pas une sanction déjà appliquée. --- */
.suspect-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: rgba(201, 138, 82, .18);
    color: var(--cuivre);
    font-weight: 600;
}
.suspect-badge i { font-size: .85em; }

/* --- Badge "Réactif" (accounts.Profile.is_responsive) — calculé automatiquement, pas achetable,
   voir accounts/services.py::refresh_responsiveness. Saphir pour rester distinct du "Vérifié"
   (sauge) et de "Client Exclusif" (noir/or). --- */
.responsive-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: rgba(79, 143, 186, .16);
    color: var(--saphir);
    font-weight: 600;
}
.responsive-badge i { font-size: .85em; }

/* --- Badge "Client Exclusif" (accounts.Profile.is_exclusive_client), visible sur le profil
   public et le compte lui-même — même famille noir/or que le reste de la fonctionnalité
   Exclusif (.highlight-box--dark, .plan-card-tier--exclusive, .exclusive-badge). --- */
.exclusive-client-badge {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: linear-gradient(135deg, #241b16, var(--rideau));
    color: var(--laiton);
    font-weight: 600;
}
.exclusive-client-badge i { font-size: .85em; }
.btn-exclusive-cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .4rem;
    background: linear-gradient(135deg, #241b16, var(--rideau));
    border: 1px solid var(--laiton);
    color: var(--laiton);
    font-weight: 600;
    border-radius: var(--radius-md);
    padding: .45rem 1rem;
    transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.btn-exclusive-cta:hover {
    background: linear-gradient(135deg, #0d0906, var(--rideau));
    color: var(--sable);
    border-color: var(--sable);
}

/* --- Info-bulle réutilisable (templates/_info_tooltip.html) : icône + texte au survol/focus,
   sans JS — utilisée pour expliquer le filtre "Exclusif" (listing_list.html) mais pensée pour
   être réutilisée ailleurs sur le site. --- */
.info-tooltip {
    position: relative;
    display: inline-flex;
    align-items: center;
    color: var(--muted);
    cursor: help;
}
.info-tooltip-bubble {
    position: absolute;
    bottom: calc(100% + 8px);
    left: 50%;
    transform: translateX(-50%) translateY(4px);
    width: max-content;
    max-width: 240px;
    background: var(--rideau);
    color: var(--sable);
    font-size: .78rem;
    font-weight: 500;
    line-height: 1.35;
    padding: .55rem .7rem;
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity .15s ease, transform .15s ease;
    z-index: 20;
}
.info-tooltip-bubble::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    border: 5px solid transparent;
    border-top-color: var(--rideau);
}
.info-tooltip:hover .info-tooltip-bubble,
.info-tooltip:focus-visible .info-tooltip-bubble {
    opacity: 1;
    visibility: visible;
    transform: translateX(-50%) translateY(0);
}
.verification-status {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
}
.verification-status i { font-size: 1.8rem; flex-shrink: 0; margin-top: .1rem; }
.verification-status-verified i { color: var(--sauge); }
.verification-status-pending i { color: var(--cuivre); }
.verification-status-rejected i { color: var(--accent); }
.verified-icon { color: var(--sauge); font-size: .8em; margin-left: .2rem; vertical-align: middle; }
.responsive-icon { color: var(--saphir); font-size: .8em; margin-left: .2rem; vertical-align: middle; }

/* Étapes numérotées de accounts/templates/accounts/verification.html : email et identité sont
   deux actions indépendantes (l'une automatique, l'autre modérée à la main) — le numéro + le
   séparateur pointillé entre les deux blocs rendent cette indépendance visible d'un coup d'œil,
   plutôt que de les laisser s'enchaîner comme les étapes d'un même parcours. */
.verification-step { margin-bottom: 1.5rem; }
.verification-step + .verification-step {
    padding-top: 2rem;
    border-top: 1px dashed rgba(233, 217, 195, .16);
}
.verification-step-header {
    display: flex;
    align-items: flex-start;
    gap: .85rem;
    margin-bottom: 1rem;
}
.verification-step-number {
    flex: 0 0 auto;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--velours);
    color: var(--sable);
    font-weight: 700;
    font-size: .85rem;
    margin-top: .1rem;
}

/* --- Onglets Bootstrap (accounts:following_list) recolorés à la charte, Bootstrap ne connaissant
   que sa couleur primaire par défaut pour l'état actif des .nav-pills --- */
.nav-pills .nav-link { color: var(--ink); font-weight: 600; font-size: .9rem; }
.nav-pills .nav-link:not(.active):hover { background: var(--surface-alt); }
.nav-pills .nav-link.active { background-color: var(--laiton); color: var(--rideau); }
.nav-pills .nav-link .badge { font-weight: 600; }

/* --- Accès rapide à l'achat de crédits, affiché en tête de la sidebar "Mon compte" --- */
.account-credits-card {
    display: flex;
    align-items: center;
    gap: .75rem;
    margin: .85rem .75rem 0;
    padding: .7rem .85rem;
    background: var(--brand-light);
    border-radius: var(--radius-md);
    text-decoration: none;
    transition: box-shadow .15s ease, transform .15s ease;
}
.account-credits-card:hover {
    box-shadow: var(--shadow-sm);
    transform: translateY(-1px);
}
.account-credits-card-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.35rem;
    height: 2.35rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: var(--velours);
    color: var(--sable);
    font-size: 1.1rem;
}
.account-credits-card-info {
    display: flex;
    flex-direction: column;
    gap: .05rem;
    min-width: 0;
}
.account-credits-card-balance { color: var(--ink); font-weight: 700; font-size: .9rem; }
.account-credits-card-cta { display: flex; align-items: center; color: var(--brand); font-weight: 600; font-size: .78rem; }
.account-credits-card-cta i { font-size: 1.1em; }

/* --- Page payments:buy_credits : solde mis en avant + rappel des usages des crédits --- */
.credits-balance-banner {
    display: flex;
    align-items: center;
    gap: 1.1rem;
    margin-bottom: 1.5rem;
    padding: 1.25rem 1.5rem;
    border-radius: var(--radius-lg);
    background: linear-gradient(135deg, var(--velours), var(--bordeaux));
    box-shadow: var(--shadow-md);
}
.credits-balance-banner-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3.25rem;
    height: 3.25rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, .18);
    color: #fff;
    font-size: 1.5rem;
}
.credits-balance-banner-body { display: flex; flex-direction: column; gap: .1rem; }
.credits-balance-banner-label {
    color: rgba(255, 255, 255, .85);
    font-size: .78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .05em;
}
.credits-balance-banner-value { color: #fff; font-size: 1.9rem; font-weight: 800; line-height: 1.2; }
.credits-balance-banner-value small { font-size: 1rem; font-weight: 600; opacity: .9; }

/* Grille "pourquoi/à quoi ça sert" (icône + titre + texte), réutilisée telle quelle partout où une
   liste de fonctionnalités doit être mise en avant de façon uniforme — voir payments/templates/
   payments/credits.html ("À quoi servent vos crédits ?"), exclusive.html ("Une sélection à part,
   un statut qui se voit") et listing_plan_packs.html ("Pourquoi acheter un pack ?", un seul
   élément dans la grille). Bordure/dégradé de marque repris de .highlight-box--brand pour que les
   3 widgets se lisent comme une seule et même famille visuelle plutôt que 3 traitements distincts. */
.feature-list-card {
    margin-bottom: 1.5rem;
    border: 2px solid var(--brand);
    background: linear-gradient(135deg, rgba(198, 164, 97, .14), var(--surface) 60%);
}
.feature-list-card h2 { color: var(--brand); }
.feature-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 1rem;
    margin-top: 1rem;
}
.feature-item { display: flex; align-items: flex-start; gap: .75rem; }
.feature-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.35rem;
    height: 2.35rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--velours), var(--bordeaux));
    color: #fff;
    font-size: 1.05rem;
}
.feature-text { font-size: .85rem; color: var(--muted); line-height: 1.4; }
.feature-text strong { display: block; color: var(--ink); font-size: .9rem; }

.account-nav { padding: .75rem; }
.account-nav a {
    display: flex;
    align-items: center;
    gap: .65rem;
    padding: .65rem .8rem;
    border-radius: var(--radius-md);
    color: var(--ink);
    font-weight: 500;
    font-size: .92rem;
    text-decoration: none;
}
.account-nav a:hover { background: var(--surface-alt); color: var(--ink); }
.account-nav a.active { background: var(--brand-light); color: var(--brand); font-weight: 700; }
.account-nav a i { font-size: 1.05rem; width: 1.3rem; text-align: center; flex-shrink: 0; }
.account-nav hr { margin: .6rem .2rem; border-color: rgba(233, 217, 195, .1); }
.account-nav-label {
    display: block;
    padding: .9rem .8rem .35rem;
    color: var(--muted);
    font-size: .7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
}
.account-nav-label:first-child { padding-top: .2rem; }

.account-card {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    padding: 1.5rem;
}
.account-card + .account-card { margin-top: 1.5rem; }
.account-card h2 {
    font-size: 1.05rem;
    font-weight: 700;
    margin-bottom: .25rem;
}
.account-card .section-hint {
    color: var(--muted);
    font-size: .85rem;
    margin-bottom: 1.25rem;
}
.section-count-badge {
    background: var(--brand-light);
    color: var(--brand);
    font-size: .75rem;
    font-weight: 700;
    padding: .15rem .6rem;
    border-radius: 50rem;
    vertical-align: middle;
}

/* Codes de secours MFA (staffadmin/_backup_codes.html) : lisibles, espacés, copiables tels quels. */
.backup-codes {
    background: var(--bg-subtle, rgba(23, 17, 15, .35));
    border-radius: var(--radius-sm, 6px);
    padding: 1rem;
    font-size: 1.05rem;
    line-height: 1.8;
}

/* ===== Assistant en étapes (création d'annonce) — la modification garde le formulaire complet
   sur une seule page ; seule la création (plus longue, plus intimidante pour un nouvel
   annonceur) est mise en avant par ce bandeau, sur 3 étapes : les 2 premières scindent le
   formulaire (voir listings/_form_section_*.html + static/js/listing-wizard.js), la 3e
   correspond à la page de paiement qui suit (payments/templates/payments/checkout.html),
   affichée en lecture seule via listings/_wizard_steps.html. Depuis l'étape 3, les étapes 1 et
   2 (déjà terminées) redeviennent cliquables (.wizard-step-link) pour revenir modifier
   l'annonce avant de payer — voir listings/views.py::listing_update, is_wizard. ===== */
/* Encadré autour du bandeau d'étapes, même traitement visuel que .account-card (fond, ombre,
   coins arrondis) pour que le bandeau se lise comme un widget à part entière plutôt que comme du
   texte flottant directement sur le fond de page — cohérent avec le reste du site. */
.wizard-steps-card {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    padding: 1.25rem 1.5rem;
    margin-bottom: 2rem;
}
.wizard-steps {
    display: flex;
    align-items: center;
    justify-content: center;
    list-style: none;
    padding: 0;
    margin: 0 0 2rem;
    gap: .5rem;
}
.wizard-steps-card .wizard-steps { margin: 0; }
.wizard-step-item {
    display: flex;
    align-items: center;
    gap: .6rem;
    color: var(--muted);
}
.wizard-step-circle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    flex-shrink: 0;
    border-radius: 50%;
    border: 2px solid rgba(233, 217, 195, .18);
    background: var(--surface-alt);
    font-weight: 700;
    font-size: .95rem;
    color: var(--muted);
    transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.wizard-step-label {
    font-weight: 600;
    font-size: .9rem;
    transition: color .15s ease;
}
.wizard-step-line {
    width: 3.5rem;
    height: 2px;
    background: rgba(233, 217, 195, .18);
    border-radius: 1px;
}
.wizard-step-item--active .wizard-step-circle {
    background: var(--laiton);
    border-color: var(--laiton);
    color: var(--rideau);
    box-shadow: 0 0 0 4px var(--brand-light);
}
.wizard-step-item--active .wizard-step-label { color: var(--ink); }
.wizard-step-item--done .wizard-step-circle {
    background: var(--brand-light);
    border-color: var(--brand);
    color: var(--brand);
}
.wizard-step-item--done .wizard-step-label { color: var(--brand); }
.wizard-step-link {
    display: flex;
    align-items: center;
    gap: .6rem;
    text-decoration: none;
    color: inherit;
    cursor: pointer;
}
.wizard-step-link:hover .wizard-step-circle {
    box-shadow: 0 0 0 4px var(--brand-light);
}
.wizard-step-link:hover .wizard-step-label { text-decoration: underline; }
.wizard-step-panel { animation: wizardStepFadeIn .25s ease; }
@keyframes wizardStepFadeIn {
    from { opacity: 0; transform: translateY(6px); }
    to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 420px) {
    .wizard-step-label { display: none; }
    .wizard-step-line { width: 2rem; }
}

.legal-page {
    max-width: 760px;
    margin: 0 auto;
}
.legal-content h2 {
    font-size: 1rem;
    font-weight: 700;
    margin: 1.5rem 0 .6rem;
}
.legal-content h2:first-child { margin-top: 0; }
.legal-content p, .legal-content li {
    color: var(--ink);
    font-size: .92rem;
    line-height: 1.6;
}
.legal-content ul { padding-left: 1.25rem; margin-bottom: 1rem; }

.stat-card {
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    padding: 1.1rem 1.25rem;
    display: flex;
    align-items: center;
    gap: .9rem;
    height: 100%;
}
.stat-card .icon {
    width: 2.7rem;
    height: 2.7rem;
    border-radius: var(--radius-md);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.25rem;
    flex-shrink: 0;
    background: var(--brand-light);
    color: var(--brand);
}
.stat-card .icon.icon-rose { background: rgba(193, 68, 94, .16); color: var(--accent); }
.stat-card .icon.icon-amber { background: rgba(201, 138, 82, .16); color: var(--cuivre); }
.stat-card .icon.icon-green { background: rgba(138, 154, 130, .16); color: var(--sauge); }
.stat-card .value { font-size: 1.45rem; font-weight: 800; color: var(--ink); line-height: 1.15; }
.stat-card .label { font-size: .76rem; color: var(--muted); text-transform: uppercase; letter-spacing: .03em; }

.mini-bars {
    display: flex;
    align-items: flex-end;
    gap: .6rem;
    height: 130px;
    padding-top: 1.4rem;
}
.mini-bars .bar-col {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-end;
    height: 100%;
    position: relative;
}
.mini-bars .bar-value {
    font-size: .72rem;
    color: var(--ink);
    font-weight: 700;
    margin-bottom: .35rem;
}
.mini-bars .bar {
    width: 100%;
    max-width: 34px;
    background: var(--brand);
    border-radius: .35rem .35rem 0 0;
    min-height: 3px;
}
.mini-bars .bar-col:hover .bar { background: var(--brand-dark); }
.mini-bars .bar-label {
    font-size: .72rem;
    color: var(--muted);
    margin-top: .5rem;
}
/* Benchmark par palier (dashboard/listing_stats.html, écran d'upsell) : mêmes couleurs de
   palier déjà établies ailleurs sur le site (badges VIP/Premium/Exclusif des annonces). */
.mini-bars .bar--tier-basic { background: var(--sable); }
.mini-bars .bar--tier-premium { background: linear-gradient(180deg, var(--sauge), #5c6e52); }
.mini-bars .bar--tier-exclusive { background: linear-gradient(180deg, #241b16, var(--rideau)); }
.mini-bars .bar--tier-vip { background: linear-gradient(180deg, var(--ambre), var(--laiton)); }
/* Comparaison avec/sans mise en avant (staffadmin::analytics_promotions) : le laiton (.bar par
   défaut) marque "avec", ce ton neutre marque "sans" — jamais l'inverse, pour rester lisible sans
   légende à chaque paire. */
.mini-bars .bar--muted { background: var(--argent); }
/* Pastille de couleur devant un libellé (staffadmin::analytics_revenue), pour faire le lien avec
   la série correspondante du graphique juste au-dessus sans dupliquer sa légende. */
.legend-dot {
    display: inline-block;
    width: .6rem;
    height: .6rem;
    border-radius: 50%;
    margin-right: .3rem;
}

/* Répartition par heure (dashboard/listing_stats.html) : 24 colonnes plutôt que 3-4, donc plus
   serrées et sans valeur au-dessus de chaque barre (illisible à cette densité — un simple survol,
   via l'attribut title posé sur .bar-col, donne le détail) ; un seul repère sur trois (0h, 3h,
   6h...) pour ne pas surcharger l'axe. Le template rend .bar-label pour CHAQUE colonne (vide entre
   deux repères) plutôt que de l'omettre : .bar-col empile bar+label en colonne flex, donc une
   colonne sans .bar-label serait plus basse que ses voisines et sa barre semblerait "flotter" plus
   haut qu'elles — hauteur figée ici pour que toutes les colonnes réservent le même espace, avec ou
   sans texte. */
.mini-bars--hourly { gap: .2rem; height: 110px; padding-top: .5rem; }
.mini-bars--hourly .bar { max-width: none; border-radius: .2rem .2rem 0 0; }
.mini-bars--hourly .bar-label { font-size: .62rem; line-height: 1; height: .62rem; margin-top: .35rem; }

.avatar-placeholder {
    /* Taille par défaut alignée sur .avatar-preview (photo réelle) : sans elle, un
       .avatar-placeholder utilisé seul (sans classe de contexte type .comment-item) se
       réduit à la taille de son icône, qui n'est pas carrée — d'où le rendu ovale. */
    width: 96px;
    height: 96px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--velours), var(--bordeaux));
    border: 2px solid rgba(198, 164, 97, .2);
    color: var(--laiton);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2.2rem;
    flex-shrink: 0;
}

.avatar-editor {
    position: relative;
    display: inline-block;
}
.avatar-editor-circle {
    display: block;
    width: 96px;
    height: 96px;
    border-radius: 50%;
    overflow: hidden;
    cursor: pointer;
    position: relative;
}
.avatar-editor-circle #avatarPreview,
.avatar-editor-circle .avatar-preview {
    width: 96px;
    height: 96px;
    display: block;
}
.avatar-editor-circle .avatar-placeholder {
    width: 96px;
    height: 96px;
}
.avatar-editor-overlay {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(23, 17, 15, .55);
    color: #fff;
    font-size: 1.3rem;
    opacity: 0;
    transition: opacity .15s ease;
    border-radius: 50%;
}
.avatar-editor-circle:hover .avatar-editor-overlay { opacity: 1; }
.avatar-editor-remove {
    position: absolute;
    top: -.15rem;
    right: -.15rem;
    width: 1.9rem;
    height: 1.9rem;
    border-radius: 50%;
    background: var(--accent);
    color: #fff;
    border: 2px solid var(--surface);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .75rem;
    cursor: pointer;
    padding: 0;
}
.avatar-editor-remove[hidden] { display: none; }

/* ===== Messagerie ===== */
.conversation-row {
    position: relative;
    display: flex;
    align-items: center;
    gap: .9rem;
    padding: 1rem 1.25rem;
    color: var(--ink);
    text-decoration: none;
}
.conversation-row:hover { background: var(--surface-alt); color: var(--ink); }
.conversation-row.is-unread { background: var(--brand-light); }
.conversation-row .min-w-0 { min-width: 0; }
/* Toute la ligne ouvre la conversation (stretched-link), sauf le pseudo qui mène au profil —
   même principe que .listing-card .stretched-link::after pour la carte d'annonce. */
.conversation-row .stretched-link::after { z-index: 1; }
.conversation-row .conversation-profile-link {
    position: relative;
    z-index: 2;
    color: inherit;
    text-decoration: none;
}
.conversation-row .conversation-profile-link:hover { text-decoration: underline; }

.chat-bubble {
    max-width: 75%;
    padding: .6rem .9rem;
    border-radius: var(--radius-md);
    font-size: .92rem;
}
.chat-bubble.is-mine {
    background: rgba(198, 164, 97, .22);
    color: var(--sable);
    border-bottom-right-radius: .2rem;
}
.chat-bubble.is-theirs {
    background: var(--surface-alt);
    color: var(--ink);
    border-bottom-left-radius: .2rem;
}
.chat-scroll {
    max-height: 420px;
    overflow-y: auto;
}

/* ===== Authentification ===== */
.auth-card {
    display: flex;
    max-width: 900px;
    margin: 2rem auto;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    background: var(--surface-gradient);
}
.auth-card .auth-brand {
    flex: 0 0 40%;
    background: linear-gradient(150deg, var(--velours), var(--bordeaux));
    color: #fff;
    padding: 2.5rem;
    display: flex;
    flex-direction: column;
    justify-content: center;
}
.auth-card .auth-brand h2 { font-weight: 800; margin-bottom: .75rem; }
.auth-card .auth-brand p { opacity: .9; margin-bottom: 0; }
.auth-card .auth-brand .brand-icon { font-size: 2.4rem; margin-bottom: 1rem; }
.auth-card .auth-form {
    flex: 1 1 60%;
    padding: 2.5rem;
}
@media (max-width: 767px) {
    .auth-card { flex-direction: column; }
    .auth-card .auth-brand { padding: 1.75rem; }
}

/* Règles du mot de passe (signup.html) : cochées en direct à la frappe par static/js/
   password-strength.js — voir accounts.forms.SignUpForm.password_rules pour la génération de
   cette liste à partir de AUTH_PASSWORD_VALIDATORS. */
.password-rules {
    list-style: none;
    padding: 0;
    margin: .5rem 0 0;
    font-size: .82rem;
}
.password-rule {
    display: flex;
    align-items: center;
    gap: .45rem;
    padding: .15rem 0;
    color: var(--muted);
}
.password-rule i { font-size: .9rem; flex-shrink: 0; }
.password-rule.is-valid { color: var(--sauge); }

.account-type-options {
    display: flex;
    gap: .75rem;
}
.account-type-option {
    display: flex;
    align-items: center;
    gap: .5rem;
    flex: 1;
    border: 1.5px solid rgba(233, 217, 195, .16);
    border-radius: var(--radius-md);
    padding: .7rem 1rem;
    cursor: pointer;
    font-weight: 500;
    margin-bottom: 0;
}
.account-type-option:has(input:checked) {
    border-color: var(--brand);
    background: var(--brand-light);
    color: var(--brand);
    font-weight: 700;
}
.account-type-option input { accent-color: var(--brand); margin: 0; }

/* ===== Fils de commentaires / avis ===== */
.comment-item {
    display: flex;
    gap: .85rem;
    padding: 1.1rem 0;
}
.comment-item + .comment-item {
    border-top: 1px solid rgba(233, 217, 195, .08);
}
.comment-item .avatar-preview,
.comment-item .avatar-placeholder {
    width: 42px;
    height: 42px;
    font-size: 1.1rem;
    flex-shrink: 0;
}
.comment-body { flex: 1; min-width: 0; }
.comment-header {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
}
.comment-header .author { font-weight: 700; color: var(--ink); }
.comment-header .date { font-size: .78rem; color: var(--muted); }
.comment-text { margin: .3rem 0 .4rem; white-space: pre-line; }

.comment-actions { display: flex; gap: 1rem; }
.comment-reply-toggle {
    background: none;
    border: none;
    padding: 0;
    font-size: .8rem;
    font-weight: 600;
    color: var(--brand);
}
.comment-reply-toggle:hover { color: var(--sable); }

.comment-replies {
    margin-top: .9rem;
    margin-left: 1.1rem;
    padding-left: 1.1rem;
    border-left: 2px solid var(--brand-light);
    display: flex;
    flex-direction: column;
    gap: .9rem;
}
.comment-replies:empty {
    display: none;
    margin: 0;
    padding: 0;
    border: none;
}
.comment-replies.comment-replies-flat {
    margin-left: .4rem;
    padding-left: .75rem;
}
.comment-reply-context {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .74rem;
    font-weight: 600;
    color: var(--brand);
    background: var(--brand-light);
    border-radius: 50rem;
    padding: .12rem .6rem;
    margin-bottom: .3rem;
}

/* Corps d'un widget de section (liste d'avis/commentaires sous un titre "Avis (N)", "Commentaires"...
   — voir listing_detail.html/public_profile.html) : regroupé dans la même .account-card que son
   titre plutôt que dans une carte séparée, avec un retrait + liseré coloré à gauche pour bien
   montrer que ce bloc appartient au titre juste au-dessus — même traitement visuel que
   .comment-replies ci-dessus pour une réponse dans un fil de discussion. */
.widget-section-body {
    padding-left: 1.1rem;
    border-left: 2px solid var(--brand-light);
}

.comment-reply-form {
    margin-top: .75rem;
    display: flex;
    gap: .5rem;
}

/* ===== Notifications ===== */
.notif-badge {
    position: absolute;
    top: .1rem;
    right: -.35rem;
    font-size: .62rem;
    padding: .22rem .4rem;
}
.notification-dropdown {
    width: 340px;
    max-width: 90vw;
    padding: 0;
    overflow: hidden;
}
.notification-dropdown-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: .85rem 1rem;
    font-weight: 700;
    border-bottom: 1px solid rgba(233, 217, 195, .12);
}
.notification-dropdown-header .mark-all-read-form button {
    font-size: .78rem;
    font-weight: 500;
}
/* Icône seule (voir notifications/_bell.html et notifications/list.html) plutôt qu'un libellé
   texte : le tooltip natif (attribut title) porte l'accessibilité. */
.mark-all-read-btn {
    font-size: 1.1rem;
    line-height: 1;
    color: var(--muted);
}
.mark-all-read-btn:hover { color: var(--brand); }
.notification-dropdown-footer {
    display: block;
    text-align: center;
    padding: .65rem 1rem;
    font-size: .8rem;
    font-weight: 600;
    color: var(--brand);
    border-top: 1px solid rgba(233, 217, 195, .12);
}
.notification-dropdown-footer:hover { background: var(--brand-light); color: var(--sable); }
.notification-list {
    max-height: 360px;
    overflow-y: auto;
}
/* Page "Notifications" (notifications/list.html) : même liste que le dropdown de la cloche,
   mais sans la hauteur bornée — c'est déjà `account-card` qui l'encadre sur toute la page. */
.notification-list--page { max-height: none; overflow-y: visible; }
.notification-item {
    display: flex;
    align-items: flex-start;
    gap: .75rem;
    padding: .75rem 1rem;
    color: var(--ink);
    text-decoration: none;
    border-bottom: 1px solid rgba(233, 217, 195, .12);
}
.notification-item:hover { background: var(--brand-light); color: var(--ink); }
.notification-item i { font-size: 1.1rem; color: var(--brand); margin-top: .15rem; flex-shrink: 0; }
.notification-item.unread { background: var(--brand-light); }
.notification-item.unread .notification-text { font-weight: 700; }
.notification-text { font-size: .86rem; line-height: 1.3; }
.notification-date { font-size: .72rem; color: var(--muted); margin-top: .15rem; }
.notification-empty { padding: 1.5rem 1rem; text-align: center; }
.comment-reply-form textarea { flex: 1; }

/* ===== Widget photos (glisser-déposer) ===== */
.photo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
    gap: .75rem;
}
.photo-tile {
    position: relative;
    aspect-ratio: 1 / 1;
    border-radius: var(--radius-md);
    overflow: hidden;
    cursor: grab;
    transition: opacity .15s ease;
}
.photo-tile.dragging { opacity: .35; }
.photo-tile.removed { opacity: .35; }
.photo-tile-preview { position: relative; width: 100%; height: 100%; }
.photo-tile-preview > img { width: 100%; height: 100%; object-fit: cover; display: block; }
.photo-tile-placeholder {
    position: relative;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 2px dashed var(--brand-light);
    border-radius: var(--radius-md);
    color: var(--brand);
    font-size: 1.6rem;
    cursor: pointer;
    background: var(--surface-gradient);
    overflow: hidden;
}
.photo-tile.has-image .photo-tile-placeholder { border: none; }
.photo-tile.has-image .photo-tile-placeholder > i { display: none; }
.photo-tile-placeholder img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.photo-tile-placeholder input[type="file"] {
    position: absolute;
    inset: 0;
    opacity: 0;
    cursor: pointer;
}
.photo-drag-handle {
    position: absolute;
    top: .35rem;
    left: .35rem;
    width: 1.7rem;
    height: 1.7rem;
    border-radius: 50%;
    background: rgba(23, 17, 15, .6);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .85rem;
    pointer-events: none;
}
.photo-tile-remove,
.photo-tile-cancel {
    position: absolute;
    top: .35rem;
    right: .35rem;
    width: 1.7rem;
    height: 1.7rem;
    border-radius: 50%;
    background: var(--accent);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .85rem;
    cursor: pointer;
    border: none;
    padding: 0;
    margin: 0;
    z-index: 2;
}
.photo-tile-remove[hidden],
.photo-tile-cancel[hidden] { display: none; }
.photo-tile-remove input[type="checkbox"] {
    position: absolute;
    inset: 0;
    opacity: 0;
    margin: 0;
    cursor: pointer;
}
.photo-tile.removed .photo-tile-remove { background: var(--muted); }
.photo-tile-blurred-badge {
    position: absolute;
    top: .35rem;
    left: .35rem;
    z-index: 2;
    font-size: .65rem;
    display: inline-flex;
    align-items: center;
    gap: .25rem;
}

/* ===== Pied de page ===== */
.site-footer {
    background: linear-gradient(115deg, var(--rideau), var(--bordeaux));
    color: rgba(255, 255, 255, .78);
    padding: 2rem 0 1.25rem;
}
.site-footer-top {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 2rem;
    padding-bottom: 1.5rem;
    border-bottom: 1px solid rgba(255, 255, 255, .12);
}
.site-footer-brand {
    display: inline-flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .15rem;
    text-decoration: none;
}
.site-footer-brand .navbar-brand-word { font-size: 1.7rem; }
.site-footer-columns {
    display: flex;
    flex-wrap: wrap;
    gap: 1.75rem 3rem;
}
.site-footer-col {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .5rem;
    min-width: 9rem;
}
.site-footer-col-title {
    margin: 0 0 .1rem;
    color: var(--laiton);
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.site-footer-col a {
    color: rgba(255, 255, 255, .78);
    font-size: .87rem;
    font-weight: 500;
    text-decoration: none;
}
.site-footer-col a:hover { color: #fff; }
.site-footer-bottom {
    padding-top: 1.25rem;
    font-size: .8rem;
    color: rgba(255, 255, 255, .55);
    text-align: center;
}

/* ===== Pages d'erreur (404, 500, ...) ===== */
.error-page {
    max-width: 460px;
    margin: 3rem auto;
    padding: 3rem 2rem;
    text-align: center;
    background: var(--surface-gradient);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
}
.error-page-icon {
    width: 88px;
    height: 88px;
    margin: 0 auto 1.5rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--brand-light);
    color: var(--brand);
    font-size: 2.25rem;
}
.error-page-code {
    font-size: .8rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--muted);
    margin-bottom: .5rem;
}
.error-page-title {
    font-size: 1.5rem;
    font-weight: 800;
    margin-bottom: .75rem;
}
.error-page-message {
    color: var(--muted);
    margin-bottom: 1.75rem;
}
.error-page-secondary {
    display: block;
    margin-top: .9rem;
    font-size: .87rem;
}

/* ===== Bandeau "intérêt de l'action" (compte annonceur) ===== */
.benefit-banner {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    background: linear-gradient(135deg, rgba(198, 164, 97, .14), var(--surface));
    border: 1px solid rgba(198, 164, 97, .2);
    border-radius: var(--radius-lg);
    padding: 1.25rem 1.5rem;
    margin-bottom: 1.5rem;
}
.benefit-banner-icon {
    width: 48px;
    height: 48px;
    flex-shrink: 0;
    border-radius: 50%;
    background: var(--velours);
    color: var(--sable);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.3rem;
}
.benefit-banner-title {
    font-size: 1rem;
    font-weight: 700;
    color: var(--ink);
    margin-bottom: .25rem;
}
.benefit-banner-text {
    margin: 0;
    font-size: .9rem;
    color: var(--muted);
}

/* ===== Étiquettes de catégorie (listes de type "Mes annonces") ===== */
.category-pill {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: var(--brand-light);
    color: var(--brand);
    font-size: .72rem;
    font-weight: 600;
    padding: .18rem .6rem;
    border-radius: 999px;
    margin: .15rem .3rem .15rem 0;
    white-space: nowrap;
}

/* Icône ronde en tête de carte "Recherche sauvegardée" (listings/saved_search_list.html) — même
   vocabulaire visuel que .highlight-box-icon (cercle plein coloré). */
.saved-search-icon {
    flex: 0 0 auto;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, var(--velours), var(--bordeaux));
    color: #fff;
    font-size: 1.1rem;
}

/* Piège à bots (config/forms.py::HoneypotFormMixin) : positionné hors-écran plutôt qu'en
   display:none/visibility:hidden, que certains bots évitent spécifiquement en inspectant le CSS
   calculé. aria-hidden sur le conteneur (posé dans le template) le retire de l'arbre
   d'accessibilité pour ne jamais le proposer à un lecteur d'écran. */
.hp-field {
    position: absolute;
    left: -9999px;
    top: -9999px;
    height: 0;
    width: 0;
    overflow: hidden;
}

/* ===== Afficher/masquer un mot de passe (static/js/site.js::initPasswordToggles) =====
   Injecté en JS autour de chaque <input type="password"> du site, quel que soit le gabarit — le
   wrapper ne fait que repositionner le bouton en overlay, sans changer la mise en page du champ. */
.password-field-wrapper {
    position: relative;
    display: block;
}
.password-field-wrapper input {
    padding-right: 2.75rem;
}
.password-toggle-btn {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    width: 2.75rem;
    display: flex;
    align-items: center;
    justify-content: center;
    background: none;
    border: 0;
    padding: 0;
    color: var(--muted);
    cursor: pointer;
}
.password-toggle-btn:hover,
.password-toggle-btn:focus-visible {
    color: var(--laiton);
}

/* ===== Sélecteur de destinataires à cases à cocher (staffadmin::mass_message,
   static/js/site.js::initMassMessagePickers) ===== */
.mass-recipient-list {
    max-height: 320px;
    overflow-y: auto;
    border: 1px solid var(--bs-border-color);
    border-radius: var(--radius-md);
}
.mass-recipient-row {
    display: flex;
    align-items: flex-start;
    gap: .6rem;
    padding: .5rem .75rem;
    margin: 0;
    cursor: pointer;
    border-bottom: 1px solid var(--bs-border-color);
}
.mass-recipient-row:last-child { border-bottom: none; }
.mass-recipient-row:hover { background: rgba(255, 255, 255, .04); }
.mass-recipient-row input[type="checkbox"] {
    margin-top: .2rem;
    flex-shrink: 0;
}
