/* ============================================================================
 * Pistes Pragmatiques — cn-theme v0.9.0
 *
 * Styles dédiés au CPT cn_piste_pragmatique :
 *   - single piste-pragmatique.twig
 *   - archive archive-pistes-pragmatiques.twig
 *
 * Chargé conditionnellement (enqueue.php) sur les pages PP uniquement.
 * Toutes les valeurs s'appuient sur les design tokens définis dans variables.css.
 * Inter unique pour rester cohérent avec le reste du thème.
 * ========================================================================== */


/* ============================================================================
 * SINGLE — HEADER
 * ========================================================================== */

.cn-pp-header {
    background-color: var(--cn-bleu-nuit);
    color: var(--cn-ivoire);
    /* v0.11.26 : élimine la bande ivoire visible entre le filet or du
       sticky-top et le bloc bleu du header.

       CAUSE
       Le sticky-top du thème est position:fixed (components.css §28).
       Pour compenser, main.js pose dynamiquement un padding-top sur
       <main> égal à la hauteur visuelle du sticky-top. Cette zone de
       padding apparaît en background --cn-ivoire-95 du body — créant
       une bande ivoire au-dessus du bloc bleu de la PP.

       FIX
       Le .cn-pp-header glisse SOUS le sticky-top via margin-top
       négatif, compensé par un padding-top augmenté de la même
       valeur. Conséquences :
         - Le bord supérieur visible du bloc bleu touche directement
           le filet or (plus aucune bande ivoire).
         - Le contenu intérieur (eyebrow, titre, sous-titre, meta-row)
           garde sa position visuelle exacte.
         - La portion du bloc bleu qui dépasse vers le haut est
           masquée par le sticky-top (z-index: 100 vs auto).

       --cn-sticky-top-height est posée par main.js sur <html>. Au
       premier paint avant exécution JS, fallback à 0 → comportement
       d'avant le fix (bande ivoire visible, transitoire). */
    margin-top: calc(-1 * var(--cn-sticky-top-height, 0px));
    padding:
        calc(var(--cn-space-12) + var(--cn-sticky-top-height, 0px)) 0
        var(--cn-space-16);
}

.cn-pp-header__code {
    color: var(--cn-or);
    font-weight: var(--cn-weight-semibold);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    font-size: var(--cn-text-sm);
    margin: 0 0 var(--cn-space-4);
}

.cn-pp-header__flagship {
    color: var(--cn-or);
    font-size: var(--cn-text-base);
    margin-left: var(--cn-space-2);
}

.cn-pp-header__title {
    color: var(--cn-ivoire);
    font-size: var(--cn-text-5xl);
    font-weight: var(--cn-weight-bold);
    line-height: var(--cn-leading-tight);
    margin: 0 0 var(--cn-space-4);
    /* v0.10.10 : retrait du max-width 22ch — laisse le titre s'étaler
       sur toute la largeur du container ultra. Plus de coupures
       artificielles sur 2 lignes quand il y a de la place. */
}

.cn-pp-header__subtitle {
    color: var(--cn-bleu-nuit-20);
    font-size: var(--cn-text-2xl);
    font-style: italic;
    line-height: var(--cn-leading-snug);
    font-weight: var(--cn-weight-regular);
    margin: 0 0 var(--cn-space-8);
    /* v0.10.22 : retiré max-width 56ch — laisse le sous-titre exploiter
       toute la largeur du container ultra. Plus de coupure prématurée
       sur grand écran. */
}

.cn-pp-header__meta-row {
    list-style: none;
    margin: 0;
    /* v0.10.24 : padding-top retiré du <ul>. Le padding sera appliqué sur
       chaque <li> individuel via .cn-pp-header__meta-item, pour garantir
       que chaque label commence exactement à la même distance du
       séparateur supérieur, quels que soient le rendu navigateur et les
       différences de hauteur entre items. */
    padding: 0;
    border-top: 1px solid var(--cn-bleu-nuit-80);
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    /* gap: ne s'applique qu'horizontalement maintenant, le vertical
       est géré par le padding-top des items. */
    column-gap: var(--cn-space-6);
    row-gap: var(--cn-space-4);
    align-items: start;
}

