/* Surcharge de la palette Pico.css.
 *
 * Chargé après pico.classless.min.css (voir base.html) : les variables ci-dessous
 * remplacent celles du thème clair de Pico. Fond allégé (#F4F6F5, quasi-blanc à
 * peine bleuté) depuis la refonte graphique de l'accueil/bandeau/pied de page
 * (maquette validée par l'utilisateur, 2026-08-05) — l'ancien fond plein
 * #DAE5ED devient --qvq-carte-tint (voir plus bas), réutilisé comme teinte
 * d'accent sur des zones ponctuelles (bandeau, encarts) plutôt que sur toute la
 * page : continuité de marque, pas une rupture de palette.
 *
 * Contrastes vérifiés par calcul de luminance relative WCAG 2.x par rapport au
 * NOUVEAU fond #F4F6F5 (recalculés à cette occasion, l'ancien calcul contre
 * #DAE5ED n'est plus la référence) :
 *   - --pico-color (texte principal, hérité de Pico, pas touché) : 15,17:1.
 *   - --pico-muted-color (texte secondaire : footer, pagination) : #4b5a63,
 *     6,58:1 — toujours largement AA malgré un fond plus clair.
 *   - --pico-primary (couleur des liens) : unifié sur le bleu marine
 *     institutionnel de la refonte (--qvq-marine, #1f3a5c, 10,64:1) plutôt que
 *     l'ancien #015887 — un seul bleu d'accent sur tout le site désormais,
 *     partagé avec les nouveaux composants (masthead, hero...).
 *
 * Theme forcé en "light" dans base.html (<html data-theme="light">) : sans ça, le
 * mode sombre automatique de Pico (media query prefers-color-scheme) écraserait
 * ce fond avec sa propre palette sombre dès que le visiteur a un thème système
 * sombre — hors sujet ici, on veut ce fond dans tous les cas. La refonte
 * graphique n'introduit donc pas non plus de variante sombre pour l'instant :
 * même choix assumé que le reste du site.
 */
[data-theme="light"] {
    --pico-background-color: #F4F6F5;
    --pico-muted-color: #4b5a63;
    --pico-primary: #1f3a5c;
    --pico-primary-background: #1f3a5c;
    --pico-primary-underline: rgba(31, 58, 92, 0.5);
    --pico-primary-hover: #14283f;
    --pico-primary-hover-background: #14283f;
    --pico-primary-focus: rgba(31, 58, 92, 0.5);
}

/* --- Tokens de la refonte graphique (accueil, bandeau, pied de page) ---
 * Espace de noms --qvq- distinct de --pico- : composants propres au site,
 * pas une surcharge du thème Pico. Polices en pile système (pas de webfont à
 * embarquer, cohérent avec l'absence de pipeline de build du projet — voir
 * CLAUDE.md) : une sérif à caractère pour les titres (ton éditorial/
 * institutionnel), une sans-serif système pour le texte courant (déjà géré
 * par Pico via --pico-font-family, pas dupliqué ici), une monospace pour les
 * chiffres/dates/libellés techniques (nombres tabulaires alignés en colonne).
 * Couleurs vérifiées WCAG 2.x contre --pico-background-color (#F4F6F5) ET
 * --qvq-carte-tint (#DCE6ED, fond des encarts) :
 *   - --qvq-marine (texte/liens) : 10,64:1 / 9,12:1.
 *   - --qvq-encre-douce (texte secondaire) : 6,58:1 / 5,64:1.
 *   - --qvq-or : 3,69:1 sur #F4F6F5 — sous le seuil AA texte (4,5:1), donc
 *     jamais utilisé comme couleur de texte ; réservé aux accents graphiques
 *     (puces, contours, dégradé du spectre politique), qui ne demandent que
 *     3:1 (WCAG 1.4.11, composants non textuels).
 */
:root {
    --qvq-police-affichage: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
    --qvq-police-donnees: "SF Mono", "Cascadia Code", "Consolas", ui-monospace, monospace;
    --qvq-encre-douce: #4b5a63;
    --qvq-marine: #1f3a5c;
    --qvq-marine-forte: #14283f;
    --qvq-or: #9c7a34;
    --qvq-ligne: #c7d2d3;
    --qvq-carte-tint: #dce6ed;
}

