/* raccords-maison.css — v3 (Claude, atelier RACCORDS, 29/09/2026). Raccord entre la fin d'une page intérieure et l'ouverture de la
   suivante, LIMITÉ au trajet de fin de page (liens .ed-next-link / .te-next-link) : partout ailleurs (menu, langue, autres liens) le
   geste historique (tube d'entracte.css + brume 1 300 ms) reste inchangé. États : html[data-tc-raccord="depart"] posé par
   raccords-maison.mjs au clic sur le lien de fin de page ; html[data-tc-raccord="arrivee"] posé par raccords-maison-tete.js en tête
   du document arrivant (avant le premier rendu) quand le marqueur de seuil désigne cette page ; 'direct' sinon. Gardes réelles :
   body[data-tc-cine-paused="true"] (raccord-mouvement.mjs), .tc-scene[data-motion=paused], mouvement réduit, contraste renforcé,
   couleurs forcées, impression — sur tous les effets ajoutés, y compris une pause déclenchée pendant la transition (les animations
   sont retirées : la transition se termine aussitôt, contenu visible). Ivoire, vert, noir ; jamais d'or. Aucun délai. */

:root { --rm-voile: #06100c; --rm-dur-seuil: 420ms; --rm-dur-passage: var(--tc-dur-passage, 650ms); --rm-ease: var(--tc-ease-cine, cubic-bezier(.22,.72,.18,1)); }
html:has(body.page-champagne) { --rm-voile: #f4f0e8; }

/* 1. Seuil au repos : cadre calme. Survol / focus clavier du lien « page suivante » (borné à main :is(.ed-next, .te-next), le bloc « page suivante ») :
   la lumière de l'image s'ouvre (voile plus clair, image +4 %, 420 ms) ; titre et flèche restent nets. */
body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-shade { transition: opacity var(--rm-dur-seuil) var(--rm-ease); }
body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-drift img { transform-origin: var(--tv-focus, 50% 53%); transition: transform var(--rm-dur-seuil) var(--rm-ease); }
body.tc-direction-20260928 main :is(.ed-next, .te-next):has(:is(.ed-next-link, .te-next-link):is(:hover, :focus-visible)) .tv-shade { opacity: .74; }
body.tc-direction-20260928 main :is(.ed-next, .te-next):has(:is(.ed-next-link, .te-next-link):is(:hover, :focus-visible)) .tv-drift img { transform: scale(1.04); }

/* 2. Clic sur le lien de fin de page (html[data-tc-raccord="depart"]) : le cadre s'ouvre (+6 %) pendant le chargement ; le fond
   d'image reçoit un nom de View Transition : sa capture poursuit le geste dans le document arrivant. */
html[data-tc-raccord="depart"] body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-shade { opacity: .55; transition-duration: var(--rm-dur-passage); }
html[data-tc-raccord="depart"] body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-drift img { transform: scale(1.06); transition-duration: var(--rm-dur-passage); }
html[data-tc-raccord="depart"] body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-backdrop { view-transition-name: raccords-seuil; }

/* 3. Arrivée par le seuil (html[data-tc-raccord="arrivee"]) : un seul fondu bref — l'ancienne page s'efface (280 ms) sur le voile
   de la matière arrivante pendant que l'image du seuil s'élargit (+8 %) et se dissout (320 ms) ; la nouvelle page apparaît de 80 à
   520 ms ; la brume existante (même calque, même matière) monte en 180 ms et se dissipe jusqu'à 600 ms : titre visible ~300 ms. */
html[data-tc-raccord="arrivee"]::view-transition { background-color: var(--rm-voile); }
html[data-tc-raccord="arrivee"]::view-transition-old(root) { animation: rm-sortie 280ms var(--tc-ease-vif, ease-out) both; mix-blend-mode: normal; }
html[data-tc-raccord="arrivee"]::view-transition-new(root) { animation: rm-entree 440ms var(--rm-ease) 80ms both; mix-blend-mode: normal; }
html[data-tc-raccord="arrivee"]::view-transition-old(raccords-seuil) { animation: rm-seuil 320ms var(--tc-ease-vif, ease-out) both; object-fit: cover; }
html[data-tc-raccord="arrivee"]::view-transition-group(tc-brume) { animation: rm-brume 600ms var(--tc-ease-mineral, ease-out) both; }
/* Capture nommée sans marqueur d'arrivée (cas limite : marqueur périmé ou page inattendue) : elle ne joue pas et reste invisible. */
html:not([data-tc-raccord="arrivee"])::view-transition-old(raccords-seuil), html:not([data-tc-raccord="arrivee"])::view-transition-group(raccords-seuil) { animation: none; visibility: hidden; }
@keyframes rm-sortie { to { opacity: 0; } }
@keyframes rm-entree { from { opacity: 0; } to { opacity: 1; } }
@keyframes rm-seuil { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(1.08); } }
@keyframes rm-brume { 0% { --tc-brume-p: 0%; opacity: 0; translate: 0 0; } 8% { opacity: 1; } 30% { --tc-brume-p: 165%; opacity: 1; translate: 0 0; } 100% { --tc-brume-p: 165%; opacity: 0; translate: 0 -7%; } }

/* 3b. FG-01 (relecture Codex 23:57) : curseur-intelligent.css:67 masque le h1 de l'ouverture tant que lettres.mjs n'a pas ses
   polices (body:not(.tc-lettres-pret) .tc-scene h1 { opacity:0 !important }) et lettres.mjs attend les polices (≤ 1,8 s) avant
   de lire data-tc-lettres : à polices lentes, le titre restait masqué malgré « fait ». Exemption UNIQUEMENT à l'arrivée par le
   seuil (spécificité (0,3,3) > (0,2,2), même !important) : titre lisible dès le premier rendu, police de repli acceptable.
   Rien ne change pour direct / menu / langue. */
html[data-tc-raccord="arrivee"] body:not(.tc-lettres-pret) .tc-scene h1 { opacity: 1 !important; }

/* 4. Gardes réelles. Pause ciné (body[data-tc-cine-paused="true"], y compris scène en pause, dialogue, météo) : seuil immobile,
   aucun nom de capture, aucune animation de passage ; posée pendant la transition, elle retire les animations en cours. */
body[data-tc-cine-paused="true"] main :is(.ed-next, .te-next) .tv-shade { transition: none !important; opacity: 1 !important; }
body[data-tc-cine-paused="true"] main :is(.ed-next, .te-next) .tv-drift img { transition: none !important; transform: none !important; }
body[data-tc-cine-paused="true"] main :is(.ed-next, .te-next) .tv-backdrop { view-transition-name: none !important; }
html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition-old(root), html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition-new(root),
html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition-old(raccords-seuil), html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition-group(raccords-seuil),
html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition-group(tc-brume),
html[data-tc-raccord="arrivee"]:has(.tc-scene[data-motion=paused])::view-transition-old(root), html[data-tc-raccord="arrivee"]:has(.tc-scene[data-motion=paused])::view-transition-new(root),
html[data-tc-raccord="arrivee"]:has(.tc-scene[data-motion=paused])::view-transition-old(raccords-seuil), html[data-tc-raccord="arrivee"]:has(.tc-scene[data-motion=paused])::view-transition-group(tc-brume) { animation: none !important; }
html[data-tc-raccord="arrivee"]:has(body[data-tc-cine-paused="true"])::view-transition, html[data-tc-raccord="arrivee"]:has(.tc-scene[data-motion=paused])::view-transition { background-color: transparent; }
/* Mouvement réduit, contraste renforcé, couleurs forcées, impression : idem, sur tous les effets ajoutés. */
@media (prefers-reduced-motion: reduce), (prefers-contrast: more), (forced-colors: active), print {
  body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-shade { transition: none !important; opacity: 1 !important; }
  body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-drift img { transition: none !important; transform: none !important; }
  body.tc-direction-20260928 main :is(.ed-next, .te-next) .tv-backdrop { view-transition-name: none !important; }
  html[data-tc-raccord="arrivee"]::view-transition { background-color: transparent; }
  html[data-tc-raccord="arrivee"]::view-transition-old(root), html[data-tc-raccord="arrivee"]::view-transition-new(root), html[data-tc-raccord="arrivee"]::view-transition-old(raccords-seuil), html[data-tc-raccord="arrivee"]::view-transition-group(raccords-seuil), html[data-tc-raccord="arrivee"]::view-transition-group(tc-brume) { animation: none !important; }
}

/* 5. FG-08 (b) (30/09/2026) : la brume de sortie (.tc-passage-brume, navigation-cinematique.mjs) partage la garde globale : masquée
   dès que la garde est active (sécurité CSS avant/sans JS ; le module la retire aussi). Calque absent = aucune capture « tc-brume ». */
body[data-tc-cine-paused="true"] .tc-passage-brume { animation: none !important; display: none !important; }

/* 6. FG-08 (c) (30/09/2026) : pause locale du paysage. Attribut réel (vignes.mjs:29) : data-vineyard-motion="paused" sur le bloc
   « page suivante » (le paysage lui-même) — mais il vaut aussi « paused » sans choix utilisateur (image pas encore chargée, bloc hors
   écran, garde) ; le choix de l'utilisateur est le bouton .tv-motion[aria-pressed="true"] (vignes.mjs:33 : localPaused, ou scène en
   pause / réduit, déjà couverts par la garde et le média). Sous ce choix : aucun agrandissement ni transition de voile au survol /
   focus / clic, aucun nom de capture ; navigation native (raccords-maison.mjs n'écrit alors ni marqueur ni « depart »). */
body.tc-direction-20260928 main :is(.ed-next, .te-next):has(.tv-motion[aria-pressed="true"]) .tv-shade { transition: none !important; opacity: 1 !important; }
body.tc-direction-20260928 main :is(.ed-next, .te-next):has(.tv-motion[aria-pressed="true"]) .tv-drift img { transition: none !important; transform: none !important; }
body.tc-direction-20260928 main :is(.ed-next, .te-next):has(.tv-motion[aria-pressed="true"]) .tv-backdrop { view-transition-name: none !important; }