.cn-pp-header__meta-item {
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-1);
    /* v0.10.24 : padding-top fixe pour un alignement strict avec le
       séparateur supérieur. Tous les <li> commencent à exactement
       space-6 (24px) du border-top du parent. */
    padding-top: var(--cn-space-6);
    margin: 0;
}

.cn-pp-header__meta-label {
    /* v0.10.24 : margin-top: 0 explicite pour neutraliser tout reset
       browser (certains UA mettent margin sur les éléments inline). */
    margin: 0;
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-xs);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    font-weight: var(--cn-weight-medium);
}

.cn-pp-header__meta-value {
    color: var(--cn-ivoire);
    font-size: var(--cn-text-base);
    font-weight: var(--cn-weight-medium);
    text-decoration: none;
}

/* v0.10.22 : retiré le border-bottom décoratif sur les liens (TYPOLOGIE,
   MESURE SOURCE) qui créait une asymétrie visuelle avec les valeurs
   non-liens (COÛT, HORIZON). Tous les blocs s'affichent désormais avec
   le même style (texte ivoire, sans soulignement). Le hover fait apparaître
   un soulignement or pour signaler la cliquabilité, mais l'état au repos
   est identique pour tous. */
a.cn-pp-header__meta-value {
    border: 0;
    transition: color var(--cn-duration-normal) var(--cn-easing);
}
a.cn-pp-header__meta-value:hover {
    color: var(--cn-or);
    text-decoration: underline;
    text-decoration-color: var(--cn-or-50);
    text-underline-offset: 4px;
}


/* ============================================================================
 * SINGLE — LAYOUT 2 COLONNES
 * ========================================================================== */

.cn-pp-layout {
    background-color: var(--cn-blanc);
    padding: var(--cn-space-16) 0 0;
}

.cn-pp-layout__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--cn-space-12);
}

@media (min-width: 1024px) {
    .cn-pp-layout__grid {
        grid-template-columns: minmax(0, 1fr) 280px;
        gap: var(--cn-space-16);
    }
}

.cn-pp-layout__main > section + section {
    margin-top: var(--cn-space-16);
}

/* ============================================================================
 * v0.11.11 — BLOCS PLEINE LARGEUR (post-2-colonnes)
 *
 * Articulation + Garde-fous + Différenciation sont rendus dans un wrapper
 * .cn-pp-fullwidth séparé de .cn-pp-layout pour s'affranchir de la grille
 * 2 colonnes. Background blanc continu avec cn-pp-layout (pas de coupure
 * visuelle). Le padding top du wrapper layout disparaît au profit d'un
 * rythme géré par les sections internes. Le padding bottom est sur le
 * fullwidth (fin de la portion "blanche" de la page, avant les sections
 * affirmations/rating/related qui ont leur propre fond).
 * ========================================================================== */

.cn-pp-fullwidth {
    background-color: var(--cn-blanc);
    /* v0.11.12 — Padding-top sur le wrapper au lieu de margin-top sur la
       1re section enfant. La règle précédente avec section:first-child
       margin-top: var(--cn-space-16) provoquait un MARGIN-COLLAPSE :
       le margin externe sortait du wrapper et exposait le fond ivoire-95
       du body entre la fin de .cn-pp-layout et le contenu fullwidth,
       créant une bande visible non désirée.
       Le padding-top, lui, est strictement à l'intérieur du wrapper et
       n'autorise aucun débordement. Le fond blanc est donc continu. */
    padding: var(--cn-space-16) 0 var(--cn-space-20);
}

.cn-pp-fullwidth > .cn-container > section + section {
    margin-top: var(--cn-space-16);
}