/* --- Bandeau (masthead) : remplace le <nav> Pico par défaut, voir base.html ---
 * Centré, wordmark en sérif d'affichage + sous-titre technique en majuscules
 * espacées, puis une seconde ligne de navigation ("rubriques") — plutôt que le
 * <nav> gauche/droite par défaut de Pico classless, jugé trop "app" pour un
 * site de transparence institutionnelle. */
.masthead {
    text-align: center;
    padding: 2rem 0 0.9rem;
    border-bottom: 3px double var(--qvq-ligne);
}

.masthead .marque {
    display: inline-flex;
    align-items: baseline;
    gap: 0.5rem;
    text-decoration: none;
    color: inherit;
}

.masthead .marque img {
    align-self: center;
}

.masthead .nom {
    font-family: var(--qvq-police-affichage);
    font-size: clamp(1.7rem, 4vw, 2.3rem);
    font-weight: 600;
    letter-spacing: 0.01em;
    margin: 0;
}

.masthead .dateline {
    font-family: var(--qvq-police-donnees);
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
    margin: 0.4rem 0 0;
}

.rubriques {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 1.75rem;
    padding: 0.8rem 0;
    border-bottom: 1px solid var(--qvq-ligne);
    font-size: 0.92rem;
}

.rubriques a { text-decoration: none; }
.rubriques a:hover { color: var(--qvq-marine); }

/* --- Pied de page --- */
footer.pied-de-page {
    margin-top: 2.5rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--qvq-ligne);
    color: var(--qvq-encre-douce);
    font-size: 0.85rem;
}

/* --- Hero d'accueil : recherche par circonscription + carte, voir accueil.html ---
 * La carte (fragment site/_widget_recherche_circonscription.html, partagée
 * avec recherche_circonscription.html) est mise en avant ici sur demande
 * explicite de l'utilisateur après comparaison de plusieurs maquettes — d'où
 * .panneau-carte qui l'habille (fond marine, coins arrondis, ombre légère),
 * absent de la page /circonscriptions/ dédiée qui n'en a pas besoin (déjà
 * pleine page). */
.hero-carte {
    display: grid;
    grid-template-columns: 1fr 1.05fr;
    gap: 2.5rem;
    align-items: center;
    padding: 2.25rem 0 2.5rem;
    border-bottom: 1px solid var(--qvq-ligne);
}

.hero-carte .eyebrow {
    font-family: var(--qvq-police-donnees);
    font-size: 0.7rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
    margin: 0 0 0.6rem;
}

.hero-carte h1 {
    font-family: var(--qvq-police-affichage);
    font-size: clamp(1.9rem, 3.6vw, 2.5rem);
    line-height: 1.15;
    margin: 0 0 0.8rem;
    text-wrap: balance;
    font-weight: 600;
}

.hero-carte p.chapo {
    font-size: 1.02rem;
    color: var(--qvq-encre-douce);
    max-width: 32rem;
    margin: 0 0 1.3rem;
}

.hero-carte .hero-micro {
    margin-top: 0.7rem;
    font-size: 0.85rem;
    color: var(--qvq-encre-douce);
}

.panneau-carte {
    border-radius: var(--pico-border-radius);
    overflow: hidden;
    box-shadow: 0 1.5rem 3rem -1.75rem rgba(20, 40, 63, 0.45);
}

/* Le fragment carte partagé fixe une hauteur (voir style inline historique de
 * recherche_circonscription.html) ; ici on la laisse suivre le panneau plutôt
 * qu'une valeur fixe, pour s'accorder à la colonne du hero. */
.panneau-carte [data-carte-circonscriptions] {
    height: 22rem;
}

/* Résultat de la recherche par circonscription (député/sénateurs) :
 * - Desktop (>700px) : affiché dans une bulle Leaflet ancrée au marqueur
 *   (voir carte-circonscriptions.js) — ce panneau reste masqué, ne sert que
 *   de cible au htmx swap.
 * - Mobile (≤700px) : la carte ne fait que 352-400px de haut selon la page,
 *   bien trop peu pour qu'une bulle Leaflet y tienne de façon fiable quelle
 *   que soit sa hauteur max (testé : toujours à la limite du clipping,
 *   indépendamment de la taille du contenu) — ce panneau est affiché à la
 *   place (voir _recherche_circonscription_resultat.html), en incrustation
 *   fixe au bas de l'écran, hors du conteneur carte et donc jamais rogné
 *   par lui.
 */
