/*
 * Portfolio Cinéaste — CSS
 * Ce que theme.json ne peut pas exprimer : grille horizontale, compteur CSS,
 * hover/focus-within, apparition échelonnée, lightbox <dialog>, scrim, scrollbar masquée.
 * Toute valeur vient de theme.json via var(--wp--preset--*) / var(--wp--custom--*).
 */

/* ----- Reset plein écran ----- */
html, body {
	margin: 0;
	height: 100%;
}

/* Suppression de tous les outline (demande client).
   ⚠️ Retire les indicateurs de focus clavier — voir docs/decisions.md. */
:focus,
:focus-visible,
:focus-within {
	outline: none;
}

/* Verrou plein écran — **trois vues seulement** (ADR-0021) : la grille
   (`.pfc-strip-wrapper`), la fiche film (`.pfc-flow`) et le visionnage
   (`.pfc-view`) — et, depuis ADR-0025, les pages et articles, repassés au flux
   latéral. Seule la 404 (`.pfc-page`) défile encore verticalement. */
html:has(.pfc-strip-wrapper), body:has(.pfc-strip-wrapper),
html:has(.pfc-view), body:has(.pfc-view),
html:has(.pfc-flow), body:has(.pfc-flow) {
	overflow: hidden;
}
/* Repli sans `:has()` (ADR-0031) : la même serrure via la classe posée sur `<html>`
   côté serveur (`pfc_layout_mode()`). `html.pfc-mode-flow` a la **même spécificité
   0,1,1** que `html:has(.pfc-flow)`, donc les batailles de spécificité — dont la
   levée mobile ci-dessous — se départagent identiquement. `<html>` étant l'ancêtre
   de tout, la seule classe racine couvre ce que `:has()` posait sur `html` ET `body`.
   Un moteur moderne applique les deux règles (même valeur) ; FF ESR ≤ 120 la classe
   seule. `.pfc-mode-page` (404) reste volontairement hors verrou : elle défile. */
html.pfc-mode-strip, html.pfc-mode-view, html.pfc-mode-flow {
	overflow: hidden;
}

/* ----- Scrollbar — noir et blanc, épurée (demande client) -----
 *
 * Une seule identité pour tout le site : la scrollbar verticale du document (pages
 * et articles classiques, ADR-0021) et la scrollbar horizontale de la fiche film
 * lisent les mêmes tokens `--wp--custom--scrollbar--*`. Un filet blanc translucide
 * sur un rail presque invisible ; rien d'autre — ni flèches, ni relief, ni couleur.
 *
 * `color-scheme: dark` est le levier natif : sans lui, un navigateur qui ne
 * comprend pas `scrollbar-color` (Safari < 18.2) dessine une scrollbar CLAIRE, en
 * plein contraste avec le fond noir. Il met aussi les contrôles de formulaire au
 * même régime — cohérent, le thème est sombre de bout en bout.
 *
 * Posé sur `html` : pour la scrollbar du **viewport**, la spec fait autorité à
 * l'élément racine. `scrollbar-width` et `scrollbar-color` étant héritées, la fiche
 * film reçoit le même régime sans rien redéclarer ; la grille et la barre latérale
 * l'écrasent par `none` — c'est le design (CDC §6) : là, aucune scrollbar.
 */
html {
	color-scheme: dark;
}

/*
 * Deux écritures, une seule apparence — et **pas** de doublon : quand un moteur
 * comprend `::-webkit-scrollbar`, il ignore `scrollbar-width` / `scrollbar-color`
 * (et inversement). Il faut donc choisir par capacité, sinon Chrome retombe sur le
 * régime standard, où la largeur des flèches de fin de course n'est pas réglable :
 * on hérite alors de la scrollbar Windows, juste assombrie. Ce n'est pas « épuré ».
 *
 * `@supports not selector(...)` n'est pas un ciblage de navigateur mais une question
 * de capacité — et il se répare tout seul : le jour où un moteur retirerait
 * `::-webkit-scrollbar`, la requête basculerait et il recevrait le régime standard.
 * Firefox, qui n'a jamais eu ces pseudo-éléments, passe ici : `thin` +
 * `scrollbar-color` est tout ce qu'il expose, et il ne dessine pas de flèches.
 *
 * ⚠️ Branche non recettée (Firefox absent de la machine de développement). Si elle
 * ne prenait pas, le repli reste noir et blanc : `color-scheme: dark` donne une
 * scrollbar système sombre, simplement plus large.
 */
@supports not selector(::-webkit-scrollbar) {
	html {
		scrollbar-width: thin;
		scrollbar-color: var(--wp--custom--scrollbar--thumb) var(--wp--custom--scrollbar--track);
	}
}

/* Régime WebKit (Chrome, Safari) : contrôle complet — largeur exacte, angles francs
   comme les vignettes et les cadres du thème, aucune flèche. */
html::-webkit-scrollbar,
.pfc-flow::-webkit-scrollbar {
	width: var(--wp--custom--scrollbar--size);
	height: var(--wp--custom--scrollbar--size);
}

html::-webkit-scrollbar-track,
.pfc-flow::-webkit-scrollbar-track {
	background: var(--wp--custom--scrollbar--track);
}

html::-webkit-scrollbar-thumb,
.pfc-flow::-webkit-scrollbar-thumb {
	background: var(--wp--custom--scrollbar--thumb);
	border-radius: 0;
}

html::-webkit-scrollbar-thumb:hover,
.pfc-flow::-webkit-scrollbar-thumb:hover {
	background: var(--wp--custom--scrollbar--thumb-hover);
}

/* Les flèches de fin de course : WebKit les dessine en gris système dès qu'une
   scrollbar est personnalisée. `display: none` et non une couleur transparente —
   sinon elles gardent leur place et le curseur ne parcourt pas tout le rail. */
html::-webkit-scrollbar-button,
.pfc-flow::-webkit-scrollbar-button {
	display: none;
}

/* L'angle entre deux scrollbars ne doit pas se signaler par un carré gris. */
html::-webkit-scrollbar-corner,
.pfc-flow::-webkit-scrollbar-corner {
	background: transparent;
}

.wp-site-blocks {
	min-height: 100dvh;
	display: flex;
	flex-direction: column;
}

/* Hauteur *exacte* de l'écran (et non `min-height`) : le multi-colonnes n'a de
   point de fragmentation que si la hauteur est définie. Sans ça, la colonne
   grandit indéfiniment et le débordement redevient vertical. */
.wp-site-blocks:has(.pfc-flow) {
	height: 100dvh;
}
/* Jumeau sans `:has()` (ADR-0031). Forme `.pfc-mode-flow .wp-site-blocks` :
   spécificité 0,2,0, **identique** à `.wp-site-blocks:has(.pfc-flow)`, donc les
   levées mobile et impression ci-dessous se départagent par l'ordre source, comme
   les originales entre elles. */
.pfc-mode-flow .wp-site-blocks {
	height: 100dvh;
}

/* ----- Navbar ----- */
.pfc-header {
	flex: none;
	border-bottom: 1px solid var(--wp--custom--line--soft);
}

.pfc-brand {
	display: flex;
	align-items: baseline;
	gap: 12px;
}

/* Sous-titre d'en-tête, sous la ligne nom + slogan. Texte défini dans
   « Apparence → En-tête » (option `pfc_header_subtitle`, ADR-0016), injecté
   côté serveur ; masqué quand l'option est vide. Reprend la graduation
   « label » du design (11px / 500 / .28em / muted-4). L'écart avec la ligne
   au-dessus vient du blockGap du groupe `.pfc-identity` (preset spacing 10). */
.pfc-subtitle {
	margin-top: 10px;
	font-size: var(--wp--preset--font-size--label);
	font-weight: 300;
	letter-spacing: var(--wp--custom--tracking--role);
	text-transform: uppercase;
	/* Plus opaque que le libellé « rôle » du design (muted-4) : le trait plus fin
	   (300) est compensé par un gris plus présent (muted-2), demande client. */
	color: var(--wp--preset--color--muted-2);
}

/* ----- Menu : toggle (burger + libellé) et panneau latéral -----
   core/navigation en `overlayMenu: "always"` : le burger et le drawer
   s'affichent à **toutes** les largeurs (ADR-0018). Le voile et sa couleur de
   texte viennent des attributs natifs du bloc (`overlayBackgroundColor` /
   `overlayTextColor`), pas d'ici : rien de codé en dur. */
.wp-block-navigation__responsive-container-open,
.wp-block-navigation__responsive-container-close {
	color: var(--wp--preset--color--white);
	opacity: 0.9;
	/* Cible tactile de 44px sans grossir l'icône (24px). */
	min-width: 44px;
	min-height: 44px;
	align-items: center;
	justify-content: center;
}

/* Toggle : fixé EXACTEMENT au même point que la croix (mêmes tokens partagés), en
   boîte 44×44 à icône centrée → superposition ☰/✕ parfaite. Hors flux (l'en-tête
   ne réserve plus sa place) et ancré au coin haut-droit, à l'écart de l'identité. */
.pfc-header .wp-block-navigation__responsive-container-open {
	position: fixed;
	top: var(--pfc-menu-btn-top);
	inset-inline-end: var(--pfc-menu-btn-end);
	z-index: 10;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
}

/* Libellé configurable (« Apparence → En-tête », option `pfc_menu_toggle_label`,
   ADR-0018) : porté par `data-pfc-menu-label` (posé via WP_HTML_Tag_Processor,
   = aussi l'`aria-label`), rendu par `content: attr(...)`. Posé EN ABSOLU à gauche
   du bouton pour ne PAS agrandir la boîte 44×44 ni décaler le ☰ (sinon la ✕ ne
   tomberait plus dessus). Rien si l'option est vide. Taille sur un token dédié
   (`toggle`, 16px) plutôt que `nav` : ce dernier sert aussi de taille de base
   globale du site (styles.typography racine) et à la barre de filtres — les
   coupler aurait fait grossir tout le reste. */
.pfc-header .wp-block-navigation__responsive-container-open[data-pfc-menu-label]::after {
	content: attr(data-pfc-menu-label);
	position: absolute;
	inset-inline-end: 100%;
	margin-inline-end: var(--wp--preset--spacing--20);
	top: 50%;
	transform: translateY(-50%);
	white-space: nowrap;
	color: var(--wp--preset--color--white);
	font-size: var(--wp--preset--font-size--toggle);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--nav);
	text-transform: uppercase;
	opacity: 0.9;
}

/* Les outline sont supprimés globalement (demande client, en tête de fichier) :
   le focus clavier se signale ici par la couleur, comme sur `.pfc-filter__link`. */
.wp-block-navigation__responsive-container-open:hover,
.wp-block-navigation__responsive-container-open:focus-visible,
.wp-block-navigation__responsive-container-close:hover,
.wp-block-navigation__responsive-container-close:focus-visible {
	color: var(--wp--preset--color--white);
}

/* Le toggle (☰) et la croix (✕) occupent le MÊME point — mêmes `top` et
   `inset-inline-end` (tokens partagés), tous deux en `position: fixed`, pour une
   superposition parfaite et un basculement sur place ☰ ⇄ ✕. Offsets serrés vers
   l'angle haut-droit (demande client). */
.pfc-header {
	--pfc-menu-btn-top: var(--wp--preset--spacing--20);
	--pfc-menu-btn-end: var(--wp--preset--spacing--20);
}