/* v0.11.11 — Override des margins négatifs de .cn-pp-garde-fous quand il
   est dans .cn-pp-fullwidth. Les margins négatifs (-cn-space-12 puis
   -cn-content-edge) servaient à faire déborder l'encart bleu nuit hors
   de la colonne __main (contrainte de la grille 2-colonnes) pour
   atteindre les bords de la page. Désormais le bloc est nativement en
   pleine largeur (dans .cn-pp-fullwidth), donc ces débordements créent
   un double overflow qui dépasse le container. On les annule. */
.cn-pp-fullwidth .cn-pp-garde-fous {
    margin-left: 0;
    margin-right: 0;
}


/* ============================================================================
 * SINGLE — TITRES DE SECTION
 * ========================================================================== */

.cn-pp-section-title {
    font-size: var(--cn-text-3xl);
    font-weight: var(--cn-weight-bold);
    line-height: var(--cn-leading-snug);
    color: var(--cn-bleu-nuit);
    margin: 0 0 var(--cn-space-6);
    padding-top: var(--cn-space-3);
    border-top: 2px solid var(--cn-or);
    /* v0.10.22 : retiré max-width 28ch — les titres de section comme
       "Ce que disent les modèles internationaux" peuvent désormais
       s'étendre sur 1 ligne au lieu d'être cassés en 2. */
}

.cn-pp-section-title--inverted {
    color: var(--cn-ivoire);
    border-top-color: var(--cn-or);
}


/* ============================================================================
 * SINGLE — PITCH (mise en valeur typo forte)
 * ========================================================================== */

.cn-pp-pitch {
    background-color: var(--cn-ivoire-95);
    border-left: 4px solid var(--cn-or);
    padding: var(--cn-space-8) var(--cn-space-10);
}

.cn-pp-pitch__inner {
    font-size: var(--cn-text-lg);
    line-height: var(--cn-leading-relaxed);
    color: var(--cn-bleu-nuit);
}

.cn-pp-pitch__inner p:first-child {
    font-style: italic;
    font-size: var(--cn-text-xl);
    color: var(--cn-bleu-nuit);
    margin-top: 0;
}


/* ============================================================================
 * SINGLE — PANEL INTERNATIONAL
 * ========================================================================== */

.cn-pp-panel__intro {
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-base);
    font-style: italic;
    margin: 0 0 var(--cn-space-8);
}

.cn-pp-panel__grid {
    display: grid;
    /* v0.10.22 : largeur minimale 320px (avant 220px) — chaque card panel
       est plus large et moins haute, ce qui évite que les textes longs
       par card soient écrasés sur 5 colonnes étroites. Avec un container
       ultra à 1600px, on aura 4 colonnes à 320-380px chacune (lieu de 5
       à 220-280px). */
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: var(--cn-space-6);
}

.cn-pp-panel__card {
    background-color: var(--cn-blanc);
    border: 1px solid var(--cn-bleu-nuit-10);
    border-top: 3px solid var(--cn-or);
    padding: var(--cn-space-6);
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-3);
}

.cn-pp-panel__pays {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-xl);
    font-weight: var(--cn-weight-semibold);
    margin: 0;
}

.cn-pp-panel__modele {
    color: var(--cn-or-95);
    font-size: var(--cn-text-sm);
    font-weight: var(--cn-weight-medium);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin: 0;
}

.cn-pp-panel__detail {
    color: var(--cn-bleu-nuit-80);
    font-size: var(--cn-text-base);
    line-height: var(--cn-leading-normal);
    margin: 0;
}


/* ============================================================================
 * SINGLE — DETAIL (corps principal)
 * ========================================================================== */

.cn-pp-detail__inner {
    font-size: var(--cn-text-base);
    line-height: var(--cn-leading-relaxed);
    color: var(--cn-bleu-nuit);
    /* v0.10.22 : retiré max-width var(--cn-content-prose) — le contenu
       Mise en œuvre française est structuré (titres, listes, leviers)
       et bénéficie de la pleine largeur du conteneur, pas d'une colonne
       de lecture longue à 720px. */
}