#panneau-resultat-mobile {
    display: none;
}

#panneau-resultat-mobile #fermer-resultat-mobile {
    display: none;
}

@media (max-width: 700px) {
    #panneau-resultat-mobile.visible {
        display: block;
        position: fixed;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 1000;
        max-height: 70vh;
        overflow-y: auto;
        background: var(--pico-background-color);
        border-top: 1px solid var(--qvq-ligne);
        border-radius: 1rem 1rem 0 0;
        box-shadow: 0 -0.5rem 1.5rem rgba(20, 40, 63, 0.25);
        padding: 1.25rem 1.25rem 1.5rem;
    }

    /* Sticky (pas juste en haut du panneau) : reste atteignable même si le
     * contenu (député + plusieurs sénateurs + anciens élus) force à
     * défiler. */
    #panneau-resultat-mobile.visible #fermer-resultat-mobile {
        display: block;
        position: sticky;
        top: 0;
        margin-left: auto;
        background: none;
        border: none;
        font-size: 1.3rem;
        line-height: 1;
        padding: 0.25rem 0.5rem;
        cursor: pointer;
        color: var(--qvq-encre-douce);
    }
}

/* --- Grille éditoriale contenu + colonne latérale : introduite pour
 * l'accueil ("à la une" + fil / encarts), réutilisée telle quelle sur les
 * fiches détail (élu/loi) pour leur propre colonne latérale (identité/stats,
 * résultat/auteurs) plutôt que dupliquer ratio+gap+breakpoint. */
.grille-deux-colonnes {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: 3rem;
}

.une h2 {
    font-family: var(--qvq-police-affichage);
    font-size: clamp(1.6rem, 3vw, 2.1rem);
    line-height: 1.18;
    margin: 0.7rem 0 0.8rem;
    text-wrap: balance;
    font-weight: 600;
}

.une p.chapo {
    font-size: 1.02rem;
    color: var(--qvq-encre-douce);
    max-width: 40rem;
    margin: 0 0 0.8rem;
}

.une .meta {
    font-family: var(--qvq-police-donnees);
    font-size: 0.8rem;
    color: var(--qvq-encre-douce);
}

.fil { margin-top: 2.25rem; }

.fil h2 {
    font-family: var(--qvq-police-affichage);
    font-size: 1.05rem;
    font-weight: 600;
    margin: 0 0 0.5rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--qvq-ligne);
}

.fil-item {
    display: grid;
    grid-template-columns: 5.5rem 1fr auto;
    gap: 1rem;
    align-items: baseline;
    padding: 0.85rem 0;
    border-top: 1px solid var(--qvq-ligne);
    text-decoration: none;
    color: inherit;
}

.fil-item:first-child { border-top: none; }

.fil-item time {
    font-family: var(--qvq-police-donnees);
    font-size: 0.78rem;
    color: var(--qvq-encre-douce);
    font-variant-numeric: tabular-nums;
}

.fil-item:hover .titre-loi { color: var(--qvq-marine); }

.fil-item .meta {
    font-size: 0.78rem;
    color: var(--qvq-encre-douce);
    white-space: nowrap;
}

.encart {
    border: 1px solid var(--qvq-ligne);
    border-radius: var(--pico-border-radius);
    padding: 1.25rem 1.3rem;
    background: var(--qvq-carte-tint);
}

.encart h2 {
    font-family: var(--qvq-police-affichage);
    font-size: 1.1rem;
    margin: 0 0 0.7rem;
    font-weight: 600;
}

/* Second niveau à l'intérieur d'un h2 sur deux lignes (ex: "Scrutins" /
 * "toutes législatures" sur elu_detail.html) : plus petit et moins appuyé
 * que la ligne principale, sans être une définition de champ (dl.definitions
 * dt, plus bas) ni un nouveau titre de section. */
.encart-sous-titre {
    display: block;
    font-size: 0.75rem;
    font-weight: 400;
    color: var(--qvq-encre-douce);
}