/* Croix : sortie du flux du panneau et fixée au même point que le toggle. Le
   drawer porte un `transform`, donc `position: fixed` se résout par rapport à LUI
   (il devient bloc conteneur) : la ✕ voyage avec le panneau et se pose exactement
   sur le toggle une fois ouvert. */
.pfc-header .wp-block-navigation__responsive-container-close {
	position: fixed;
	top: var(--pfc-menu-btn-top);
	inset-inline-end: var(--pfc-menu-btn-end);
	z-index: 10;
}

/* `.pfc-header` préfixe TOUTES les règles du drawer : le CSS du bloc natif a la
   même spécificité et WordPress ne garantit pas l'ordre d'enfilage des styles de
   bloc vis-à-vis d'une feuille de thème (ADR-0014). Sans ce préfixe, géométrie
   et animation se font écraser — le panneau « saute » au lieu de glisser. */

/* Conteneur du drawer — état de base = FERMÉ + transition de SORTIE.
   La GÉOMÉTRIE (ancrage droite via `left: auto` — physique, pour lever le
   `left: 0` du cœur —, largeur bornée, marge interne) est portée ICI, PAS
   seulement sur `.is-menu-open` : à la fermeture, le script retire `.is-menu-open`
   alors qu'`allow-discrete` garde le panneau affiché le temps du glissement. Sans
   géométrie de base, le cœur rebascule alors le conteneur en plein écran (`inset:
   0`) + items en ligne → l'ancienne navbar « flashe » pendant la sortie.
   Hors écran à droite au repos. Contexte LTR (thème français). */
.pfc-header .wp-block-navigation__responsive-container {
	left: auto;
	width: var(--wp--custom--menu-panel--width);
	max-width: 100%;
	/* `!important` : le cœur pose un `padding` en clamp scopé à `.is-menu-open`
	   (style.css, spécificité 0,3,0). Sans ça, notre `padStart` serait ignoré à
	   l'ouverture ET le padding sauterait à la fermeture (le cœur le retire avec
	   la classe) → items qui se décalent. On impose le nôtre dans les deux états. */
	padding-block: var(--wp--preset--spacing--50) !important;
	padding-inline-end: var(--wp--preset--spacing--40) !important;
	padding-inline-start: var(--wp--custom--menu-panel--pad-start) !important;
	/* Le cœur met `z-index: 100000` sous `.is-menu-open` uniquement : à la
	   fermeture il retombe, et le drawer passerait SOUS le burger (z-index 10) qui
	   vient de réapparaître → il « clignote » par-dessus. On le fixe dans les deux
	   états (même valeur que le cœur). */
	z-index: 100000;
	opacity: 0;
	transform: translateX(100%);
	will-change: transform, opacity;
	/* FERMETURE INSTANTANÉE — choix de robustesse. Pas de transition sur la base :
	   à la fermeture, le cœur retire `.is-menu-open` et le panneau passe
	   IMMÉDIATEMENT en `display: none`. Il ne reste donc jamais affiché dans son
	   état « sans classe » (celui où le cœur rebascule box-sizing, layout, fond… →
	   les « deux formes »). L'OUVERTURE, elle, reste animée (slide + fade) via la
	   transition de `.is-menu-open` + `@starting-style`. Approche indépendante de
	   tout style interne du bloc natif — plus de dépendance fragile au cœur. */
	transition: none;
}

/* Drawer OUVERT : seulement l'état d'arrivée + la transition d'ENTRÉE (la
   géométrie est sur la base ci-dessus). « Fade glissant » : le panneau GLISSE
   (`transform`) ET se FOND (`opacity`) ensemble, mêmes durée et courbe.
   `animation: none` DÉSACTIVE l'animation `overlay-menu__fade-in-animation` du
   cœur (style.css) : elle anime `transform`+`opacity` avec `fill-mode: forwards`,
   donc — une `animation` primant sur une `transition` — elle écrasait tout notre
   effet (c'était la cause du « aucune animation »). */
.pfc-header .wp-block-navigation__responsive-container.is-menu-open {
	animation: none;
	opacity: 1;
	transform: translateX(0);
	transition:
		opacity var(--wp--custom--duration--menu) var(--wp--custom--ease-out),
		transform var(--wp--custom--duration--menu) var(--wp--custom--ease-out),
		display var(--wp--custom--duration--menu) allow-discrete;
}

/* Animer *depuis* `display:none` : `@starting-style` donne l'état de départ au
   premier rendu quand `.is-menu-open` s'applique. Avec `allow-discrete` sur
   `display`, la SORTIE reste rendue le temps du glissement — apparition ET
   disparition sont animées, sans JS (baseline 2024 ; repli = instantané). */
@starting-style {
	.pfc-header .wp-block-navigation__responsive-container.is-menu-open {
		opacity: 0;
		transform: translateX(100%);
	}
}

/* Colonne des items, portée HORS `.is-menu-open` pour persister pendant la
   SORTIE (le cœur ne l'impose que sous `.is-menu-open` ; à la fermeture les
   items rebasculeraient en ligne — le flash). Alignés à gauche, après la marge
   interne, quel que soit le `justifyContent` du bloc pensé pour la barre inline. */
.pfc-header .wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content,
.pfc-header .wp-block-navigation__responsive-container .wp-block-navigation__container {
	flex-direction: column;
	flex-wrap: nowrap;
	align-items: flex-start;
	justify-content: flex-start;
}

/* Le cœur pousse le contenu vers le bas (`padding-top: calc(2rem + 24px)`, scopé
   `.is-menu-open`) pour dégager SA croix, placée en haut de l'overlay. La nôtre
   est fixée au coin (hors flux) : ce décalage est inutile, et retiré à la
   fermeture il ferait sauter les items ~56px vers le haut (parasite). On le
   neutralise — `!important` pour battre la règle 0,3,0 du cœur. Le haut vient de
   `padding-block` du conteneur, identique dans les deux états. */
.pfc-header .wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content {
	padding-top: 0 !important;
}

/* Fond opaque du drawer conservé pendant la SORTIE : le cœur force
   `background-color: inherit !important` dès que `.is-menu-open` part (style.css
   ~ligne 481), ce qui rendrait le panneau transparent en se fermant. Double
   `:not()` → spécificité 0,4,0 pour battre sa règle 0,3,0 !important, quel que
   soit l'ordre d'enfilage des feuilles. */
.pfc-header .wp-block-navigation__responsive-container:not(.is-menu-open):not(.is-menu-open) {
	background-color: var(--wp--preset--color--overlay) !important;
}

/* --- Verrou d'apparence : MÊME forme à l'ouverture ET à la fermeture ---
   Le cœur scope au seul `.is-menu-open` une foule de styles de mise en page
   (box-sizing, overflow, direction, couleur du voile, display des items). Comme
   `allow-discrete` garde le panneau affiché pendant la SORTIE alors que la classe
   est déjà retirée, tous rebasculent → « deux formes d'affichage ». On les
   réimpose INCONDITIONNELLEMENT, aux mêmes valeurs que l'état ouvert du cœur : la
   fermeture devient identique à l'ouverture, seuls `opacity`/`transform` animent. */
.pfc-header .wp-block-navigation__responsive-container,
.pfc-header .wp-block-navigation__responsive-close,
.pfc-header .wp-block-navigation__responsive-dialog,
.pfc-header .wp-block-navigation__responsive-container-content {
	box-sizing: border-box;
}
.pfc-header .wp-block-navigation__responsive-container {
	flex-direction: column;
	overflow: auto;
	color: var(--wp--preset--color--contrast);
}
.pfc-header .wp-block-navigation__responsive-container .wp-block-navigation-item {
	display: flex;
}

/* Le voile est à 94 % d'opacité (token `overlay`, comme la lightbox) : sans ça
   le bouton ☰ transparaît sous la croix de fermeture. `visibility` plutôt que
   `display` : le bouton garde sa place, la croix ne se décale pas à l'ouverture. */
html.has-modal-open .wp-block-navigation__responsive-container-open {
	visibility: hidden;
}

/* Typographie des items portée hors `.is-menu-open` (comme la colonne et le
   fond) : sans ça, elle rebasculerait pendant la sortie. Demande client :
   capitales en graisse fine — `font-weight: 300`, `text-transform: uppercase`.
   Le `letter-spacing` (token `filter`) rend les capitales lisibles, calé sur
   les étiquettes de filtre. Repos en gris nav (`muted-1`, plus clair que les
   étiquettes — demande client : moins effacé avant survol), bascule au blanc
   au survol et au focus avec transition sur la couleur, comme `.pfc-filter__link`
   (le focus clavier se signale donc par la couleur, cf. suppression globale des
   outline). */