/* v0.10.22 : override explicite des max-width hérités de .cn-prose sur les
   sections du single PP. Sélecteurs composés à spécificité (0,0,2,0) qui
   battent .cn-prose seul (0,0,1,0). */
.cn-pp-detail__inner.cn-prose,
.cn-pp-garde-fous__body.cn-prose,
.cn-pp-pitch__inner.cn-prose {
    max-width: none;
}

.cn-pp-detail__inner h2 {
    font-size: var(--cn-text-2xl);
    font-weight: var(--cn-weight-semibold);
    color: var(--cn-bleu-nuit);
    margin: var(--cn-space-10) 0 var(--cn-space-4);
}

.cn-pp-detail__inner h3 {
    font-size: var(--cn-text-xl);
    font-weight: var(--cn-weight-semibold);
    color: var(--cn-bleu-nuit);
    margin: var(--cn-space-8) 0 var(--cn-space-3);
}

.cn-pp-detail__inner table {
    width: 100%;
    border-collapse: collapse;
    margin: var(--cn-space-6) 0;
    font-size: var(--cn-text-sm);
}

.cn-pp-detail__inner th,
.cn-pp-detail__inner td {
    text-align: left;
    padding: var(--cn-space-3) var(--cn-space-4);
    border-bottom: 1px solid var(--cn-bleu-nuit-10);
}

.cn-pp-detail__inner th {
    background-color: var(--cn-ivoire-95);
    font-weight: var(--cn-weight-semibold);
    color: var(--cn-bleu-nuit);
}

.cn-pp-detail__inner blockquote {
    background-color: var(--cn-ivoire-90);
    border-left: 4px solid var(--cn-or);
    padding: var(--cn-space-5) var(--cn-space-6);
    margin: var(--cn-space-6) 0;
    color: var(--cn-bleu-nuit);
    font-style: italic;
}


/* ============================================================================
 * SINGLE — ARTICULATION PROGRAMME
 * ========================================================================== */

.cn-pp-articulation__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: var(--cn-space-3);
    /* v0.10.25 : align-items: stretch (default grid). Combiné avec
       height: 100% sur le __link, tous les blocs d'une rangée prennent
       la même hauteur ET le texte démarre au pixel près en haut.
       Avant (v0.10.23) : align-items: start laissait des hauteurs
       différentes par cellule, et l'imbrication flex/baseline du __link
       décalait visuellement le démarrage du texte selon la longueur
       du contenu. Désormais : grille rectangulaire parfaite. */
    align-items: stretch;
}

.cn-pp-articulation__item {
    /* v0.10.25 : item simplifié — plus de flex inutile. Le __link
       est seul enfant et prend 100% de la cellule. Avant : display:flex
       + align-items:center + align-self:start était contradictoire et
       provoquait des décalages verticaux selon le navigateur.
       v0.10.37 : reset défensif explicite des margins/padding. La cause
       du désalignement signalée par Olivier était la règle générique
       'li + li { margin-top: space-2 }' dans base.css qui s'appliquait
       à tous les <li>, y compris dans les <ul role="list"> en grid.
       Conséquence : les items 2..N recevaient un margin-top parasite
       qui décalait leur position dans la cellule grid, et créait un
       écart visuel avec l'item 1 (sans margin) → "premier bloc plus
       haut que les autres" ou inversement selon le rendu navigateur.
       Le fix principal est dans base.css (restriction aux listes prose
       via :not([role="list"])). Ce reset ici est une ceinture-bretelle
       au cas où une autre règle générique viendrait. */
    display: block;
    margin: 0;
    padding: 0;
}