.encart + .encart { margin-top: 1.75rem; }

.chiffres-encart dl {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin: 0;
    padding: 0.5rem 0;
    border-top: 1px solid var(--qvq-ligne);
}

.chiffres-encart dl:first-of-type { border-top: none; padding-top: 0; }
.chiffres-encart dt { font-size: 0.85rem; color: var(--qvq-encre-douce); }
.chiffres-encart dd {
    margin: 0;
    font-family: var(--qvq-police-donnees);
    font-size: 1.02rem;
    font-variant-numeric: tabular-nums;
}

/* Définitions de champs (ex: "Absent (officiel)"/"Taux d'absence (déduit)"
 * sur elu_detail.html, section AN) : un vrai <dl> terme/explication (dt
 * au-dessus, dd — un paragraphe — en dessous), pas la ligne étiquette:valeur
 * en flex de .chiffres-encart dl ci-dessus (pensée pour un nombre sur une
 * ligne, pas un paragraphe) — d'où l'override display:block ici. Même
 * langage visuel que .encart-info plus bas (étiquette discrète en
 * majuscules) plutôt qu'un 3e style de dl sur le site. */
.chiffres-encart dl.definitions {
    display: block;
    border-top: 1px solid var(--qvq-ligne);
    padding-top: 0.75rem;
    margin-top: 0.5rem;
}
.chiffres-encart dl.definitions dt {
    font-family: var(--qvq-police-donnees);
    font-size: 0.72rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
    margin: 0 0 0.2rem;
}
.chiffres-encart dl.definitions dd {
    margin: 0 0 1rem;
    font-family: inherit;
    font-size: 0.9rem;
    font-variant-numeric: normal;
    color: var(--qvq-encre-douce);
}
.chiffres-encart dl.definitions dd:last-child { margin-bottom: 0; }

/* --- Spectre politique : un repère graphique, pas décoratif — chaque segment
 * représente un parti actuel réel (voir AccueilView.get_context_data), ordonné
 * gauche→droite selon Parti.position_politique (même tri que l'hémicycle de
 * scrutin_detail.html), large de son effectif réel, coloré avec Parti.couleur
 * (couleur officielle du groupe fournie par la source, déjà le principe
 * établi ailleurs sur ce champ — voir apps/partis/tasks.py) plutôt qu'un
 * dégradé inventé : pas de couleur arbitraire à choisir, et pas de risque de
 * réutiliser accidentellement le vert/rouge déjà porteurs de sens pour/contre
 * ailleurs (.hemicycle-segment-* plus bas), puisque chaque teinte est celle,
 * réelle, du parti concerné. Couleur posée en style inline par le template
 * (valeur dynamique par parti), pas ici. */
/* Une barre .spectre par chambre (voir AccueilView.get_context_data,
 * spectres_par_chambre) : le badge_chambre réutilise ses propres couleurs
 * .badge-chambre-*, pas de nouvelle couleur à inventer ici. */
.spectre-chambre { margin-bottom: 1.1rem; }
.spectre-chambre:last-of-type { margin-bottom: 0; }

.spectre-chambre-titre {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.8rem;
    font-weight: 600;
    margin: 0 0 0.35rem;
}

.spectre {
    display: flex;
    height: 10px;
    border-radius: 999px;
    overflow: hidden;
    margin-bottom: 0.5rem;
}

.spectre-segment { height: 100%; }

.spectre-legende {
    display: flex;
    justify-content: space-between;
    font-family: var(--qvq-police-donnees);
    font-size: 0.66rem;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
}

/* Segment cliquable de l'échiquier (voir spectre-popup.js) : bouton natif
 * pour l'accessibilité clavier (focus, Entrée/Espace), chrome par défaut
 * retiré pour ne garder que la couleur posée en style inline par le
 * template. */
.spectre-segment {
    height: 100%;
    border: none;
    padding: 0;
    margin: 0;
    display: block;
    cursor: pointer;
}

/* Popup d'identification du parti au clic sur un segment (voir
 * spectre-popup.js) : `position: fixed` + coordonnées posées en JS depuis
 * getBoundingClientRect(), pas de calcul de scroll nécessaire. Mêmes teinte
 * d'ombre/rayon que #panneau-resultat-mobile (carte de circonscription) —
 * seul autre "popup" du site — pour rester visuellement cohérent. */
