/*
 * Composants. Règle : aucune valeur en dur (couleur, police, taille, espacement) — uniquement des jetons (jetons.css).
 * Sections dans l'ordre de docs/design.md. Toute nouvelle classe est ajoutée à /admin/design et à la doc.
 */
@layer composants {
	/* --- Base */
	* { box-sizing: border-box; }
	/* L'attribut hidden doit toujours gagner (les boutons et les listes en flex/inline-flex l'écrasaient). */
	[hidden] { display: none !important; }
	html { font: var(--taille)/var(--interligne) var(--police); background: var(--fond-page); color: var(--texte); -webkit-font-smoothing: antialiased; }
	body { max-width: var(--largeur-page); margin: 0 auto; padding: 0 var(--gouttiere) var(--e5); }
	/* Liens : tout passe par les jetons --lien-* (réglables par thème ou par l'admin). Spécificité nulle (:where) : tout composant qui retire
	   le soulignement (onglets, menus, boutons) l'emporte, survol compris. */
	:where(a) { color: var(--lien); font-weight: var(--lien-graisse); text-decoration-line: var(--lien-ligne); text-decoration-color: var(--lien-trait); text-decoration-thickness: var(--lien-epaisseur); text-underline-offset: var(--lien-decalage); }
	:where(a:hover, a:focus-visible) { text-decoration-line: underline; text-decoration-color: var(--lien-trait-survol); text-decoration-thickness: var(--lien-epaisseur-survol); }
	/* Texte courant : toujours souligné, même si --lien-ligne vaut none (distinction autrement que par la couleur). */
	:where(p, li, dd, blockquote, td, figcaption) > a:where(:not(.bouton, .pastille, .puce, .icone, .icone-action, .titre)) { text-decoration-line: underline; }
	:focus-visible { outline: var(--contour-focus); outline-offset: 2px; }
	h1, h2, h3 { font-family: var(--police-titres); font-weight: var(--graisse-titres); line-height: var(--interligne-titres); letter-spacing: var(--approche-titres); }
	h1 { font-size: var(--taille-h1); margin: var(--e5) 0 var(--e4); }
	h2 { font-size: var(--taille-h2); margin: var(--e5) 0 var(--e3); }
	h3 { font-size: var(--taille-h3); margin: var(--e4) 0 var(--e2); }
	h1 small, h2 small, h3 small { font-weight: normal; letter-spacing: normal; }
	p { margin: var(--e2) 0; }
	small, .doux { color: var(--texte-doux); }
	code { font: .9em var(--police-mono); background: var(--surface); padding: 0 var(--e1); border-radius: var(--rayon-petit); }
	/* Garde-fou (mobile 360 px) : rien ne dépasse de l'écran ; un long mot, une URL ou une image se replie. Les défilements restent
	   dans leur conteneur (.defile, pre, .frise-zone), jamais dans la page. Pas de overflow-x sur body : il casserait le menu collant.
	   `break-word` (et non `anywhere`) : un mot n'est coupé que s'il ne tient pas seul sur sa ligne, et la largeur minimale des cellules, des colonnes
	   de grille et des éléments flex reste celle du plus long mot (sinon les tableaux coupent « Annu|aire »). `anywhere` reste réservé au code et aux
	   identifiants (et aux blocs qui le déclarent : adresses, lecteur, notes). */
	body { overflow-wrap: break-word; }
	code, kbd, samp { overflow-wrap: anywhere; }
	img, svg, video, canvas, iframe { max-width: 100%; }
	pre { max-width: 100%; overflow-x: auto; }
	main, header, footer { min-width: 0; }
	header .logo { min-width: 0; max-width: 100%; }

	/* --- En-tête (fixé en haut), navigation, pied de page */
	/* Onglets de la hauteur de l'en-tête : l'onglet actif porte un filet d'accent et le texte plein, les autres le texte doux. À droite : alertes
	   (pastille du nombre non lu) et menu compte (details : Compte, Admin, Déconnexion). Sous 64 rem, le tout se replie derrière « Menu » — case à cocher
	   et details, donc sans JavaScript ; app.js ajoute seulement la fermeture à Échap. */
	header { position: sticky; top: 0; z-index: 10; display: flex; flex-wrap: wrap; align-items: center; column-gap: var(--e4); min-height: var(--hauteur-entete); background: var(--fond-entete); border-bottom: var(--bordure) solid var(--ligne);
		/* Fond et filet peints sur toute la largeur de la fenêtre (le contenu qui défile dessous, ex. dégradé du héros de la vitrine, ne transparaît plus
		   de part et d'autre de la colonne : en-tête « coupé ») : border-image débordant horizontalement, débordement d'encre seulement (aucun défilement). */
		border-image: linear-gradient(to top, var(--ligne) var(--bordure), var(--fond-entete) 0) 0 fill / 0 / 0 100vmax; }
	header .logo { display: inline-flex; align-items: center; gap: var(--e2); min-height: var(--hauteur-entete); font-size: var(--taille-logo); font-weight: var(--graisse-titres); letter-spacing: var(--approche-titres); color: var(--texte); text-decoration: none; margin-right: var(--e3); }
	header .marque { display: inline-grid; place-items: center; width: 1.6em; height: 1.6em; border-radius: var(--rayon); background: var(--accent); color: var(--sur-accent); font-size: .8em; }
	header .logo-image { display: block; height: var(--hauteur-logo); width: auto; max-width: 12rem; object-fit: contain; }
	.menu-bascule, .menu-bouton { display: none; }
	.menu-corps { display: flex; flex: 1; align-items: center; justify-content: space-between; gap: var(--e3); min-width: 0; }
	header nav { display: flex; align-items: center; gap: var(--e1); }
	header nav a, header nav summary, header button.nav { display: inline-flex; align-items: center; gap: var(--e1); min-height: var(--hauteur-entete); padding: 0 var(--e3); border: 0; border-bottom: 2px solid transparent; border-radius: var(--rayon) var(--rayon) 0 0; background: none; color: var(--texte-doux); font: inherit; font-weight: var(--graisse-forte); text-decoration: none; cursor: pointer; }
	header nav a:hover, header nav summary:hover, header button.nav:hover { background: var(--surface); color: var(--texte); }
	header nav a[aria-current], header details[data-actif] > summary { color: var(--texte); border-bottom-color: var(--accent); }
	header nav a.bouton.principal { min-height: var(--hauteur-champ); border: var(--bordure) solid var(--accent); border-radius: var(--rayon); color: var(--sur-accent); background: var(--accent); }
	header nav form.inline { display: block; }
	details.menu-compte { position: relative; }
	details.menu-compte > summary { list-style: none; }
	details.menu-compte > summary::-webkit-details-marker { display: none; }
	/* Chevron des menus déroulants de l'en-tête (compte, groupes) : pointe vers le bas, pivote vers le haut à l'ouverture. */
	:is(details.menu-compte, header nav.principale details.menu-groupe) > summary::after { content: ""; flex: none; width: .4rem; height: .4rem; margin: 0 .1rem .2rem .15rem; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; opacity: .7; transform: rotate(45deg); transition: transform .2s ease, margin .2s ease; }
	:is(details.menu-compte, header nav.principale details.menu-groupe)[open] > summary::after { margin: .2rem .1rem 0 .15rem; transform: rotate(-135deg); }
	@media (prefers-reduced-motion: reduce) { :is(details.menu-compte, header nav.principale details.menu-groupe) > summary::after { transition: none; } }
	details.menu-compte[open] > summary { background: var(--surface); color: var(--texte); }
	.menu-panneau { position: absolute; right: 0; top: 100%; z-index: 20; display: grid; min-width: 14rem; padding: var(--e2); background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	.menu-panneau .identite { margin: 0; padding: var(--e1) var(--e3) var(--e2); border-bottom: var(--bordure) solid var(--ligne); color: var(--texte-doux); font-size: var(--taille-petite); overflow-wrap: anywhere; }
	header .menu-panneau :is(a, button.nav) { width: 100%; min-height: 2.25rem; justify-content: flex-start; border-bottom: 0; border-radius: var(--rayon); }
	header .menu-panneau a[aria-current] { background: var(--accent-fond); }
	@media (max-width: 64rem) {
		.menu-bascule { display: block; position: absolute; right: 0; width: 1px; height: 1px; margin: 0; opacity: 0; }
		.menu-bouton { display: inline-flex; align-items: center; gap: var(--e2); margin-left: auto; min-height: var(--hauteur-champ); padding: 0 var(--e3); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); font-weight: var(--graisse-forte); cursor: pointer; }
		.menu-bouton::before { content: "☰"; }
		.menu-bascule:checked + .menu-bouton { background: var(--surface); }
		.menu-bascule:checked + .menu-bouton::before { content: "✕"; }
		.menu-bascule:focus-visible + .menu-bouton { outline: var(--contour-focus); outline-offset: 2px; }
		.menu-corps { display: none; flex: 0 0 100%; flex-direction: column; align-items: stretch; justify-content: flex-start; gap: var(--e2); padding: var(--e2) 0 var(--e3); max-height: calc(100dvh - var(--hauteur-entete)); overflow-y: auto; }
		.menu-bascule:checked ~ .menu-corps { display: flex; }
		header nav { flex-direction: column; align-items: stretch; gap: 0; }
		header nav.compte { padding-top: var(--e2); border-top: var(--bordure) solid var(--ligne); }
		header nav a, header nav summary, header button.nav { min-height: 2.75rem; border-bottom: 0; border-radius: var(--rayon); }
		header nav a[aria-current], header details[data-actif] > summary { background: var(--accent-fond); }
		header nav a.bouton.principal { justify-content: center; margin-top: var(--e2); }
		.menu-panneau { position: static; padding: 0 0 0 var(--e3); border: 0; }
		.menu-panneau .identite { border-bottom: 0; }
	}
	.compteur { display: inline-block; min-width: 1.4em; padding: 0 .4em; border-radius: var(--rayon-pastille); background: var(--accent); color: var(--sur-accent); font-size: var(--taille-petite); line-height: 1.4; text-align: center; font-variant-numeric: tabular-nums; }
	nav.sous { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e4); margin: var(--e3) 0 0; border-bottom: var(--bordure) solid var(--ligne); }
	nav.sous a { color: var(--texte-doux); font-weight: var(--graisse-forte); text-decoration: none; padding: var(--e2) 0; margin-bottom: calc(-1 * var(--bordure)); border-bottom: 2px solid transparent; }
	nav.sous a.icone-action { margin-left: auto; display: inline-flex; align-items: center; justify-content: center; min-width: 2.25rem; min-height: 2.25rem; padding: 0 var(--e2); border-bottom-color: transparent; border-radius: var(--rayon); }
	nav.sous a.icone-action:hover { background: var(--surface); }
	nav.sous a:hover { color: var(--texte); }
	nav.sous a[aria-current] { color: var(--texte); border-bottom-color: var(--accent); }
	/* Onglets d'un dossier (Parcours | Scrutins | Amendements | Notes) : même motif, un peu d'air autour */
	nav.sous.onglets-dossier { margin: var(--e3) 0 var(--e4); }
	/* Pied de page : trois blocs (marque, liens, apparence). Cibles de clic d'au moins 2,25 rem, état choisi marqué par plus que la couleur
	   (coche, fond, graisse), titres de bloc pour les lecteurs d'écran, liens soulignés. */
	footer { margin-top: var(--e5); padding: var(--e5) 0 var(--e4); border-top: var(--bordure) solid var(--ligne); font-size: var(--taille-tableau); color: var(--texte-doux); }
	footer .pied { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr); gap: var(--e5); align-items: start; }
	@media (max-width: 52rem) { footer .pied { grid-template-columns: minmax(0, 1fr); gap: var(--e4); } }
	footer h2 { margin: 0 0 var(--e2); font-size: var(--taille-petite); font-weight: var(--graisse-forte); text-transform: uppercase; letter-spacing: .04em; color: var(--texte); }
	footer .pied-marque b { color: var(--texte); font-size: var(--taille-h3); }
	footer .pied-marque p { margin: var(--e1) 0; max-width: 28rem; }
	footer .pied-liens ul { list-style: none; margin: 0; padding: 0; }
	footer .pied-liens a, footer button.lien-bouton { display: inline-flex; align-items: center; min-height: 2.25rem; color: var(--texte); }
	footer button.lien-bouton { border: 0; background: none; padding: 0; font: inherit; text-decoration: underline; text-decoration-color: var(--lien-trait); text-decoration-thickness: var(--lien-epaisseur); text-underline-offset: var(--lien-decalage); cursor: pointer; }
	footer button.lien-bouton:is(:hover, :focus-visible) { text-decoration-color: var(--lien-trait-survol); }
	footer .pied-liens a:hover, footer button.lien-bouton:hover { color: var(--lien); }
	:where(footer, .edition-dialogue) .segments { display: inline-flex; border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); overflow: hidden; }
	:where(footer, .edition-dialogue) .segments button { min-height: 2.25rem; min-width: 4.5rem; border: 0; border-radius: 0; background: var(--fond); color: var(--texte); font-weight: normal; }
	:where(footer, .edition-dialogue) .segments button + button { border-left: var(--bordure) solid var(--ligne); }
	:where(footer, .edition-dialogue) .segments button:hover { background: var(--surface); }
	:where(footer, .edition-dialogue) .segments button[aria-pressed="true"] { background: var(--accent-fond); color: var(--texte); font-weight: var(--graisse-forte); }
	:where(footer, .edition-dialogue) .segments button[aria-pressed="true"]::before { content: "✓"; margin-right: var(--e1); color: var(--accent); }
	footer .aide-segments { margin: var(--e2) 0 0; font-size: var(--taille-petite); }
	/* Lien d'évitement : invisible tant qu'il n'a pas le focus clavier. */
	a.evitement { position: absolute; left: var(--e3); top: -4rem; z-index: 200; padding: var(--e2) var(--e4); background: var(--fond); color: var(--texte); border: 2px solid var(--accent); border-radius: var(--rayon); }
	a.evitement:focus { top: var(--e2); }
	main:focus { outline: none; }

	/* --- Messages. Fond teinté uni, sans liseré : le ton se lit à la couleur du fond et au texte, pas à un trait décoratif. */
	.banniere, .ok, .erreur { padding: var(--e3) var(--e4); border-radius: var(--rayon); }
	.banniere { background: var(--accent-fond); margin: var(--e3) 0 0; }
	.banniere.attention { background: var(--attention-fond); color: var(--attention); }
	.retour-message { white-space: pre-wrap; max-width: 40rem; }
	.conditions-beta { max-height: 60vh; overflow-y: auto; border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); padding: var(--e3) var(--e4); }
	.maintenance { max-width: 40rem; margin: 15vh auto 0; padding: 0 var(--e4); }
	.ok { background: var(--succes-fond); }
	.erreur { background: var(--danger-fond); color: var(--danger); }

	/* --- Tableaux. Une liste est une carte (bordure fine, coins arrondis) ; liens sans soulignement dans les cellules (au survol). */
	table { width: 100%; border-collapse: collapse; margin: var(--e2) 0; font-size: var(--taille-tableau); }
	th, td { text-align: left; padding: var(--e2) var(--e3); border-bottom: var(--bordure) solid var(--ligne); vertical-align: top; }
	/* En-têtes : retour à la ligne (jamais de chevauchement dans une colonne fixe) ; les nombres restent sur une ligne. */
	th { font-size: var(--taille-petite); font-weight: var(--graisse-forte); color: var(--texte-doux); white-space: normal; overflow-wrap: break-word; vertical-align: bottom; }
	/* En-têtes de ligne (th du corps et du pied) : alignés en haut, comme les cellules de leur ligne (le bas ne vaut que pour les en-têtes de colonne). */
	:is(tbody, tfoot) th { vertical-align: top; }
	th.n { white-space: nowrap; }
	.defile, :not(.defile) > table.navigable { border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); margin: var(--e3) 0; }
	.defile { overflow-x: auto; }
	.defile > table { margin: 0; }
	:not(.defile) > table.navigable { border-collapse: separate; border-spacing: 0; }
	.defile thead th, table.navigable thead th { background: var(--surface); }
	.defile tbody tr:last-child > :is(td, th), table.navigable tbody tr:last-child > :is(td, th) { border-bottom: 0; }
	/* Pied de tableau (total) : filet pleine largeur au-dessus, aucun en dessous (le cadre de la carte le borde) ; libellé en couleur de texte. */
	tfoot tr:first-child > :is(td, th) { border-top: var(--bordure) solid var(--ligne); }
	:is(.defile, table.navigable) tfoot tr:last-child > :is(td, th) { border-bottom: 0; }
	tfoot th { color: var(--texte); }
	/* Liens des cellules : couleur de lien et soulignement discret (repérables sans dépendre de la seule couleur), soulignement plein au survol et au focus.
	   :where() garde une spécificité faible (a.doux reste doux) ; boutons, pastilles, puces et icônes gardent leur forme. */
	:is(td, tbody th) a:where(:not(.bouton, .pastille, .puce, .icone, .icone-action)) { color: var(--lien); text-decoration-line: underline; text-decoration-color: var(--lien-trait); }
	:is(td, tbody th) a:where(:not(.bouton, .pastille, .puce, .icone, .icone-action)):is(:hover, :focus-visible) { text-decoration-color: var(--lien-trait-survol); }
	/* Dans une liste, le titre de la ligne (a.titre, ou premier lien de la première cellule) est en couleur de texte, sans soulignement : la ligne entière
	   se lit comme cliquable (j/k) ; bleu et souligné au survol et au focus. Les autres liens de la ligne (sources, ministère…) gardent la règle ci-dessus. */
	table.navigable tbody :is(a.titre, tr > :first-child > a:first-child) { color: var(--texte); text-decoration-line: none; }
	table.navigable tbody :is(a.titre, tr > :first-child > a:first-child):is(:hover, :focus-visible) { color: var(--lien); text-decoration-line: underline; text-decoration-color: currentColor; }
	/* Colonnes à largeur fixe : la mise en page ne dépend ni du tri ni de la longueur du contenu (listes paginées). */
	table.stable { table-layout: fixed; min-width: 40rem; }
	table.stable td { overflow-wrap: anywhere; }
	/* Une pastille ne déborde jamais de sa cellule (sinon la liste défile horizontalement) : elle passe à la ligne si la colonne est étroite. */
	/* Badge passé à la ligne : marges verticales et interligne pour qu'il ne touche ni le filet ni le texte voisin. */
	td .pastille { max-width: 100%; white-space: nowrap; overflow-wrap: break-word; vertical-align: top; margin-block: .15em; line-height: 1.35; }
	/* Mobile : un tableau hors `.defile` ne déborde pas de l'écran, ses en-têtes passent à la ligne (les tableaux larges sont dans `.defile`). */
	@media (max-width: 40rem) {
		:where(:not(.defile) > table) th { white-space: normal; }
		td .pastille { white-space: normal; }
		:where(:not(.defile) > table.stable) { min-width: 0; }
		/* Filet : un tableau resté trop large défile dans son propre cadre, jamais la page. */
		:where(main > table, main :not(.defile) > table) { display: block; max-width: 100%; overflow-x: auto; }
	}
	/* « * » et « * * » d'un rapport : filet ornemental centré, pas des paragraphes d'une étoile. */
	/* Numéro de page imprimé : repère discret en marge du texte. Notes de bas de page : corps réduit, renvoi en exposant. */
	p.num-page { margin: var(--e4) 0 var(--e2); text-align: right; font-size: var(--taille-petite); color: var(--texte-doux); font-variant-numeric: tabular-nums; }
	p.note-bas { margin: var(--e2) 0; font-size: var(--taille-tableau); color: var(--texte-doux); overflow-wrap: anywhere; }
	p.note-bas sup { margin-right: var(--e1); font-weight: var(--graisse-forte); }
	a.renvoi-note { text-decoration: none; }
	.saisines-cc { margin: var(--e2) 0; padding-left: var(--e4); }
	hr.etoiles { border: 0; height: auto; margin: var(--e5) 0; text-align: center; }
	hr.etoiles::after { content: "*  *  *"; color: var(--texte-doux); letter-spacing: .4em; }
	col.c-n { width: 6rem; }
	col.c-date { width: 9rem; }
	col.c-statut { width: 16rem; }
	col.c-article { width: 9rem; }
	col.c-sort { width: 10rem; }
	col.c-formation { width: 14rem; }
	/* Actes de l'Union : dates et numéros étroits, titre (colonne restante) large. */
	table.actes-ue th:nth-child(1) { width: 7.5rem; }
	table.actes-ue th:nth-child(2) { width: 13.5rem; }
	table.actes-ue th:nth-child(4) { width: 12.5rem; }
	td.n, th.n { text-align: right; font-variant-numeric: tabular-nums; }
	table.navigable tbody tr:hover { background: var(--surface); }
	tr[aria-selected="true"], table.navigable tbody tr[aria-selected="true"] { background: var(--accent-fond); }

	/* --- Formulaires */
	/* Colonne minmax(0, 1fr) : un long mot (adresse en lien) passe à la ligne au lieu d'élargir le formulaire au-delà de l'écran. */
	form.bloc { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--e4); max-width: var(--largeur-formulaire); margin: var(--e3) 0; }
	form.inline { display: inline; }
	/* Ligne de boutons : un <form> ne peut pas être dans un <p> (le navigateur ferme le paragraphe). */
	.actions { margin: var(--e3) 0; }
	/* Les deux recherches de l'accueil : côte à côte (une colonne sur petit écran), champs qui remplissent leur moitié. */
	.recherches { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--e3) var(--e5); margin: var(--e3) 0; }
	@media (max-width: 52rem) { .recherches { grid-template-columns: minmax(0, 1fr); } }
	.recherches > form.ligne { margin: 0; flex-wrap: nowrap; }
	.recherches label { flex: 1; min-width: 0; }
	.recherches input[type=search] { min-width: 0; width: 100%; }
	form.ligne { display: flex; flex-wrap: wrap; gap: var(--e2) var(--e3); align-items: end; margin: var(--e3) 0; }
	/* Variante discrète (Journal officiel) : même fond gris que les autres filtres, mais plus compacte. */
	form.filtres.discret { padding: var(--e2) var(--e3); font-size: var(--taille-petite); }
	form.filtres.discret input[type=search] { min-width: 12rem; }
	form.filtres.discret :is(select, input, button) { min-height: 2rem; height: 2rem; }
	/* Case à cocher d'une barre de filtres : même hauteur que les champs, centrée sur leur ligne. */
	form.filtres label.case, form.filtres > label:has(> input[type=checkbox]), form.ligne > label:has(> input[type=checkbox]) { display: flex; align-items: center; gap: var(--e2); align-self: end; min-height: var(--hauteur-champ); font-weight: normal; }
	form.filtres.discret label.case, form.filtres.discret > label:has(> input[type=checkbox]) { min-height: 2rem; }
	/* Libellé en flex (case ou radio d'une barre de filtres, groupe natures inclus) : pas de retrait suspendu, il décalerait le texte sur la case. */
	form.filtres :is(label.case, label:has(> input[type=checkbox])) { padding-left: 0; text-indent: 0; }
	/* Toute case ou radio d'une barre de filtres (groupes « natures » de la frise et du graphe compris, avec ou sans .case) : case centrée sur la
	   ligne de texte (flex), sans retrait suspendu ni décalage vertical hérité des formulaires en bloc. */
	form.filtres label:has(> input[type=checkbox], > input[type=radio]) { display: flex; align-items: center; gap: var(--e2); padding-left: 0; text-indent: 0; }
	form.filtres label > :is(input[type=checkbox], input[type=radio]) { flex: none; margin: 0; vertical-align: baseline; }
	label.case input { margin: 0; }
	/* Filtres d'une liste : une barre sur fond de surface, au-dessus des résultats. */
	form.filtres { padding: var(--e3); background: var(--surface); border-radius: var(--rayon-grand); }
	/* Les contrôles d'une barre de filtres se justifient sur une grille : colonnes de même largeur, tous les champs et listes remplissent leur cellule,
	   libellés alignés en haut et contrôles alignés en bas d'une même ligne ; le bouton garde sa largeur propre. */
	form.filtres { display: grid; grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); gap: var(--e3) var(--e4); align-items: end; }
	form.filtres :is(select, textarea, input:not([type=checkbox], [type=radio], [type=hidden])) { width: 100%; min-width: 0; }
	/* Champs et boutons d'une barre de filtres : même hauteur fixe (alignés en bas), quel que soit le type de contrôle. */
	form.filtres :where(select, input:not([type=checkbox], [type=radio], [type=hidden]), button) { height: var(--hauteur-champ); box-sizing: border-box; }
	form.filtres > button { justify-self: start; }
	form.filtres > details.avance { grid-column: 1 / -1; }
	label { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--e1); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	label small, label:has(input[type=checkbox]) { font-weight: normal; }
	/* Case ou radio : libellé en bloc (le texte coule normalement, liens compris) ; la case est posée à gauche du premier mot. */
	label:has(> input[type=checkbox]), label:has(> input[type=radio]) { display: block; font-weight: normal; font-size: var(--taille-tableau); line-height: 1.4; }
	/* Retrait suspendu : les lignes suivantes du libellé s'alignent sur le texte, pas sous la case. */
	:where(form.bloc, fieldset) label:has(> input[type=checkbox]:first-child, > input[type=radio]:first-child) { padding-left: calc(1.05em + var(--e2)); text-indent: calc(-1.05em - var(--e2)); }
	:where(form.bloc, fieldset) label:has(> input:first-child) > input { margin-right: var(--e2); }
	label > input[type=checkbox], label > input[type=radio] { width: 1.05em; height: 1.05em; margin: 0 var(--e2) 0 0; vertical-align: -.15em; accent-color: var(--accent); }
	/* Fieldset : cadre fin et arrondi, légende en petit libellé ; groupe de cases ou de radios aéré. */
	fieldset { min-width: 0; margin: var(--e3) 0; padding: var(--e2) var(--e4) var(--e3); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	legend { padding: 0 var(--e2); font-size: var(--taille-petite); font-weight: var(--graisse-forte); color: var(--texte-doux); }
	fieldset label:has(> input[type=checkbox]), fieldset label:has(> input[type=radio]) { margin: var(--e1) 0; }
	/* Arbre à cases (admin/sources) : liste sans marqueur natif sous la case, retrait par niveau. */
	ul.arbre-sources, ul.arbre-sources ul { list-style: none; margin: 0; padding-left: var(--e4); }
	ul.arbre-sources { padding-left: 0; }
	ul.arbre-sources li { padding: var(--e1) 0; }
	input, select, textarea, button { font: inherit; color: inherit; }
	select { max-width: 100%; }
	input, select, textarea { padding: var(--e1) var(--e3); border: var(--bordure) solid var(--ligne); background: var(--fond); border-radius: var(--rayon); font-weight: normal; font-size: var(--taille-tableau); }
	input:not([type=checkbox], [type=radio]), select, button, a.bouton { min-height: var(--hauteur-champ); }
	input:hover, select:hover, textarea:hover { border-color: var(--texte-doux); }
	input:focus, select:focus, textarea:focus { border-color: var(--accent); outline: none; box-shadow: var(--anneau-focus); }
	input[type=search] { min-width: min(16rem, 100%); }
	input.court { width: 6rem; min-width: 0; }
	/* Champs d'un formulaire (form.bloc) : même hauteur (--hauteur-champ), pleine colonne, même bordure, rayon et focus, quel que soit le type
	   (texte, e-mail, nombre, liste, fichier). Une zone de texte garde sa hauteur de saisie. Sans cela, nombres et listes n'avaient ni la même taille ni la même largeur. */
	form.bloc :is(input:not([type=checkbox], [type=radio], [type=hidden]), select) { width: 100%; min-width: 0; height: var(--hauteur-champ); box-sizing: border-box; }
	form.bloc textarea { width: 100%; min-width: 0; box-sizing: border-box; }

	/* --- Boutons. Le bouton d'envoi d'un formulaire (form.bloc, form.ligne) est le bouton principal ; les autres sont secondaires.
	   a.bouton : un lien qui a l'air d'un bouton (« Créer un compte »). */
	button, a.bouton { display: inline-flex; align-items: center; justify-content: center; gap: var(--e1); padding: 0 var(--e3); border: var(--bordure) solid var(--ligne); background: var(--fond); color: var(--texte); font-size: var(--taille-tableau); font-weight: var(--graisse-forte); text-decoration: none; cursor: pointer; border-radius: var(--rayon); }
	button:hover, a.bouton:hover { background: var(--surface); }
	/* Bouton d'envoi = principal ; un bouton-lien ou danger posé dans le formulaire garde son style (sinon la règle de formulaire l'écrase). */
	form.bloc > button:not(.lien, .danger), form.ligne > button:not(.lien, .danger), button.principal, a.bouton.principal { background: var(--accent); border-color: var(--accent); color: var(--sur-accent); }
	form.bloc > button:not(.lien, .danger):hover, form.ligne > button:not(.lien, .danger):hover, button.principal:hover, a.bouton.principal:hover { background: var(--accent); filter: brightness(1.1); }
	form.bloc > button { justify-self: start; }
	button:disabled { opacity: .5; cursor: not-allowed; filter: none; }
	button.lien { display: inline; min-height: 0; height: auto; border: 0; background: none; padding: 0; color: var(--lien); font-weight: normal; font-size: inherit; text-decoration: underline; }
	button.lien:hover { background: none; }
	button.danger { border-color: var(--danger); color: var(--danger); }
	button.danger:hover { background: var(--danger-fond); }

	/* --- Indicateurs et graphiques. Chiffre clé : libellé discret au-dessus, valeur en dessous. */
	.grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: var(--e3); margin: var(--e4) 0; }
	.chiffre { display: flex; flex-direction: column-reverse; gap: var(--e1); padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	.chiffre b { font-size: var(--taille-chiffre); font-weight: var(--graisse-chiffre); line-height: var(--interligne-titres); letter-spacing: var(--approche-titres); font-variant-numeric: tabular-nums; }
	.chiffre span { color: var(--texte-doux); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	.chiffre span::first-letter { text-transform: uppercase; }
	svg.barres { display: block; width: 100%; height: 48px; color: var(--accent); fill: currentColor; border-bottom: var(--bordure) solid var(--ligne); }
	/* Séries : une classe par rôle (v-pour…) donne --c ; la marque SVG et la pastille de légende la reprennent. Texte jamais coloré. */
	.v-pour { --c: var(--vote-pour); }
	.v-contre { --c: var(--vote-contre); }
	.v-abstention { --c: var(--vote-abstention); }
	.v-non-votant { --c: var(--fond); }
	.v-absent { --c: var(--vote-absent); }
	/* Sorts d'amendements (vues/amendements.ts) : mêmes jetons que les votes ; adopté / rejeté sur l'échelle bleu ↔ rouge, les autres issues en gris dégradés. `.v-autre` : plus bas. */
	.v-adopte { --c: var(--vote-pour); }
	.v-rejete { --c: var(--vote-contre); }
	.v-retire { --c: var(--vote-abstention); }
	.v-tombe { --c: color-mix(in srgb, var(--vote-abstention) 50%, var(--fond)); }
	.v-attente { --c: var(--surface-forte); }

	/* Résultats électoraux : une classe par regroupement d'affichage de nuance (jetons --famille-*). */
	.v-f-extreme-gauche { --c: var(--famille-extreme-gauche); }
	.v-f-gauche { --c: var(--famille-gauche); }
	.v-f-ecologistes { --c: var(--famille-ecologistes); }
	.v-f-centre { --c: var(--famille-centre); }
	.v-f-droite { --c: var(--famille-droite); }
	.v-f-extreme-droite { --c: var(--famille-extreme-droite); }
	.v-f-regionalistes { --c: var(--famille-regionalistes); }
	.v-f-divers { --c: var(--famille-divers); }
	svg .serie { fill: var(--c); stroke: var(--fond); stroke-width: var(--ecart-graphique); }
	svg .serie.v-non-votant { stroke: var(--texte-doux); stroke-width: var(--bordure); vector-effect: non-scaling-stroke; }
	/* Dans une barre, un segment « non-votant » très étroit dessinerait un crochet (contour sans fond) : fond teinté plein à la place. */
	svg.barre .serie.v-non-votant { fill: color-mix(in srgb, var(--texte-doux) 35%, var(--fond)); stroke: var(--fond); stroke-width: var(--ecart-graphique); vector-effect: none; }
	svg .serie:hover { stroke: var(--texte); vector-effect: non-scaling-stroke; }
	figure.graphique { margin: var(--e4) 0; }
	figure.graphique figcaption small { display: block; margin-top: var(--e1); }
	svg.barre { display: block; width: 100%; height: var(--hauteur-barre); border-radius: var(--rayon); overflow: hidden; background: var(--surface); }
	svg.barre.mini { height: var(--hauteur-barre-mini); min-width: 8rem; }
	svg.barre .seuil { stroke: var(--texte); stroke-width: 2px; stroke-dasharray: none; }
	.repere { margin: var(--e1) 0 0; font-size: var(--taille-petite); color: var(--texte-doux); }
	ul.legende { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e4); list-style: none; padding: 0; margin: var(--e2) 0 0; font-size: var(--taille-petite); color: var(--texte-doux); }
	ul.legende li::before { content: ""; display: inline-block; width: .8em; height: .8em; margin-right: var(--e1); vertical-align: -.05em; border-radius: var(--rayon-pastille); background: var(--c); }
	ul.legende li.v-non-votant::before { border: var(--bordure) solid var(--texte-doux); }
	ul.legende li.v-attente::before { border: var(--bordure) solid var(--texte-doux); }
	ul.legende b { color: var(--texte); font-variant-numeric: tabular-nums; }
	.hemicycle svg { display: block; width: 100%; max-width: var(--largeur-hemicycle); height: auto; }

	/* --- Plans de la fiche d'un élu (vues/plans.ts) : carte de la circonscription et siège dans l'hémicycle. Une colonne sous 64 rem, plans à droite au-delà. */
	.fiche-elu { display: grid; gap: var(--e4); }
	.fiche-corps { min-width: 0; }
	/* Page /offres : cartes des offres (fonctions phares), puis tableau détaillé. */
	.offres-accroche { font-size: 1.1em; max-width: 46rem; }
	.offres-cartes { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: var(--e3); margin: var(--e4) 0; }
	.offre-carte { border: var(--bordure) solid var(--ligne); border-radius: var(--rayon, 6px); padding: var(--e3) var(--e4); display: flex; flex-direction: column; gap: var(--e2); }
	.offre-carte.actuelle { border-color: var(--accent); }
	.offre-carte h2 { margin: 0; font-size: 1.15em; }
	.offre-carte .prix { font-size: 1.2em; font-weight: 600; margin: 0; }
	.offre-carte ul { margin: 0; padding-left: 1.1em; }
	.offre-carte .quotas { margin-top: auto; font-size: .9em; }
	.offre-carte form { margin: 0; }
	.offre-carte a.bouton { display: inline-block; padding: var(--e1) var(--e3); border-radius: var(--rayon); background: var(--accent); color: var(--sur-accent); text-decoration: none; }
	.offres-communs ul { columns: 2 22rem; }
	.plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: var(--e3); align-content: start; }
	@media (min-width: 64rem) { .fiche-elu { grid-template-columns: minmax(0, 1fr) 19rem; align-items: start; } .plans { grid-template-columns: minmax(0, 1fr); } }
	figure.plan { margin: 0; max-width: 26rem; padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	figure.plan svg { display: block; width: 100%; height: auto; }
	figure.plan-carte svg { max-height: 16rem; }
	figure.plan figcaption { margin-top: var(--e2); font-size: var(--taille-petite); }
	figure.plan figcaption small { display: block; margin-top: var(--e1); }
	figure.plan .fond { fill: var(--surface-forte); stroke: var(--texte-doux); stroke-width: var(--bordure); vector-effect: non-scaling-stroke; fill-rule: evenodd; }
	figure.plan .limites { fill: none; stroke: var(--fond); stroke-width: var(--bordure); vector-effect: non-scaling-stroke; }
	figure.plan .zone { fill: var(--accent); stroke: var(--accent); stroke-width: var(--bordure); vector-effect: non-scaling-stroke; fill-rule: evenodd; }
	figure.plan .repere, figure.plan .anneau { fill: none; stroke-width: calc(var(--bordure) * 1.5); vector-effect: non-scaling-stroke; }
	figure.plan .repere { stroke: var(--accent); }
	figure.plan .anneau { stroke: var(--texte); }
	.v-moi { --c: var(--accent); }
	.v-groupe { --c: color-mix(in srgb, var(--accent) 60%, var(--fond)); }
	.v-autre { --c: color-mix(in srgb, var(--texte-doux) 35%, var(--fond)); }
	figure.plan .serie:hover { stroke: var(--fond); vector-effect: none; }
	figure.plan ul.legende { margin-bottom: var(--e1); }
	td.repartition { width: 30%; vertical-align: middle; }
	details.repartition-detail { margin: var(--e3) 0; }
	details.repartition-detail > summary { font-weight: var(--graisse-forte); }
	table.repartition-groupes td.repartition { width: 35%; }

	/* --- Chargement : barre fine en haut de page pendant qu'une page ou une liste se charge (app.js pose data-chargement). */
	html::before { content: ""; position: fixed; inset: 0 0 auto 0; height: 3px; z-index: 100; background: var(--accent); transform-origin: left; transform: scaleX(0); opacity: 0; pointer-events: none; }
	html[data-chargement]::before { opacity: 1; animation: chargement 8s cubic-bezier(.1, .6, .2, 1) forwards; }
	html[data-chargement] { cursor: progress; }
	html[data-chargement] a:hover { cursor: progress; }
	@keyframes chargement { to { transform: scaleX(.92); } }
	@media (prefers-reduced-motion: reduce) { html[data-chargement]::before { animation: none; transform: scaleX(1); } }

	/* --- Groupes politiques : pastille de couleur (SVG), carte de chaleur de l'accord entre groupes */
	svg.couleur-groupe { width: .8em; height: .8em; vertical-align: -.05em; margin-right: var(--e1); }
	/* Une famille de groupes = une classe sur le cercle (vues/groupes.ts) et un jeton ; sans classe (non-inscrits), l'anneau garde ses attributs. */
	svg.couleur-groupe circle[class] { fill: var(--c); }
	.g-gauche-radicale { --c: var(--groupe-gauche-radicale); }
	.g-gauche { --c: var(--groupe-gauche); }
	.g-ecologiste { --c: var(--groupe-ecologiste); }
	.g-centre-gauche { --c: var(--groupe-centre-gauche); }
	.g-centre { --c: var(--groupe-centre); }
	.g-centre-droit { --c: var(--groupe-centre-droit); }
	.g-independants { --c: var(--groupe-independants); }
	.g-droite { --c: var(--groupe-droite); }
	.g-extreme-droite { --c: var(--groupe-extreme-droite); }
	table.accord { width: auto; }
	table.accord th[scope="row"] { white-space: nowrap; color: var(--texte); }
	table.accord td { min-width: 4rem; text-align: center; font-variant-numeric: tabular-nums; }
	table.accord td.diag { color: var(--texte-doux); }
	table.accord td[data-niveau="0"] { background: color-mix(in srgb, var(--accent) 4%, var(--fond)); }
	table.accord td[data-niveau="1"] { background: color-mix(in srgb, var(--accent) 12%, var(--fond)); }
	table.accord td[data-niveau="2"] { background: color-mix(in srgb, var(--accent) 22%, var(--fond)); }
	table.accord td[data-niveau="3"] { background: color-mix(in srgb, var(--accent) 32%, var(--fond)); }
	table.accord td[data-niveau="4"] { background: color-mix(in srgb, var(--accent) 42%, var(--fond)); }
	ul.membres { columns: 14rem; list-style: none; padding: 0; margin: var(--e2) 0; }
	ul.membres li { padding: var(--e1) 0; break-inside: avoid; }

	/* --- Listes interactives : tri, filtres instantanés (vues/tableaux.ts, app.js) */
	th[aria-sort] a.tri, th button.tri { display: inline; min-height: 0; color: inherit; font: inherit; text-decoration: none; background: none; border: 0; padding: 0; cursor: pointer; white-space: normal; }
	th[aria-sort] a.tri:hover, th button.tri:hover { color: var(--texte); background: none; }
	th[aria-sort] a.tri::after, th button.tri::after { content: "↕"; margin-left: var(--e1); opacity: .35; }
	th[aria-sort="ascending"], th[aria-sort="descending"] { color: var(--texte); }
	th[aria-sort="ascending"] a.tri::after, th[aria-sort="ascending"] button.tri::after { content: "↑"; opacity: 1; color: var(--accent); }
	th[aria-sort="descending"] a.tri::after, th[aria-sort="descending"] button.tri::after { content: "↓"; opacity: 1; color: var(--accent); }
	#resultats { transition: opacity .15s; }
	#resultats.htmx-request { opacity: .5; }
	a.titre { font-weight: var(--graisse-forte); }
	p.chapeau { font-size: var(--taille-h3); max-width: 46rem; }
	abbr[title] { text-decoration: none; cursor: help; }

	/* --- Agenda : panneau de détail à gauche, jours à droite (une colonne sur petit écran) */
	/* Le panneau occupe sa colonne (à droite) même quand rien n'est choisi : la liste ne bouge pas à l'ouverture. */
	.agenda-grille { display: grid; grid-template-columns: minmax(0, 1fr) minmax(18rem, 26rem); gap: var(--e5); align-items: start; }
	@media (max-width: 60rem) { .agenda-grille { grid-template-columns: minmax(0, 1fr); } .agenda-grille.avec-panneau aside.panneau { order: -1; } }
	aside.panneau.vide { background: none; border-style: dashed; }
	aside.panneau .texte { max-width: none; font-size: var(--taille-tableau); }
	aside.panneau { position: sticky; top: calc(var(--hauteur-entete) + var(--e3)); padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); background: var(--surface); }
	/* Dans la colonne de références, seul le conteneur est collant : sinon deux panneaux collants se chevauchent au défilement. */
	.colonne-references aside.panneau { position: static; }
	.colonne-references aside.panneau + aside.panneau, .colonne-references aside.panneau + details { margin-top: var(--e3); }
	aside.panneau h2 { margin-top: var(--e2); font-size: var(--taille-h3); }
	aside.panneau ul { padding-left: var(--e4); }
	table.agenda tr[aria-current="true"] { background: var(--accent-fond); }
	/* Repère de couleur de l'assemblée (jamais seul : l'étiquette AN / Sénat reste écrite). */
	table.agenda td.chambre { border-left: 4px solid var(--ligne); }
	table.agenda td.chambre[data-chambre="AN"] { border-left-color: var(--chambre-an); }
	table.agenda td.chambre[data-chambre="SN"] { border-left-color: var(--chambre-sn); }
	table.agenda tr[hidden] { display: none; }

	/* --- Lecture d'un texte consolidé : plan à gauche, articles à droite, fil d'Ariane, historique et comparaison */
	nav.fil { margin: var(--e3) 0 0; font-size: var(--taille-petite); color: var(--texte-doux); }
	nav.fil ol { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e2); list-style: none; margin: 0; padding: 0; }
	nav.fil li:not(:last-child)::after { content: "›"; margin-left: var(--e2); }
	nav.fil { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1) var(--e3); }
	nav.fil button.retour { min-height: 2rem; padding: 0 var(--e3); border: 0; background: none; color: var(--lien); font-weight: var(--graisse-forte); }
	nav.fil button.retour[hidden] { display: none; }
	nav.fil a { color: var(--texte-doux); text-decoration: none; }
	nav.fil a:hover { color: var(--texte); text-decoration: underline; }
	nav.fil [aria-current] { color: var(--texte); }
	/* Titre du texte, recherche dans le plan et version à une date */
	.titre-code { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--e3); }
	.titre-code a.icone { padding: var(--e1) var(--e3); border-radius: var(--rayon); color: var(--texte-doux); text-decoration: none; font-size: var(--taille-h3); }
	.titre-code a.icone:hover { background: var(--surface); color: var(--texte); }
	form.recherche-code { align-items: center; flex-wrap: nowrap; }
	form.recherche-code label.large { flex: 1; min-width: 0; }
	form.recherche-code label.large input { width: 100%; min-width: 0; }
	form.recherche-code label.version { display: flex; align-items: center; gap: var(--e2); white-space: nowrap; font-weight: normal; color: var(--texte-doux); }
	@media (max-width: 40rem) { form.recherche-code { flex-wrap: wrap; } }
	.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
	/* Cartes de sections : on descend dans le texte une subdivision à la fois (livre, titre, chapitre…) */
	p.lire { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e3); margin: var(--e3) 0; }
	a.bouton.desactive { opacity: .6; cursor: not-allowed; }
	/* Subdivisions d'un texte : table des matières en liste (une ligne par subdivision, séparateurs fins), pas de cartes. */
	ul.liste-sections { list-style: none; margin: var(--e3) 0; padding: 0; border-top: var(--bordure) solid var(--ligne); }
	ul.liste-sections li { border-bottom: var(--bordure) solid var(--ligne); }
	a.ligne-section { display: flex; align-items: baseline; justify-content: space-between; gap: var(--e4); padding: var(--e2) var(--e2); color: var(--texte); text-decoration: none; }
	a.ligne-section:hover { background: var(--surface); }
	a.ligne-section .intitule { display: grid; gap: var(--e1); font-weight: var(--graisse-forte); min-width: 0; overflow-wrap: anywhere; }
	a.ligne-section .intitule small { color: var(--texte-doux); font-weight: normal; }
	a.ligne-section .meta { color: var(--texte-doux); font-size: var(--taille-tableau); white-space: nowrap; }
	a.ligne-section .meta::after { content: "›"; margin-left: var(--e3); }
	.cartes { display: grid; gap: var(--e2); margin: var(--e3) 0; }
	ul.liste-articles { display: grid; grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr)); gap: var(--e2); list-style: none; margin: var(--e2) 0 var(--e4); padding: 0; }
	ul.liste-articles li { display: contents; }
	ul.liste-articles a { display: block; padding: var(--e2) var(--e3); background: var(--surface); border-radius: var(--rayon); color: var(--texte); font-size: var(--taille-tableau); text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
	ul.liste-articles a:hover { background: var(--surface-forte); color: var(--lien); }
	ul.liste-articles a:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
	ul.arbre-recherche, ul.arbre-recherche ul { list-style: none; padding-left: var(--e4); }
	ul.arbre-recherche { padding-left: 0; }
	ul.arbre-recherche li { padding: var(--e1) 0; }
	/* Historique d'un article, chargé sous l'article */
	.historique-zone, .details-zone { margin: var(--e3) 0; }
	a.bouton-historique, a.lien-historique { color: var(--texte-doux); text-decoration: none; font-weight: var(--graisse-forte); }
	a.bouton-historique:hover, a.lien-historique:hover { color: var(--texte); }
	a.bouton-historique::before, a.lien-historique::before { content: "↺ "; }
	.historique .carte { padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); margin: var(--e3) 0; }
	.historique .carte h3 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); }
	.historique form.ligne { margin: var(--e2) 0; flex-wrap: nowrap; }
	.historique form.ligne select { min-width: 0; flex: 1; }
	.historique p.stats { margin: var(--e2) 0; font-size: var(--taille-petite); }
	section.version { margin: var(--e3) 0; padding-left: var(--e3); border-left: 3px solid var(--ligne); }
	section.version.actuelle { border-left-color: var(--accent); }
	section.version h4 { margin: 0 0 var(--e1); font-size: var(--taille-h3); }
	section.version p { margin: var(--e1) 0; }
	section.version p.texte { max-width: 46rem; font-family: var(--police-texte); line-height: var(--interligne-texte); }
	article.art { margin: var(--e4) 0; padding-bottom: var(--e3); border-bottom: var(--bordure) solid var(--ligne); }
	article.art h3 { margin-top: 0; scroll-margin-top: calc(var(--hauteur-entete) + var(--e3)); }
	article.art:target { background: var(--accent-fond); border-radius: var(--rayon); padding: var(--e2) var(--e3); }
	p.outils { font-size: var(--taille-petite); color: var(--texte-doux); }
	p.diff { max-width: 46rem; line-height: var(--interligne-texte); }
	ins, del { text-decoration: none; padding: 0 .15em; border-radius: var(--rayon-petit); }
	ins { background: var(--succes-fond); color: var(--succes); }
	del { background: var(--danger-fond); color: var(--danger); text-decoration: line-through; }
	table.stable tr[aria-current="true"] { background: var(--accent-fond); }

	/* --- Décisions de justice : une carte par décision (formation, date, numéro, mention), extrait, détails à la demande */
	ul.decisions { list-style: none; margin: var(--e3) 0; padding: 0; display: grid; gap: var(--e3); }
	li.decision { padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	li.decision .entete { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1) var(--e3); margin-bottom: var(--e2); }
	li.decision .meta { color: var(--texte-doux); font-size: var(--taille-petite); font-variant-numeric: tabular-nums; }
	li.decision a.titre { display: block; font-size: var(--taille-h3); line-height: var(--interligne-titres); color: var(--texte); text-decoration: none; }
	li.decision a.titre:hover { color: var(--lien); text-decoration: underline; }
	li.decision .extrait { margin: var(--e2) 0 0; color: var(--texte-doux); font-size: var(--taille-tableau); }
	li.decision mark, .extrait mark { background: var(--accent-fond); color: var(--texte); border-radius: var(--rayon-petit); padding: 0 .15em; }
	.pastille[data-rang="0"], .pastille[data-rang="1"] { background: var(--accent-fond); color: var(--accent); }
	dl.fiche-decision { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--e1) var(--e4); margin: var(--e2) 0; font-size: var(--taille-tableau); }
	dl.fiche-decision dt { color: var(--texte-doux); }
	dl.fiche-decision dd { margin: 0; overflow-wrap: anywhere; }
	.details h4 { margin: var(--e3) 0 var(--e1); font-size: var(--taille-tableau); }
	.details blockquote { font-size: var(--taille-tableau); }

	/* --- Recherche Légifrance : critères avancés repliés, résultats en cartes avec aperçu des articles trouvés */
	/* Ligne principale : champ de recherche (large), fonds, bouton — alignés sur une ligne, en pile sur petit écran. */
	form.recherche-avancee .rech-principale { display: grid; grid-template-columns: minmax(0, 1fr) minmax(12rem, 18rem) auto; gap: var(--e3); align-items: end; margin: var(--e3) 0 var(--e2); }
	@media (max-width: 52rem) { form.recherche-avancee .rech-principale { grid-template-columns: minmax(0, 1fr); } }
	form.recherche-avancee .rech-principale input, form.recherche-avancee .rech-principale select { width: 100%; min-width: 0; }
	/* Critères avancés : un panneau replié, ses champs en grille régulière. */
	details.avance { margin: var(--e2) 0 var(--e3); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	details.avance > summary { display: flex; align-items: center; gap: var(--e2); min-height: 2.5rem; padding: 0 var(--e4); color: var(--texte); font-weight: var(--graisse-forte); cursor: pointer; list-style: none; }
	details.avance > summary::-webkit-details-marker { display: none; }
	details.avance > summary::before { content: "▸"; color: var(--texte-doux); }
	details.avance[open] > summary::before { content: "▾"; }
	details.avance[open] > summary { border-bottom: var(--bordure) solid var(--ligne); }
	details.avance .compteur { margin-left: var(--e1); }
	details.avance .rech-criteres { display: grid; grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); gap: var(--e3) var(--e4); padding: var(--e4); background: var(--surface); border-radius: 0 0 var(--rayon-grand) var(--rayon-grand); }
	details.avance .rech-criteres select, details.avance .rech-criteres input { width: 100%; min-width: 0; }
	details.avance .rech-criteres .aide { grid-column: 1 / -1; margin: 0; }
	/* Recherche d'élus : champ de nom + bouton sur une ligne ; puces des filtres actifs (chacune retire son filtre). */
	form.recherche-avancee .rech-principale-elus { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--e3); align-items: end; margin: var(--e3) 0 var(--e2); }
	form.recherche-avancee .rech-principale-elus input { width: 100%; min-width: 0; }
	.puces { display: flex; flex-wrap: wrap; gap: var(--e2); align-items: center; margin: var(--e2) 0; }
	.puces .puce { padding: .1em var(--e3); background: var(--surface-forte); color: var(--texte); border-radius: var(--rayon-pastille); font-size: var(--taille-petite); text-decoration: none; }
	.puces .puce:hover { background: var(--accent-fond); }
	ul.extraits { list-style: none; margin: var(--e2) 0 0; padding: 0 0 0 var(--e3); border-left: 3px solid var(--ligne); font-size: var(--taille-tableau); color: var(--texte-doux); }
	ul.extraits li { margin: var(--e2) 0; }
	ul.extraits mark { background: var(--accent-fond); color: var(--texte); }

	/* --- Données juridiques et parlementaires */
	/* Catégories d'amendement (analysis/categoriesAmendement.ts) : badges texte, neutres, sous le libellé de l'article. */
	.categories { display: inline-flex; flex-wrap: wrap; gap: var(--e1); margin-top: var(--e1); }
	.categorie { display: inline-block; padding: 0 var(--e2); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-pastille); background: var(--surface-forte); color: var(--texte-doux); font-size: var(--taille-petite); line-height: 1.5; white-space: nowrap; }
	/* Pastille : fond teinté plein (le statut se repère avant d'être lu). Ton absent ou « neutre » : gris. */
	.pastille { display: inline-block; padding: .15em var(--e3); line-height: 1.5; background: var(--surface-forte); color: var(--texte); border-radius: var(--rayon-pastille); font-size: var(--taille-petite); font-weight: var(--graisse-forte); white-space: nowrap; }
	.pastille[data-ton="ok"] { background: var(--succes-fond); color: var(--succes); }
	.pastille[data-ton="alerte"] { background: var(--danger-fond); color: var(--danger); }
	.pastille[data-ton="attention"] { background: var(--attention-fond); color: var(--attention); }
	table.fiche th { width: 11rem; }
	@media (max-width: 40rem) { table.fiche th { width: 7.5rem; } table.fiche td { overflow-wrap: anywhere; } }
	td:last-child { padding-right: var(--e4); }
	td.date { white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--texte-doux); width: 1%; }
	tr.prevu td, tr.annule td { color: var(--texte-doux); }
	/* Ligne de titre d'un groupe dans une grille (droits `module.*` de /admin/offres) */
	tr.groupe th { text-align: left; color: var(--texte-doux); background: var(--surface); }
	/* Onglets Recherches | Consultations */
	nav.onglets { display: flex; gap: var(--e3); margin: var(--e3) 0; border-bottom: var(--bordure) solid var(--ligne); }
	nav.onglets a { padding: var(--e2) var(--e1); color: var(--texte-doux); text-decoration: none; border-bottom: 2px solid transparent; }
	nav.onglets a[aria-current="page"] { color: var(--texte); border-bottom-color: var(--accent); font-weight: var(--graisse-forte); }
	/* Mobile (≤ 40 rem) : onglets défilants dans leur barre (jamais la page) ; cibles tactiles ≥ 44 px ; avancement qui passe à la ligne. */
	@media (max-width: 40rem) {
		nav.onglets { overflow-x: auto; scrollbar-width: thin; }
		nav.onglets a { flex: none; display: inline-flex; align-items: center; min-height: 2.75rem; white-space: nowrap; }
		button:not(.lien, .lien-bouton), a.bouton, .menu-bouton, nav.pagination a, nav.pagination span, nav.sous a, .puces .puce, footer .pied-liens a,
		input:not([type=checkbox], [type=radio], [type=hidden], [type=range], [type=file]), select, textarea { min-height: 2.75rem; }
		nav.pagination a, nav.pagination span { min-width: 2.75rem; }
		ol.avancement { flex-wrap: wrap; }
		ol.avancement li { flex: 1 1 6rem; white-space: normal; }
	}
	tr.annule b { text-decoration: line-through; }
	section.phase { margin-bottom: var(--e3); }
	/* Frise horizontale du parcours (vues/frise.ts) : une étape par phase, défilement horizontal sur écran étroit. Jamais la couleur seule : mot d'état,
	   glyphe du repère (✓ ● ×), trait plein (accompli) ou pointillé (à venir). */
	.frise-zone { overflow-x: auto; margin: var(--e3) 0 var(--e4); padding-bottom: var(--e2); }
	ol.frise { display: flex; list-style: none; margin: 0; padding: 0; min-width: min-content; }
	ol.frise li { position: relative; flex: 1 0 10rem; padding-top: 2rem; }
	ol.frise li::before { content: ""; position: absolute; top: .7rem; left: 1.4rem; right: 0; border-top: 2px solid var(--ligne); }
	ol.frise li:last-child::before { display: none; }
	ol.frise li[data-etat="fait"]::before { border-top-color: var(--accent); }
	ol.frise li[data-etat="cours"]::before, ol.frise li[data-etat="prevu"]::before { border-top-style: dashed; border-top-color: var(--texte-doux); }
	ol.frise a { display: block; padding: 0 var(--e3) var(--e2) 0; color: var(--texte); text-decoration: none; }
	ol.frise a:hover .etape { text-decoration: underline; }
	ol.frise .repere { position: absolute; top: 0; left: 0; display: grid; place-items: center; width: 1.4rem; height: 1.4rem; border: 2px solid var(--accent); border-radius: 50%; background: var(--fond); color: var(--accent); font-size: var(--taille-petite); font-weight: var(--graisse-forte); line-height: 1; }
	ol.frise li[data-etat="fait"] .repere { background: var(--accent); color: var(--sur-accent); }
	ol.frise li[data-etat="cours"] .repere { background: var(--accent); color: var(--sur-accent); outline: 4px solid var(--accent-fond); }
	ol.frise li[data-etat="prevu"] .repere { border-style: dashed; border-color: var(--texte-doux); color: var(--texte-doux); }
	ol.frise li[data-etat="arret"] .repere { border-color: var(--danger); background: var(--danger-fond); color: var(--danger); }
	ol.frise .etape { display: block; font-weight: var(--graisse-forte); }
	ol.frise .lieu, ol.frise .dates { display: block; color: var(--texte-doux); font-size: var(--taille-petite); }
	ol.frise .etat { display: inline-block; margin-top: var(--e1); padding: 0 var(--e2); border-radius: var(--rayon-pastille); background: var(--surface-forte); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	ol.frise li[data-etat="cours"] .etat { background: var(--accent); color: var(--sur-accent); }
	ol.frise li[data-etat="prevu"] .etat { background: none; border: var(--bordure) dashed var(--texte-doux); }
	ol.frise li[data-etat="arret"] .etat { background: var(--danger-fond); color: var(--danger); }
	/* Mini-frise d'avancement d'une ligne de liste : six jalons, soulignement plein (fait), pointillé long (prévu), pointillé court (à venir), barré (sans objet), fond plein (en cours). */
	ol.avancement { display: flex; gap: var(--e1); max-width: 24rem; list-style: none; margin: var(--e2) 0 0; padding: 0; font-size: var(--taille-petite); }
	ol.avancement li { flex: 1 1 0; min-width: 0; padding: 0 var(--e1); border-bottom: 3px solid var(--accent); text-align: center; white-space: nowrap; }
	ol.avancement li[data-etat="cours"] { border-radius: var(--rayon-petit) var(--rayon-petit) 0 0; background: var(--accent); color: var(--sur-accent); font-weight: var(--graisse-forte); }
	ol.avancement li[data-etat="prevu"] { border-bottom-style: dashed; }
	ol.avancement li[data-etat="attendu"] { border-bottom: 3px dotted var(--texte-doux); color: var(--texte-doux); }
	ol.avancement li[data-etat="saute"] { border-bottom-color: transparent; color: var(--texte-doux); text-decoration: line-through; }
	ol.avancement li[data-etat="arret"] { border-radius: var(--rayon-petit) var(--rayon-petit) 0 0; border-bottom-color: var(--danger); background: var(--danger-fond); color: var(--danger); font-weight: var(--graisse-forte); }
	ol.avancement li[data-etat="arret"]::after { content: " ×"; }
	.pagination { margin: var(--e3) 0; }
	/* Élections : bloc de résultats d'un tour, barre par ligne, pastille de nuance. */
	table.resultats td.barre-ligne { width: 28%; min-width: 7rem; }
	/* Mise en page fixe : colonnes égales par défaut ; la première (candidat ou liste) en reçoit 30 % et le tableau 48 rem au moins (défilé dans .defile),
	   pour qu'un nom ne soit jamais coupé en plein mot (« GUILLERMI|N » à 360 px) ; la barre mini suit sa colonne au lieu de déborder sur la suivante. */
	table.resultats.stable { min-width: 48rem; }
	table.resultats.stable thead th:first-child { width: 30%; }
	table.resultats td.barre-ligne svg.barre.mini { min-width: 0; }
	.tour-resultats { margin: var(--e4) 0; }
	.tour-resultats h3 { margin-bottom: var(--e2); }
	small.nuance { white-space: nowrap; }
	details summary { cursor: pointer; color: var(--lien); }
	blockquote { margin: var(--e3) 0; padding: var(--e2) var(--e4); background: var(--surface); border-radius: var(--rayon); }
	article.texte { max-width: 46rem; font-family: var(--police-texte); line-height: var(--interligne-texte); }
	article.texte table { font-size: var(--taille-tableau); }
	article.texte h1, article.texte h2, article.texte h3, article.texte h4 { font-size: var(--taille-h3); }

	/* --- Lecteur de textes (lois, décisions, textes parlementaires) : mesure confortable, intitulés, alinéas, visas, plan, références. */
	.lecteur { max-width: 46rem; font-family: var(--police-texte); line-height: var(--interligne-texte); overflow-wrap: anywhere; }
	.lecteur h3 { margin: var(--e5) 0 var(--e2); padding-bottom: var(--e1); border-bottom: var(--bordure) solid var(--ligne); }
	.lecteur h4 { margin: var(--e4) 0 var(--e2); font-weight: var(--graisse-forte); }
	.lecteur :is(h2, h3, h4)[id] { scroll-margin-top: calc(var(--hauteur-entete) + var(--e3)); }
	.lecteur p { margin: 0 0 var(--e3); }
	.lecteur p.vu { margin-bottom: var(--e2); color: var(--texte-doux); }
	.lecteur p.motif, .lecteur p.num { padding-left: var(--e4); text-indent: calc(-1 * var(--e4)); }
	.lecteur p.num { padding-left: var(--e5); text-indent: calc(-1 * var(--e5)); }
	.lecteur .marque { font-variant-numeric: tabular-nums; font-weight: var(--graisse-forte); margin-right: var(--e1); }
	.lecteur ul.alineas { list-style: none; margin: 0 0 var(--e3); padding-left: var(--e4); }
	.lecteur ul.alineas ul.alineas { margin: var(--e1) 0; }
	.lecteur ul.alineas li { margin: var(--e1) 0; }
	.lecteur ul.alineas li.puce { list-style: disc; margin-left: var(--e4); }
	.lecteur table { display: block; max-width: 100%; overflow-x: auto; }
	.lecteur h2 { margin: var(--e6, var(--e5)) 0 var(--e2); padding-bottom: var(--e1); border-bottom: calc(2 * var(--bordure)) solid var(--ligne); }
	/* Décision : carte d'informations, puis plan | texte | références. Les panneaux latéraux restent visibles au défilement. */
	section.carte-decision { margin: var(--e3) 0 var(--e4); padding: var(--e3) var(--e4); background: var(--surface); border-radius: var(--rayon-grand); }
	section.carte-decision h2 { margin: var(--e3) 0 var(--e1); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	section.carte-decision blockquote { font-size: var(--taille-tableau); }
	section.carte-decision .outils { margin-bottom: 0; }
	/* Page de garde d'un texte parlementaire : nature et numéro, intitulé, puis la fiche (dl.fiche-decision) */
	.fiche-document .fiche-nature { margin: 0; color: var(--texte-doux); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; }
	.fiche-document .fiche-intitule { margin: var(--e1) 0 var(--e2); font-size: var(--taille-h3); font-weight: 600; line-height: var(--interligne-titres); }
	/* Liens loi / amendement ↔ Légifrance : articles visés, liste sobre */
	ul.visees { margin: 0; padding: 0; list-style: none; }
	ul.visees p { margin: 0; }
	p.visee { margin: 0; font-size: var(--taille-tableau); color: var(--texte-doux); }
	details.saisine ul { columns: 2 14rem; margin: var(--e1) 0; padding-left: var(--e4); }
	.lecteur-colonnes { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--e4); align-items: start; }
	.lecteur-colonnes .colonne-plan:empty, .lecteur-colonnes .colonne-references:empty { display: none; }
	nav.sommaire-lecteur.panneau, aside.references-citees.panneau { max-width: none; margin: 0; padding: var(--e3); background: var(--surface); border: 0; border-radius: var(--rayon); font-size: var(--taille-tableau); }
	nav.sommaire-lecteur.panneau summary, aside.references-citees.panneau h2 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	nav.sommaire-lecteur.panneau ol { max-height: none; margin: var(--e2) 0 0; }
	nav.sommaire-lecteur.panneau summary { cursor: pointer; margin: 0; }
	nav.sommaire-lecteur.panneau details:not([open]) summary { margin: 0; }
	details.plan-repliable > summary { list-style: none; display: flex; align-items: center; justify-content: space-between; gap: var(--e2); }
	details.plan-repliable > summary::-webkit-details-marker { display: none; }
	details.plan-repliable > summary::after { content: "«"; font-size: 1.25rem; line-height: 1; color: var(--texte-doux); }
	details.plan-repliable:not([open]) > summary::after { content: "»"; }
	@media (min-width: 64rem) {
		.lecteur-colonnes .colonne-plan details.plan-repliable:not([open]) { padding: 0; }
		.lecteur-colonnes .colonne-plan details.plan-repliable:not([open]) > summary { justify-content: center; }
		.lecteur-colonnes .colonne-plan details.plan-repliable:not([open]) .lib { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
	}
	ul.plan-arbre, ul.plan-arbre ul { list-style: none; margin: 0; padding-left: var(--e3); }
	ul.plan-arbre { padding-left: 0; }
	ul.plan-arbre li { padding: var(--e1) 0; }
	ul.plan-arbre a { color: var(--texte); text-decoration: none; }
	ul.plan-arbre a:hover { color: var(--lien); text-decoration: underline; }
	ul.plan-arbre a[aria-current="page"] { font-weight: var(--graisse-forte); color: var(--accent); }
	.lecteur-colonnes > .colonne-centre { min-width: 0; }
	@media (min-width: 64rem) {
		.lecteur-colonnes { grid-template-columns: minmax(11rem, 15rem) minmax(0, 46rem) minmax(12rem, 18rem); }
		/* Plan replié : simple rail vertical, la place revient au texte. */
		.lecteur-colonnes:has(.colonne-plan details:not([open])) { grid-template-columns: 2.5rem minmax(0, 60rem) minmax(12rem, 18rem); }
		.lecteur-colonnes:has(.colonne-plan details:not([open])) .colonne-plan { overflow: visible; }
		.lecteur-colonnes .colonne-plan details:not([open]) { text-align: center; }
		.lecteur-colonnes > .colonne-plan, .lecteur-colonnes > .colonne-references { position: sticky; top: calc(var(--hauteur-entete) + var(--e3)); max-height: calc(100vh - var(--hauteur-entete) - var(--e5)); overflow-y: auto; }
		.lecteur-colonnes .colonne-plan:empty + .colonne-centre { grid-column: 2; }
		.lecteur-colonnes .colonne-plan:empty ~ .colonne-references { grid-column: 3; }
		/* Pas de colonne de références : la piste de droite disparaît et le texte (ou les cartes) prend la place ; plan replié : rail + pleine largeur. */
		.lecteur-colonnes:has(.colonne-references:empty) { grid-template-columns: minmax(11rem, 15rem) minmax(0, 1fr); }
		.lecteur-colonnes:has(.colonne-references:empty):has(.colonne-plan details:not([open])) { grid-template-columns: 2.5rem minmax(0, 1fr); }
		.lecteur-colonnes:has(.colonne-references:empty):has(.colonne-plan:empty) { grid-template-columns: minmax(0, 1fr); }
		.lecteur-colonnes:has(.colonne-references:empty) .colonne-plan:empty + .colonne-centre { grid-column: 1; }
	}
	a.citation[data-externe]::after { content: "↗"; font-size: .75em; margin-left: .15em; color: var(--texte-doux); }
	a.citation:hover { text-decoration-style: solid; }
	nav.sommaire-lecteur { max-width: 46rem; margin: var(--e3) 0; padding: var(--e2) var(--e4); background: var(--surface); border-radius: var(--rayon); font-size: var(--taille-tableau); }
	nav.sommaire-lecteur ol { margin: var(--e2) 0; padding-left: 0; list-style: none; max-height: 16rem; overflow-y: auto; }
	nav.sommaire-lecteur li[data-niveau="2"] { padding-left: var(--e4); }
	nav.sommaire-lecteur li[data-niveau="3"] { padding-left: calc(2 * var(--e4)); }
	nav.sommaire-lecteur li[data-niveau="1"] { font-weight: var(--graisse-forte); }
	nav.sommaire-lecteur a { color: var(--texte); text-decoration: none; }
	nav.sommaire-lecteur a:hover { color: var(--lien); text-decoration: underline; }
	details.references-citees { max-width: 46rem; margin: var(--e4) 0; padding-top: var(--e2); border-top: var(--bordure) dashed var(--ligne); }
	details.references-citees h3 { margin: var(--e3) 0 var(--e1); font-size: var(--taille-petite); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	details.references-citees ul { margin: 0; padding-left: var(--e4); }
	/* Textes modificateurs : étiquette d'action sur les références, panneau « Dispositions visées », tableau « Dispositions modifiées » */
	a.citation[data-action]::after { content: attr(data-action); margin-left: .35em; padding: 0 var(--e2); font-size: .7em; line-height: 1.5; vertical-align: .1em; background: var(--surface-forte); color: var(--texte-doux); border-radius: var(--rayon-pastille); text-decoration: none; white-space: nowrap; }
	a.citation[data-action="abrogé"]::after, a.citation[data-action="supprimé"]::after { background: var(--danger-fond); color: var(--danger); }
	a.citation[data-action="inséré"]::after, a.citation[data-action="créé"]::after { background: var(--succes-fond); color: var(--succes); }
	.action-visee { display: inline-block; padding: 0 var(--e2); font-size: var(--taille-petite); font-weight: var(--graisse-forte); background: var(--surface-forte); color: var(--texte); border-radius: var(--rayon-pastille); }
	.action-visee[data-action="abrogé"], .action-visee[data-action="supprimé"] { background: var(--danger-fond); color: var(--danger); }
	.action-visee[data-action="inséré"], .action-visee[data-action="créé"] { background: var(--succes-fond); color: var(--succes); }
	aside.dispositions-visees.panneau { margin: 0 0 var(--e4); padding: var(--e3); background: var(--surface); border-radius: var(--rayon); font-size: var(--taille-tableau); }
	aside.dispositions-visees.panneau h2 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	.dispositions-visees h3 { margin: var(--e3) 0 var(--e1); font-size: var(--taille-petite); color: var(--texte-doux); overflow-wrap: anywhere; }
	.dispositions-visees ul.visees-liste { list-style: none; margin: 0 0 var(--e3); padding: 0; display: grid; gap: var(--e2); }
	.dispositions-visees .verbe { font-weight: var(--graisse-forte); }
	.dispositions-visees .cible-visee { color: var(--texte-doux); }
	.dispositions-visees li[data-action="abrogé"] .verbe, .dispositions-visees li[data-action="supprimé"] .verbe { color: var(--danger); }
	details.dispositions-visees { max-width: 46rem; margin: var(--e4) 0; padding-top: var(--e2); border-top: var(--bordure) dashed var(--ligne); }
	/* Analyse d'une décision du Conseil constitutionnel : encart en marge (badges de conclusion, dispositif, fondements) ; le passage prouvé est surligné à l'arrivée du lien. */
	aside.analyse-cc.panneau { margin: 0 0 var(--e3); padding: var(--e3); background: var(--surface); border: 0; border-radius: var(--rayon); font-size: var(--taille-tableau); }
	aside.analyse-cc.panneau h2 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	aside.analyse-cc h3 { margin: var(--e3) 0 var(--e1); font-size: var(--taille-petite); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	aside.analyse-cc p { margin: var(--e1) 0; }
	aside.analyse-cc p.avertissement { padding: var(--e1) var(--e2); border-left: var(--bordure-forte) solid var(--ligne); font-size: var(--taille-petite); color: var(--texte-doux); }
	aside.analyse-cc ul, aside.analyse-cc ol { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--e2); }
	aside.analyse-cc ul ul { margin-top: var(--e1); padding-left: var(--e3); }
	aside.analyse-cc .pastille { white-space: normal; }
	aside.analyse-cc .preuves, aside.analyse-cc .considerants { color: var(--texte-doux); }
	aside.analyse-cc q { quotes: "« " " »"; font-family: var(--police-texte); }
	aside.analyse-cc ol.dispositif-cc .art { font-weight: var(--graisse-forte); }
	aside.analyse-cc dl.statuts-articles { margin: var(--e1) 0; }
	aside.analyse-cc dl.statuts-articles dt { margin-top: var(--e1); font-weight: var(--graisse-forte); }
	aside.analyse-cc dl.statuts-articles dd { margin: 0; overflow-wrap: anywhere; }
	aside.analyse-cc details > summary { cursor: pointer; margin-top: var(--e2); color: var(--texte-doux); }
	aside.analyse-cc details > ul { margin-top: var(--e2); }
	.lecteur p.num:target, .lecteur h3:has(> span:target), .lecteur h4:has(> span:target) { background: var(--accent-fond); border-radius: var(--rayon-petit); }
	.lecteur p.num[id], .lecteur [id^="dispositif-"] { scroll-margin-top: calc(var(--hauteur-entete) + var(--e3)); }
	section.modifications { max-width: 60rem; margin: var(--e4) 0; }
	section.modifications .cible-modifiee { margin: 0 0 var(--e4); }
	section.modifications h3 { margin: var(--e3) 0 var(--e1); }
	/* Champs du droit : aide en langage clair, méthode détaillée repliée */
	.aide-champs { max-width: 52rem; margin: 0 0 var(--e4); }
	ol.etapes-champs { margin: var(--e3) 0; padding-left: var(--e5); display: grid; gap: var(--e2); }
	details.methode-detaillee { max-width: 52rem; margin: var(--e5) 0; }
	details.methode-detaillee > summary { cursor: pointer; }
	details.methode-detaillee > summary h2 { display: inline; font-size: var(--taille-h3); margin: 0; }
	/* Dépôt d'archive (admin) : le formulaire est une zone de dépôt */
	form.depot { padding: var(--e3) var(--e4); border: 2px dashed var(--ligne); border-radius: var(--rayon-grand); }
	form.depot.survol { border-color: var(--accent); background: var(--accent-fond); }
	.zone-depot-aide { margin: 0 0 var(--e2); }
	/* Aperçu de l'image téléversée (logo, favicon) dans /admin/parametres#marque */
	.apercu-marque { display: inline-flex; align-items: center; gap: var(--e3); }
	.apercu-marque img { max-width: 12rem; max-height: 3rem; padding: var(--e1); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); background: var(--surface); }
	.resume-modif { margin: 0 0 var(--e4); line-height: 2; }
	article.modif-cible { margin: 0 0 var(--e5); padding: 0 0 0 var(--e4); border-left: 2px solid var(--ligne); }
	article.modif-cible > h3 { margin: 0 0 var(--e2); }
	.modif-action { margin: 0 0 var(--e4); }
	.modif-action h4 { margin: 0 0 var(--e2); font-size: var(--taille); }
	.modif-action h4 small { color: var(--texte-doux); font-weight: normal; margin-left: var(--e2); }
	.modif-legende { margin: var(--e2) 0 var(--e1); font-size: var(--taille-petite); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	ul.puces-articles { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--e1) var(--e2); }
	ul.puces-articles li a, ul.puces-articles li span { display: inline-block; padding: 0 var(--e2); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-pastille); font-size: var(--taille-tableau); text-decoration: none; color: var(--texte); background: var(--fond); }
	ul.puces-articles li a:hover { background: var(--surface); border-color: var(--texte-doux); }
	.modif-action ul.subdivisions-visees { margin: 0; padding-left: var(--e4); font-size: var(--taille-tableau); }
	.modif-action details > summary { cursor: pointer; margin-bottom: var(--e2); color: var(--texte-doux); }
	/* Article modificateur « consommé » : dispositions visées en ligne (liens de Légifrance), textes modifiant un article, synthèse d'une loi */
	.action-visee[data-action="abroge"], .action-visee[data-action="annule"], .action-visee[data-action="déclare périmé"] { background: var(--danger-fond); color: var(--danger); }
	.action-visee[data-action="crée"] { background: var(--succes-fond); color: var(--succes); }
	.synthese-dispositions { margin: 0 0 var(--e2); line-height: 2; }
	.synthese-dispositions .outils { margin-left: var(--e3); }
	.dispo-legende { max-width: 46rem; margin: 0 0 var(--e4); font-size: var(--taille-petite); }
	section.dispositions-article { max-width: 60rem; margin: var(--e3) 0 var(--e4); padding: var(--e3) var(--e4); background: var(--surface); border-radius: var(--rayon); font-size: var(--taille-tableau); }
	section.dispositions-article h4 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	section.dispositions-article h4 small { text-transform: none; letter-spacing: 0; font-weight: normal; }
	.dispo-cible { margin: 0 0 var(--e3); }
	.dispo-cible h5 { margin: 0 0 var(--e1); font-size: var(--taille); overflow-wrap: anywhere; }
	.dispo-ligne { margin: 0 0 var(--e2); }
	.dispo-ligne > p { margin: 0 0 var(--e1); }
	.dispo-ligne .verbe { font-weight: var(--graisse-forte); }
	.dispo-ligne[data-action="abroge"] .verbe { color: var(--danger); }
	.dispo-ligne[data-action="crée"] .verbe { color: var(--succes); }
	.dispo-ligne details > summary { cursor: pointer; margin-bottom: var(--e2); color: var(--texte-doux); }
	ul.dispo-articles { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--e1) var(--e2); }
	ul.dispo-articles li { display: inline-flex; align-items: baseline; gap: var(--e1); }
	ul.dispo-articles li a { display: inline-block; padding: 0 var(--e2); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-pastille); text-decoration: none; color: var(--texte); background: var(--fond); }
	ul.dispo-articles li a:hover { background: var(--surface-forte); border-color: var(--texte-doux); }
	small.etat-visee { font-size: var(--taille-petite); color: var(--texte-doux); }
	small.etat-visee[data-ton="alerte"] { color: var(--danger); }
	.dispositions-attente, .dispositions-message { margin: var(--e3) 0; font-size: var(--taille-tableau); }
	details.modificateurs { max-width: 60rem; margin: var(--e2) 0; font-size: var(--taille-tableau); }
	details.modificateurs > summary, section.modificateurs-article h3 small { color: var(--texte-doux); }
	details.modificateurs > summary { cursor: pointer; }
	ul.liste-modificateurs { margin: var(--e2) 0; padding-left: var(--e4); display: grid; gap: var(--e1); }
	section.modificateurs-article { margin: var(--e3) 0 var(--e4); }
	section.modificateurs-article h3 small { font-weight: normal; }

	/* --- Notes et alertes */
	a.wikilien { text-decoration-style: solid; }
	a.wikilien[data-absent] { color: var(--texte-doux); text-decoration-style: dashed; }
	a.citation { color: inherit; text-decoration: underline dotted var(--accent); text-underline-offset: 2px; }
	article.note pre { background: var(--surface); padding: var(--e2) var(--e3); overflow-x: auto; border-radius: var(--rayon); }
	article.note del { color: var(--texte-doux); }
	.panneaux { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--e2) var(--e4); margin-top: var(--e4); padding-top: var(--e2); border-top: var(--bordure) solid var(--ligne); }
	.panneaux h2, .mes-notes h2 { font-size: var(--taille-h3); }
	.panneaux ul, .mes-notes ul { margin: var(--e1) 0; padding-left: var(--e4); }
	.mes-notes { margin-top: var(--e4); padding-top: var(--e2); border-top: var(--bordure) dashed var(--ligne); }
	/* --- Notes : espace de travail à la Obsidian. Trois zones (explorateur | note | plan et liens) séparées par des filets de 1 px, dans la largeur de page
	   des autres modules (`--largeur-page`) ; aucune boîte : champs sans bordure ni fond, boutons d'icône nus, pas d'ombre. Une colonne sous 64 rem. Le script (notes.js) ajoute
	   les bascules de volets (`data-explorateur` / `data-volet` = « ferme » sur .notes-ecran), filtre, tri, menu contextuel. */
	.notes-ecran { --gauche: 17rem; --droite: 17rem; display: grid; grid-template-columns: minmax(0, 1fr); font-size: var(--taille-tableau); }
	.notes-ecran :is(.explorateur, .notes-contenu, .note-annexes) { min-width: 0; min-height: 0; }
	.notes-ecran > .explorateur { max-height: 18rem; border-bottom: var(--bordure) solid var(--ligne); }
	.notes-ecran > .note-annexes { border-top: var(--bordure) solid var(--ligne); }
	@media (min-width: 64rem) {
		.notes-ecran { grid-template-columns: var(--gauche) minmax(0, 1fr); height: calc(100dvh - var(--hauteur-entete) - 4.75rem); min-height: 28rem; }
		.notes-ecran.avec-volet { grid-template-columns: var(--gauche) minmax(0, 1fr) var(--droite); }
		.notes-ecran > .explorateur { grid-column: 1; max-height: none; border-bottom: 0; border-right: var(--bordure) solid var(--ligne); }
		.notes-ecran > .notes-contenu { grid-column: 2; overflow: hidden; }
		.notes-ecran > .note-annexes { grid-column: 3; border-top: 0; border-left: var(--bordure) solid var(--ligne); }
	}
	.notes-ecran[data-explorateur="ferme"] { --gauche: 0px; }
	.notes-ecran[data-volet="ferme"] { --droite: 0px; }
	.notes-ecran[data-explorateur="ferme"] > .explorateur, .notes-ecran[data-volet="ferme"] > .note-annexes { display: none; }
	/* Boutons d'icône : nus, sans bordure ; l'état (volet ouvert, mode) se lit à la couleur et à aria-pressed. */
	.notes-ecran :is(button, a, summary).icone { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 1.9rem; height: 1.9rem; min-height: 0; padding: 0; border: 0; border-radius: var(--rayon); background: none; color: var(--texte-doux); list-style: none; text-decoration: none; cursor: pointer; }
	.notes-ecran summary.icone::-webkit-details-marker { display: none; }
	.notes-ecran :is(button, a, summary).icone:hover { background: var(--surface); color: var(--texte); }
	.notes-ecran button.icone[aria-pressed="true"] { color: var(--texte); }
	.notes-ecran :is(input:not([type=checkbox], [type=radio], [type=hidden]), select) { border: 0; border-bottom: var(--bordure) solid var(--ligne); border-radius: 0; background: none; box-shadow: none; }
	.notes-ecran :is(input, select):is(:hover, :focus) { border-bottom-color: var(--accent); box-shadow: none; }
	.notes-ecran :is(form.ligne, form.bloc) > button, .notes-ecran button.principal { border: 0; background: none; color: var(--accent); filter: none; }
	.notes-ecran :is(form.ligne, form.bloc) > button:hover, .notes-ecran button.principal:hover { background: var(--surface); filter: none; }
	/* Explorateur */
	.explorateur { display: flex; flex-direction: column; overflow: auto; padding-bottom: var(--e2); }
	.explorateur-outils { display: flex; align-items: center; gap: var(--e1); padding: var(--e1) var(--e2); }
	.explorateur-outils form { display: contents; }
	.notes-ecran .filtre-notes { width: calc(100% - 2 * var(--e2)); min-height: 1.9rem; margin: var(--e1) var(--e2); padding: 0 var(--e1); }
	.explorateur :is(a, summary) { color: var(--texte); text-decoration: none; }
	.explorateur :focus-visible { outline-offset: -2px; }
	.arbre, .arbre ul { list-style: none; margin: 0; padding: 0; }
	.arbre ul { margin-left: 1.1rem; border-left: var(--bordure) solid var(--ligne); }
	.arbre summary, .arbre-note a, .arbre-racine { display: flex; align-items: center; gap: var(--e2); min-height: 1.85rem; padding: .15rem var(--e3); border-left: 2px solid transparent; overflow-wrap: anywhere; cursor: pointer; }
	.arbre summary { list-style: none; }
	.arbre summary::-webkit-details-marker { display: none; }
	.arbre summary::before, .annexe > summary::before { content: ""; flex: none; width: .4rem; height: .4rem; margin: 0 .2rem 0 .1rem; border-right: 1.5px solid var(--texte-doux); border-bottom: 1.5px solid var(--texte-doux); transform: rotate(-45deg); }
	.arbre details[open] > summary::before, .annexe[open] > summary::before { transform: rotate(45deg); }
	.arbre summary small, .arbre-racine small, .annexe > summary small { margin-left: auto; color: var(--texte-doux); font-size: var(--taille-petite); font-variant-numeric: tabular-nums; }
	.arbre-note a { padding-left: calc(var(--e3) + 1.2rem); }
	.arbre summary:hover, .arbre-note a:hover, .arbre-racine:hover { background: var(--surface); }
	.arbre-note a[aria-current], .arbre-racine[aria-current] { background: var(--accent-fond); border-left-color: var(--accent); }
	.arbre-racine { color: var(--texte-doux); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	.arbre-note a[draggable] { cursor: pointer; }
	.arbre-note.glisse a { opacity: .5; }
	.arbre summary.depot, .explorateur a[data-racine].depot { background: var(--accent-fond); outline: var(--bordure) dashed var(--accent); outline-offset: -2px; }
	.explorateur .vide { padding: var(--e2) var(--e3); }
	.epinglees h2 { margin: var(--e2) 0 var(--e1); padding: 0 var(--e3); color: var(--texte-doux); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	.arbre input.champ-inline { width: calc(100% - var(--e3)); min-height: 1.6rem; margin: .15rem var(--e2); padding: 0 var(--e1); }
	.explorateur-pied { margin: auto 0 0; padding: var(--e2) var(--e3) 0; font-size: var(--taille-petite); }
	.explorateur [data-deplacement] { display: block; min-height: 1em; color: var(--texte-doux); }
	/* Bouton « … » de chaque ligne (ajouté par le script) : visible au survol et au focus, par-dessus le compteur. */
	.arbre summary, .arbre li.arbre-note { position: relative; }
	.plus-ligne { position: absolute; right: var(--e1); top: 50%; display: none; align-items: center; justify-content: center; min-height: 0; width: 1.5rem; height: 1.5rem; padding: 0; border: 0; border-radius: var(--rayon-petit); background: var(--surface-forte); color: var(--texte); line-height: 1; transform: translateY(-50%); }
	.arbre summary:hover > .plus-ligne, .arbre li.arbre-note:hover > .plus-ligne, .plus-ligne:focus-visible { display: inline-flex; }
	.menu-contexte { position: fixed; z-index: 40; min-width: 11rem; margin: 0; padding: var(--e1); list-style: none; background: var(--fond); color: var(--texte); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); font-size: var(--taille-tableau); }
	.menu-contexte button { display: flex; justify-content: flex-start; width: 100%; min-height: 1.9rem; padding: 0 var(--e2); border: 0; border-radius: var(--rayon-petit); background: none; font-weight: normal; text-align: left; }
	.menu-contexte button:hover, .menu-contexte button:focus-visible { background: var(--surface); }
	.menu-contexte button.danger { color: var(--danger); }
	/* Contenu : en-tête discret, page de lecture centrée, barre d'état */
	.notes-contenu { display: flex; flex-direction: column; }
	.note-fiche { display: flex; flex: 1; flex-direction: column; min-height: 0; }
	.note-entete { display: flex; align-items: center; gap: var(--e2); min-height: 2.5rem; padding: 0 var(--e3); }
	.note-chemin { display: flex; flex: 1; flex-wrap: wrap; align-items: center; gap: var(--e1); min-width: 0; color: var(--texte-doux); font-size: var(--taille-petite); }
	.note-chemin a { color: var(--texte-doux); text-decoration: none; }
	.note-chemin a:hover { color: var(--texte); text-decoration: underline; }
	.note-actions { display: flex; align-items: center; gap: var(--e1); margin-left: auto; }
	.ico-lecture, .ico-edition { display: inline-flex; }
	.note-fiche[data-mode="edition"] .ico-edition, .note-fiche[data-mode="lecture"] .ico-lecture { display: none; }
	details.menu-note { position: relative; }
	.menu-note-corps { position: absolute; right: 0; top: 100%; z-index: 20; display: grid; gap: var(--e1); min-width: 16rem; padding: var(--e2); background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); }
	.menu-note-corps form { display: grid; gap: var(--e1); margin: 0; }
	.menu-note-corps label { font-weight: normal; color: var(--texte-doux); }
	.menu-note-corps .menu-item, .menu-note-corps summary.menu-item { display: flex; align-items: center; justify-content: flex-start; width: 100%; min-height: 1.9rem; padding: 0 var(--e2); border: 0; border-radius: var(--rayon-petit); background: none; color: var(--texte); font-weight: normal; text-align: left; cursor: pointer; list-style: none; }
	.menu-note-corps .menu-item:hover { background: var(--surface); }
	.menu-note-corps .menu-item.danger { color: var(--danger); }
	.menu-note-corps .note-epingle button { gap: var(--e2); }
	/* Colonne de lecture centrée par le remplissage latéral (un max() des pourcentages de la largeur) : aucun enfant n'a besoin de marges automatiques. */
	.note-page { flex: 1; min-height: 0; overflow: auto; padding: var(--e3) max(var(--e4), calc((100% - 46rem) / 2)) var(--e5); }
	.note-page.liste-page { padding-inline: max(var(--e4), calc((100% - 56rem) / 2)); }
	.note-edition h1, .liste-page h1 { margin: var(--e4) 0 var(--e3); font-size: var(--taille-h1); }
	.liste-page form.ligne { margin: var(--e3) 0; }
	.liste-page .defile, .liste-page table.navigable { border: 0; border-radius: 0; }
	.liste-page table.navigable thead th { background: none; }
	.liste-page table.navigable tbody tr:last-child > td { border-bottom: var(--bordure) solid var(--ligne); }
	.notes-ecran input.titre-en-place { width: 100%; min-height: 0; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; color: var(--texte); font: inherit; font-size: var(--taille-h1); font-weight: var(--graisse-titres); letter-spacing: var(--approche-titres); }
	.notes-ecran input.titre-en-place::placeholder { color: var(--texte-doux); opacity: .7; }
	.champ-zone { position: relative; margin-left: calc(-1 * (var(--e3) + 2px)); padding-left: var(--e3); border-left: 2px solid transparent; }
	.champ-zone:focus-within { border-left-color: var(--accent); }
	.notes-ecran textarea.editeur { display: block; width: 100%; min-height: 50vh; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; color: var(--texte); font: inherit; font-family: var(--police-texte); line-height: var(--interligne-texte); resize: none; }
	.notes-ecran textarea.editeur:is(:hover, :focus) { border: 0; box-shadow: none; outline: none; }
	.note-nouvelle .note-dossier-champ { display: flex; align-items: center; gap: var(--e2); margin-bottom: var(--e3); color: var(--texte-doux); font-weight: normal; }
	.note-nouvelle .note-dossier-champ input { flex: 1; max-width: 20rem; }
	.note-fiche[data-mode] form.note-edition > p.actions { display: none; }
	.note-fiche[data-mode="edition"] article.note, .note-fiche[data-mode="lecture"] .champ-zone, .note-fiche[data-mode="lecture"] .note-outils, .note-fiche[data-mode="lecture"] .note-menu { display: none; }
	.note-pied { display: flex; align-items: center; justify-content: flex-end; gap: var(--e4); min-height: 1.9rem; padding: 0 var(--e4); border-top: var(--bordure) solid var(--ligne); color: var(--texte-doux); font-size: var(--taille-petite); }
	.note-etat { margin-right: auto; }
	.note-etat[data-statut="erreur"] { color: var(--danger); }
	.note-outils { position: absolute; z-index: 25; display: flex; padding: var(--e1); background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); }
	.note-outils button { min-width: 1.8rem; min-height: 1.8rem; padding: 0 var(--e2); border: 0; border-radius: var(--rayon-petit); background: none; color: var(--texte); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	.note-outils button:hover { background: var(--surface); }
	.note-menu { position: absolute; z-index: 30; min-width: 14rem; max-width: calc(100% - 2 * var(--e2)); max-height: 16rem; overflow: auto; margin: 0; padding: var(--e1); list-style: none; background: var(--fond); color: var(--texte); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); }
	.note-menu li { display: flex; justify-content: space-between; gap: var(--e2); padding: var(--e1) var(--e2); border-radius: var(--rayon-petit); cursor: pointer; }
	.note-menu li[aria-selected="true"] { background: var(--accent-fond); }
	.note-menu small { color: var(--texte-doux); }
	/* Volet droit : sections repliables séparées par des filets */
	.note-annexes { overflow: auto; padding: var(--e1) 0; }
	.annexe { padding: var(--e1) var(--e3); border-top: var(--bordure) solid var(--ligne); }
	.annexe:first-child { border-top: 0; }
	.annexe > summary { color: var(--texte); display: flex; align-items: center; gap: var(--e2); min-height: 1.9rem; font-weight: var(--graisse-forte); list-style: none; cursor: pointer; }
	.annexe > summary::-webkit-details-marker { display: none; }
	.annexe ul { margin: 0 0 var(--e2); padding: 0; list-style: none; }
	.annexe li { padding: .15rem 0; overflow-wrap: anywhere; }
	.annexe a { color: var(--texte); text-decoration: none; }
	.annexe a:hover { text-decoration: underline; }
	.annexe a.wikilien[data-absent] { color: var(--texte-doux); }
	.annexe p { margin: 0 0 var(--e2); font-size: var(--taille-petite); }
	.note-plan ul.plan-arbre li.niveau-2 { padding-left: var(--e3); }
	.note-plan ul.plan-arbre li.niveau-3, .note-plan ul.plan-arbre li.niveau-4, .note-plan ul.plan-arbre li.niveau-5, .note-plan ul.plan-arbre li.niveau-6 { padding-left: calc(2 * var(--e3)); }
	/* Liste des notes (page /notes), dossier courant, formulaires sans JavaScript */
	.notes-tri { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--e1) var(--e3); margin: var(--e2) 0; font-size: var(--taille-petite); }
	.notes-tri a[aria-current="page"] { font-weight: var(--graisse-forte); color: var(--texte); text-decoration: underline; text-underline-offset: 3px; }
	table.notes-liste td { vertical-align: top; }
	table.notes-liste .note-titre { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--e1); font-weight: var(--graisse-forte); }
	table.notes-liste .extrait { display: block; margin-top: var(--e1); line-height: 1.4; overflow-wrap: anywhere; }
	table.notes-liste td.dossier, table.notes-liste td.date { color: var(--texte-doux); font-size: var(--taille-petite); white-space: nowrap; }
	table.notes-liste td.dossier { white-space: normal; }
	table.notes-liste tr.epinglee td:first-child { border-left: 2px solid var(--accent); }
	.epingle { display: inline-flex; color: var(--accent); }
	.outil-dossier { margin: var(--e2) 0; }
	.outil-dossier summary { color: var(--texte-doux); cursor: pointer; }
	.outil-dossier form { display: grid; gap: var(--e2); margin-top: var(--e2); }
	.note-dossier-nouveau { display: flex; flex-wrap: wrap; align-items: end; gap: var(--e3); margin: var(--e3) 0; }
	tr.non-lue a { font-weight: var(--graisse-forte); }

	/* --- Divers */
	pre.codes { background: var(--surface); padding: var(--e3); font: 1rem var(--police-mono); user-select: all; border-radius: var(--rayon); }
	dl.raccourcis { display: grid; grid-template-columns: auto 1fr; gap: var(--e1) var(--e3); }
	dl.raccourcis dt { font-family: var(--police-mono); }
	dialog { border: var(--bordure) solid var(--ligne); background: var(--fond); color: var(--texte); border-radius: var(--rayon); padding: var(--e4); }
	dialog::backdrop { background: var(--texte); opacity: .4; }

	/* --- Guide de style (/admin/design) : nuancier des jetons de couleur */
	.nuancier { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: var(--e2); }
	.nuancier div { border: var(--bordure) solid var(--ligne); font-size: var(--taille-petite); }
	.nuancier i { display: block; height: 2.5rem; border-bottom: var(--bordure) solid var(--ligne); }
	.nuancier code { display: block; background: none; padding: var(--e1); }
	.nuancier [data-jeton="fond"] { background: var(--fond); }
	.nuancier [data-jeton="surface"] { background: var(--surface); }
	.nuancier [data-jeton="surface-forte"] { background: var(--surface-forte); }
	.nuancier [data-jeton="texte"] { background: var(--texte); }
	.nuancier [data-jeton="texte-doux"] { background: var(--texte-doux); }
	.nuancier [data-jeton="ligne"] { background: var(--ligne); }
	.nuancier [data-jeton="lien"] { background: var(--lien); }
	.nuancier [data-jeton="accent"] { background: var(--accent); }
	.nuancier [data-jeton="succes"] { background: var(--succes); }
	.nuancier [data-jeton="danger"] { background: var(--danger); }
	.nuancier [data-jeton="accent-fond"] { background: var(--accent-fond); }
	.nuancier [data-jeton="sur-accent"] { background: var(--sur-accent); }
	.nuancier [data-jeton="succes-fond"] { background: var(--succes-fond); }
	.nuancier [data-jeton="danger-fond"] { background: var(--danger-fond); }
	.nuancier [data-jeton="vote-pour"] { background: var(--vote-pour); }
	.nuancier [data-jeton="vote-contre"] { background: var(--vote-contre); }
	.nuancier [data-jeton="vote-abstention"] { background: var(--vote-abstention); }
	.nuancier [data-jeton="vote-absent"] { background: var(--vote-absent); }
	.nuancier [data-jeton="groupe-gauche-radicale"] { background: var(--groupe-gauche-radicale); }
	.nuancier [data-jeton="groupe-gauche"] { background: var(--groupe-gauche); }
	.nuancier [data-jeton="groupe-ecologiste"] { background: var(--groupe-ecologiste); }
	.nuancier [data-jeton="groupe-centre-gauche"] { background: var(--groupe-centre-gauche); }
	.nuancier [data-jeton="groupe-centre"] { background: var(--groupe-centre); }
	.nuancier [data-jeton="groupe-centre-droit"] { background: var(--groupe-centre-droit); }
	.nuancier [data-jeton="groupe-independants"] { background: var(--groupe-independants); }
	.nuancier [data-jeton="groupe-droite"] { background: var(--groupe-droite); }
	.nuancier [data-jeton="groupe-extreme-droite"] { background: var(--groupe-extreme-droite); }
	.nuancier [data-jeton="nature-loi"] { background: var(--nature-loi); }
	.nuancier [data-jeton="nature-ordonnance"] { background: var(--nature-ordonnance); }
	.nuancier [data-jeton="nature-decret"] { background: var(--nature-decret); }
	.nuancier [data-jeton="nature-arrete"] { background: var(--nature-arrete); }
	.nuancier [data-jeton="nature-autre"] { background: var(--nature-autre); }
	.nuancier [data-jeton="nature-dossier"] { background: var(--nature-dossier); }
	.nuancier [data-jeton="nature-decision"] { background: var(--nature-decision); }
	.nuancier [data-jeton="nature-jurisprudence"] { background: var(--nature-jurisprudence); }

	/* Bulle d'aperçu d'une citation (survol / focus) */
	.bulle-apercu { position: absolute; z-index: 30; max-width: min(26rem, calc(100vw - 1rem)); padding: var(--e3); background: var(--fond); color: var(--texte); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); box-shadow: var(--anneau-focus); font-size: var(--taille-tableau); line-height: 1.45; pointer-events: none; }
	.bulle-apercu p { margin: 0; }
	.bulle-apercu p + p { margin-top: var(--e2); }
	.bulle-apercu .apercu-titre { font-weight: var(--graisse-forte); color: var(--texte-doux); }

	/* Annotations : surlignage dans le texte (mark), barre de sélection, encart « Mes annotations » */
	.nuancier [data-jeton="surligne-jaune"] { background: var(--surligne-jaune); }
	.nuancier [data-jeton="surligne-vert"] { background: var(--surligne-vert); }
	.nuancier [data-jeton="surligne-bleu"] { background: var(--surligne-bleu); }
	.nuancier [data-jeton="surligne-rose"] { background: var(--surligne-rose); }
	mark.annotation { color: inherit; border-radius: var(--rayon); }
	mark.annotation[data-couleur="jaune"], .pastille-surlignage[data-couleur="jaune"] { background: var(--surligne-jaune); }
	mark.annotation[data-couleur="vert"], .pastille-surlignage[data-couleur="vert"] { background: var(--surligne-vert); }
	mark.annotation[data-couleur="bleu"], .pastille-surlignage[data-couleur="bleu"] { background: var(--surligne-bleu); }
	mark.annotation[data-couleur="rose"], .pastille-surlignage[data-couleur="rose"] { background: var(--surligne-rose); }
	mark.annotation[data-commentaire] { border-bottom: var(--bordure) dotted var(--texte-doux); cursor: help; }
	mark.annotation:target, mark.annotation[data-actif] { outline: var(--bordure) solid var(--accent); }
	.pastille-surlignage { display: inline-block; width: 1em; height: 1em; vertical-align: -.15em; border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-pastille); }
	.annotations { margin-top: var(--e4); padding-top: var(--e2); border-top: var(--bordure) dashed var(--ligne); }
	.annotations summary { cursor: pointer; font-weight: var(--graisse-forte); }
	.annotations-liste { list-style: none; margin: var(--e3) 0; padding: 0; display: grid; gap: var(--e3); }
	.annotation-item { padding: var(--e2) var(--e3); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); }
	.annotation-item blockquote { margin: 0 0 var(--e2); border-left: var(--e1) solid var(--ligne); border-radius: 0; }
	.annotation-item[data-couleur="jaune"] blockquote { border-left-color: var(--surligne-jaune); }
	.annotation-item[data-couleur="vert"] blockquote { border-left-color: var(--surligne-vert); }
	.annotation-item[data-couleur="bleu"] blockquote { border-left-color: var(--surligne-bleu); }
	.annotation-item[data-couleur="rose"] blockquote { border-left-color: var(--surligne-rose); }
	.annotation-item[data-orpheline] { border-style: dashed; }
	.annotation-item p { margin: var(--e1) 0; }
	.annotation-item .outil-dossier { margin: var(--e2) 0; }
	.annotation-item form.inline { display: inline; }
	.annotation-barre { position: absolute; z-index: 30; display: grid; gap: var(--e2); max-width: min(22rem, calc(100vw - 1rem)); padding: var(--e2); background: var(--fond); color: var(--texte); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); box-shadow: var(--anneau-focus); font-size: var(--taille-tableau); }
	.annotation-barre[data-exemple] { position: static; }
	.annotation-barre .rang { display: flex; flex-wrap: wrap; gap: var(--e2); align-items: center; }
	.annotation-barre button[data-couleur] { width: 2rem; height: 2rem; padding: 0; border: var(--bordure) solid var(--ligne); }
	.annotation-barre button[data-couleur="jaune"] { background: var(--surligne-jaune); }
	.annotation-barre button[data-couleur="vert"] { background: var(--surligne-vert); }
	.annotation-barre button[data-couleur="bleu"] { background: var(--surligne-bleu); }
	.annotation-barre button[data-couleur="rose"] { background: var(--surligne-rose); }
	.annotation-barre button[aria-pressed="true"] { outline: var(--bordure) solid var(--accent); }
	.annotation-barre textarea, .annotation-barre input { width: 100%; }
	.annotation-barre .erreur { margin: 0; }
	/* Modale d'édition d'une annotation (dialog natif) et références juridiques */
	dialog.dialogue { width: min(32rem, calc(100vw - 2rem)); }
	dialog.dialogue::backdrop { background: color-mix(in srgb, var(--texte) 40%, transparent); opacity: 1; }
	dialog.dialogue h2 { margin-top: 0; font-size: var(--taille-h3); }
	dialog.dialogue textarea, dialog.dialogue input:not([type]), dialog.dialogue input[type="text"] { width: 100%; }
	dialog.dialogue blockquote { margin: var(--e2) 0; }
	.annotation-dialogue .rang { display: flex; gap: var(--e2); margin: var(--e2) 0; }
	.annotation-dialogue button[data-couleur] { width: 2rem; height: 2rem; padding: 0; border: var(--bordure) solid var(--ligne); }
	.annotation-dialogue button[data-couleur="jaune"] { background: var(--surligne-jaune); }
	.annotation-dialogue button[data-couleur="vert"] { background: var(--surligne-vert); }
	.annotation-dialogue button[data-couleur="bleu"] { background: var(--surligne-bleu); }
	.annotation-dialogue button[data-couleur="rose"] { background: var(--surligne-rose); }
	.annotation-dialogue button[aria-pressed="true"] { outline: var(--bordure) solid var(--accent); outline-offset: 2px; }
	mark.annotation:focus-visible { outline: var(--bordure) solid var(--accent); }
	.annotation-references { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e2); align-items: baseline; margin: var(--e1) 0; }
	.annotation-references a.pastille { text-decoration: none; white-space: normal; }
	li.tache { list-style: none; margin-left: calc(-1 * var(--e3)); }
	li.tache input[type="checkbox"] { margin-right: var(--e1); accent-color: var(--accent); }
	li.tache input[data-tache]:not(:disabled) { cursor: pointer; }

	/* Accueil : présentation du visiteur, prise en main, cartes du tableau de bord */
	.chapeau { font-size: var(--taille-tableau); max-width: 60ch; }
	.usages { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: var(--e3); padding: 0; margin: var(--e3) 0; list-style: none; }
	.usages li { padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	.usages h3 { margin-top: 0; }
	/* Cartes de l'accueil : hauteur naturelle, jamais coupées entre deux colonnes, pas de blanc entre elles ; 1 colonne sur mobile, 2 puis 3 selon la largeur. `grand` = pleine largeur. */
	.carte { min-width: 0; padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); break-inside: avoid; margin-bottom: var(--e3); }
	.cartes:has(> .carte) { display: block; columns: 20rem 3; column-gap: var(--e3); }
	/* Éditeur du tableau de bord (accueil, Pro) : cartes saisissables en entier, badge « − » dans le coin, barre flottante en bas, carte
	   soulevée qui suit le pointeur et emplacement en pointillés. En édition, grille régulière : la position de dépôt est prévisible. */
	.barre-dashboard { display: flex; flex-wrap: wrap; gap: var(--e2); align-items: center; margin: var(--e3) 0; }
	.outils-edition { display: inline-flex; flex-wrap: wrap; gap: var(--e2); align-items: center; }
	.etat-dashboard { color: var(--texte-doux); font-size: var(--taille-petite); }
	.etat-dashboard button.lien { padding: 0; min-height: 0; border: 0; background: none; color: var(--lien); text-decoration: underline; cursor: pointer; font: inherit; }
	body.edition-dashboard { padding-bottom: 7rem; }
	body.edition-dashboard .barre-dashboard { position: fixed; z-index: 40; left: 50%; bottom: var(--e4); transform: translateX(-50%); margin: 0; flex-wrap: nowrap; padding: var(--e2) var(--e3); background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-pastille); box-shadow: var(--ombre-forte); white-space: nowrap; }
	body.edition-dashboard .barre-dashboard .etat-dashboard { max-width: 16rem; overflow: hidden; text-overflow: ellipsis; }
	/* Mobile : la barre d'édition flottante tient dans l'écran (retour à la ligne) au lieu de déborder à droite. */
	@media (max-width: 40rem) {
		body.edition-dashboard .barre-dashboard { left: var(--gouttiere); right: var(--gouttiere); width: auto; transform: none; flex-wrap: wrap; justify-content: center; white-space: normal; border-radius: var(--rayon-grand); }
	}
	.ajout-widget { margin: var(--e3) 0; padding: var(--e3) var(--e4); border: var(--bordure) dashed var(--ligne); border-radius: var(--rayon-grand); }
	.ajout-widget h2 { margin: 0 0 var(--e2); font-size: var(--taille-tableau); text-transform: uppercase; letter-spacing: .04em; color: var(--texte-doux); }
	.ajout-widget ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--e2); }
	.ajout-widget li { display: flex; flex-wrap: wrap; gap: var(--e2) var(--e3); align-items: center; justify-content: space-between; }
	.ajout-widget .ajout-pied { margin: var(--e3) 0 0; padding-top: var(--e2); border-top: var(--bordure) solid var(--ligne); }
	body.edition-dashboard .ajout-widget { position: fixed; z-index: 39; left: 50%; bottom: 5.5rem; transform: translateX(-50%); width: min(34rem, calc(100vw - 2 * var(--e3))); max-height: 55vh; overflow: auto; margin: 0; background: var(--fond); border-style: solid; box-shadow: var(--ombre-forte); }
	/* Même mise en page qu'en lecture (colonnes « maçonnerie ») : ce qu'on arrange est ce qu'on verra. */
	.cartes.edition:empty { min-height: 6rem; }
	.cartes.edition > .carte { margin-bottom: var(--e3); }
	.cartes.edition > .carte { position: relative; background: var(--fond); box-shadow: var(--ombre); cursor: grab; user-select: none; touch-action: manipulation; }
	.cartes.edition > .carte:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
	.cartes.edition > .carte > :not(.retirer) { pointer-events: none; }
	.carte > .retirer { position: absolute; top: 0; left: 0; transform: translate(-40%, -40%); z-index: 2; width: 1.85rem; min-height: 1.85rem; height: 1.85rem; padding: 0; display: grid; place-items: center; font-size: var(--taille-h3); line-height: 1; background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); box-shadow: var(--ombre); cursor: pointer; }
	.carte > .retirer:hover { background: var(--danger-fond); color: var(--danger); border-color: var(--danger); }
	.carte-vide { border: 2px dashed var(--accent); border-radius: var(--rayon-grand); background: var(--accent-fond); break-inside: avoid; margin-bottom: var(--e3); }
	.cartes.edition > .carte.souleve, .carte.souleve { position: fixed; z-index: 60; margin: 0; cursor: grabbing; box-shadow: var(--ombre-forte); transform: rotate(1.5deg); pointer-events: none; opacity: .96; }
	body.glisse { cursor: grabbing; user-select: none; }
	.carte.saisi { outline: 2px solid var(--accent); outline-offset: 3px; }
	.carte h2 { margin-top: 0; font-size: var(--taille-tableau); }
	.carte ul { margin: 0; padding-left: var(--e4); }
	.carte .grille { margin: 0; }
	/* Tableau nu dans une carte (agenda, scrutins de l'accueil) : la colonne de libellé (cellule à lien, sinon la dernière) prend la place restante
	   et passe à la ligne ; les cellules courtes sans lien (date, chambre) restent sur une ligne, une dernière colonne de texte après le lien passe à la ligne. */
	.carte > table td:last-child { width: 100%; }
	.carte > table td:not(:last-child):not(:has(a)) { white-space: nowrap; }
	.carte > table tr:has(> td:not(:last-child) > a) > td:has(> a) { width: 100%; }
	.carte > table tr:has(> td:not(:last-child) > a) > td:last-child:not(:has(a)) { width: auto; white-space: normal; min-width: 6rem; }
	/* Frise des groupes successifs d'un élu : une étape par groupe, reliées par une flèche. */
	.groupes-successifs { list-style: none; margin: var(--e3) 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--e2) var(--e5); }
	.groupes-successifs li { position: relative; display: grid; padding: var(--e1) var(--e3); border-left: 3px solid var(--accent); }
	.groupes-successifs li + li::before { content: "→"; position: absolute; left: calc(-1 * var(--e5) + var(--e1)); color: var(--texte-doux); }
	.groupes-successifs small { color: var(--texte-doux); }
	/* Cartes d'accueil : bloc-notes libre (zone de texte pleine largeur) et annotations récentes. */
	.bloc-notes { display: grid; gap: var(--e2); }
	.bloc-notes textarea { width: 100%; min-height: 6rem; resize: vertical; }
	.bloc-notes button { justify-self: start; }
	.annotations-carte { list-style: none; padding: 0; display: grid; gap: var(--e3); }
	.courbe { margin: var(--e3) 0 0; }
	.courbe svg { display: block; width: 100%; height: 2.5rem; }
	.courbe polyline { fill: none; stroke: var(--accent); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
	.courbe figcaption { font-size: var(--taille-petite); }
	.carte-lien { margin-bottom: 0; font-size: var(--taille-petite); }
	/* Cartes d'analyse (accueil) : barres par champ en SVG (largeur = attribut, sans style en ligne) ; choix du groupe sur une ligne. */
	.barres-champs { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--e2); }
	.barres-champs small { font-size: var(--taille-petite); }
	.barre-champ { display: block; width: 100%; height: 0.3rem; margin-top: var(--e1); }
	.barre-champ rect { fill: var(--accent); }
	.choix-groupe { margin-bottom: var(--e2); }
	.prise-en-main { margin: var(--e3) 0; padding: var(--e3) var(--e4); background: var(--accent-fond); border-radius: var(--rayon-grand); }
	.prise-en-main h2 { margin-top: 0; }
	.prise-en-main .ignorer { margin: var(--e3) 0 0; font-size: var(--taille-petite); }
	.etapes { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--e2); }
	.etapes .etat { display: inline-block; min-width: 4.5rem; font-size: var(--taille-petite); font-weight: var(--graisse-forte); color: var(--texte-doux); }
	.etapes .fait .etat { color: var(--succes); }
	/* Bouton d'une étape (lien ou « C'est fait ») ; l'étape mise en avant (li.suivante) a le bouton plein. */
	.etapes .cta { display: inline-block; min-height: var(--hauteur-champ); margin-left: var(--e2); padding: 0 var(--e3); border: var(--bordure) solid var(--accent); border-radius: var(--rayon); color: var(--accent); background: transparent; font: inherit; line-height: var(--hauteur-champ); text-decoration: none; cursor: pointer; }
	.etapes .suivante .cta { color: var(--sur-accent); background: var(--accent); }
	.etapes form.inline { display: inline; }
	.choix-cartes { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--e2); }
	.choix-cartes li { display: flex; flex-wrap: wrap; gap: var(--e2) var(--e4); align-items: center; justify-content: space-between; padding: var(--e2) var(--e3); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon); }
	.choix-cartes .ordre { display: flex; gap: var(--e2); align-items: end; }
	/* Glisser-déposer (dashboard.js) : poignée ajoutée par le script, ligne saisie mise en relief. */
	.choix-cartes .poignee { flex: none; min-width: 2.75rem; min-height: 2.75rem; padding: 0; touch-action: none; cursor: grab; }
	.choix-cartes .poignee[aria-pressed=true] { background: var(--accent-fond); border-color: var(--accent); }
	.choix-cartes li.saisi { background: var(--accent-fond); border-color: var(--accent); }
	.choix-cartes li:has(.poignee) label { flex: 1 1 12rem; }
	.apercu .carte h3 { margin: 0; font-size: var(--taille-tableau); }
	.apercu .carte[data-taille=petit] { padding-block: var(--e2); }
	.apercu .carte[data-taille=moyen]::after, .apercu .carte[data-taille=grand]::after { content: ""; display: block; height: 3rem; margin-top: var(--e2); border-top: var(--bordure) dashed var(--ligne); }
	.apercu .carte[data-taille=grand]::after { height: 5rem; }
	.sr-seul { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }

	/* Champs du droit : pastille neutre cliquable, arbre des champs, badge de proximité (jamais de couleur seule : le libellé dit le niveau) */
	a.champ-droit { text-decoration: none; color: var(--texte); }
	a.champ-droit:hover, a.champ-droit:focus-visible { background: var(--accent-fond); color: var(--accent); }
	a.champ-droit[data-rang="secondaire"] { font-weight: normal; color: var(--texte-doux); }
	.champs-droit { display: inline-flex; flex-wrap: wrap; gap: var(--e1) var(--e2); }
	.champs-droit-ligne { margin: var(--e2) 0; font-size: var(--taille-petite); color: var(--texte-doux); }
	.champs-racine { margin: var(--e3) 0; }
	.champs-arbre { margin: 0; padding-left: var(--e4); columns: 2 22rem; }
	.champs-arbre li { break-inside: avoid; padding: var(--e1) 0; }
	.proximite { display: inline-block; padding: .1em var(--e3); border-radius: var(--rayon-pastille); background: var(--surface-forte); color: var(--texte); font-size: var(--taille-petite); white-space: nowrap; }
	.proximite[data-niveau="fort"] { background: var(--succes-fond); color: var(--succes); }
	.proximite[data-niveau="moyen"] { background: var(--accent-fond); color: var(--accent); }
	.proximite[data-niveau="indetermine"] { background: transparent; color: var(--texte-doux); border: var(--bordure) dashed var(--ligne); }
	.proximite-ligne { margin: var(--e1) 0; }
	details.facteurs { display: inline-block; margin-left: var(--e2); font-size: var(--taille-petite); vertical-align: top; }
	details.facteurs ul { margin: var(--e1) 0; padding-left: var(--e4); }

	/* --- Textes éditables (/admin/textes) */
	.texte-modifier { margin-left: var(--e1); font-size: var(--taille-petite); color: var(--texte-doux); }
	/* Édition des textes sur la page (admin, edition.js) : liens « modifier » visibles seulement en mode édition (repli sans JS : toujours visibles). */
	[data-edition-js]:not([data-edition]) .texte-modifier { display: none; }
	[data-edition] .texte-editable { outline: 1px dashed color-mix(in oklab, var(--accent) 70%, transparent); outline-offset: 2px; border-radius: 2px; cursor: text; }
	[data-edition] .texte-editable:hover { background: var(--accent-fond); }
	.edition-bascule { position: fixed; z-index: 50; left: var(--e4); bottom: var(--e4); box-shadow: var(--ombre); border-color: var(--accent); }
	.edition-bascule[aria-pressed="true"] { background: var(--accent); color: var(--sur-accent); }
	.edition-dialogue { width: min(40rem, calc(100vw - 2rem)); padding: var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); background: var(--fond); color: var(--texte); box-shadow: var(--ombre); }
	.edition-dialogue::backdrop { background: color-mix(in oklab, var(--texte) 35%, transparent); }
	.edition-dialogue h2 { margin: 0; font-size: 1.1rem; }
	.edition-dialogue textarea { width: 100%; }
	.edition-dialogue .actions { display: flex; flex-wrap: wrap; gap: var(--e3); align-items: center; }
	.edition-dialogue .edition-registre { display: flex; width: fit-content; margin: var(--e2) 0; }
	@media print { .edition-bascule, .texte-modifier { display: none; } }
	.texte-fiche { margin: var(--e4) 0; padding: var(--e3) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	.texte-fiche h3 { margin: 0; font-size: var(--taille-tableau); }
	.texte-fiche:target { border-color: var(--accent); }
	.texte-apercu { margin: var(--e2) 0; padding: var(--e2) var(--e3); background: var(--surface-forte); border-radius: var(--rayon); }
	.texte-edition label, .texte-edition textarea, .texte-edition input[name="valeur"] { display: block; width: 100%; box-sizing: border-box; }
	.texte-edition .actions { display: flex; flex-wrap: wrap; gap: var(--e3); align-items: center; margin-top: var(--e2); }
	.texte-registres { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--e4); }
	.texte-registres h4 { margin: var(--e2) 0 var(--e1); font-size: var(--taille-tableau); }
	@media (max-width: 52rem) { .texte-registres { grid-template-columns: minmax(0, 1fr); } }
	.texte-historique { margin: var(--e1) 0; padding-left: var(--e4); }

	/* --- Champs du droit : administration (/admin/domaines) */
	.fil-admin { margin: var(--e2) 0; font-size: var(--taille-petite); }
	.domaines-edition fieldset { margin: var(--e3) 0; padding: var(--e2) var(--e4); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	.domaines-edition legend { padding: 0 var(--e2); font-weight: 600; }
	.domaines-edition label, .domaines-edition textarea { display: block; box-sizing: border-box; }
	.domaines-edition textarea { width: 100%; font-family: var(--police-mono); }
	.domaines-edition .actions { display: flex; flex-wrap: wrap; gap: var(--e3); }
	ul.cases { margin: var(--e1) 0; padding: 0; list-style: none; columns: 2 20rem; }
	ul.cases li { break-inside: avoid; padding: var(--e1) 0; }
	ul.cases label { display: inline; }
	.domaines-impact { margin: var(--e3) 0; padding: var(--e2) var(--e4); background: var(--surface-forte); border-radius: var(--rayon); }
	.domaines-actions { display: flex; flex-wrap: wrap; gap: var(--e3); align-items: end; }
	.domaines-masse td:first-child { width: 2em; }

	/* --- Rapports publics : pagination numérotée, colonnes et extrait de la liste, champ d'année */
	nav.pagination { display: flex; flex-wrap: wrap; align-items: center; gap: var(--e1); margin: var(--e3) 0; }
	nav.pagination a, nav.pagination span { min-width: 2.25em; padding: var(--e1) var(--e2); text-align: center; border: var(--bordure) solid transparent; border-radius: var(--rayon); font-variant-numeric: tabular-nums; }
	nav.pagination a { border-color: var(--ligne); text-decoration: none; }
	nav.pagination a:hover { background: var(--surface); }
	nav.pagination [aria-current="page"] { background: var(--accent); color: var(--sur-accent); border-color: var(--accent); font-weight: var(--graisse-forte); }
	/* Barre de pagination commune (vues/pagination.ts) : plage « 31–60 sur 1 204 », pages numérotées, lignes par page */
	.pagination-barre { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--e2) var(--e4); margin: var(--e3) 0; }
	.pagination-barre p, .pagination-barre nav.pagination { margin: 0; }
	.pagination-barre .plage { color: var(--texte-doux); font-variant-numeric: tabular-nums; }
	.par-page { color: var(--texte-doux); font-size: var(--taille-petite); }
	.par-page a, .par-page [aria-current] { display: inline-block; min-width: 2.25em; padding: var(--e1) var(--e2); text-align: center; border-radius: var(--rayon); font-variant-numeric: tabular-nums; }
	.par-page [aria-current] { background: var(--surface-forte); color: var(--texte); font-weight: var(--graisse-forte); }
	table.rapports th:nth-child(1) { width: 7rem; }
	table.rapports th:nth-child(3) { width: 13rem; }
	table.rapports th:nth-child(4) { width: 9rem; }
	table.rapports p.extrait { margin: var(--e1) 0 0; color: var(--texte-doux); font-size: var(--taille-tableau); }
	input.annee { width: 6em; }
	/* --- Décisions de la justice administrative : liste (date, juridiction, décision, solution) et bloc « décisions citant cet article » */
	table.decisions-adm th:nth-child(1) { width: 7rem; }
	table.decisions-adm th:nth-child(2) { width: 12rem; }
	table.decisions-adm th:nth-child(4) { width: 9rem; }
	table.decisions-adm p.extrait { margin: var(--e1) 0 0; color: var(--texte-doux); font-size: var(--taille-tableau); }
	form.filtres > details.avance { margin: 0; }
	.decisions-adm-citant h2 small { font-weight: normal; color: var(--texte-doux); }
	/* --- Champs du droit : fiche de liens d'un nœud du graphe (fil de parcours rempli par app.js, chemin entre deux nœuds) */
	nav.parcours { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--e1) var(--e2); margin: var(--e2) 0; font-size: var(--taille-petite); }
	nav.parcours:empty { display: none; }
	nav.parcours ol, ol.chemin { margin: 0; padding: 0; list-style: none; }
	nav.parcours ol { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e3); }
	nav.parcours li[aria-current] { font-weight: var(--graisse-forte); }
	ol.chemin li { padding: var(--e1) 0; }
	.fiche-noeud h3 small { font-weight: normal; color: var(--texte-doux); }

	/* --- Champs du droit : frise chronologique (/domaines/frise). Une classe par nature donne --c (jetons --nature-*) ; la barre SVG, la pastille et la légende la reprennent.
	   Histogramme par année : barres empilées (réutilise svg .serie et ul.legende), année cliquable (zone transparente), alternative en tableau. */
	.nat-loi { --c: var(--nature-loi); }
	.nat-ordonnance { --c: var(--nature-ordonnance); }
	.nat-decret { --c: var(--nature-decret); }
	.nat-arrete { --c: var(--nature-arrete); }
	.nat-autre { --c: var(--nature-autre); }
	.nat-dossier { --c: var(--nature-dossier); }
	.nat-decision { --c: var(--nature-decision); }
	.nat-jurisprudence { --c: var(--nature-jurisprudence); }
	.pastille.nature::before { content: ""; display: inline-block; width: .6em; height: .6em; margin-right: var(--e1); border-radius: var(--rayon-pastille); background: var(--c); }
	/* Groupe de cases (radios, cases à cocher) dans un formulaire de filtres : pleine largeur, sans cadre, légende au style des libellés. */
	form.filtres fieldset.natures { grid-column: 1 / -1; min-width: 0; margin: 0; padding: 0; border: 0; }
	form.filtres fieldset.natures legend { padding: 0; margin-bottom: var(--e1); font-size: var(--taille-petite); font-weight: var(--graisse-forte); }
	form.filtres fieldset.natures legend small { font-weight: normal; }
	form.filtres .natures-cases { display: flex; flex-wrap: wrap; gap: var(--e1) var(--e4); }
	form.filtres .natures-cases label.case { min-height: 2rem; align-self: auto; }
	figure.histo { margin: var(--e3) 0; }
	figure.histo .defile { padding: var(--e2) var(--e2) 0; }
	svg.histo-annees { display: block; width: 100%; min-width: 48rem; height: auto; }
	svg.histo-annees .serie { stroke-width: var(--bordure); }
	svg.histo-annees.dense .serie { stroke: none; }
	svg.histo-annees .zone { fill: transparent; }
	svg.histo-annees a:hover .zone { fill: var(--surface); }
	svg.histo-annees .grille { stroke: var(--ligne); stroke-width: var(--bordure); }
	svg.histo-annees .axe-ligne { stroke: var(--texte-doux); stroke-width: var(--bordure); }
	svg.histo-annees text.axe { fill: var(--texte-doux); font-size: var(--taille-petite); font-variant-numeric: tabular-nums; }
	details.histo-tableau { margin: var(--e2) 0 0; font-size: var(--taille-petite); }
	details.histo-tableau summary { cursor: pointer; color: var(--texte-doux); }
	details.histo-tableau .defile { max-height: 20rem; overflow-y: auto; }
	/* Liste par année : titre d'année avec son effectif, tableau à colonnes fixes (date, nature, titre, champ, rôle). */
	h2[id^="annee-"] { scroll-margin-top: calc(var(--hauteur-entete) + var(--e2)); }
	h2[id^="annee-"] small { font-weight: normal; color: var(--texte-doux); }
	table.chrono col.c-date { width: 6.5rem; }
	table.chrono col.c-nature { width: 10.5rem; }
	table.chrono col.c-champs { width: 14rem; }
	table.chrono col.c-role { width: 8.5rem; }
	/* Gouvernement : listes sobres, cabinets et services (organigramme : section « Organigramme dessiné »). */
	/* Gouvernement, portes d'entrée (modules/gouvernement/portes.ts, accueil.ts) : rangée des trois portes au-dessus de la navigation de la porte courante ;
	   volets de l'accueil (ul.portes-cartes > li > section.carte.porte, dl.stats) ; indicateurs de réponse : valeur écrite au-dessus d'une barre simple (svg.barre-champ). */
	nav.sous.portes { margin-top: 0; }
	nav.sous.portes a { color: var(--texte); }
	nav.sous.portes + nav.sous { border-bottom: 0; margin-top: var(--e1); }
	/* Volets empilés, pleine largeur. `columns: auto` annule la colonne multiple de la règle générique (.cartes:has(> .carte)), défense si un volet y tombe. */
	.cartes.portes-cartes { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--e3); columns: auto; list-style: none; padding: 0; margin: var(--e3) 0; }
	.portes-cartes > li { min-width: 0; }
	.carte.porte { margin: 0; }
	/* 1. Titre : lien principal vers la page d'arrivée, souligné (la cible ne tient pas à la seule couleur). */
	.carte.porte h2 { margin: 0 0 var(--e1); }
	.carte.porte h2 a { color: var(--lien); text-decoration: underline; text-underline-offset: .2em; overflow-wrap: anywhere; }
	/* 2. Phrase d'usage. */
	.carte.porte .usage { margin: 0 0 var(--e3); color: var(--texte-doux); }
	/* 3. Chiffres : valeur grande au-dessus, libellé petit dessous (dt avant dd dans le DOM, ordre inversé à l'écran) ; la rangée passe à la ligne. */
	.carte.porte dl.stats { display: flex; flex-wrap: wrap; gap: var(--e3) var(--e5); margin: 0 0 var(--e3); }
	.carte.porte dl.stats > div { display: flex; flex-direction: column-reverse; min-width: 7rem; max-width: 100%; }
	.carte.porte dl.stats dd { margin: 0; font-size: var(--taille-chiffre); font-weight: var(--graisse-chiffre); line-height: 1.1; text-align: left; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
	.carte.porte dl.stats dd a { font-size: var(--taille-tableau); font-weight: var(--graisse-forte); }
	.carte.porte dl.stats dd small { font-size: var(--taille-tableau); font-weight: normal; }
	.carte.porte dl.stats dt { margin-top: var(--e1); color: var(--texte-doux); font-size: var(--taille-petite); }
	/* 4. Sous-entrées : liens secondaires, description en petit dessous. */
	.carte.porte ul.porte-liens { margin: var(--e3) 0 0; border-top: var(--bordure) solid var(--ligne); }
	.carte.porte ul.porte-liens > li { padding: var(--e2) 0; border-bottom: var(--bordure) solid var(--ligne); }
	.carte.porte ul.porte-liens > li:last-child { border-bottom: 0; padding-bottom: 0; }
	.carte.porte ul.porte-liens small { display: block; }
	/* Volet sélectionné au clavier (j/k, app.js) : fond teinté et barre d'accent, en forme comme en couleur. */
	.portes-cartes > li[data-selection] > .carte.porte { background: var(--accent-fond); box-shadow: inset var(--bordure-forte) 0 0 var(--accent); }
	/* Budget (modules/gouvernement/budget) : montant en toutes lettres sur une ligne (« 147,1 milliards d'euros ») ; total en pied de tableau. */
	table.budget td.n { white-space: nowrap; }
	table.indicateurs td.indicateur { min-width: 9rem; }
	table.indicateurs td.indicateur .valeur { display: block; font-variant-numeric: tabular-nums; }
	table.indicateurs tfoot th { text-align: left; }
	/* Organigramme dessiné (modules/gouvernement/organigramme.ts) : arbre en liste imbriquée, traits coudés tracés par ::before / ::after.
	   --orga-pas : retrait d'un niveau ; --orga-y : hauteur du coude (milieu de la première ligne d'une carte). */
	.orga { --orga-pas: 1.75rem; --orga-y: 1.6rem; --orga-trait: var(--bordure-forte) solid var(--ligne); margin: var(--e4) 0; max-width: 52rem; }
	.orga-sommet { display: flex; flex-direction: column; align-items: flex-start; }
	.orga-lien-vertical { display: block; width: 0; height: var(--e3); margin-left: calc(var(--e3) + 1.1rem - var(--bordure-forte) / 2); border-left: var(--orga-trait); }
	.orga-carte { display: inline-flex; align-items: flex-start; gap: var(--e2); padding: var(--e2) var(--e3); background: var(--surface); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); color: var(--texte); text-decoration: none; max-width: 100%; transition: border-color .15s ease, box-shadow .15s ease; }
	a.orga-carte:hover { border-color: var(--accent); box-shadow: var(--ombre); }
	a.orga-carte:focus-visible { outline: var(--contour-focus); outline-offset: 2px; }
	.orga-texte { display: flex; flex-direction: column; min-width: 0; }
	.orga-texte small { color: var(--texte-doux); }
	.orga-ministere { font-size: var(--taille-petite); color: var(--lien); margin-top: .1rem; }
	.orga-initiales { flex: none; display: grid; place-items: center; width: 2.2rem; height: 2.2rem; border-radius: 50%; background: var(--accent-fond); color: var(--accent); font-weight: var(--graisse-forte); font-size: var(--taille-petite); letter-spacing: .02em; }
	.orga-president { background: transparent; border-style: dashed; }
	.orga-pm { border-color: var(--accent); border-width: var(--bordure-forte); }
	.orga-pm .orga-initiales { background: var(--accent); color: var(--sur-accent); }
	.orga-delegue { padding: var(--e1) var(--e2); }
	.orga-delegue .orga-initiales { width: 1.8rem; height: 1.8rem; background: var(--surface-forte); color: var(--texte-doux); }
	.orga-arbre, .orga-delegues { list-style: none; margin: 0; padding: 0 0 0 var(--orga-pas); }
	/* Le tronc part du milieu de la carte du Premier ministre (initiales). */
	.orga-arbre { margin-left: calc(var(--e3) + 1.1rem - var(--bordure-forte) / 2); padding-left: 0; }
	.orga-ministre { min-width: min(20rem, 100%); }
	.orga-branche-delegue { --orga-y: 1.3rem; }
	.orga-arbre > li, .orga-delegues > li { position: relative; padding: var(--e1) 0 var(--e1) var(--orga-pas); }
	/* Coude : du tronc vers la carte. */
	.orga-arbre > li::before, .orga-delegues > li::before { content: ""; position: absolute; left: 0; top: 0; width: calc(var(--orga-pas) - var(--e1)); height: var(--orga-y); border-left: var(--orga-trait); border-bottom: var(--orga-trait); border-bottom-left-radius: var(--rayon); }
	/* Tronc : continue vers le frère suivant (absent sous le dernier). */
	.orga-arbre > li::after, .orga-delegues > li::after { content: ""; position: absolute; left: 0; top: var(--orga-y); bottom: 0; border-left: var(--orga-trait); }
	.orga-arbre > li:last-child::after, .orga-delegues > li:last-child::after { display: none; }
	.orga-delegues > li { --orga-y: 1.3rem; }
	@media (max-width: 40rem) { .orga { --orga-pas: 1.1rem; } }
	@media (prefers-reduced-motion: reduce) { .orga-carte { transition: none; } }
	ul.sobre { list-style: none; margin: 0; padding: 0; }
	ul.services { list-style: none; padding: 0; }
	ul.services > li { padding: var(--e2) 0; border-bottom: var(--bordure) solid var(--ligne); }
	section.cabinet details { margin: var(--e1) 0 var(--e1) var(--e3); }
	/* Fiche d'un ministère (modules/gouvernement/fiche.ts) : sections repliables, titre de section dans le résumé, éléments récents, lien « Tout voir ». */
	details.fiche-bloc { max-width: 52rem; margin: var(--e4) 0; padding-top: var(--e2); border-top: var(--bordure) solid var(--ligne); }
	details.fiche-bloc > summary { cursor: pointer; }
	details.fiche-bloc > summary:focus-visible { outline: var(--contour-focus); outline-offset: 2px; }
	details.fiche-bloc > summary h2 { display: inline; margin: 0; }
	ul.fiche-liste > li { padding: var(--e2) 0; border-bottom: var(--bordure) solid var(--ligne); }
	ul.fiche-liste > li:last-child { border-bottom: 0; }
	p.fiche-tout { margin: var(--e2) 0 0; font-size: var(--taille-petite); }
	table.services details { margin-top: var(--e1); font-size: var(--taille-petite); }
	/* Frise des gouvernements (modules/gouvernement/frise.ts) : bandes SVG positionnées par attributs (CSP : aucun style en ligne), couleurs par jetons ;
	   le tableau qui suit porte toute l'information (sous 40 rem, ses cellules s'empilent). */
	figure.frise-gouv { margin: var(--e4) 0; }
	svg.frise-axe { display: block; width: 100%; height: 3.25rem; overflow: visible; }
	svg.frise-axe .frise-bande { fill: color-mix(in srgb, var(--accent) 45%, var(--fond)); stroke: var(--fond); stroke-width: 1px; }
	svg.frise-axe .frise-bande.frise-alt { fill: color-mix(in srgb, var(--accent) 30%, var(--fond)); }
	svg.frise-axe .frise-bande.frise-nouveau { fill: var(--accent); }
	svg.frise-axe .frise-bande.frise-courant { stroke: var(--texte); stroke-width: 1.5px; }
	svg.frise-axe a:hover .frise-bande, svg.frise-axe a:focus-visible .frise-bande { fill: var(--lien); }
	svg.frise-axe .frise-annee { stroke: var(--ligne); stroke-width: 1px; }
	svg.frise-axe .frise-libelle { fill: var(--texte-doux); font-size: var(--taille-petite); text-anchor: middle; }
	.frise-cle { display: inline-block; width: .9em; height: .9em; vertical-align: -.1em; border-radius: 2px; background: color-mix(in srgb, var(--accent) 45%, var(--fond)); }
	.frise-cle.frise-nouveau { background: var(--accent); }
	svg.frise-duree { display: block; width: 100%; min-width: 5rem; height: .5rem; margin-top: var(--e1); border-radius: var(--rayon); background: var(--surface); }
	svg.frise-duree rect { fill: var(--accent); }
	table.frise-table td.frise-cellule-duree { min-width: 6rem; white-space: nowrap; }
	table.frise-table tr:target { background: var(--accent-fond); }
	.frise-compte { font-weight: var(--graisse-forte); font-variant-numeric: tabular-nums; margin-right: var(--e1); }
	@media (max-width: 40rem) {
		table.frise-table thead { display: none; }
		table.frise-table, table.frise-table tbody, table.frise-table tr, table.frise-table td { display: block; width: auto; }
		table.frise-table tr { padding: var(--e2) 0; border-bottom: var(--bordure) solid var(--ligne); }
		table.frise-table td { border: 0; padding: var(--e1) 0; }
		table.frise-table td.frise-entrees::before { content: "Entrées : "; color: var(--texte-doux); }
		table.frise-table td.frise-sorties::before { content: "Sorties : "; color: var(--texte-doux); }
		table.frise-table td.frise-restes::before { content: "Restés : "; color: var(--texte-doux); }
	}

	/* Gouvernement, navigation (modules/gouvernement/portes.ts, pages.ts, personnes-pages.ts) : onglets d'une fiche ministère groupés par porte (span.groupe
	   dans nav.sous) ; éléments de liste `.navigable` parcourus par j/k (app.js) : surlignage par l'attribut data-selection, comme aria-selected sur les lignes. */
	nav.sous span.groupe { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: var(--e1) var(--e3); }
	/* Barres du module (portes, pages de la porte, onglets d'une fiche ministère, filtres d'une page) : une seule rangée, qui défile horizontalement dans
	   sa barre si elle ne tient pas (jamais la page) ; à 360 px, trois barres d'une ligne au lieu d'une dizaine de lignes de menus. Filet en ombre
	   intérieure (le débordement vertical masqué couperait le filet d'accent posé sur la bordure) ; focus dessiné à l'intérieur de la barre ;
	   l'onglet courant est ramené dans la barre au chargement (app.js). */
	main:has(> nav.sous.portes) > nav.sous { position: relative; flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; border-bottom: 0; box-shadow: inset 0 calc(-1 * var(--bordure)) 0 var(--ligne); }
	main:has(> nav.sous.portes) > nav.sous.portes + nav.sous { box-shadow: none; }
	main:has(> nav.sous.portes) > nav.sous :is(a, span.groupe) { flex: none; }
	main:has(> nav.sous.portes) > nav.sous a { display: flex; align-items: center; margin-bottom: 0; white-space: nowrap; outline-offset: -2px; }
	/* Onglets d'une fiche ministère : nom du groupe (Action, Contrôle) au-dessus de ses onglets, qui restent alignés sur « Équipe » ; un écart plus
	   large entre les groupes qu'entre les onglets d'un groupe. */
	nav.sous.onglets-ministere { align-items: flex-end; }
	nav.sous.onglets-ministere span.groupe { display: flex; flex-direction: column; align-items: flex-start; gap: 0; }
	/* Nom du groupe collé au bord gauche de la barre tant que son groupe est visible (barre défilée à 360 px : jamais « …ntrôle »). */
	nav.sous.onglets-ministere span.groupe > small { position: sticky; left: 0; padding-top: var(--e1); font-size: var(--taille-petite); line-height: 1; }
	nav.sous.onglets-ministere .groupe-liens { display: flex; gap: var(--e3); }
	ul.navigable > li, ol.navigable > li { scroll-margin-top: calc(var(--hauteur-entete) + var(--e2)); }
	ul.navigable > li[data-selection], ol.navigable > li[data-selection] { background: var(--accent-fond); }

	/* Gouvernement, vérification visuelle (07/11/2026) : pages repérées par leur rangée de portes (main > nav.sous.portes).
	   1. Titre d'un volet de l'accueil à la taille d'un h2 (la règle générique .carte h2 le rendait plus petit que sa phrase d'usage).
	   2. Résumé chiffré d'un onglet (ul.sobre juste après les onglets) détaché de la barre d'onglets.
	   (Coupure des mots et alignement des en-têtes de ligne : règles globales, section Base et Tableaux.) */
	.carte.porte h2 { font-size: var(--taille-h2); }
	main:has(> nav.sous.portes) nav.sous + ul.sobre { margin-top: var(--e3); }
	/* 3. Membres d'un gouvernement antérieur au Protocole (pages.ts, table.historique-membres) : sous 40 rem, une ligne par membre empilée, comme la frise
	   (la colonne des rattachés, longue, laissait un vide de toute sa hauteur à côté des trois premières). */
	@media (max-width: 40rem) {
		table.historique-membres thead { display: none; }
		table.historique-membres, table.historique-membres tbody, table.historique-membres tr, table.historique-membres td { display: block; width: auto; }
		table.historique-membres tr { padding: var(--e2) var(--e3); border-bottom: var(--bordure) solid var(--ligne); }
		table.historique-membres td { border: 0; padding: var(--e1) 0; }
		table.historique-membres td.historique-rattaches:empty { display: none; }
		table.historique-membres td.historique-rattaches::before { content: "Rattachés : "; color: var(--texte-doux); }
	}

	/* --- Encart « Graphe des liens » en fin de document (domaines/encart.ts) : replié, chargé à l'ouverture (htmx) ; le graphe lui-même est mis en forme par graphe.css. */
	section.encart-graphe { margin: var(--e5) 0 var(--e3); border-top: var(--bordure) solid var(--ligne); }
	section.encart-graphe > details > summary { padding: var(--e2) 0; font-weight: var(--graisse-forte); cursor: pointer; }
	section.encart-graphe > details > summary:hover { color: var(--accent); }
	section.encart-graphe .graphe { margin-top: var(--e2); }
	section.encart-graphe details:has(.graphe) > p { display: none; } /* lien de repli sans JavaScript : doublon de « Vue complète » une fois le graphe chargé */

	/* --- Lot navigation --- */
	/* Menus par groupe (details, sans JavaScript) ; les listes s'ouvrent en surimpression, puis sont empilées dans le menu replié (sous 64 rem). */
	header nav.principale details.menu-groupe { position: relative; display: flex; }
	header nav.principale details.menu-groupe > summary { list-style: none; }
	header nav.principale details.menu-groupe > summary::-webkit-details-marker { display: none; }
	header nav.principale details.menu-groupe[open] > summary { background: var(--surface); color: var(--texte); }
	header nav.principale details.menu-groupe > summary:focus-visible, details.menu-stats > summary:focus-visible { outline: var(--contour-focus); outline-offset: 2px; }
	header .menu-liste { position: absolute; left: 0; top: 100%; z-index: 20; display: grid; min-width: 12rem; margin: 0; padding: var(--e2); list-style: none; background: var(--fond); border: var(--bordure) solid var(--ligne); border-radius: var(--rayon-grand); }
	header .menu-liste li { display: block; }
	header .menu-liste a { width: 100%; min-height: 2.25rem; justify-content: flex-start; border-bottom: 0; border-radius: var(--rayon); }
	header .menu-liste a[aria-current] { background: var(--accent-fond); }
	/* Statistiques d'usage : bouton icône, panneau à droite (chargé à l'ouverture) */
	details.menu-stats { position: relative; display: flex; }
	details.menu-stats > summary { list-style: none; display: inline-flex; align-items: center; justify-content: center; min-width: 2.25rem; min-height: var(--hauteur-entete); padding: 0 var(--e2); color: var(--texte-doux); border-bottom: 2px solid transparent; cursor: pointer; }
	details.menu-stats > summary::-webkit-details-marker { display: none; }
	details.menu-stats > summary:hover { color: var(--texte); }
	details.menu-stats[open] > summary { color: var(--texte); background: var(--surface); }
	details.menu-stats .menu-panneau { min-width: 16rem; }
	details.menu-stats .menu-panneau > p.identite { margin: 0; }
	#stats-corps { padding: var(--e2) var(--e3) var(--e1); }
	#stats-corps p { margin: var(--e1) 0; }
	dl.stats { display: grid; grid-template-columns: 1fr auto; gap: var(--e1) var(--e4); margin: 0; font-variant-numeric: tabular-nums; }
	dl.stats dt { color: var(--texte-doux); }
	dl.stats dd { margin: 0; text-align: right; }
	dl.stats dt.groupe { grid-column: 1 / -1; margin-top: var(--e2); font-weight: var(--graisse-forte); color: var(--texte); }
	/* Transitions discrètes, désactivées si l'utilisateur réduit les animations */
	.menu-panneau, header .menu-liste { animation: menu-apparait .12s ease-out; }
	@keyframes menu-apparait { from { opacity: 0; transform: translateY(-.25rem); } }
	@media (prefers-reduced-motion: reduce) { .menu-panneau, header .menu-liste { animation: none; } }
	/* Grand écran : le déroulé pend sous le filet de l'en-tête (qui lui sert de bord haut), coins du haut droits, coins du bas arrondis.
	   La barre elle-même ne change pas. Sous 64 rem, les listes sont empilées dans le menu replié (règles ci-dessous). */
	@media (min-width: 64.0625rem) {
		.menu-panneau, header .menu-liste { top: calc(100% + var(--bordure)); border-top: 0; border-radius: 0 0 var(--rayon-grand) var(--rayon-grand); box-shadow: var(--ombre); }
	}
	@media (max-width: 64rem) {
		header nav.principale details.menu-groupe { display: block; }
		header nav.principale details.menu-groupe > summary { min-height: 2.75rem; }
		header .menu-liste { position: static; display: block; min-width: 0; padding: 0 0 0 var(--e3); border: 0; background: none; }
		details.menu-stats { display: block; }
		details.menu-stats > summary { min-height: 2.75rem; justify-content: flex-start; padding: 0 var(--e3); }
		details.menu-stats .menu-panneau { position: static; min-width: 0; padding: 0 0 0 var(--e3); border: 0; }
	}
}