.cn-pp-articulation__link {
    /* v0.10.25 : block + height 100% pour remplir la cellule de
       grille à hauteur identique avec ses voisins de rangée. Padding
       homogène, pas de baseline alignment qui déplacerait le texte
       selon les fontes/leadings. */
    display: block;
    text-decoration: none;
    color: var(--cn-bleu-nuit);
    padding: var(--cn-space-3) var(--cn-space-4);
    background-color: var(--cn-ivoire-95);
    border-left: 3px solid var(--cn-or);
    height: 100%;
    box-sizing: border-box;
    transition: background-color var(--cn-duration-normal) var(--cn-easing);
}

.cn-pp-articulation__link:hover {
    background-color: var(--cn-or-10);
}

.cn-pp-articulation__code {
    font-weight: var(--cn-weight-semibold);
    font-family: var(--cn-font-mono);
    color: var(--cn-or-95);
    font-size: var(--cn-text-sm);
    flex-shrink: 0;
}

.cn-pp-articulation__title {
    font-size: var(--cn-text-sm);
    color: var(--cn-bleu-nuit);
}

.cn-pp-articulation__title--unlinked {
    color: var(--cn-bleu-nuit-50);
    font-style: italic;
}


/* ============================================================================
 * SINGLE — GARDE-FOUS (encart inversé bleu nuit)
 * ========================================================================== */

.cn-pp-garde-fous {
    background-color: var(--cn-bleu-nuit);
    color: var(--cn-ivoire);
    padding: var(--cn-space-12);
    margin-left: calc(-1 * var(--cn-space-12));
    margin-right: calc(-1 * var(--cn-space-12));
}

@media (max-width: 1023px) {
    .cn-pp-garde-fous {
        margin-left: calc(-1 * var(--cn-content-edge));
        margin-right: calc(-1 * var(--cn-content-edge));
        padding: var(--cn-space-8) var(--cn-content-edge);
    }
}

.cn-pp-garde-fous__inner {
    /* v0.10.22 : retiré max-width prose — section structurée, pleine largeur. */
}

.cn-pp-garde-fous__body {
    color: var(--cn-bleu-nuit-20);
    font-size: var(--cn-text-base);
    line-height: var(--cn-leading-relaxed);
}

.cn-pp-garde-fous__body strong {
    color: var(--cn-ivoire);
    font-weight: var(--cn-weight-semibold);
}

.cn-pp-garde-fous__body p {
    margin: 0 0 var(--cn-space-4);
}

.cn-prose--inverted a {
    color: var(--cn-or-50);
    border-bottom: 1px solid var(--cn-or-50);
}
.cn-prose--inverted a:hover {
    color: var(--cn-or);
    border-bottom-color: var(--cn-or);
}


/* ============================================================================
 * SINGLE — DIFFÉRENCIATION POLITIQUE
 * ========================================================================== */

.cn-pp-differenciation__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: var(--cn-space-5);
}

.cn-pp-differenciation__card {
    background-color: var(--cn-ivoire-95);
    border-top: 2px solid var(--cn-bleu-nuit);
    padding: var(--cn-space-5) var(--cn-space-6);
}

.cn-pp-differenciation__cible {
    color: var(--cn-or-95);
    font-size: var(--cn-text-xs);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    font-weight: var(--cn-weight-semibold);
    margin: 0 0 var(--cn-space-3);
}

.cn-pp-differenciation__corps {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-base);
    line-height: var(--cn-leading-normal);
    margin: 0;
}


/* ============================================================================
 * SINGLE — CINQ AFFIRMATIONS (bloc final fond or)
 * ========================================================================== */

.cn-pp-affirmations {
    background-color: var(--cn-or);
    color: var(--cn-bleu-nuit);
    padding: var(--cn-space-16) 0 var(--cn-space-20);
}

.cn-pp-affirmations__title {
    font-size: var(--cn-text-3xl);
    font-weight: var(--cn-weight-bold);
    color: var(--cn-bleu-nuit);
    margin: 0 0 var(--cn-space-10);
    text-align: center;
}