.pfc-header .wp-block-navigation__responsive-container .wp-block-navigation-item__content {
	font-size: var(--wp--preset--font-size--brand);
	font-weight: 300;
	letter-spacing: var(--wp--custom--tracking--filter);
	text-transform: uppercase;
	/* Aligné à gauche, après la marge interne du drawer (ADR-0018). */
	text-align: start;
	color: var(--wp--preset--color--muted-1);
	transition: color var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover,
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus-visible {
	color: var(--wp--preset--color--white);
}

/* Apparition échelonnée des entrées à l'ouverture (entrée seule : à la fermeture
   le drawer glisse d'un bloc). Discret — léger fondu + montée de 8px, décalage
   par le token `stagger`, plafonné dès la 6ᵉ entrée pour rester bref quel que
   soit le nombre de liens. `both` : l'entrée part de l'état masqué (pas de
   scintillement avant le délai). */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	animation: pfc-menu-item-in var(--wp--custom--duration--fade) var(--wp--custom--ease-out) both;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(1) {
	animation-delay: var(--wp--custom--duration--stagger);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(2) {
	animation-delay: calc(2 * var(--wp--custom--duration--stagger));
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(3) {
	animation-delay: calc(3 * var(--wp--custom--duration--stagger));
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(4) {
	animation-delay: calc(4 * var(--wp--custom--duration--stagger));
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(5) {
	animation-delay: calc(5 * var(--wp--custom--duration--stagger));
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item:nth-child(n+6) {
	animation-delay: calc(6 * var(--wp--custom--duration--stagger));
}

@keyframes pfc-menu-item-in {
	from { opacity: 0; transform: translateY(8px); }
	to   { opacity: 1; transform: translateY(0); }
}

/* ----- Sous-navigation (filtres + méta) ----- */
.pfc-subnav {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding-inline: var(--wp--custom--gutter);
	padding-top: var(--wp--preset--spacing--30);
	padding-bottom: var(--wp--preset--spacing--20);
}

.pfc-filter {
	display: flex;
	gap: 26px;
	font-size: var(--wp--preset--font-size--nav);
	font-weight: 600;
	letter-spacing: var(--wp--custom--tracking--filter);
	text-transform: uppercase;
}

.pfc-filter__link {
	color: var(--wp--preset--color--muted-3);
	border-bottom: 1px solid transparent;
	padding-bottom: 5px;
	transition: color var(--wp--custom--duration--filter) var(--wp--custom--easing),
	            border-color var(--wp--custom--duration--filter) var(--wp--custom--easing);
	text-decoration: none;
}

.pfc-filter__link:hover,
.pfc-filter__link:focus-visible {
	color: var(--wp--preset--color--white);
}

.pfc-filter__link.is-active {
	color: var(--wp--preset--color--white);
	border-bottom-color: var(--wp--preset--color--accent);
}

.pfc-meta {
	display: flex;
	align-items: center;
	gap: 16px;
	font-size: var(--wp--preset--font-size--label);
	font-weight: 500;
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-5);
}

.pfc-meta__rule {
	display: inline-block;
	width: 60px;
	height: 1px;
	background: var(--wp--custom--line--rule);
}

.pfc-meta__hint {
	color: var(--wp--preset--color--muted-2);
}

/* ----- Rangée principale : grille pleine largeur + barre latérale flottante ----- */
.pfc-layout {
	flex: 1;
	min-height: 0;
	display: flex;
	align-items: stretch;
	/* Ancre le positionnement absolu de la barre latérale (overlay). */
	position: relative;
}

/*
 * Voile de lisibilité derrière la barre latérale flottante : dégradé
 * transparent → fond, pour que les catégories restent lisibles par-dessus les
 * affiches (contraste RGAA/WCAG AA, CDC §14). Au-dessus de la grille (z-index 1),
 * sous les liens de la barre (z-index 2).
 */
.pfc-layout::after {
	content: "";
	position: absolute;
	inset: 0 0 0 auto;
	width: var(--wp--custom--sidebar--scrim-width);
	background: var(--wp--custom--sidebar--scrim);
	z-index: 1;
	pointer-events: none;
}

/* ----- Grille défilante ----- */
.pfc-strip-wrapper {
	flex: 1;
	min-width: 0;
	min-height: 0;
	overflow-x: auto;
	overflow-y: hidden;
	padding: 8px var(--wp--custom--gutter) 40px;
	scrollbar-width: none;
	/* Glissement latéral natif au doigt ; le pan vertical est laissé au JS, qui
	   le convertit en défilement horizontal (ADR-0010). */
	touch-action: pan-x pinch-zoom;
	/* Conteneur de requête : `cqh` = hauteur réelle disponible de la bande,
	   pour dimensionner les colonnes 16:9 depuis la hauteur (voir .pfc-strip). */
	container-type: size;
}

/*
 * Le bloc `core/query` insère un `<div class="wp-block-query">` entre le
 * wrapper et le `<ul>.pfc-strip`. Sans cette règle, le `height: 100%` de la
 * grille se résout contre un parent à hauteur `auto` : les rangées `1fr`
 * s'effondrent et les vignettes deviennent invisibles (~2 px).
 */
.pfc-strip-wrapper > .wp-block-query {
	height: 100%;
}

.pfc-strip-wrapper::-webkit-scrollbar {
	display: none;
	height: 0;
	width: 0;
}

/* ----- Barre latérale droite : overlay flottant, ne réserve aucune largeur ----- */
.pfc-sidebar {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: var(--wp--custom--sidebar--width);
	z-index: 2;
	display: flex;
	align-items: center;
	overflow-y: auto;
	scrollbar-width: none;
	padding-top: var(--wp--preset--spacing--40);
	padding-bottom: var(--wp--preset--spacing--40);
	/* Pas de padding droit : le tiret doit toucher la bordure d'écran. */
	padding-right: 0;
	/* La grille défile sous cet overlay ; on laisse passer le clic partout
	   sauf sur les liens eux-mêmes, pour ne pas bloquer les vignettes derrière. */
	pointer-events: none;
}

.pfc-sidebar .pfc-filter__link {
	pointer-events: auto;
}

.pfc-sidebar::-webkit-scrollbar {
	display: none;
	width: 0;
}

.pfc-sidebar .pfc-filter {
	flex-direction: column;
	align-items: stretch;
	gap: var(--wp--preset--spacing--30);
	width: 100%;
	/* Étiquettes de la colonne latérale : graisse allégée par rapport au 600 des
	   filtres (la sous-nav n'existe plus, mais on garde la règle de base intacte). */
	font-weight: 300;
}

/* Catégorie : mot aligné à droite + tiret collé au bord de l'écran */
.pfc-sidebar .pfc-filter__link {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: var(--wp--preset--spacing--10);
	padding-bottom: 0;
	border-bottom: 0;
	text-align: right;
	color: var(--wp--custom--sidebar--link);
}

.pfc-sidebar .pfc-filter__link::after {
	content: "";
	flex: none;
	width: var(--wp--custom--sidebar--dash);
	height: 1px;
	background: currentColor;
}

.pfc-sidebar .pfc-filter__link:hover,
.pfc-sidebar .pfc-filter__link:focus-visible,
.pfc-sidebar .pfc-filter__link.is-active {
	color: var(--wp--preset--color--white);
	border-bottom: 0;
}

/* ----- Barre footer (rôles) -----
   La barre vit dans la part de pied de page globale (toutes les pages sauf le
   visionnage plein écran). Elle est rendue côté serveur à partir des termes de
   la taxonomie `role_film` (ADR-0017) ; sans terme, rien n'est émis. */
.pfc-footer {
	/* Part de pied : enfant flex de `.wp-site-blocks`, ne se comprime pas —
	   comme l'ancienne `.pfc-footerbar` qui portait `flex: none`. */
	flex: none;
}

.pfc-footerbar {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: center;
	border-top: 1px solid var(--wp--custom--line--soft);
	padding: var(--wp--preset--spacing--20) var(--wp--custom--gutter);
}

/* Ligne des rôles : reprend la graduation « rôle » de l'ancienne ligne statique
   (label / 500 / .28em / uppercase / muted-4). */
.pfc-roles {
	margin: 0;
	font-size: var(--wp--preset--font-size--label);
	font-weight: 500;
	letter-spacing: var(--wp--custom--tracking--role);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-4);
	text-align: center;
}

.pfc-roles a {
	color: inherit;
	text-decoration: none;
	transition: color var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.pfc-roles a:hover,
.pfc-roles a:focus-visible {
	color: var(--wp--preset--color--white);
}

.pfc-strip {
	height: 100%;
	display: grid !important;
	grid-template-rows: repeat(3, 1fr);
	grid-auto-flow: column;
	/* Largeur de colonne dérivée de la hauteur d'une rangée (1fr de la bande)
	   au ratio 16:9 → vignettes 16:9, 3 rangées qui tiennent dans la hauteur
	   d'écran, colonnes qui débordent à droite (nombre de vignettes libre). */
	grid-auto-columns: calc((100cqh - 2 * var(--wp--custom--grid-gap)) / 3 * 16 / 9);
	gap: var(--wp--custom--grid-gap);
	margin: 0;
	padding: 0;
	/*
	 * Réserve de fin de course (demande client, ADR-0026).
	 * La barre d'étiquettes est un overlay posé sur la droite, et la grille défile
	 * dessous : sans cette réserve, la dernière colonne s'arrête *sous* elle —
	 * mesuré 220px sous les libellés et 340px sous le voile, sur une colonne de
	 * 368px. On rend donc défilable la largeur du voile (la zone effectivement
	 * assombrie, plus large que les libellés) : en fin de course, la dernière
	 * colonne se range juste à côté de la barre, entièrement lisible.
	 *
	 * `width: max-content` est **indispensable** : étirée par défaut à la largeur
	 * du conteneur, la grille voit ses colonnes déborder *hors* de sa boîte, et
	 * son padding — resté à l'intérieur — ne repousse rien (mesuré : réserve sans
	 * effet, fin de course inchangée). En épousant ses colonnes, la boîte grandit
	 * avec elles et son padding entre enfin dans l'espace défilable.
	 *
	 * Il n'ajoute de défilement que s'il en manque : une archive courte, dont les
	 * colonnes tiennent dans l'écran, ne devient pas défilable pour autant.
	 */
	width: max-content;
	/* `core/post-template` pose `max-width: 100%`, qui plafonnait la boîte à la
	   largeur du conteneur et annulait le `max-content` ci-dessus. */
	max-width: none;
	padding-right: calc(var(--wp--custom--sidebar--scrim-width) + var(--wp--custom--grid-gap));
	list-style: none;
}

/* ----- Vignette (core/post > pattern film-card) ----- */
.pfc-strip > .wp-block-post {
	position: relative;
	margin: 0;
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	border: 1px solid var(--wp--custom--line--faint);
}

/* Filtre : display:none seulement — une vignette masquée ne doit pas garder sa
   colonne dans la grille. (Le compteur CSS qui l'imposait aussi a disparu avec la
   numérotation, ADR-0020 ; la règle reste néanmoins impérative.) */
.pfc-strip > .wp-block-post[hidden] {
	display: none !important;
}

/*
 * Durée du film, en haut à gauche — à la place du numéro « 01, 02 » (ADR-0020).
 *
 * Portée par le `core/cover`, qui remplit la vignette et est déjà en
 * `position: relative` : c'est lui qui reçoit `data-pfc-duration` côté serveur, et
 * `attr()` ne lit que l'élément portant le pseudo-élément. `::after` et non
 * `::before` : le cœur style `.wp-block-cover.has-background-dim::before`.
 * Durée non renseignée ⇒ pas d'attribut ⇒ pas de pastille (position, graduation et
 * couleur inchangées par rapport au numéro).
 */
.pfc-strip > .wp-block-post .wp-block-cover[data-pfc-duration]::after {
	content: attr(data-pfc-duration);
	position: absolute;
	top: 14px;
	left: 16px;
	z-index: 4;
	font-size: var(--wp--preset--font-size--meta);
	font-weight: 300;
	letter-spacing: var(--wp--custom--tracking--num);
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.55);
	pointer-events: none;
}

/* Cover à l'intérieur : plein cadre + scrim */
.pfc-strip > .wp-block-post .wp-block-cover {
	width: 100%;
	height: 100%;
	min-height: 0;
	position: relative;
}

/*
 * Voile noir au survol.
 * Le pattern film-card pose le calque scrim avec dimRatio 0 : WordPress force
 * alors `opacity: 0` (règle
 * `.wp-block-cover__background.has-background-dim.has-background-dim-0`).
 * Au repos l'image reste donc nette ; au survol/focus le calque remonte à
 * `opacity: 1` et le dégradé assombrit le bas de la vignette pour rendre le
 * cartouche (thème · année · titre) lisible — en même temps que son apparition.
 *
 * `!important` : le bloc core/cover écrit le dégradé en style inline
 * (`style="background:linear-gradient(...)"`), qui l'emporterait sur cette
 * règle. On force donc le token à primer, pour que la densité du voile se règle
 * en un seul endroit — `--wp--custom--scrim` dans theme.json.
 */
.pfc-strip > .wp-block-post .wp-block-cover__background {
	background: var(--wp--custom--scrim) !important;
	opacity: 0;
	transition: opacity var(--wp--custom--duration--hover) var(--wp--custom--easing);
}

/* Spécificité 0,5,0 : passe devant la règle WP dim-0 (0,4,0) sans dépendre du
   suffixe de classe dim-N. */
.pfc-strip > .wp-block-post:hover .wp-block-cover .wp-block-cover__background,
.pfc-strip > .wp-block-post:focus-within .wp-block-cover .wp-block-cover__background {
	opacity: 1;
}

.pfc-strip > .wp-block-post .wp-block-cover__inner-container {
	position: absolute;
	inset: auto 0 0 0;
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	opacity: 0;
	transform: translateY(10px);
	transition: opacity var(--wp--custom--duration--hover) var(--wp--custom--easing),
	            transform var(--wp--custom--duration--hover) var(--wp--custom--easing);
	z-index: 3;
}

.pfc-strip > .wp-block-post:hover .wp-block-cover__inner-container,
.pfc-strip > .wp-block-post:focus-within .wp-block-cover__inner-container {
	opacity: 1;
	transform: translateY(0);
}

.pfc-strip > .wp-block-post .wp-block-post-title {
	margin: 0;
}

.pfc-strip > .wp-block-post .wp-block-post-title a {
	color: var(--wp--preset--color--white);
	text-decoration: none;
}

/* Lien étiré — un seul lien par carte (ADR-0005) */
.pfc-strip > .wp-block-post .wp-block-post-title a::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 3;
}

.pfc-strip > .wp-block-post .wp-block-post-terms {
	margin-bottom: 6px;
}

/* Ligne méta « Drame · 2024 » — separator entre post-terms et post-date */
.pfc-strip > .wp-block-post .pfc-card__meta {
	display: flex;
	align-items: baseline;
	gap: 6px;
}

.pfc-strip > .wp-block-post .pfc-card__meta::before {
	content: none;
}

/* Le « · » ne sépare rien quand il n'a plus qu'un voisin : la catégorie (les
   travaux antérieurs n'en portent pas) ou l'année (masquée si non renseignée,
   ADR-0023) peuvent manquer. Le séparateur est alors premier ou dernier enfant
   du groupe — c'est le seul `<p>` de la ligne, les deux blocs voisins rendant
   des `<div>`. Sans cette règle, la vignette afficherait « · 2018 » ou
   « Commandes · ». */
.pfc-card__meta > p:first-child,
.pfc-card__meta > p:last-child {
	display: none;
}

/* ----- Apparition échelonnée (JS seul) ----- */
html.js .pfc-strip > .wp-block-post {
	opacity: 0;
	transform: translateY(24px);
	transition: opacity var(--wp--custom--duration--reveal) var(--wp--custom--easing),
	            transform var(--wp--custom--duration--reveal) var(--wp--custom--easing);
}

html.js .pfc-strip > .wp-block-post:nth-child(3n+1) {
	transition-delay: 0s;
}

html.js .pfc-strip > .wp-block-post:nth-child(3n+2) {
	transition-delay: var(--wp--custom--duration--stagger);
}

html.js .pfc-strip > .wp-block-post:nth-child(3n) {
	transition-delay: calc(2 * var(--wp--custom--duration--stagger));
}

html.js .pfc-strip > .wp-block-post.is-revealed {
	opacity: 1;
	transform: translateY(0);
}

/* ----- Lightbox <dialog> ----- */
.pfc-lightbox {
	position: fixed;
	inset: 0;
	max-width: 100vw;
	max-height: 100dvh;
	width: 100vw;
	height: 100dvh;
	padding: 48px;
	margin: 0;
	background: var(--wp--preset--color--overlay);
	border: 0;
	color: var(--wp--preset--color--contrast);
}

.pfc-lightbox::backdrop {
	background: transparent;
}

.pfc-lightbox[open] {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	animation: pfc-fade-in var(--wp--custom--duration--fade) var(--wp--custom--easing);
}

.pfc-lightbox__head {
	width: 100%;
	max-width: var(--wp--custom--card-max);
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-bottom: 16px;
	gap: 16px;
}

.pfc-lightbox__cat {
	display: block;
	font-size: var(--wp--preset--font-size--label);
	font-weight: 600;
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--accent);
}

.pfc-lightbox__title {
	margin: 4px 0 0;
	font-size: var(--wp--preset--font-size--lightbox);
	font-weight: 700;
	color: var(--wp--preset--color--white);
	line-height: 1.2;
}

.pfc-lightbox__close {
	background: none;
	border: 1px solid var(--wp--custom--line--strong);
	color: var(--wp--preset--color--white);
	font: inherit;
	font-size: var(--wp--preset--font-size--nav);
	font-weight: 600;
	letter-spacing: var(--wp--custom--tracking--close);
	text-transform: uppercase;
	padding: 11px 20px;
	border-radius: 2px;
	cursor: pointer;
}

.pfc-lightbox__player {
	/* Le cadre tient dans la largeur ET la hauteur : sur un écran peu haut,
	   il rétrécit (en gardant le 16/9) pour ne jamais dépasser l'écran.
	   La réserve = padding de la lightbox + barre de titre (theme.json). */
	width: min(100%, var(--wp--custom--card-max), calc((100dvh - var(--wp--custom--lightbox-reserve)) * 16 / 9));
	aspect-ratio: 16 / 9;
	background: #000;
	border: 1px solid var(--wp--custom--line--medium);
}

.pfc-lightbox__player iframe {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

@keyframes pfc-fade-in {
	from { opacity: 0; }
	to   { opacity: 1; }
}

/* ----- Query no-results ----- */
.wp-block-query-no-results {
	padding: 48px;
	color: var(--wp--preset--color--muted-2);
	text-align: center;
	font-size: var(--wp--preset--font-size--label);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
}

/* ===== Défilement vertical — la 404 seulement (ADR-0021, réduit par ADR-0025) ===== */

/*
 * Pages, articles et archive de blog sont repassés au **flux latéral** (ADR-0025) :
 * il ne reste ici que la 404, qui n'est pas du contenu éditorial mais un message
 * court — le mettre en colonnes n'apporterait rien.
 *
 * Défilement vertical natif : aucun verrou de hauteur, aucun multi-colonnes,
 * aucune conversion de la molette. Les règles de rythme, elles, sont partagées
 * avec le flux latéral (voir plus bas) : le contenu éditorial se lit pareil dans
 * les deux régimes.
 */
.pfc-page {
	/* Seul enfant extensible de `.wp-site-blocks` (flex column, `min-height:
	   100dvh`) : sur une page courte, la barre de rôles est poussée en bas
	   d'écran au lieu de flotter sous le texte. `1 0 auto` et non `1` (= `1 1 0%`)
	   : la base reste la hauteur du contenu, qui peut donc dépasser l'écran — et
	   c'est bien le document qui défile. */
	flex: 1 0 auto;
}

/*
 * Largeur de lecture — la même mesure que le synopsis de la fiche film
 * (`--wp--custom--reading-width`). Sans elle, la ligne courrait sur toute la
 * largeur de l'écran : le multi-colonnes, qui bornait la mesure à 32rem, n'est
 * plus là pour le faire.
 *
 * `max-width` sur les enfants plutôt qu'un layout `constrained` du groupe : le
 * layout natif centre la colonne (`margin-inline: auto !important`), alors que
 * tout le thème lit depuis la marge gauche — identité, fiche film, colonnes du
 * flux latéral. On garde donc le texte à gauche.
 */
.pfc-page > * {
	max-width: var(--wp--custom--reading-width);
}

/* Titre de la page en capitales — même graduation que dans le flux latéral, pour
   que le passage d'une vue à l'autre ne change pas la typographie. */
.pfc-page > .wp-block-post-title {
	text-transform: uppercase;
}

/*
 * Rythme vertical du contenu éditorial.
 * `blockGap` vaut 0 globalement (theme.json — la grille et les barres en
 * dépendent) : sans rythme explicite, les paragraphes d'une page se tassent en un
 * pavé illisible. Le `blockGap` du groupe de la template couvre ses enfants
 * directs ; il reste l'intérieur de `core/post-content` et de la boucle
 * d'articles, rendus ici. Deux classes de spécificité pour passer devant le
 * `margin-block-start: 0` que le layout de core génère.
 */
:is(.pfc-page, .pfc-flow) .wp-block-post-content > * + * {
	margin-top: var(--wp--preset--spacing--40);
}

/* Boucle d'articles (archive de blog) : les entrées se détachent nettement, et
   titre / extrait restent solidaires au sein d'une entrée. */
:is(.pfc-page, .pfc-flow) .wp-block-post-template > li + li {
	margin-top: var(--wp--preset--spacing--60);
}

:is(.pfc-page, .pfc-flow) .wp-block-post-template > li > * + * {
	margin-top: var(--wp--preset--spacing--10);
}

/* `core/query` et `core/query-pagination` ne déclarent pas le support `blockGap`
   (leur `block.json` n'a pas de `supports.spacing`) : leur rythme ne peut pas être
   réglé depuis la template, il se règle ici. Sans ça la pagination se colle au
   dernier extrait et ses liens se touchent. */
:is(.pfc-page, .pfc-flow) .wp-block-query > * + * {
	margin-top: var(--wp--preset--spacing--60);
}

:is(.pfc-page, .pfc-flow) .wp-block-query-pagination {
	gap: var(--wp--preset--spacing--20);
}

/* ===== Flux latéral — fiche film, pages et articles (ADR-0010, ADR-0025) ===== */

/*
 * Hauteur exacte de l'écran, défilement horizontal, jamais de coupe. Le
 * multi-colonnes CSS re-fragmente le contenu en colonnes de lecture ; quand ça ne
 * tient plus en hauteur, une colonne de plus est créée *à droite* — d'où le
 * débordement horizontal.
 *
 * Condition non négociable : la hauteur doit être définie (`flex: 1` dans le
 * flex column de hauteur fixe `.wp-site-blocks:has(.pfc-flow)`), sinon rien ne
 * fragmente.
 *
 * ⚠️ Poser `.pfc-flow` suffit à tout déclencher : le verrou plein écran en tête de
 * fichier, la fragmentation en colonnes et les directives de défilement latéral
 * (`pfc_enrich_flow_container()`). La classe est portée par la fiche film, les
 * pages, les articles et l'archive de blog (ADR-0025) ; l'y retirer suffit à
 * rendre une vue au défilement vertical.
 */
.pfc-flow {
	flex: 1;
	/* Sans `min-height: 0`, un élément flex refuse de descendre sous sa hauteur
	   de contenu : la hauteur cesse d'être contrainte et la fragmentation ne se
	   déclenche jamais. */
	min-height: 0;
	overflow-x: auto;
	overflow-y: hidden;
	column-width: 32rem;
	column-gap: var(--wp--custom--gutter);
	/* Défilement latéral natif au doigt (pan-x) et zoom préservé (a11y) ; le pan
	   vertical est laissé au JS, qui le convertit en glissement latéral. */
	touch-action: pan-x pinch-zoom;
	/* Contrairement à la grille, la scrollbar reste visible : sur du texte, le
	   défilement latéral doit être signalé (repli sans JS — ADR-0006). Rien à
	   déclarer pour cela : le régime hérité du document convient. **Ne pas** y
	   remettre `scrollbar-width` — ce serait rebasculer ce conteneur sur le régime
	   standard, avec ses flèches (voir le bloc scrollbar en tête de fichier). */
}

/*
 * Garde-fous anti-coupure.
 * Le multi-colonnes fragmente *entre* les blocs, jamais *dans* un élément
 * atomique : tout média plus haut qu'une colonne serait tronqué. On le borne.
 */
.pfc-flow :is(img, video, iframe, figure, .wp-block-image, .wp-block-embed) {
	max-height: 100%;
	height: auto;
	break-inside: avoid;
}

/* `.wp-block-buttons` (donc `.pfc-watch`) est dans la liste depuis qu'une fiche
   peut porter **plusieurs** boutons d'action (ADR-0032) : sans lui, la rangée se
   fragmentait entre deux colonnes du flux — deux boutons ici, le troisième en
   tête de la colonne suivante, détaché de son groupe. */
.pfc-flow :is(figure, blockquote, pre, .wp-block-table, .wp-block-buttons, .wp-block-button, .pfc-sheet__credit) {
	break-inside: avoid;
}

/* Un titre ne reste jamais seul en bas de colonne. */
.pfc-flow :is(h1, h2, h3, h4, h5, h6) {
	break-after: avoid;
}

/*
 * Un champ de formulaire ne se sépare pas de son libellé.
 *
 * Le multi-colonnes ne coupe pas « au niveau du formulaire » : il coupe là où la
 * colonne est pleine, entre deux blocs quelconques. Or un champ n'est pas un bloc
 * unique — les moteurs de formulaire (Fluent Forms ici, `core/form` aussi)
 * empilent le libellé et le contrôle dans **deux conteneurs frères**. La coupure
 * pouvait donc tomber entre les deux : « Demande » en bas d'une colonne, son champ
 * en haut de la suivante.
 *
 * ⚠️ `break-after: avoid` sur le conteneur du libellé a été essayé **et n'a rien
 * changé ici** — alors que la propriété fonctionne en multi-colonnes par ailleurs
 * (vérifié sur un cas isolé). Le balisage du plugin y résiste, probablement par le
 * mode de disposition de ses conteneurs. `break-inside: avoid` sur le champ entier,
 * lui, fait le travail : c'est celui qu'on garde.
 *
 * Ces classes sont celles du moteur de formulaire, faute de sélecteur générique
 * sûr : `:has(label):has(input)` remonterait jusqu'à `.entry-content` et enfermerait
 * tout le formulaire dans une colonne. Volontairement **pas** de `break-inside` sur
 * `form` ni `fieldset` non plus : un formulaire plus haut qu'une colonne doit
 * pouvoir se fragmenter — l'invariant « jamais tronqué » (ADR-0010) prime.
 */
.pfc-flow :is(.ff-el-group, .ff-t-container, .wp-block-form-input) {
	break-inside: avoid;
}

/*
 * Aucun bloc scindé entre deux colonnes (demande client, ADR-0025) : un
 * paragraphe ou une liste passe entier dans la colonne suivante plutôt que de se
 * couper en deux.
 *
 * `break-inside: avoid` reste une **préférence**, pas une garantie : quand le
 * bloc est plus haut qu'une colonne entière, le navigateur ne peut pas l'honorer
 * et le fragmente quand même — c'est ce qui préserve l'invariant d'ADR-0010
 * (« jamais tronqué »), qui prime. Vérifié en rendu réel sur un paragraphe plus
 * haut que l'écran : il se fragmente, il ne se coupe pas.
 */
.pfc-flow :is(p, ul, ol, dl) {
	break-inside: avoid;
}

/*
 * Titre de la page, en capitales.
 * Enfant direct uniquement : cela vise le titre propre à la page (page, article,
 * fiche film) et laisse en casse normale les titres d'une boucle de contenus,
 * ainsi que ceux des vignettes de la grille — qui ne sont pas dans ce flux.
 */
.pfc-flow > .wp-block-post-title {
	text-transform: uppercase;
}

/*
 * Layouts insufragmentables neutralisés dans ce contexte.
 * Un conteneur flex (`core/columns`) ou une bande à défilement horizontal
 * (galerie) forme un bloc atomique plus haut/large que la colonne : il serait
 * coupé, et imbriquer un défilement horizontal dans un autre est illisible.
 * On les remet en flux normal — le multi-colonnes fournit déjà la colonnade.
 */
.pfc-flow .wp-block-columns {
	display: block;
}

.pfc-flow .wp-block-column {
	flex-basis: auto !important;
	width: auto;
}

/*
 * La galerie est la colonne de gauche, et cette colonne ne contient qu'elle
 * (ADR-0024). Rendue en tête du flux par `pfc_render_film_gallery()`, elle ouvre
 * la première colonne ; `break-after: column` renvoie tout le descriptif — donc
 * tout ce qui la suit — dans la suivante.
 */
.pfc-flow .pfc-sheet__galerie {
	break-after: column;
	break-inside: avoid;
	/* Seule dans sa colonne, la galerie l'occupe entièrement : sans hauteur, un
	   vide de la hauteur de l'écran suivrait l'image. `max-height` reste le
	   garde-fou anti-coupure (le slider ne peut pas déborder de la colonne). */
	height: 100%;
	max-height: 100%;
}

/* Le slider suit la hauteur de sa colonne, et **abandonne son ratio** : une
   hauteur définie doublée d'un `aspect-ratio` fait dériver la largeur du ratio
   (mesuré : 1 160px de large dans une colonne de 648px, la galerie débordait sur
   le descriptif). C'est la colonne qui donne les deux dimensions ici ; le cadrage
   de l'image est l'affaire d'`object-fit`. */
.pfc-flow .pfc-slider {
	height: 100%;
	aspect-ratio: auto;
}

/* L'image remplit la hauteur disponible et se centre. Prend le pas sur le
   `height: auto` du garde-fou médias ci-dessus, qui la collerait en haut d'une
   colonne pleine hauteur. `object-fit: contain` garantit qu'elle n'est ni
   déformée ni rognée (ADR-0011). */
.pfc-flow .pfc-sheet__shot {
	height: 100%;
}

/* Le premier bloc du descriptif ouvre une colonne : son écart de rythme n'a plus
   lieu d'être (et tous les navigateurs ne tronquent pas les marges au saut). */
.pfc-single.pfc-flow > .pfc-sheet__galerie + * {
	margin-top: 0;
}

/* La fiche film est bâtie en flex/grid : autant de conteneurs atomiques qui ne
   savent pas se fragmenter et seraient donc coupés. On les repasse en flux
   normal — les espacements portés par `gap` sont restitués en marges — et on
   rend chaque paire du générique insécable. */
.pfc-flow :is(.pfc-sheet, .pfc-sheet__credits, .pfc-sheet__list, .pfc-sheet__links) {
	display: block;
}

.pfc-flow .pfc-sheet > * + * {
	margin-top: var(--wp--preset--spacing--40);
}

.pfc-flow .pfc-sheet__credit {
	display: block;
	break-inside: avoid;
}

/* `dt` et `dd` ne sont plus côte à côte (la grille a été neutralisée) mais
   empilés : il faut donc séparer nettement les paires entre elles, sinon la
   valeur d'un poste colle au terme du suivant. */
.pfc-flow .pfc-sheet__credit + .pfc-sheet__credit,
.pfc-flow :is(.pfc-sheet__list, .pfc-sheet__links) li + li {
	margin-top: var(--wp--preset--spacing--30);
}

.pfc-flow .pfc-sheet__credit dt {
	margin-bottom: var(--wp--preset--spacing--10);
}

/* Un intertitre respire largement au-dessus, mais reste solidaire de ce qu'il
   annonce (`break-after: avoid` est déjà posé sur les titres du flux). */
.pfc-flow .pfc-sheet > * + .pfc-sheet__h {
	margin-top: var(--wp--preset--spacing--60);
}

/* `position: sticky` est inopérant en multi-colonnes : on l'annule pour éviter
   un positionnement fantôme. */
.pfc-flow :is(.is-position-sticky, [style*="position:sticky"]) {
	position: static;
}

/* ===== Fiche film — page de présentation (single-film.html) ===== */

/* La grille 62/38 a été supprimée (ADR-0011) : la fiche est un flux unique —
   tout le descriptif, puis la galerie — que le multi-colonnes met en colonnes. */

/*
 * Rythme vertical de la fiche.
 * `blockGap` vaut 0 globalement (theme.json) et les valeurs explicites vivaient
 * dans les colonnes 62/38, supprimées : sans ce rythme, les blocs se touchent.
 * Deux classes de spécificité pour passer devant le `margin-block-start: 0` que
 * le layout de core génère sur les enfants du groupe.
 */
.pfc-single.pfc-flow > * + * {
	margin-top: var(--wp--preset--spacing--50);
}

/* Le titre et sa catégorie forment un bloc : on les rapproche, puis on détache
   le reste. */
.pfc-single.pfc-flow > .wp-block-post-title + * {
	margin-top: var(--wp--preset--spacing--20);
}

.pfc-single .wp-block-post-title {
	margin: 0;
}

/* La fiche rendue côté serveur remplit la colonne principale. */
.pfc-single .pfc-sheet {
	max-width: none;
}

.pfc-single__synopsis {
	/* Taille de lecture (18px) légèrement sous le corps `card` (20px) : la
	   description gagne en compacité et davantage de texte tient à l'écran sans
	   défilement. La visibilité *entière* est déjà garantie en amont — plus haut
	   qu'une colonne, ce paragraphe se fragmente (ADR-0025) sans jamais être
	   tronqué (ADR-0010) ; la réduction ne fait que resserrer le rendu. */
	font-size: var(--wp--preset--font-size--read);
	color: var(--wp--preset--color--contrast);
	/* Interligne plus généreux que le 1.4 global (calibré pour la navigation) :
	   c'est le seul vrai paragraphe de la fiche. */
	line-height: 1.6;
	max-width: 680px;
}

.pfc-single__keywords {
	font-size: var(--wp--preset--font-size--meta);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-3);
	line-height: 1.6;
}

/* Générique, diffusions, partenaires : lignes courtes mais nombreuses, elles
   ont besoin d'air pour rester lisibles en colonne étroite. */
.pfc-sheet__credit dd,
.pfc-sheet__list li,
.pfc-sheet__links li {
	line-height: 1.6;
}

/* Bouton « Visionner le film ». Pas de `margin-block` ici : il entrerait en
   conflit (spécificité égale, déclaré plus bas) avec le rythme vertical de la
   fiche, qui doit rester la seule source d'espacement. */

/* Rangée d'actions : rendue côté serveur (pfc_route_watch_button) sans les
   classes de layout du bloc — la disposition flex est donc explicite ici. */
.pfc-watch {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

.pfc-watch .wp-block-button__link {
	background: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--accent);
	border-radius: 2px;
	font-size: var(--wp--preset--font-size--nav);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--nav);
	text-transform: uppercase;
	padding: 14px 26px;
}

/* Second CTA (« Demander un lien de visionnage ») : action secondaire, en
   contour, pour ne pas rivaliser avec le bouton de visionnage. */
.pfc-watch__btn--ghost .wp-block-button__link {
	background: transparent;
	color: var(--wp--preset--color--white);
	border: 1px solid var(--wp--custom--line--strong);
}

.pfc-watch__btn--ghost .wp-block-button__link:hover,
.pfc-watch__btn--ghost .wp-block-button__link:focus-visible {
	border-color: var(--wp--preset--color--white);
}

/* Film protégé : une phrase (mot de passe sur demande) à la place du champ natif. */
.pfc-locked {
	max-width: 680px;
}

.pfc-locked__text {
	font-size: var(--wp--preset--font-size--read);
	color: var(--wp--preset--color--contrast);
	line-height: 1.6;
}

.pfc-locked__text a {
	color: var(--wp--preset--color--white);
	text-decoration: underline;
	text-decoration-color: var(--wp--preset--color--white);
	text-underline-offset: 3px;
}

/* Fiche technique rendue côté serveur (pfc_render_film_sheet) */
.pfc-sheet {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--40);
	max-width: 820px;
}