/* --- Lot signets --- */
.signet-bloc { margin: var(--e2) 0; }
.signet-bloc details > summary { cursor: pointer; font-weight: var(--graisse-forte); }
.signet-bloc form.ligne { margin-top: var(--e2); }
.en-ligne { display: inline; }
.signets-dossier { margin-top: var(--e3, var(--e2)); }
.signets-liste, .signets-volet { list-style: none; padding: 0; margin: 0; }
.signets-liste > li.signet { padding: var(--e2) 0; border-bottom: 1px solid var(--filet, currentColor); }
.signets-liste details form { margin: var(--e2) 0; }
.signets-volet li { padding: var(--e1, 0.25rem) 0; }
.volet-signets h3 { font-size: 0.95em; margin: var(--e2) 0 var(--e1, 0.25rem); }
.volet-signets button { font: inherit; background: none; border: 0; padding: 0; color: var(--accent); cursor: pointer; text-decoration: underline; }
/* Signet d'un article : discret, plein et d'accent si enregistré */
.signet-article { display: inline-flex; align-items: center; vertical-align: middle; margin-left: var(--e2); color: var(--texte-doux); opacity: .4; text-decoration: none; border-radius: var(--rayon); }
.signet-article:hover, .signet-article:focus-visible, .signet-article.actif { opacity: 1; color: var(--accent); }
.signet-article:focus-visible { outline: var(--contour-focus); outline-offset: 2px; }
.signet-article.actif svg { fill: currentColor; }
dialog.dialogue-signet .signet-form label { display: block; margin: var(--e2) 0; }
dialog.dialogue-signet .signet-form select, dialog.dialogue-signet .signet-form input:not([type]) { width: 100%; }
dialog.dialogue-signet .signet-form .case { display: flex; gap: var(--e2); align-items: center; }
dialog.dialogue-signet .signet-form [data-erreur] { color: var(--danger); margin: var(--e2) 0 0; }
dialog.dialogue-signet .signet-form [data-erreur]:empty { display: none; }
dialog.dialogue-signet .signet-form [hidden] { display: none; }
.volet-filtre { margin-bottom: var(--e2); }
