/**
 * Core Bridge — emplacements publicitaires.
 *
 * Feuille SÉPARÉE de main.css et chargée uniquement sur une requête éligible :
 * un membre Premium ne reçoit pas ces octets, pas plus qu'il ne reçoit le markup
 * ou le script. C'est la traduction en assets de la règle « Premium : 0 markup,
 * 0 script, 0 requête ».
 *
 * Le conteneur naît `hidden` : tant que le runtime n'a pas vérifié le device, le
 * panneau actif et le plafond, il n'occupe aucune place. Dès qu'il est activé, sa
 * hauteur est réservée AVANT la requête (variables posées par AdRenderer), ce qui
 * évite le déplacement de contenu que sanctionne le CLS.
 */

.crb-ad {
    /* Réservation de hauteur, par device. Le conteneur reste display:none tant
       qu'il porte [hidden] : la règle ci-dessous ne s'applique qu'après activation. */
    display: block;
    position: relative;
    box-sizing: border-box;
    margin: var(--crb-space-lg, 24px) 0;
    padding: 0;
    min-height: var(--crb-ad-h-m, 0px);
    overflow: hidden;
    text-align: center;
    /* Fond neutre, jamais la couleur d'une carte de profil : l'annonce ne doit à
       aucun moment pouvoir être prise pour un contenu du site. */
    background: var(--crb-surface-2, rgba(127, 127, 127, .06));
    border-radius: var(--crb-radius, 12px);
}

.crb-ad[hidden] { display: none; }

@media (min-width: 1024px) {
    .crb-ad { min-height: var(--crb-ad-h-d, 0px); }
}