.spectre-popup {
    position: fixed;
    z-index: 1000;
    max-width: 240px;
    background: var(--pico-background-color);
    border: 1px solid var(--qvq-ligne);
    border-radius: var(--pico-border-radius);
    box-shadow: 0 0.5rem 1.5rem rgba(20, 40, 63, 0.25);
    padding: 0.7rem 0.9rem;
}

.spectre-popup-titre {
    font-weight: 600;
    margin: 0 0 0.2rem;
}

.spectre-popup-effectif {
    font-size: 0.85rem;
    color: var(--qvq-encre-douce);
    margin: 0 0 0.5rem;
}

.spectre-popup-lien { font-size: 0.9rem; }

.encart p.note {
    font-size: 0.88rem;
    color: var(--qvq-encre-douce);
    margin: 0.8rem 0 0;
}

@media (max-width: 860px) {
    .hero-carte { grid-template-columns: 1fr; }
    .grille-deux-colonnes { grid-template-columns: 1fr; }
    .fil-item { grid-template-columns: 1fr; gap: 0.2rem; }
    /* Fiche élu et fiche loi (pas les autres pages partageant aussi
     * .grille-deux-colonnes) : en mobile empilé, l'aside (Identité +
     * Statistiques de vote / Informations générales + Auteurs et
     * rapporteurs) passe avant le contenu principal plutôt qu'après —
     * demande explicite utilisateur, ces infos de repère sont plus utiles
     * en premier sur petit écran. `order` réordonne juste l'affichage, le
     * HTML garde le contenu principal en premier dans le DOM (pas d'impact
     * SEO). */
    .grille-fiche-elu aside,
    .grille-fiche-loi aside { order: -1; }
}

/* --- Pages de liste (Élus/Lois/Scrutins/Partis) : deuxième passe de la
 * refonte graphique (2026-08-05), après l'accueil + l'habillage commun.
 * Les 4 pages partagent le même gabarit Pico.css par défaut (h1, formulaire
 * de filtres htmx, liste à puces, pagination) — un seul jeu de classes
 * partagé plutôt que du CSS par page. Les fiches détail (élu/loi/parti/
 * scrutin_detail) ne sont volontairement PAS concernées par cette passe
 * (prévu pour un chantier suivant, périmètre confirmé avec l'utilisateur). */
main > h1 {
    font-family: var(--qvq-police-affichage);
    font-weight: 600;
    font-size: clamp(1.6rem, 3.4vw, 2.2rem);
}

/* Sous-titres de section, toutes pages (ex: "Partis actuels" sur /partis/,
 * "Appartenance politique"/"Votes" sur une fiche élu...) : élargi depuis un
 * `#parti-liste h2` scopé (passe 2) maintenant que les fiches détail entrent
 * dans le périmètre de la refonte (passe 3). */
main h2 {
    font-family: var(--qvq-police-affichage);
    font-weight: 600;
    font-size: 1.25rem;
}

/* Barre de filtres (recherche + selects) : ligne horizontale plutôt que les
 * champs empilés par défaut de Pico classless, même esprit que .recherche du
 * hero d'accueil. */
.filtres {
    display: flex;
    flex-wrap: wrap;
    align-items: end;
    gap: 1.1rem 1.5rem;
    padding: 1.1rem 1.25rem;
    margin: 1.25rem 0 1.75rem;
    background: var(--qvq-carte-tint);
    border-radius: var(--pico-border-radius);
}

.filtres label {
    flex: 1 1 11rem;
    margin: 0;
    font-size: 0.85rem;
    color: var(--qvq-encre-douce);
}

.filtres input, .filtres select {
    margin-top: 0.35rem;
}

@media (max-width: 700px) {
    .filtres { flex-direction: column; align-items: stretch; }
}

/* Liste de résultats (élus/lois/scrutins/partis) : lignes séparées par un
 * filet, pas des puces — même esprit que .fil-item de l'accueil, généralisé
 * ici puisque le contenu de chaque ligne diffère d'une liste à l'autre
 * (badges + lien toujours en tête, métadonnées poussées à droite via
 * margin-left:auto sur .meta). */