.cn-pp-affirmations__list {
    list-style: none;
    margin: 0 auto;
    padding: 0;
    max-width: 800px;
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-6);
}

.cn-pp-affirmations__item {
    background-color: var(--cn-ivoire);
    padding: var(--cn-space-6) var(--cn-space-8);
    display: flex;
    gap: var(--cn-space-6);
    align-items: flex-start;
}

.cn-pp-affirmations__num {
    width: 40px;
    height: 40px;
    flex-shrink: 0;
    border-radius: 50%;
    background-color: var(--cn-bleu-nuit);
    color: var(--cn-or);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-weight: var(--cn-weight-bold);
    font-size: var(--cn-text-base);
}

.cn-pp-affirmations__text {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-lg);
    line-height: var(--cn-leading-snug);
    font-style: italic;
    margin: 0;
}


/* ============================================================================
 * SINGLE — ASIDE (sidebar info production)
 * ========================================================================== */

.cn-pp-aside-info {
    background-color: var(--cn-ivoire-95);
    padding: var(--cn-space-5);
    border-top: 2px solid var(--cn-bleu-nuit-20);
    margin-top: var(--cn-space-6);
}

.cn-pp-aside-info__title {
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-xs);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    font-weight: var(--cn-weight-semibold);
    margin: 0 0 var(--cn-space-3);
}

.cn-pp-aside-info__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-1);
    color: var(--cn-bleu-nuit-80);
    font-size: var(--cn-text-sm);
}


/* ============================================================================
 * SINGLE — RELATED CARDS
 * ========================================================================== */

.cn-pp-related-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--cn-space-5);
}

.cn-pp-related-card {
    background-color: var(--cn-blanc);
    border: 1px solid var(--cn-bleu-nuit-10);
    padding: var(--cn-space-5);
    text-decoration: none;
    color: var(--cn-bleu-nuit);
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-3);
    transition: transform var(--cn-duration-normal) var(--cn-easing),
                box-shadow var(--cn-duration-normal) var(--cn-easing);
}

.cn-pp-related-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--cn-shadow-md);
}

.cn-pp-related-card--flagship {
    border-top: 3px solid var(--cn-or);
}

.cn-pp-related-card__code {
    color: var(--cn-or-95);
    font-weight: var(--cn-weight-semibold);
    font-size: var(--cn-text-sm);
    letter-spacing: 0.04em;
    margin: 0;
}

.cn-pp-related-card__star {
    color: var(--cn-or);
}

.cn-pp-related-card__title {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-lg);
    font-weight: var(--cn-weight-semibold);
    line-height: var(--cn-leading-snug);
    margin: 0;
}

.cn-pp-related-card__sous-titre {
    color: var(--cn-bleu-nuit-80);
    font-size: var(--cn-text-sm);
    font-style: italic;
    margin: 0;
}


/* ============================================================================
 * ARCHIVE — HEADER
 * ========================================================================== */

/* ============================================================================
 * ARCHIVE — EN-TÊTE
 *
 * v0.10.15 : suppression des classes spécifiques .cn-pp-archive-header__*.
 * L'archive Pistes pragmatiques utilise désormais le même header unifié
 * (.cn-archive-header / .cn-archive-header__title / __lede / __subtitle)
 * que les archives Mesures et Tribunes. Garantit un alignement vertical
 * strictement identique au pixel près sur les 3 pages.
 *
 * Voir components.css pour les définitions.
 * ========================================================================== */


/* ============================================================================
 * ARCHIVE — LAYOUT
 * ========================================================================== */

.cn-pp-archive-layout {
    background-color: var(--cn-blanc);
    padding: var(--cn-space-12) 0 var(--cn-space-20);
}

.cn-pp-archive-layout__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--cn-space-10);
}

@media (min-width: 1024px) {
    .cn-pp-archive-layout__grid {
        grid-template-columns: 240px minmax(0, 1fr);
        gap: var(--cn-space-12);
    }
}