/* Étiquette : lisible, discrète, jamais confondue avec un titre de contenu. */
.crb-ad__label {
    display: block;
    padding: 4px 8px 2px;
    font-size: 11px;
    line-height: 1.2;
    letter-spacing: .08em;
    text-transform: uppercase;
    text-align: left;
    color: var(--crb-text-muted, #8a8a8a);
}

.crb-ad__unit { display: block; width: 100%; }

/* Repli — trois causes, un seul rendu : le conteneur disparaît.

   Le runtime replie sur `unfilled` (la régie n'a rien), sur erreur de tag (la
   requête n'est jamais partie) ET sur délai de garde (l'`<ins>` n'a jamais reçu de
   réponse). Il pose `[hidden]`, qui l'emporte sur les marges de placement ci-dessous
   — la seule remise à zéro des dimensions, elle, ne suffisait pas : `.crb-ad--unfilled`
   ne pèse qu'une classe, les règles de rail en pèsent deux, donc les 24px de marge
   verticale survivaient au repli.

   La classe reste posée : c'est le repère de diagnostic dans l'inspecteur, et le
   filet si quelque chose ré-affichait le conteneur. */
.crb-ad--unfilled {
    min-height: 0;
    margin: 0;
    background: none;
}
.crb-ad--unfilled .crb-ad__label { display: none; }

/* Mode test : gabarit dimensionné, aucune requête vers Google. */
.crb-ad__preview {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: inherit;
    padding: 16px;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 12px;
    color: var(--crb-text-muted, #8a8a8a);
    border: 1px dashed var(--crb-border, rgba(127, 127, 127, .4));
    border-radius: inherit;
}

/* ── Placements ─────────────────────────────────────────────────────────────
   Découvrir : l'annonce occupe une RANGÉE ENTIÈRE de la grille et n'est jamais
   rendue comme une carte de profil (§5). Sans cette règle, la grille la
   traiterait comme une cellule de plus — exactement la fausse carte que
   l'audit écarte.
   La galerie publique (`.crb-gallery-grid`) n'est plus concernée : elle porte la
   page d'accueil et ne reçoit aucune annonce (surface fermée en dur, cf.
   AdSlotRegistry::FORBIDDEN_SURFACES). */
.crb-members-grid > .crb-ad {
    grid-column: 1 / -1;
    margin: var(--crb-space-md, 16px) 0;
}

/* Liste d'articles : même principe, mais dans une grille qui n'est PAS la nôtre
   (`.w-grid-list`, module [us_post_list] du thème). Deux jeux de propriétés parce
   que le thème peut la disposer en grid comme en flex selon sa version et son
   gabarit : `grid-column` ne dit rien à un conteneur flex, et `flex-basis` rien à
   une grille. Écrire les deux coûte trois lignes et évite une annonce coincée dans
   une colonne de 300px alors qu'elle en demande 728.
   Sans cette règle, l'unité se rangeait comme un article de plus — exactement la
   fausse carte que l'audit écarte. */
.w-grid-list > .crb-ad {
    grid-column: 1 / -1;
    flex: 0 0 100%;
    width: 100%;
    max-width: 100%;
    margin: var(--crb-space-md, 16px) 0;
}

/* Accueil, liste des matchs (mobile) : colonne simple, l'unité s'y insère comme une
   rangée de plus. Elle ne peut tomber qu'après la dernière (cf. matches-block.php),
   d'où une marge haute qui la détache du dernier bouton « Envoyer un message ». */
.crb-matches__list > .crb-ad {
    margin: var(--crb-space-lg, 24px) 0 0;
}

/* Rails contextuels : jamais collée à une action. Sur l'Accueil elle est intercalée
   entre « Mon activité » et « À la une », d'où le même air en dessous qu'au-dessus ;
   quand elle ferme la colonne (Swipe, Découvrir), la marge basse retombe à zéro.

   Sur la FICHE profil elle est intercalée entre « Sécurité & confiance » et le
   sélecteur d'affichage : elle a une action au-dessus ET une en dessous, les deux
   marges sont donc pleines. La règle `:first-child` plus bas ne la concerne que sur
   SA PROPRE fiche, où le bloc Sécurité n'est pas rendu et où l'annonce ouvre alors
   la colonne pour de bon. */
.crb-rail-widgets > .crb-ad,
.crb-rail-ad > .crb-ad,
.crb-swipe-companion > .crb-ad {
    margin-top: var(--crb-space-lg, 24px);
    margin-bottom: var(--crb-space-lg, 24px);
}
.crb-rail-widgets > .crb-ad:last-child,
.crb-swipe-companion > .crb-ad:last-child {
    margin-bottom: 0;
}
.crb-rail-widgets > .crb-rail-ad:first-child > .crb-ad {
    margin-top: 0;
}

/* LARGEUR OFFERTE À LA RÉGIE — le point qui décidait du format servi.

   Le rail garde 16px de retrait de chaque côté pour ses cartes (cf. .crb-shell__rail
   dans main.css). Appliqué à l'annonce, ce retrait ramenait la largeur disponible
   de 320 à 288px, soit 12px de MOINS que le plus petit format large de 300px.
   Google ne pouvait donc servir ni le 300×600 déclaré par le catalogue, ni même un
   300×250 : il retombait sur un 250×250 — un carré, dans une boîte de 600px.

   Une annonce n'est pas une carte du rail : elle prend la colonne entière. La marge
   négative rend ces 32px sans toucher à la grille du shell (la colonne centrale
   garde exactement sa largeur, contrairement à un élargissement de
   --crb-shell-rail-width qui la rognerait sur toute la plage 1024–1280px).

   Bornée au desktop : le rail n'existe pas en dessous, et ces trois conteneurs n'y
   sont jamais rendus. */
@media (min-width: 1024px) {
    .crb-rail-widgets > .crb-ad,
    .crb-rail-ad > .crb-ad,
    .crb-swipe-companion > .crb-ad {
        margin-inline: calc(-1 * var(--crb-space-4, 16px));
    }
}

/* Messagerie : bloc ancré en bas de la LISTE des conversations.

   `.crb-inbox` est une colonne flex — en-tête figé, liste en flex:1 qui défile,
   et ce conteneur en dernier. Il suffit donc de l'empêcher de rétrécir pour qu'il
   reste collé en bas pendant que la liste défile au-dessus : ni position:sticky, ni
   position:fixed, donc rien qui puisse recouvrir une conversation ou remonter avec
   le clavier mobile.

   Rien à écrire pour le cas « sans publicité » : quand le membre a une formule sans
   publicité, ou que l'emplacement est coupé, AdRenderer ne rend AUCUN élément ici —
   la liste, seule en flex:1, prend toute la hauteur. Idem au repli du runtime, qui
   pose [hidden] (donc display:none, cf. la règle du haut de ce fichier : ne jamais
   redéclarer `display` ci-dessous, sous peine de rendre visible un conteneur replié).

   Le fond et le liseré rattachent le bloc à la colonne ; le coin arrondi de `.crb-ad`
   est annulé, il ne flotte pas, il la termine. */
.crb-inbox > .crb-ad {
    flex-shrink: 0;
    /* `auto` en haut : quand la colonne a de la place libre — boîte vide, une seule
       conversation — le bloc descend en bas au lieu de coller au dernier élément.
       Quand la liste remplit la colonne (flex:1), il ne reste rien à distribuer et
       cette marge vaut zéro. */
    margin: auto 0 0;
    padding-bottom: var(--crb-space-2, 8px);
    border-top: 1px solid var(--crb-border);
    border-radius: 0;
    background: var(--crb-surface);
}


/* Éditorial : centrée dans la colonne de texte, avec de l'air au-dessus et en
   dessous pour ne jamais toucher un paragraphe ni un bouton. */
.crb-ad--blog_single,
.crb-ad--blog_index,
.crb-ad--forum {
    margin: var(--crb-space-xl, 32px) auto;
    max-width: 100%;
}