ul.liste-simple {
    list-style: none;
    margin: 0;
    padding: 0;
}

.rangee-liste {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    row-gap: 0.2rem;
    column-gap: 0.6rem;
    padding: 0.85rem 0;
    border-top: 1px solid var(--qvq-ligne);
}

ul.liste-simple li.rangee-liste:first-child {
    border-top: none;
}

.rangee-liste .meta {
    margin-left: auto;
    font-size: 0.85rem;
    color: var(--qvq-encre-douce);
    white-space: nowrap;
}

/* Ligne de description secondaire dans une .rangee-liste (ex: extrait d'un
 * exposé sommaire sous une "mesure phare" de loi_detail.html) : forcée sur sa
 * propre ligne pleine largeur plutôt que de participer au flex-wrap comme un
 * élément de plus, sans quoi un texte long se retrouverait mal placé entre
 * le lien et .meta. */
.rangee-liste-detail {
    flex-basis: 100%;
    color: var(--qvq-encre-douce);
}

/* Variante "compacte" de .rangee-liste : .meta collé au lien (léger espacement)
 * plutôt que poussé à l'extrémité droite de la ligne (`margin-left: auto`,
 * comportement par défaut de .rangee-liste .meta). Le renvoi à droite ne se
 * justifie que pour une VRAIE liste à parcourir (plusieurs dizaines de lignes
 * empilées, où l'alignement en colonne aide à comparer visuellement — voir
 * les 4 pages de liste, ou "Élus membres" de parti_detail.html) : sur une
 * poignée de lignes (appartenances/rôles d'un élu, vote sur l'ensemble/
 * mesures phares d'une loi), le même espacement ne fait que créer un grand
 * vide illisible entre le lien et sa métadonnée (signalé par l'utilisateur,
 * 2026-08-05). Utilisée sur elu_detail.html (appartenances, rôles) et
 * loi_detail.html (rôles, résumé) — PAS sur les 4 pages de liste ni
 * "Élus membres"/"Tous les scrutins", qui gardent l'alignement en colonne. */
.liste-compacte .meta {
    margin-left: 0.6rem;
}

/* Pagination : remplace le <ul> à puces par défaut de Pico pour ce cas
 * précis (Précédent / Page X sur Y / Suivant), centré, police données pour
 * les chiffres. */
nav.pagination-liste ul {
    display: flex;
    list-style: none;
    justify-content: center;
    align-items: center;
    gap: 1.5rem;
    margin: 1.5rem 0 0;
    padding: 0;
    font-family: var(--qvq-police-donnees);
    font-size: 0.85rem;
}

/* États vides ("Aucun X pour l'instant") : en retrait visuel, pas une
 * erreur — cohérent avec --qvq-encre-douce utilisé pour tout texte
 * secondaire ailleurs dans la refonte. */
.etat-vide {
    color: var(--qvq-encre-douce);
}

/* Bascule "Afficher les anciens..." (parti_liste, et parti_detail existant) :
 * couleur d'accent cohérente avec le reste des liens de la refonte, pas la
 * couleur de texte par défaut du <summary> Pico. */
main details summary {
    cursor: pointer;
    color: var(--qvq-marine);
}

/* --- Fiches détail (élu/loi/scrutin) : troisième passe de la refonte
 * graphique (2026-08-05), après l'accueil/habillage commun et les pages de
 * liste. `.fiche-entete` habille le `<hgroup>` titre+méta commun aux 3
 * (parti_detail.html n'a qu'un h1 nu, déjà couvert par `main > h1`). */
.fiche-entete h1 {
    font-family: var(--qvq-police-affichage);
    font-weight: 600;
    font-size: clamp(1.6rem, 3.4vw, 2.2rem);
}

.fiche-entete p {
    color: var(--qvq-encre-douce);
    font-size: 0.95rem;
}

/* Tableaux de données (historique de vote d'un élu, votes d'un scrutin) :
 * seuls tableaux du site, remplace le style par défaut de Pico classless par
 * quelque chose de cohérent avec le reste de la refonte (en-tête façon
 * étiquette, filets plutôt que zébrage, survol de ligne). */
main table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.92rem;
}