/* v0.10.15 : .cn-pp-archive-layout__results-count retiré — le compteur
   est maintenant dans le header via .cn-archive-header__count. */


/* ============================================================================
 * ARCHIVE — FILTRES SIDEBAR
 * 
 * v0.10.9 : remplacé par le composant unifié .cn-filters dans
 * components.css. Les classes .cn-pp-filters__* ont été retirées —
 * voir components/filter-sidebar.twig + components.css.
 * ========================================================================== */


/* ============================================================================
 * ARCHIVE — GRILLE DE CARTES
 * ========================================================================== */

.cn-pp-archive-grid {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    /* v0.10.7 : colonnes fixes par viewport au lieu de auto-fill, pour
       que les pages intermédiaires (ex. page 2 sur 3) ne montrent pas
       de gros espace vide à droite quand le nombre de cards de la page
       n'est pas multiple du nombre de colonnes naturel. Avec 12 par
       page et 4 cols sur desktop large, on a toujours 12÷4=3 lignes
       pleines sur les pages non-finales. */
    /* v0.10.23 : align-items: start force toutes les cellules à s'ancrer
       en haut de leur ligne (au lieu du défaut stretch qui peut différer
       selon le contenu intérieur). Combiné avec align-self: start sur
       chaque <li>, garantit l'alignement strictement identique des bords
       supérieurs des cards d'une même ligne. */
    align-items: start;
    grid-template-columns: 1fr;
    gap: var(--cn-space-6);
}

.cn-pp-archive-grid > li {
    /* v0.10.23 : reset explicite pour que la cellule grid n'introduise
       aucun offset vertical, qu'elle soit la 1ère ou pas. */
    margin: 0;
    padding: 0;
    align-self: start;
}
@media (min-width: 640px) {
    .cn-pp-archive-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
    .cn-pp-archive-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 1440px) {
    .cn-pp-archive-grid { grid-template-columns: repeat(4, 1fr); }
}

.cn-pp-card {
    display: flex;
    flex-direction: column;
    gap: var(--cn-space-3);
    padding: var(--cn-space-6);
    background-color: var(--cn-blanc);
    border: 1px solid var(--cn-bleu-nuit-10);
    text-decoration: none;
    color: var(--cn-bleu-nuit);
    transition: transform var(--cn-duration-normal) var(--cn-easing),
                box-shadow var(--cn-duration-normal) var(--cn-easing);
    height: 100%;
}

.cn-pp-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--cn-shadow-lg);
}

.cn-pp-card--flagship {
    border-top: 3px solid var(--cn-or);
}

.cn-pp-card__head {
    /* v0.10.22 : passé de flex space-between → block simple. Le head ne
       contient désormais que la typologie (le code PPc et l'étoile flagship
       ont été retirés en v0.10.10). Plus de flex inutile qui pouvait créer
       de subtiles asymétries verticales selon le contenu. */
    display: block;
    margin: 0 0 var(--cn-space-3) 0;
}

.cn-pp-card__code {
    color: var(--cn-or-95);
    font-family: var(--cn-font-mono);
    font-weight: var(--cn-weight-bold);
    font-size: var(--cn-text-sm);
    letter-spacing: 0.04em;
}

.cn-pp-card__flagship-badge {
    display: inline-block;
    background: var(--cn-or);
    color: var(--cn-bleu-nuit);
    padding: 0.25rem 0.5rem;
    font-size: var(--cn-text-xs);
    font-weight: var(--cn-weight-semibold);
    border-radius: 3px;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.cn-pp-card__star {
    color: var(--cn-or);
}

.cn-pp-card__typologie {
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-xs);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

.cn-pp-card__title {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-xl);
    font-weight: var(--cn-weight-semibold);
    line-height: var(--cn-leading-snug);
    margin: 0;
}