.pfc-sheet__facts {
	font-size: var(--wp--preset--font-size--nav);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-2);
}

.pfc-sheet__h {
	font-size: var(--wp--preset--font-size--label);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--role);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-4);
	margin: 0 0 var(--wp--preset--spacing--20);
	padding-bottom: var(--wp--preset--spacing--10);
	border-bottom: 1px solid var(--wp--custom--line--soft);
}

.pfc-sheet__credits {
	display: grid;
	grid-template-columns: max-content 1fr;
	gap: 6px var(--wp--preset--spacing--40);
	margin: 0;
}

.pfc-sheet__credit {
	display: contents;
}

.pfc-sheet__credit dt {
	font-size: var(--wp--preset--font-size--label);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-3);
}

.pfc-sheet__credit dd {
	margin: 0;
	color: var(--wp--preset--color--contrast);
}

.pfc-sheet__list,
.pfc-sheet__links {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.pfc-sheet__list li {
	color: var(--wp--preset--color--contrast);
}

/* Liens de la fiche (vidéos, partenaires) : **blancs et soulignés** (demande
   client, ADR-0023). Le soulignement vient de `text-decoration` et non d'un
   `border-bottom` comme ailleurs dans le thème : un libellé qui se replie sur
   deux lignes — c'est le cas en colonne étroite — verrait sa bordure se couper
   à chaque fragment de ligne. */
.pfc-sheet__links a {
	color: var(--wp--preset--color--white);
	text-decoration: underline;
	text-underline-offset: 4px;
	text-decoration-thickness: 1px;
	transition: text-decoration-color var(--wp--custom--duration--filter) var(--wp--custom--easing),
		text-decoration-thickness var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

/* L'accent passe du texte au trait : le survol et le focus restent signalés
   sans changer la couleur du libellé — et l'épaisseur ne décale rien, à la
   différence d'une bordure (les outline étant supprimés globalement). */
.pfc-sheet__links a:hover,
.pfc-sheet__links a:focus-visible {
	text-decoration-color: var(--wp--preset--color--accent);
	text-decoration-thickness: 2px;
}

/* Liste des vidéos du film (ADR-0022) — numérotée : c'est l'ordre des
   diapositives du visionnage, pas une liste d'items interchangeables. */
.pfc-sheet__videos {
	counter-reset: pfc-video;
}

.pfc-sheet__videos li {
	counter-increment: pfc-video;
}

.pfc-sheet__videos li::before {
	content: counter(pfc-video, decimal-leading-zero) " ";
	font-size: var(--wp--preset--font-size--label);
	letter-spacing: var(--wp--custom--tracking--num);
	color: var(--wp--preset--color--muted-4);
}

/* ----- Galerie — slider CSS pur (ADR-0011) ----- */

/*
 * Aucun JS, aucun bloc custom : un groupe de boutons radio pilote l'image
 * affichée. Corollaire voulu — le slider ne peut pas s'animer tout seul, et il
 * fonctionne sans JavaScript (ADR-0006).
 *
 * Le PHP émet les éléments dans l'ordre `input → image → ligne`. Cette chaîne
 * d'adjacence suffit à piloter l'image *et* sa ligne de navigation avec deux
 * règles, quel que soit le nombre d'images.
 */
.pfc-slider {
	display: grid;
	/* `--pfc-slides` (posé par PHP) rend la grille explicite : sans quoi le
	   `grid-column: 1 / -1` de l'image ne pourrait pas couvrir les colonnes de
	   navigation, qui seraient implicites. */
	grid-template-columns: repeat(var(--pfc-slides, 1), minmax(0, 1fr));
	grid-template-rows: minmax(0, 1fr) auto;
	column-gap: var(--wp--preset--spacing--10);
	row-gap: var(--wp--preset--spacing--20);
	/* Hauteur *définie* dérivée de la largeur de colonne : sans elle, le
	   `height: 100%` des images ne se résoudrait pas (la grille étant en hauteur
	   automatique, la référence serait circulaire et la zone s'effondrerait). */
	aspect-ratio: 16 / 9;
	max-height: 100%;
}

/* Les radios restent atteignables au clavier mais sortent du flux de la grille
   (position: absolute), sinon elles occuperaient des cellules. */
.pfc-sr-only,
.pfc-slider__input {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* Toutes les images occupent la même cellule : elles sont empilées. */
.pfc-slider__slide {
	grid-row: 1;
	grid-column: 1 / -1;
	margin: 0;
	min-width: 0;
	min-height: 0;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity var(--wp--custom--duration--fade) var(--wp--custom--easing);
}

.pfc-slider__input:checked + .pfc-slider__slide {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}

.pfc-sheet__shot {
	width: 100%;
	height: 100%;
	max-height: 100%;
	object-fit: contain;
	object-position: center;
	display: block;
	border: 1px solid var(--wp--custom--line--faint);
}

/* Lignes de navigation sous l'image — une par vue, de largeur égale. */
.pfc-slider__line {
	grid-row: 2;
	height: 2px;
	background: var(--wp--custom--line--medium);
	cursor: pointer;
	transition: background var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.pfc-slider__line:hover {
	background: var(--wp--preset--color--white);
}

.pfc-slider__input:checked + .pfc-slider__slide + .pfc-slider__line {
	background: var(--wp--preset--color--accent);
}

/* Les outline étant supprimés globalement (demande client), le focus clavier se
   signale par la ligne elle-même — sans quoi le slider serait inutilisable. */
.pfc-slider__input:focus-visible + .pfc-slider__slide + .pfc-slider__line {
	background: var(--wp--preset--color--white);
	height: 4px;
}

/* Flèches de navigation — surcouche JS (ADR-0029). Masquées tant que le store
   n'a pas hydraté la galerie (`is-enhanced`) : sans JS, aucune commande inerte
   n'apparaît, le slider se navigue par ses lignes. Elles partagent la cellule
   des images (row 1) et se calent à chaque bord, par-dessus la vue affichée.
   Un fond `overlay` — à la différence des flèches du lecteur, sur fond noir —
   garde le chevron lisible sur une image claire. */
.pfc-slider__arrow {
	display: none;
	grid-row: 1;
	grid-column: 1 / -1;
	align-self: center;
	z-index: 2;
	position: relative;
	/* Cible tactile de 44px **conservée** (a11y, ADR-0027) ; le carré sombre
	   visible, lui, est plus petit et translucide — il est dessiné par `::before`
	   ci-dessous, pas par le fond du bouton. */
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	background: transparent;
	color: var(--wp--preset--color--white);
	cursor: pointer;
	place-items: center;
	transition: color var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

/* Carré sombre translucide, plus petit que la cible tactile : `inset` le ramène à
   ~30px et l'opacité atténue le token `overlay` (déjà semi-opaque) — d'où l'effet
   de transparence demandé. Placé derrière le chevron (z-index 0). */
.pfc-slider__arrow::before {
	content: "";
	position: absolute;
	inset: 7px;
	z-index: 0;
	background: var(--wp--preset--color--overlay);
	opacity: 0.55;
	transition: opacity var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.pfc-sheet__galerie.is-enhanced .pfc-slider__arrow {
	display: grid;
}

.pfc-slider__arrow--prev {
	justify-self: start;
}

.pfc-slider__arrow--next {
	justify-self: end;
}

/* Focus signalé comme le survol (outline supprimés globalement, demande client) :
   sans cela les flèches seraient invisibles au clavier. Le carré s'opacifie un peu
   pour marquer l'état actif. */
.pfc-slider__arrow:hover,
.pfc-slider__arrow:focus-visible {
	color: var(--wp--preset--color--accent);
}

.pfc-slider__arrow:hover::before,
.pfc-slider__arrow:focus-visible::before {
	opacity: 0.8;
}

/* Chevron dessiné, pas de nœud de texte — même idiome que `.pfc-view__chevron`,
   en plus petit. Au-dessus du carré (z-index 1). */
.pfc-slider__chevron {
	position: relative;
	z-index: 1;
	width: 8px;
	height: 8px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: rotate(135deg);
	/* Le chevron penche : on le recentre optiquement dans son carré. */
	margin-left: 2px;
}

.pfc-slider__arrow--next .pfc-slider__chevron {
	transform: rotate(-45deg);
	margin-left: -2px;
}

/* ===== Visionnage plein écran (single-film-visionnage.html) ===== */
.pfc-view {
	display: flex;
	flex-direction: column;
	height: 100dvh;
	gap: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--40) var(--wp--custom--gutter) var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--base);
	/* Ancre la croix de fermeture (plus bas) : elle se pose sur *cette* boîte. */
	position: relative;
}

.pfc-view__bar {
	flex: none;
	/* Réserve la place de la croix de fermeture (fixée au coin haut-droit, plus
	   bas) : sans elle, le lien « Filmographie », aligné sur la gouttière, passerait
	   dessous. */
	padding-inline-end: 44px;
}

.pfc-view__title,
.pfc-view__title a {
	margin: 0;
	font-size: var(--wp--preset--font-size--brand);
	font-weight: 700;
	color: var(--wp--preset--color--white);
	text-decoration: none;
}

/*
 * Le titre cède la place quand la ligne est trop courte.
 *
 * La barre est en `nowrap` : un titre long (« La Compagnie Kivuko en résidence
 * à… ») poussait « Filmographie » et la croix hors de l'écran. Sans `min-width: 0`,
 * un élément flex refuse de passer sous sa largeur de contenu ; le titre se tronque
 * donc proprement — exactement ce que fait déjà le nom du site dans l'en-tête sous
 * 1024px. Vérifié en rendu réel à 700px sur ce film.
 */
.pfc-view__title {
	min-width: 0;
}

.pfc-view__title a {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.pfc-view__content {
	flex: 1;
	min-height: 0;
	display: flex;
}

/*
 * Croix de fermeture du lecteur (demande client).
 *
 * Même dessin, même boîte de 44×44 et mêmes offsets serrés que la croix du menu
 * (ADR-0018), au coin haut-droit. Le lecteur n'a pas d'en-tête — c'est donc la
 * seule croix de la vue, sans risque de superposition avec celle du menu.
 *
 * `absolute` (ancré sur `.pfc-view`) plutôt que `fixed` : la croix appartient à la
 * vue, pas à l'écran — la vue occupe déjà toute la hauteur, le résultat est le même
 * et la portée est plus étroite. Hors flux dans les deux cas : le flex de
 * `.pfc-view__content` n'en tient pas compte.
 *
 * Vérifiée à 320, 375, 700 et 1440px : la croix reste dans le champ, aux côtés du
 * lien « Filmographie », et la barre ne déborde jamais en largeur.
 */
.pfc-view__close {
	position: absolute;
	top: var(--wp--preset--spacing--20);
	inset-inline-end: var(--wp--preset--spacing--20);
	z-index: 10;
	display: flex;
	align-items: center;
	justify-content: center;
	/* Cible tactile de 44px sans grossir l'icône (24px), comme le toggle du menu. */
	width: 44px;
	height: 44px;
	color: var(--wp--preset--color--muted-1);
	transition: color var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.pfc-view__close svg {
	fill: currentColor;
}

/* Les outline sont supprimés globalement (demande client, en tête de fichier) : le
   focus clavier se signale par la couleur, comme sur la croix du menu. */
.pfc-view__close:hover,
.pfc-view__close:focus-visible {
	color: var(--wp--preset--color--white);
}

/* ----- Slider des vidéos du film (ADR-0022) -----
 *
 * Une diapositive par vidéo, mais **une seule iframe** dans le document : les
 * autres diapositives n'affichent que leur titre. Le rail se déplace de
 * `--pfc-current` diapositives — variable posée par le serveur (donc juste
 * dès le premier rendu, sans JS) puis tenue à jour par le store.
 */
.pfc-view__slider {
	flex: 1;
	min-height: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

.pfc-view__stage {
	flex: 1;
	min-height: 0;
	overflow: hidden;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--custom--line--medium);
}

.pfc-view__track {
	display: flex;
	height: 100%;
	transform: translateX(calc(var(--pfc-current, 0) * -100%));
	transition: transform var(--wp--custom--duration--fade) var(--wp--custom--easeOut);
}

.pfc-view__slide {
	flex: 0 0 100%;
	width: 100%;
	height: 100%;
	min-width: 0;
	display: flex;
	align-items: center;
	justify-content: center;
}

.pfc-view__slide iframe {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

/* Le titre ne sert que de cadre d'attente : il disparaît sous le lecteur. */
.pfc-view__placeholder {
	margin: 0;
	font-size: var(--wp--preset--font-size--label);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-3);
}

.pfc-view__slide.is-current .pfc-view__placeholder {
	display: none;
}

.pfc-view__nav {
	flex: none;
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

.pfc-view__status {
	flex: 1;
	margin: 0;
	font-size: var(--wp--preset--font-size--nav);
	letter-spacing: var(--wp--custom--tracking--meta);
	text-transform: uppercase;
	color: var(--wp--preset--color--muted-2);
}

.pfc-view__label {
	color: var(--wp--preset--color--white);
}

/* Cible tactile de 44px (même exigence qu'ADR-0014 sur le toggle de menu). */
.pfc-view__arrow {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	color: var(--wp--preset--color--white);
	text-decoration: none;
	border: 1px solid var(--wp--custom--line--medium);
	transition: border-color var(--wp--custom--duration--filter) var(--wp--custom--easing),
		color var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

/* Les outline étant supprimés globalement (demande client), le focus clavier se
   signale comme le survol — sans quoi les flèches seraient invisibles au clavier. */
.pfc-view__arrow:hover,
.pfc-view__arrow:focus-visible {
	color: var(--wp--preset--color--accent);
	border-color: var(--wp--preset--color--accent);
}

/* Extrémité atteinte : plus de cible, et aucun lien vers la première vidéo —
   la lecture ne boucle pas. */
.pfc-view__arrow[aria-disabled="true"] {
	color: var(--wp--preset--color--muted-5);
	pointer-events: none;
}

.pfc-view__chevron {
	width: 10px;
	height: 10px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: rotate(-45deg);
	/* Le chevron penche : on le recentre optiquement dans son carré. */
	margin-left: -3px;
}

.pfc-view__arrow[data-pfc-arrow="prev"] .pfc-view__chevron {
	transform: rotate(135deg);
	margin-left: 3px;
}

/* Lignes de navigation — même langage que le slider de la galerie (ADR-0011). */
.pfc-view__lines {
	flex: none;
	display: grid;
	grid-template-columns: repeat(var(--pfc-videos, 1), minmax(0, 1fr));
	gap: var(--wp--preset--spacing--10);
}

.pfc-view__line {
	height: 2px;
	background: var(--wp--custom--line--medium);
	transition: background var(--wp--custom--duration--filter) var(--wp--custom--easing);
}

.pfc-view__line:hover,
.pfc-view__line:focus-visible {
	background: var(--wp--preset--color--white);
	height: 4px;
}

.pfc-view__line.is-current {
	background: var(--wp--preset--color--accent);
}

/* ----- Formulaire de contact (Fluent Forms) -----
   Fluent Forms embarque sa propre feuille — champs clairs, focus bleu,
   bouton gris clair réglé depuis l'éditeur du plugin (feuille par
   formulaire injectée en ligne, spécificité 0,3,1). On la réaligne sur le
   design sombre du thème : angles francs, cadre blanc translucide, fond
   anthracite — même vocabulaire que le CTA fantôme de la fiche film
   (`.pfc-watch__btn--ghost`). Préfixe `.pfc-flow` : égalise la spécificité
   de `.ff-default .ff-el-form-control` (0,2,0) pour gagner par l'ordre
   d'enfilage (cette feuille charge après celles du plugin). */
.pfc-flow .ff-el-form-control {
	background: var(--wp--preset--color--field);
	border: 1px solid var(--wp--custom--line--medium);
	border-radius: 0;
	color: var(--wp--preset--color--contrast);
	font-family: inherit;
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
}

.pfc-flow .ff-el-form-control::placeholder {
	color: var(--wp--preset--color--muted-2);
	opacity: 1;
}

/* Le cœur du plugin repasse le champ au blanc et la bordure au bleu de
   marque au focus (`.ff-default .ff-el-form-control:focus`, 0,3,0) : on
   reste sur l'identité du thème, le focus se signalant par la bordure qui
   passe au blanc plein (les outline sont supprimés globalement, en tête de
   fichier). */
.pfc-flow .ff-el-form-control:focus {
	background: var(--wp--preset--color--field);
	border-color: var(--wp--preset--color--white);
	color: var(--wp--preset--color--contrast);
}

/* Bouton d'envoi : même traitement que le CTA secondaire de la fiche film —
   transparent, cadre blanc translucide, angles francs, aucun remplissage au
   survol (`opacity: 1` annule l'assombrissement au survol du cœur du
   plugin). `!important` sur fond/bordure/texte : au-delà de la feuille du
   plugin, ce bouton porte une feuille `<style>` par-formulaire (couleurs de
   démo réglées dans l'éditeur Fluent Forms), plus spécifique qu'aucun
   sélecteur de classes ici. */
.pfc-flow .ff-btn-submit {
	border-radius: 0;
	padding: var(--wp--preset--spacing--10) var(--wp--preset--spacing--20);
	font-size: var(--wp--preset--font-size--nav);
	font-weight: 400;
	letter-spacing: var(--wp--custom--tracking--nav);
	text-transform: uppercase;
	background: transparent !important;
	border: 1px solid var(--wp--custom--line--strong) !important;
	color: var(--wp--preset--color--white) !important;
}

.pfc-flow .ff-btn-submit:hover,
.pfc-flow .ff-btn-submit:focus-visible {
	opacity: 1;
	background: transparent !important;
	border-color: var(--wp--preset--color--white) !important;
	color: var(--wp--preset--color--white) !important;
}

/* ----- Repli mobile (PO-2 — défaut : bascule verticale sous 1024px) ----- */
@media (max-width: 1023px) {
	/* Levée du verrou plein écran. Il faut **reprendre ses sélecteurs** : le
	   verrou cible `html:has(.pfc-strip-wrapper)` (spécificité 0,1,1), qu'un
	   simple `html, body` (0,0,1) ne lève pas. Sans ça la page reste enfermée —
	   mesuré : 5 556 px de contenu dans la hauteur d'écran à 375px, 11 200 px à
	   768px, sans aucun moyen de défiler. */
	html:has(.pfc-strip-wrapper), body:has(.pfc-strip-wrapper),
	html:has(.pfc-view), body:has(.pfc-view),
	html:has(.pfc-flow), body:has(.pfc-flow) {
		overflow: visible;
	}
	/* Jumeau sans `:has()` (ADR-0031) : lève aussi le verrou par classe. Même
	   spécificité 0,1,1 que le verrou de base, mais **plus bas dans la source** →
	   il l'emporte, comme la règle `:has()` mobile l'emporte sur la sienne. */
	html.pfc-mode-strip, html.pfc-mode-view, html.pfc-mode-flow {
		overflow: visible;
	}
	/* `height: 100%` enfermerait le document dans la hauteur d'écran : sous
	   1024px c'est le flux normal qui défile, pas un conteneur interne. */
	html, body {
		height: auto;
	}
	/* La barre de rôles reste visible en bas de l'écran (comme en desktop où le
	   layout est figé) pendant que la page défile — sinon elle est reléguée tout
	   en bas du défilement, après tous les films (demande client). `sticky` ne
	   suffit pas : dernier enfant, il ne remonte pas dans le viewport. `fixed`
	   l'épingle ; fond opaque `base` pour masquer les vignettes qui passent
	   derrière. La hauteur est réservée plus bas sur `.wp-site-blocks`. */
	.pfc-footer {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 10;
		background: var(--wp--preset--color--base);
	}
	/* Réserve la hauteur de la barre fixe : sans ça, la dernière vignette passe
	   dessous en fin de défilement. Deux crans d'espacement couvrent le repli sur
	   deux lignes des libellés de rôles sur écran étroit.
	   `:has(.pfc-footer)` : le visionnage plein écran n'inclut pas la part de pied,
	   il n'a donc aucune barre à compenser. Sans cette condition il gagnait 68px de
	   vide sous un lecteur déjà en `100dvh` — mesuré : 828px de document pour 760px
	   d'écran, soit un défilement parasite sur une vue qui ne doit pas défiler. */
	.wp-site-blocks:has(.pfc-footer) {
		padding-bottom: calc(var(--wp--preset--spacing--60) + var(--wp--preset--spacing--40));
	}
	/* Jumeau sans `:has()` (ADR-0031) : le pied est présent dans tous les modes
	   sauf « view » — `:has(.pfc-footer)` équivaut donc à « pas le visionnage ». */
	html:not(.pfc-mode-view) .wp-site-blocks {
		padding-bottom: calc(var(--wp--preset--spacing--60) + var(--wp--preset--spacing--40));
	}
	/* Plus de bascule de menu à gérer ici : `overlayMenu: "always"` (ADR-0018)
	   replie le menu en burger + drawer à **toutes** les largeurs, via les
	   classes natives `hidden-by-default` / `always-shown`. Les règles de
	   neutralisation du point de rupture 600-1023px d'ADR-0014 sont donc
	   retirées (elles ne s'appliquaient qu'au mode « mobile »). */

	/* Gouttière de 48px intenable sous 1024px : le nom du site et le bouton se
	   chevauchent. Le padding vient d'un style inline posé par le bloc groupe —
	   `!important` est le seul levier CSS, comme pour `.pfc-strip`. Les boutons
	   ☰/✕ ont leur propre offset (fixe, serré au coin), indépendant de ce padding. */
	.pfc-header {
		padding-right: var(--wp--preset--spacing--40) !important;
		padding-left: var(--wp--preset--spacing--40) !important;
	}
	/* Mobile : le toggle du menu passe dans une top bar, AU-DESSUS du titre du site
	   (demande client). Il quitte son ancrage fixe en coin (desktop, ADR-0018) et
	   reprend sa place dans le flux, en tête de l'en-tête ; l'identité passe dessous.
	   L'en-tête devient une colonne ; la nav est remontée en premier via `order`.
	   `!important` : même raison qu'au-dessus — égaler les styles de layout du bloc
	   groupe, dont l'ordre d'enfilage n'est pas garanti (ADR-0014). */
	.pfc-header {
		flex-direction: column !important;
		align-items: stretch !important;
		row-gap: var(--wp--preset--spacing--30);
	}
	/* La top bar : pleine largeur, toggle rangé à droite, séparée du titre par un
	   filet. Le drawer ouvert reste un overlay `fixed` indépendant, non affecté. */
	.pfc-header > .wp-block-navigation {
		order: -1;
		justify-content: flex-end;
		padding-bottom: var(--wp--preset--spacing--20);
		border-bottom: 1px solid var(--wp--custom--line--soft);
	}
	/* Le toggle revient dans le flux. `relative` — et non `static` — pour rester le
	   contexte de positionnement de son libellé (`::after` en `inset-inline-end: 100%`) ;
	   on annule les offsets de l'ancrage fixe du desktop. */
	.pfc-header .wp-block-navigation__responsive-container-open {
		position: relative;
		top: auto;
		inset-inline-end: auto;
	}
	/* Sans `min-width: 0`, un élément flex refuse de passer sous sa largeur de
	   contenu : le nom du site pousserait le bouton hors du bandeau. */
	.pfc-brand {
		min-width: 0;
	}
	.pfc-brand .wp-block-site-title a {
		display: block;
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	}
	.wp-site-blocks {
		min-height: auto;
	}
	/* Le flux latéral redevient un défilement vertical classique : sur mobile la
	   hauteur d'écran est trop faible pour des colonnes de lecture (ADR-0010). */
	.wp-site-blocks:has(.pfc-flow) {
		height: auto;
	}
	/* Jumeau sans `:has()` (ADR-0031) — même spécificité 0,2,0, plus bas en source. */
	.pfc-mode-flow .wp-site-blocks {
		height: auto;
	}
	.pfc-flow {
		columns: auto;
		overflow: visible;
		touch-action: auto;
	}
	/* Le conteneur reste un **bloc** en mobile : le passer en flex ou en grille
	   réveille le `flex: 1` + `min-height: 0` que `.pfc-strip-wrapper` porte pour le
	   bureau, et la grille de vignettes s'écrase (mesuré : 841px pour onze
	   vignettes au lieu de 15 054). L'ordre « étiquettes puis grille » est donc posé
	   dans les templates, pas ici — le bureau ne le voit pas, la barre y étant un
	   overlay en `position: absolute`. */
	.pfc-layout {
		display: block;
	}
	/* Pas d'overlay en mobile : la barre est empilée, pas flottante. */
	.pfc-layout::after {
		display: none;
	}
	.pfc-strip-wrapper {
		overflow: visible;
		padding: 8px var(--wp--preset--spacing--40) 40px;
		/* Hauteur auto en mobile : pas de conteneur de taille (cqh indéfini). */
		container-type: normal;
		/* `pan-x pinch-zoom` interdit au navigateur le pan vertical : le doigt
		   ne ferait rien défiler du tout ici, la conversion JS étant désactivée
		   sous 1024px. Le geste vertical doit redevenir natif. */
		touch-action: auto;
	}
	.pfc-sidebar {
		position: static;
		width: auto;
		overflow: visible;
		padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--40);
		pointer-events: auto;
	}
	.pfc-sidebar .pfc-filter {
		flex-direction: row;
		flex-wrap: wrap;
		/* En colonne, l'écart venait du `gap` vertical ; en ligne enroulée il doit
		   séparer aussi les colonnes, sinon deux cibles tactiles se touchent. */
		gap: var(--wp--preset--spacing--10) var(--wp--preset--spacing--30);
	}
	/* Cible tactile de 44px (RGAA / WCAG 2.5.8) : au doigt, ces étiquettes ne
	   faisaient que 17px de haut — mesuré à 375px. Le texte reste à sa graduation,
	   c'est la boîte qui grandit. */
	.pfc-sidebar .pfc-filter__link {
		display: flex;
		align-items: center;
		justify-content: flex-start;
		min-height: 44px;
	}
	.pfc-sidebar .pfc-filter__link::after {
		display: none;
	}
	.pfc-strip {
		display: grid !important;
		grid-template-rows: none;
		grid-template-columns: 1fr;
		grid-auto-flow: row;
		grid-auto-columns: auto;
		/* La barre d'étiquettes est empilée et non plus flottante : ni réserve de
		   fin de course, ni largeur au contenu — la grille reprend la largeur de
		   l'écran, sans quoi elle déborderait horizontalement (ADR-0026). */
		width: auto;
		max-width: 100%;
		padding-right: 0;
	}
	.pfc-strip > .wp-block-post {
		aspect-ratio: 3 / 4;
	}
	.pfc-meta__hint {
		display: none;
	}
	.pfc-lightbox {
		padding: 20px;
	}
	/* La galerie ne force plus de colonne et ne remplit plus de hauteur : en
	   vertical il n'y a ni colonne à ouvrir, ni hauteur d'écran à occuper. Elle
	   ouvre simplement la page, au-dessus du titre. */
	.pfc-flow .pfc-sheet__galerie {
		break-after: auto;
		height: auto;
	}
	/* Le slider retrouve son ratio propre : sans colonne pour lui donner une
	   hauteur, c'est le 16/9 qui cadre la zone d'image — un `height: 100%` non
	   résolu laisserait la grille sans hauteur de référence. */
	.pfc-flow .pfc-slider {
		height: auto;
		aspect-ratio: 16 / 9;
	}
	.pfc-flow .pfc-sheet__shot {
		height: auto;
	}
	/* Hauteur d'image bornée par le viewport, faute de colonne pour la contraindre. */
	.pfc-slider {
		max-height: 70dvh;
	}
	/*
	 * Gouttière entre la galerie et le contenu (demande client).
	 *
	 * En bureau, le bloc qui suit la galerie ouvre une **nouvelle colonne** : sa
	 * marge de rythme n'a pas lieu d'être, et elle est annulée plus haut. Empilé en
	 * vertical, ce même `margin-top: 0` collait le titre au bas de l'image —
	 * mesuré : 0px d'écart à 375 comme à 768px. On rend donc la gouttière ici, et
	 * la plus large du jeu (preset « 6 — Gouttière ») : la galerie est un bloc
	 * d'image pleine largeur, il lui faut plus d'air que le rythme courant du
	 * descriptif (preset 5) pour que l'œil sépare les deux.
	 */
	.pfc-single.pfc-flow > .pfc-sheet__galerie + * {
		margin-top: var(--wp--preset--spacing--60);
	}

	/* ===== Lecteur : le cadre suit la vidéo, plus l'écran (demande client) =====
	 *
	 * En bureau, la scène occupe toute la hauteur restante et la vidéo s'y pose au
	 * milieu, en boîte aux lettres. Sur téléphone et tablette cette hauteur est
	 * absurde : mesuré, un cadre de 279×675 (ratio 0,41) à 375px et 672×675 (ratio
	 * 1,00) à 768px, pour une image 16/9 haute de 157px — le reste était du noir.
	 *
	 * Ici : la vue cesse d'être une colonne à hauteur d'écran, la scène prend la
	 * pleine largeur et **son ratio dicte sa hauteur**. Le lecteur se retrouve donc
	 * en haut de page, immédiatement sous la barre de contrôles. */
	.pfc-view {
		height: auto;
		/* Le fond noir continue de remplir l'écran quand la vidéo est courte. */
		min-height: 100dvh;
		/* Pleine largeur : la gouttière ne s'applique plus qu'aux commandes. */
		padding-inline: 0;
	}
	.pfc-view__nav,
	.pfc-view__lines {
		padding-inline: var(--wp--preset--spacing--40);
	}
	.pfc-view__bar {
		padding-inline-start: var(--wp--preset--spacing--40);
		/* La gouttière de 48px ne tient plus la croix à distance : la réserve doit
		   maintenant couvrir sa boîte (44px) **et** son décalage au coin (14px),
		   sinon « Filmographie » passe dessous — constaté en rendu. */
		padding-inline-end: calc(44px + var(--wp--preset--spacing--20));
	}
	/* Plus de partage de la hauteur restante : chaque conteneur reprend la hauteur
	   de son contenu, sans quoi le `flex: 1` du bureau réétirerait la scène. */
	.pfc-view__content,
	.pfc-view__slider {
		display: block;
		flex: none;
	}
	.pfc-view__stage {
		flex: none;
		aspect-ratio: 16 / 9;
		/* Bord à bord : les filets latéraux n'ont plus de bord où se poser. */
		border-inline: 0;
	}
}

/* ----- Téléphone : le bandeau de marque passe sur deux lignes -----
   Sous 600px, « Aloyse Leledy-Bécue » + « cinéaste » + le bouton ne tiennent
   plus sur une ligne. On empile plutôt que de tronquer : la signature reste
   lisible en entier, et rien n'est retiré aux lecteurs d'écran. */
@media (max-width: 599px) {
	.pfc-brand {
		flex-direction: column;
		align-items: flex-start;
		gap: 2px;
	}
	/* Padding droit resserré sur téléphone ; la marge gauche de 10 % du drawer
	   (demande client) est préservée — on ne touche pas `padding-inline-start`. */
	.pfc-header .wp-block-navigation__responsive-container.is-menu-open {
		padding-inline-end: var(--wp--preset--spacing--20);
	}
}

/* ----- Réduction de mouvement ----- */
@media (prefers-reduced-motion: reduce) {
	html.js .pfc-strip > .wp-block-post {
		opacity: 1;
		transform: none;
		transition: none;
	}
	.pfc-strip > .wp-block-post .wp-block-cover__background,
	.pfc-strip > .wp-block-post .wp-block-cover__inner-container,
	.pfc-slider__slide,
	.pfc-slider__line,
	.pfc-slider__arrow,
	.pfc-slider__arrow::before,
	.pfc-view__track,
	.pfc-view__line,
	.pfc-view__arrow,
	.pfc-view__close,
	.pfc-sheet__links a,
	.pfc-filter__link {
		transition: none;
	}
	.pfc-lightbox[open] {
		animation: none;
	}
	/* Menu : ouverture/fermeture instantanées, sans glissement, fondu ni stagger.
	   Préfixe `.pfc-header` pour égaler la spécificité des règles animées et gagner
	   par l'ordre source (le @media vient après). L'état ouvert reste visible
	   (`opacity: 1`) ; fermé, `display: none` du cœur suffit à le masquer. */
	.pfc-header .wp-block-navigation__responsive-container,
	.pfc-header .wp-block-navigation__responsive-container.is-menu-open {
		opacity: 1;
		transform: none;
		transition: none;
	}
	.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
		animation: none;
	}
}

/* ----- Impression : le flux latéral n'a aucun sens sur papier (ADR-0010) ----- */
@media print {
	html:has(.pfc-flow), body:has(.pfc-flow) {
		overflow: visible;
	}
	.wp-site-blocks:has(.pfc-flow) {
		height: auto;
	}
	/* Jumeaux sans `:has()` (ADR-0031) — mêmes spécificités que ci-dessus. */
	html.pfc-mode-flow {
		overflow: visible;
	}
	.pfc-mode-flow .wp-site-blocks {
		height: auto;
	}
	.pfc-flow {
		columns: auto;
		overflow: visible;
		height: auto;
	}
}