main table th {
    text-align: left;
    font-family: var(--qvq-police-donnees);
    font-size: 0.72rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--qvq-ligne);
}

/* Étiquette/valeur empilées dans un .encart (ex: "Identité" sur elu_detail,
 * "Informations générales" sur loi_detail) : même langage visuel que
 * main table th ci-dessus (étiquette en majuscules, police données,
 * discrète) plutôt qu'un <strong> qui rivalise en poids visuel avec la
 * valeur juste en dessous — signalé par l'utilisateur (2026-08-09) sur les
 * premiers encarts de la refonte des fiches détail. */
.encart-info dt {
    font-family: var(--qvq-police-donnees);
    font-size: 0.72rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--qvq-encre-douce);
    margin: 0 0 0.2rem;
}

.encart-info dd {
    margin: 0 0 1rem;
}

.encart-info dd:last-child {
    margin-bottom: 0;
}

main table td {
    padding: 0.55rem 0.75rem;
    border-bottom: 1px solid var(--qvq-ligne);
}

main table tbody tr:hover {
    background: var(--qvq-carte-tint);
}

/* Exposé sommaire (citation officielle d'un amendement, scrutin_detail.html) :
 * seul blockquote du site, traité comme une vraie citation (filet, italique)
 * plutôt que le cadre plein de Pico par défaut. */
main blockquote {
    border-left: 3px solid var(--qvq-ligne);
    margin-left: 0;
    padding: 0.3rem 0 0.3rem 1.15rem;
    color: var(--qvq-encre-douce);
    font-style: italic;
}

/* Histogramme "répartition par parti" de la page scrutin (scrutin_detail.html) :
 * une barre verticale par parti, ordonnées de gauche à droite selon
 * Parti.position_politique (façon hémicycle), hauteur totale proportionnelle au
 * nombre de votes du parti, segments internes empilés pour/contre/neutre.
 *
 * .hemicycle-panneau (ajouté à la refonte graphique, 2026-08-05) : enveloppe
 * légende + histogramme dans un encart teinté (--qvq-carte-tint), même
 * langage visuel que .filtres/.encart ailleurs sur le site — jusque-là
 * l'histogramme flottait sur fond blanc, seul élément de la page à ne pas
 * avoir reçu de traitement de "panneau" (signalé par l'utilisateur : mal
 * intégré au reste du graphisme). Ne touche PAS aux couleurs sémantiques
 * pour/contre/neutre (.hemicycle-segment-*) ni à la mécanique JS/Django
 * existante (hauteurs en %, repère d'effectif) — uniquement l'habillage. */
.hemicycle-panneau {
    background: var(--qvq-carte-tint);
    border-radius: var(--pico-border-radius);
    padding: 1.25rem 1.5rem 0.5rem;
}

.hemicycle-cles {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem 1.25rem;
    font-size: 0.9rem;
}

.hemicycle-cle {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}

.hemicycle-pastille {
    display: inline-block;
    width: 0.8rem;
    height: 0.8rem;
    border-radius: 2px;
}

/* Repère de légende pour .hemicycle-repere : un segment de ligne pointillée
 * plutôt qu'un carré plein, pour rester visuellement cohérent avec le repère
 * affiché dans l'histogramme (ligne, pas une aire colorée). */
.hemicycle-pastille-repere {
    display: inline-block;
    width: 0.8rem;
    height: 0;
    border-top: 2px dashed var(--pico-muted-color);
}

.hemicycle {
    display: flex;
    align-items: stretch;
    gap: 0.5rem;
    height: 260px;
    padding: 0.5rem 0.25rem 0;
    overflow-x: auto;
}

.hemicycle-parti {
    display: flex;
    flex-direction: column;
    flex: 1 1 0;
    min-width: 3rem;
}

/* Zone qui grandit pour occuper toute la hauteur disponible au-dessus de la
 * légende : c'est par rapport à SA hauteur (définie par flexbox, pas fixée en
 * dur) que .hemicycle-bar calcule son pourcentage de hauteur. */
.hemicycle-track {
    display: flex;
    align-items: flex-end;
    justify-content: center;
    flex: 1 1 auto;
    /* Ancre .hemicycle-repere (position absolute) à cette boîte plutôt qu'à un
     * ancêtre plus large : sans ça son bottom/left/right se calculeraient par
     * rapport au premier ancêtre positionné trouvé, potentiellement .hemicycle. */
    position: relative;
}