.cn-pp-card__sous-titre {
    color: var(--cn-bleu-nuit-80);
    font-size: var(--cn-text-sm);
    font-style: italic;
    line-height: var(--cn-leading-snug);
    margin: 0;
}

.cn-pp-card__resume {
    color: var(--cn-bleu-nuit);
    font-size: var(--cn-text-sm);
    line-height: var(--cn-leading-normal);
    margin: 0;
    flex-grow: 1;
}

.cn-pp-card__panel {
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-xs);
    line-height: var(--cn-leading-normal);
    margin: 0;
    padding-top: var(--cn-space-3);
    border-top: 1px solid var(--cn-bleu-nuit-10);
}

.cn-pp-card__panel-label {
    color: var(--cn-or-95);
    font-weight: var(--cn-weight-semibold);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-right: var(--cn-space-2);
}

.cn-pp-card__foot {
    display: flex;
    flex-wrap: wrap;
    gap: var(--cn-space-3);
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-xs);
    font-variant-numeric: tabular-nums;
    margin-top: auto;
}

.cn-pp-card__cout::before {
    content: '€ ';
    color: var(--cn-or-95);
}

.cn-pp-card__horizon::before {
    content: '⏱ ';
    color: var(--cn-or-95);
}


/* ============================================================================
 * ARCHIVE — PAGINATION
 * ========================================================================== */

.cn-pp-archive-pagination {
    margin-top: var(--cn-space-10);
    display: flex;
    justify-content: center;
    gap: var(--cn-space-2);
    color: var(--cn-bleu-nuit);
}

.cn-pp-archive-pagination .page-numbers {
    display: inline-block;
    padding: var(--cn-space-2) var(--cn-space-3);
    color: var(--cn-bleu-nuit);
    text-decoration: none;
    font-size: var(--cn-text-sm);
    font-weight: var(--cn-weight-medium);
    border: 1px solid var(--cn-bleu-nuit-20);
    transition: background-color var(--cn-duration-normal) var(--cn-easing);
}

.cn-pp-archive-pagination .page-numbers.current {
    background-color: var(--cn-bleu-nuit);
    color: var(--cn-ivoire);
    border-color: var(--cn-bleu-nuit);
}

.cn-pp-archive-pagination .page-numbers:hover:not(.current) {
    background-color: var(--cn-or-10);
}


/* ============================================================================
 * ARCHIVE — ÉTAT VIDE
 * ========================================================================== */

.cn-pp-archive-empty {
    text-align: center;
    color: var(--cn-bleu-nuit-50);
    font-size: var(--cn-text-base);
    padding: var(--cn-space-16) var(--cn-space-6);
    background-color: var(--cn-ivoire-95);
}

.cn-pp-archive-empty a {
    color: var(--cn-or-95);
    text-decoration: underline;
}


/* ============================================================================
 * RESPONSIVE — Mobile fixes
 * ========================================================================== */

@media (max-width: 640px) {
    .cn-pp-header {
        /* v0.11.26 : même mécanique que la règle desktop ci-dessus.
           Le padding-top intègre --cn-sticky-top-height pour compenser
           le margin-top négatif appliqué sur la règle de base. */
        padding:
            calc(var(--cn-space-8) + var(--cn-sticky-top-height, 0px)) 0
            var(--cn-space-10);
    }
    .cn-pp-header__title {
        font-size: var(--cn-text-4xl);
    }
    .cn-pp-header__subtitle {
        font-size: var(--cn-text-lg);
    }
    .cn-pp-section-title {
        font-size: var(--cn-text-2xl);
    }
    .cn-pp-affirmations__title {
        font-size: var(--cn-text-2xl);
    }
    .cn-pp-affirmations__item {
        flex-direction: column;
        gap: var(--cn-space-3);
        padding: var(--cn-space-5);
    }
    .cn-pp-pitch {
        padding: var(--cn-space-6);
    }
    .cn-pp-filters {
        position: static;
    }
}