.hemicycle-bar {
    display: flex;
    /* column-reverse : le premier segment (pour) empile depuis le bas de la
     * barre, comme un histogramme classique plutôt que depuis le haut. */
    flex-direction: column-reverse;
    width: 100%;
    max-width: 2.5rem;
    border-radius: 4px 4px 0 0;
    overflow: hidden;
}

/* Repère "effectif mobilisable" (nombre d'élus du parti à la date du scrutin,
 * indépendant des votes réellement enregistrés) : une ligne pointillée dont la
 * hauteur partage l'échelle de .hemicycle-bar (même diviseur votes_par_parti_max),
 * pas une aire colorée — évite toute confusion avec les segments pour/contre/neutre
 * empilés dans la barre à côté. position: absolute pour ne pas participer au
 * centrage flex de .hemicycle-track (qui ne doit régir que .hemicycle-bar). */
.hemicycle-repere {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    border-top: 2px dashed var(--pico-muted-color);
    pointer-events: none;
}

.hemicycle-segment-pour {
    background-color: #2e7d32;
}

.hemicycle-segment-contre {
    background-color: #c62828;
}

.hemicycle-segment-neutre {
    background-color: #9e9e9e;
}

.hemicycle-legende {
    flex: 0 0 auto;
    margin-top: 0.4rem;
    text-align: center;
    font-size: 0.8rem;
    line-height: 1.25;
}

.hemicycle-total {
    font-family: var(--qvq-police-donnees);
    font-variant-numeric: tabular-nums;
    color: var(--pico-muted-color);
}

/* Pastille "AN"/"Sénat" (voir _badge_chambre.html) : sans elle, seul le texte
 * "Assemblée nationale"/"Sénat" distinguait les deux chambres dans les listes
 * de lois et de scrutins — peu visible en lecture rapide, et carrément absent
 * de certaines listes (accueil, liste des lois). Couleurs volontairement à
 * l'écart du vert/rouge/gris déjà utilisés ailleurs pour pour/contre/neutre
 * (.hemicycle-segment-*) : une pastille de chambre rouge à côté d'un résultat
 * "contre" rouge aurait suggéré un lien qui n'existe pas entre les deux.
 * Contrastes texte blanc vérifiés par luminance relative WCAG 2.x :
 *   - AN (#000091, bleu institutionnel "Marianne") : 14,9:1
 *   - Sénat (#7a1f3d, bordeaux) : 10,0:1
 *   - UE (#003399, bleu institutionnel du drapeau européen) : 10,9:1
 * Bien au-dessus du seuil AA (4,5:1) déjà visé ailleurs dans ce fichier. */
.badge-chambre {
    display: inline-block;
    padding: 0.05rem 0.5rem;
    border-radius: 999px;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.6;
    color: #fff;
    white-space: nowrap;
}

.badge-chambre-an {
    background-color: #000091;
}

.badge-chambre-senat {
    background-color: #7a1f3d;
}

.badge-chambre-ue {
    background-color: #003399;
}

/* Pastille "Ancien mandat" (voir _badge_mandat_ancien.html) : contours
 * (pas de fond plein) plutôt qu'une couleur pleine comme .badge-chambre-* —
 * volontairement en retrait visuellement (info secondaire, pas une catégorie
 * à parcourir comme la chambre) et surtout pour ne réutiliser AUCUNE couleur
 * déjà chargée de sens ailleurs sur le site (bleu/bordeaux des chambres,
 * vert/rouge/gris pour/contre/neutre de l'hémicycle — .hemicycle-segment-*) :
 * un badge "ancien" ne doit suggérer ni une chambre, ni un résultat de vote.
 * --pico-muted-color hérite déjà du contraste WCAG AA vérifié en haut de ce
 * fichier, pas de nouveau calcul de contraste nécessaire. */
.badge-mandat-ancien {
    display: inline-block;
    padding: 0.05rem 0.5rem;
    border-radius: 999px;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.6;
    color: var(--pico-muted-color);
    border: 1px solid var(--pico-muted-color);
    white-space: nowrap;
}
