/* ============================================================
   JONAS — feuille de style commune à toutes les pages
   0 Monigue · 1 tokens · 2 base · 3 fond · 4 curseur
   5 intro · 6 header · 7 boutons · 8 hero · 9 structure
   10 à propos · 11 projets · 12 skills · 13 contact
   14 footer · 15 page projet · 16 responsive · 17 motion
   ============================================================ */

/* ============================================================
   0 — MONIGUE, la typo du logo, réservée aux grands titres
   Dépose le fichier dans fonts/. Le navigateur prend le premier
   format qu'il trouve : un seul suffit, woff2 de préférence.
   Les chemins sont relatifs à ce fichier CSS, donc « ../fonts/ ».
   ============================================================ */
@font-face{
  font-family:'Monigue';
  /* ▸ Ces chemins correspondent aux fichiers réellement présents dans
        fonts/. Ils cherchaient auparavant « Monigue.otf » et « Monigue.ttf »,
        qui n'existent pas : la police ne se chargeait donc sur aucune page
        et tous les grands titres tombaient en Archivo de repli.
        L'espace du nom de fichier s'écrit %20 dans une URL.

        Monigue existe maintenant aussi en woff2 (6 Ko au lieu de 10) : c'est
        le format que tout navigateur moderne prend en premier. Chaque page
        le précharge dans son <head>, pour que les titres ne sautent plus
        quand la police arrive. Les deux autres restent en secours.      */
  src:url('../fonts/Monigue.woff2') format('woff2'),
      url('../fonts/Monigue%20DEMO.otf') format('opentype'),
      url('../fonts/Monigue%20DEMO.ttf') format('truetype');
  font-weight:400 900;
  font-style:normal;
  font-display:swap;
}

/* ============================================================
   1 — TOKENS
   ============================================================ */
:root{
  color-scheme:light;

  --paper:#EDEDED;
  --paper-hi:#F9F9F9;
  --plate:#E3E3E3;
  --ink:#000000;
  --ink-2:#5A5A5A;
  --ink-3:#8E8E8E;
  --rule:rgba(0,0,0,.10);
  --hair:rgba(0,0,0,.14);
  --amber:#FFAA00;
  --on-amber:#141414;

  --photo-mask:linear-gradient(to bottom,#000 58%,transparent 97%);

  --gutter:clamp(20px,6vw,90px);
  --display:'Monigue','Archivo','Helvetica Neue',Helvetica,Arial,sans-serif;
  --font:'Archivo','Helvetica Neue',Helvetica,Arial,sans-serif;
  --tracking:-.012em;              /* resserrage des titres en Monigue */
  --ease:cubic-bezier(.22,1,.36,1);
}

/* Transition entre les pages (Chrome, Edge, Safari 18+).
   Ailleurs la navigation se fait normalement, rien ne casse. */
@view-transition{ navigation:auto }

/* ============================================================
   2 — BASE
   ============================================================ */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;overflow-x:clip}
body{
  margin:0;overflow-x:clip;
  background:var(--paper);color:var(--ink);
  font-family:var(--font);
  font-variation-settings:'wdth' 100,'wght' 400;
  font-size:clamp(15px,1.02vw,17px);line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
img,video{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
p{margin:0 0 1.1em;text-wrap:pretty}
h1,h2,h3{margin:0;font-weight:400}
figure{margin:0}
::selection{background:var(--amber);color:var(--on-amber)}
:focus-visible{outline:2px solid var(--amber);outline-offset:4px;border-radius:2px}

/* ============================================================
   3 — FOND : la grille du wireframe + le halo central
   ============================================================ */
.rules{position:fixed;top:0;bottom:0;left:0;width:100%;pointer-events:none;z-index:1}
.rules i{position:absolute;top:0;bottom:0;width:1px;background:var(--rule)}
.rules i:nth-child(1){left:33.3333%}
.rules i:nth-child(2){left:66.6666%}
.glow{position:fixed;inset:0;pointer-events:none;z-index:0;
  background:radial-gradient(58% 46% at 50% 40%, var(--paper-hi) 0%, transparent 72%)}
@media (max-width:760px){
  .rules i:nth-child(1){left:50%}
  .rules i:nth-child(2){display:none}
}

/* ============================================================
   4 — CURSEUR
   ============================================================ */
.cursor{
  position:fixed;top:0;left:0;width:9px;height:9px;border-radius:50%;
  background:var(--ink);pointer-events:none;z-index:999;opacity:0;
  transition:opacity .3s,width .35s var(--ease),height .35s var(--ease),background .35s,border-color .35s;
  will-change:transform;
}
.cursor.on{opacity:1}
.cursor.ring{width:50px;height:50px;background:transparent;border:1px solid var(--ink)}
.cursor.amber{width:54px;height:54px;background:var(--amber);border-color:var(--amber)}
html.fine a,html.fine button{cursor:none}

/* ============================================================
   5 — INTRO VIDÉO (page d'accueil uniquement)
   ============================================================ */
.loader{position:fixed;inset:0;z-index:900;background:var(--paper);display:none;place-items:center}
html.js .loader{display:grid}
html.js.loaded .loader{display:none}
/* intro déjà vue dans cette visite, ou retour d'une autre page du site :
   pas de loader, et tout est visible tout de suite (voir le <head> d'index.html) */
html.sans-intro .loader{display:none}
.intro-video{
  width:min(560px,74vw);height:auto;will-change:transform;
  /* Fond blanc du MP4 : multiply le fond dans le gris de la page.
     Si tu réexportes avec un fond #EDEDED, supprime ces 2 lignes. */
  mix-blend-mode:multiply;
  clip-path:inset(4% 0);
}
.skip{
  position:absolute;right:var(--gutter);bottom:clamp(22px,4vh,44px);
  background:transparent;border:1px solid var(--hair);color:var(--ink-2);
  font-family:var(--font);font-size:14px;padding:.5em 1.2em;
  border-radius:999px;cursor:pointer;transition:color .3s,border-color .3s;
  animation:skip-in .5s .6s both;      /* apparaît une fois l'intro lancée */
}
.skip:hover{color:var(--ink);border-color:var(--ink)}
@keyframes skip-in{from{opacity:0}}

/* ============================================================
   6 — HEADER
   ============================================================ */
.site-head{position:fixed;top:0;left:0;right:0;z-index:100;
  display:flex;align-items:center;justify-content:space-between;
  padding:clamp(16px,2.4vw,32px) var(--gutter)}
.site-head::before{content:'';position:absolute;inset:0;background:var(--paper);opacity:0;
  transition:opacity .45s ease;
  -webkit-mask-image:linear-gradient(to bottom,#000 52%,transparent);
  mask-image:linear-gradient(to bottom,#000 52%,transparent)}
.site-head.stuck::before{opacity:.94}
.site-head>*{position:relative}
.head-logo{width:clamp(78px,7.2vw,110px);display:block}
/* masqué seulement sur l'accueil, le temps de l'intro vidéo */
html.js .page-home .head-logo{opacity:0}
html.static .page-home .head-logo{opacity:1}
html.sans-intro .page-home .head-logo{opacity:1}
.nav{display:flex;align-items:center;gap:clamp(16px,3.4vw,58px)}
.nav a{font-size:clamp(14px,1.05vw,17px);position:relative;padding-bottom:3px}
.nav a:not(.pill)::after{content:'';position:absolute;left:0;bottom:0;height:1px;width:100%;
  background:currentColor;transform:scaleX(0);transform-origin:right;transition:transform .45s var(--ease)}
.nav a:not(.pill):hover::after{transform:scaleX(1);transform-origin:left}

/* ============================================================
   7 — BOUTONS
   ============================================================ */
.pill{display:inline-block;background:var(--amber);color:var(--on-amber);
  border:0;font-family:var(--font);font-size:clamp(14px,1.05vw,17px);
  padding:.62em 1.5em;border-radius:999px;cursor:pointer;
  font-variation-settings:'wght' 500;
  transition:background .3s,color .3s;will-change:transform}
.pill:hover{background:var(--ink);color:var(--paper)}
/* bouton secondaire : un contour, pour une action à côté de la principale */
.pill-ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.pill-ghost:hover{background:var(--ink);color:var(--paper)}
.pill:disabled{opacity:.3;cursor:default;pointer-events:none}
.pill-meta{font-size:.72em;letter-spacing:.06em;opacity:.6;margin-left:.35em;line-height:0}
/* un <button> et un <a> n'héritent pas de la même hauteur de ligne :
   on les aligne là où ils se côtoient */
.contact-row .pill,.doc-actions .pill,.liseuse-barre .pill{line-height:1.2}

/* ============================================================
   8 — HERO
   ============================================================ */
.hero{position:relative;min-height:100svh;overflow:hidden;z-index:2}
.hero-type{position:absolute;top:48%;left:50%;transform:translate(-50%,-50%);
  width:max-content;z-index:3}
.hero-title{width:max-content;
  font-family:var(--display);
  font-size:clamp(46px,9.4vw,150px);
  font-variation-settings:'wdth' 74,'wght' 900;
  line-height:.84;letter-spacing:var(--tracking);white-space:nowrap}
.solid{color:var(--ink)}
.outline{color:transparent;-webkit-text-stroke:max(1px,.0075em) var(--ink)}
@supports not (-webkit-text-stroke:1px #000){.outline{color:var(--ink-3)}}
.hero-sub{margin:.45em 0 0;font-size:clamp(14px,1.25vw,20px)}

.hero-photo{position:absolute;left:51.5%;bottom:0;transform:translateX(-50%);
  height:46%;z-index:4;pointer-events:none}
.hero-photo-in{height:100%}
.hero-photo img{height:100%;width:auto;max-width:none;
  -webkit-mask-image:var(--photo-mask);mask-image:var(--photo-mask)}

.hero-cta{position:absolute;left:50%;bottom:16%;transform:translateX(-50%);z-index:5}
.hero-cta .pill{font-size:clamp(15px,1.15vw,19px);padding:.72em 1.9em}

/* ============================================================
   9 — STRUCTURE PARTAGÉE
   ============================================================ */
.section{position:relative;z-index:2;padding-block:clamp(90px,13vw,170px)}
.wrap{padding-inline:var(--gutter);max-width:1680px;margin-inline:auto}
.bleed{display:grid;grid-template-columns:repeat(3,1fr);width:100%}

.head-2{margin-bottom:clamp(36px,5vw,72px)}
.h2{width:max-content;max-width:100%;
  font-family:var(--display);
  font-size:clamp(40px,7vw,120px);
  font-variation-settings:'wdth' 74,'wght' 900;
  line-height:.85;letter-spacing:var(--tracking);white-space:nowrap}
/* le masque déborde un peu à droite (padding + marge négative) : certaines
   lettres de Monigue, comme le « r » final, dessinent au-delà de leur boîte
   et se faisaient couper. La largeur du titre, elle, ne change pas. */
.mask{display:block;overflow:hidden;padding-bottom:.14em;margin-bottom:-.14em;
  padding-right:.15em;margin-right:-.15em}
html.js .mask>span{display:block;transform:translateY(112%)}
html.static .mask>span{transform:none}
/* titre passé sur deux lignes par le script (téléphone) : un peu plus
   d'interligne pour que les jambages ne touchent pas la ligne suivante */
[data-fit].fit-2{line-height:.92}
.lead{font-size:clamp(19px,2vw,30px);line-height:1.34;letter-spacing:-.012em;
  max-width:26ch;margin-top:.7em;color:var(--ink-2)}

/* les images se révèlent par volet, pas en fondu */
html.js .wipe{clip-path:inset(0 0 100% 0)}
html.static .wipe{clip-path:none}

/* ============================================================
   10 — À PROPOS
   ============================================================ */
.about-grid{display:grid;grid-template-columns:1.3fr .9fr;gap:clamp(34px,6vw,96px);align-items:start}
.about-body p{font-size:clamp(16px,1.35vw,21px);line-height:1.5;color:var(--ink-2);max-width:54ch}
.about-body p:first-child{color:var(--ink)}
.about-body em{font-style:normal;color:var(--ink);font-variation-settings:'wght' 500}
.facts{border-top:1px solid var(--hair);margin:.5em 0 0}
.facts div{display:flex;gap:1.2em;justify-content:space-between;align-items:baseline;
  padding:.85em 0;border-bottom:1px solid var(--hair)}
.facts dt{color:var(--ink-3);flex:0 0 auto}
.facts dd{margin:0;text-align:right}
.facts a{border-bottom:1px solid var(--amber)}

/* ============================================================
   11 — PROJETS (grille de l'accueil)
   ============================================================ */
.filters{display:flex;flex-wrap:wrap;gap:.5em;margin:clamp(24px,3vw,40px) 0 0}
.filters button{font-family:var(--font);font-size:clamp(13px,1vw,16px);
  background:transparent;border:1px solid var(--hair);color:var(--ink-2);
  padding:.5em 1.15em;border-radius:999px;cursor:pointer;
  transition:color .3s,border-color .3s,background .3s}
.filters button:hover{color:var(--ink);border-color:var(--ink)}
.filters button[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--paper)}

.tiles{border-top:1px solid var(--rule);margin-top:clamp(34px,4vw,60px)}
.tile{display:block;border-bottom:1px solid var(--rule);border-right:1px solid var(--rule);
  padding:clamp(20px,2.2vw,34px) clamp(20px,2.2vw,34px) clamp(34px,3.4vw,52px);position:relative}
.tile:nth-child(3n){border-right:0}
.tile.hide{display:none}
html.js .tile{opacity:0}
html.static .tile{opacity:1}
/* au retour d'une page projet, la vignette doit être visible tout de suite :
   c'est elle que la transition entre les pages vient rejoindre */
html.sans-intro .tile{opacity:1}
.plate{position:relative;aspect-ratio:4/5;background:var(--plate);display:grid;place-items:center;overflow:hidden}
.plate img{width:100%;height:100%;object-fit:cover}
.plate svg{width:62%;height:auto;color:var(--ink-2);transition:transform .8s var(--ease),color .5s}
.tile:hover .plate svg{transform:scale(1.05) rotate(-1deg);color:var(--ink)}
.tile-meta{display:flex;justify-content:space-between;align-items:baseline;gap:1em;margin-top:1.1em}
.tile-name{font-size:clamp(17px,1.5vw,24px);font-variation-settings:'wght' 500;letter-spacing:-.012em}
.tile-year{color:var(--ink-3);font-size:.9em}
.tile-kind{display:block;color:var(--ink-2);font-size:.92em;margin-top:.15em}
.tile-note{color:var(--ink-3);font-size:.92em;margin:.55em 0 0;max-width:34ch}
.tile::after{content:'';position:absolute;left:clamp(20px,2.2vw,34px);right:clamp(20px,2.2vw,34px);
  bottom:clamp(16px,1.8vw,26px);height:1px;background:var(--amber);
  transform:scaleX(0);transform-origin:left;transition:transform .6s var(--ease)}
.tile:hover::after{transform:scaleX(1)}

/* ============================================================
   12 — SKILLS
   ============================================================ */
.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(34px,6vw,90px)}
.skills-grid h3{font-size:clamp(17px,1.5vw,23px);font-variation-settings:'wght' 500;
  margin:0 0 .9em;letter-spacing:-.012em}
.rows{border-top:1px solid var(--hair);margin:0}
.rows div{display:flex;justify-content:space-between;gap:1.5em;align-items:baseline;
  padding:.9em 0;border-bottom:1px solid var(--hair);transition:padding-left .45s var(--ease)}
.rows div:hover{padding-left:.7em}
.rows dt{font-variation-settings:'wght' 500;flex:0 0 auto}
.rows dd{margin:0;color:var(--ink-3);text-align:right;font-size:.94em;transition:color .3s}
.rows div:hover dd{color:var(--ink-2)}

/* ============================================================
   13 — CONTACT
   ============================================================ */
.mail{display:inline-block;position:relative;
  font-size:clamp(26px,5vw,84px);
  font-variation-settings:'wdth' 82,'wght' 700;
  letter-spacing:-.03em;line-height:1;margin:.15em 0 .6em;
  word-break:break-word;will-change:transform}
.mail::after{content:'';position:absolute;left:0;bottom:.02em;width:100%;height:.045em;
  background:var(--amber);transform:scaleX(0);transform-origin:right;transition:transform .55s var(--ease)}
.mail:hover::after{transform:scaleX(1);transform-origin:left}
.contact-row{display:flex;flex-wrap:wrap;gap:.9em 1.6em;align-items:center}
.socials{display:flex;gap:1.4em;flex-wrap:wrap}
.socials a{color:var(--ink-2);padding-bottom:2px;border-bottom:1px solid transparent;transition:color .3s,border-color .3s}
.socials a:hover{color:var(--ink);border-color:var(--ink)}
.copy-note{color:var(--ink-3);font-size:.92em;opacity:0;transition:opacity .3s}
.copy-note.on{opacity:1}

/* ============================================================
   14 — FOOTER
   ============================================================ */
.site-foot{position:relative;z-index:2;border-top:1px solid var(--rule);
  padding:clamp(26px,3vw,40px) var(--gutter);
  display:flex;flex-wrap:wrap;gap:1.2em 2em;align-items:center;justify-content:space-between;
  color:var(--ink-3);font-size:.92em}
.foot-logo{width:74px;display:block}
.site-foot a:hover{color:var(--ink)}

/* ============================================================
   15 — PAGE PROJET
   ============================================================ */
.project{position:relative;z-index:2;padding-top:clamp(120px,17vh,210px)}
.back{display:inline-block;color:var(--ink-2);margin-bottom:clamp(18px,3vw,36px);transition:color .3s}
.back:hover{color:var(--ink)}
.project-title{width:max-content;max-width:100%;
  font-family:var(--display);
  font-size:clamp(42px,8vw,130px);
  font-variation-settings:'wdth' 74,'wght' 900;
  line-height:.85;letter-spacing:var(--tracking);white-space:nowrap}

.cover{margin-top:clamp(40px,6vw,86px);background:var(--plate);
  aspect-ratio:16/9;display:grid;place-items:center;overflow:hidden}
.cover img{width:100%;height:100%;object-fit:cover}
.cover svg{width:32%;height:auto;color:var(--ink-2)}

.project-grid{display:grid;grid-template-columns:1.25fr .85fr;
  gap:clamp(34px,6vw,96px);align-items:start;margin-top:clamp(46px,6vw,90px)}
.project-body p{font-size:clamp(16px,1.35vw,21px);line-height:1.5;color:var(--ink-2);max-width:54ch}
.project-body p:first-child{color:var(--ink)}
.block-title{font-size:clamp(17px,1.5vw,23px);font-variation-settings:'wght' 500;
  margin:0 0 .3em;letter-spacing:-.012em}
.block{margin-top:clamp(62px,8vw,120px)}
.block-note{color:var(--ink-3);max-width:46ch;margin:0}

/* fiche technique */
.specs{border-top:1px solid var(--hair);margin:0}
.specs div{display:flex;gap:1.2em;justify-content:space-between;align-items:baseline;
  padding:.85em 0;border-bottom:1px solid var(--hair)}
.specs dt{color:var(--ink-3);flex:0 0 auto}
.specs dd{margin:0;text-align:right}

/* avant / après */
.compare{position:relative;--pos:50%;background:var(--plate);
  aspect-ratio:16/10;overflow:hidden;margin-top:clamp(20px,2.6vw,36px)}
.compare-a,.compare-b{position:absolute;inset:0;display:grid;place-items:center}
.compare-a img,.compare-b img{width:100%;height:100%;object-fit:cover}
.compare-a svg,.compare-b svg{width:40%;height:auto}
.compare-a{color:var(--ink-3)}
.compare-b{color:var(--ink);background:var(--paper-hi);clip-path:inset(0 0 0 var(--pos))}
.compare-range{position:absolute;inset:0;width:100%;height:100%;margin:0;
  opacity:0;cursor:ew-resize;-webkit-appearance:none;appearance:none;background:none;z-index:3}
.compare-range:focus-visible ~ .compare-bar::after{box-shadow:0 0 0 3px var(--ink)}
.compare-bar{position:absolute;top:0;bottom:0;left:var(--pos);width:2px;
  background:var(--ink);pointer-events:none;z-index:2}
.compare-bar::after{content:'';position:absolute;top:50%;left:50%;width:46px;height:46px;
  transform:translate(-50%,-50%);border-radius:50%;background:var(--amber)}
.compare-tags{display:flex;justify-content:space-between;color:var(--ink-3);
  font-size:.92em;margin-top:.7em}

.film{margin-top:clamp(20px,2.6vw,36px);background:var(--plate);
  aspect-ratio:16/9;overflow:hidden;display:grid;place-items:center}
.film video{width:100%;height:100%;object-fit:cover;background:var(--plate)}
.film svg{width:26%;height:auto;color:var(--ink-3)}

/* processus : une vraie séquence, la numérotation est justifiée */
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(14px,1.6vw,26px);
  margin:clamp(24px,3.2vw,44px) 0 0;list-style:none;padding:0}
.steps li{margin:0}
.step-plate{position:relative;aspect-ratio:1/1;background:var(--plate);
  display:grid;place-items:center;overflow:hidden}
.step-plate img{width:100%;height:100%;object-fit:cover}
.step-plate svg{width:52%;height:auto;color:var(--ink-3)}
.step-n{position:absolute;top:10px;left:12px;color:var(--ink-3);font-size:.85em;z-index:2}
.step-name{display:block;margin-top:.7em;font-variation-settings:'wght' 500}
.step-note{display:block;color:var(--ink-3);font-size:.9em;margin-top:.2em}

/* galerie */
.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,1.6vw,26px);
  margin-top:clamp(24px,3.2vw,44px)}
.gallery .plate{aspect-ratio:3/4}
.gallery figcaption{color:var(--ink-3);font-size:.9em;margin-top:.6em}
/* variante large : 2 colonnes, images en paysage */
.gallery.two{grid-template-columns:repeat(2,1fr)}
.gallery.two .plate{aspect-ratio:3/2}

/* variante rendus : 3 colonnes en paysage, pensée pour une série longue.
   Le nombre d'images n'a pas d'importance, la grille se remplit seule. */
.gallery.rendus{grid-template-columns:repeat(3,1fr)}
.gallery.rendus .plate{aspect-ratio:3/2}

/* ------------------------------------------------------------
   Zoom sur place : un clic et le rendu s'étale sur toute la
   largeur de la page, sans quitter la grille ni ouvrir de
   fenêtre. Un second clic, ou Échap, le remet à sa taille.
   Le cadre cliquable est un vrai <button> : on hérite du
   clavier, du focus et du tactile sans avoir à les écrire.
   ------------------------------------------------------------ */
.gallery button.plate{border:0;padding:0;width:100%;font:inherit;color:inherit;
  text-align:inherit;cursor:zoom-in}
.gallery button.plate:disabled{cursor:default}       /* case encore vide */
.gallery button.plate:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
.gallery button.plate img{transition:transform .7s var(--ease)}
.gallery button.plate:hover img{transform:scale(1.03)}

/* Une image qu'il ne faut pas recadrer — un à-plat, un logo, une palette
   dont les codes se liraient de travers si le cadre les rognait. Le cadre
   prend alors les proportions de l'image, que le script a relevées. */
.gallery figure.entier .plate{aspect-ratio:var(--zoom-ratio,3/2)}
.gallery figure.entier .plate img{object-fit:contain}

.gallery figure.is-zoomed{grid-column:1/-1}
/* --zoom-ratio et --zoom-ar sont posés par le script d'après les
   dimensions réelles de l'image. Le cadre épouse donc ses proportions :
   aucune bande, aucun recadrage. La largeur est en même temps bridée
   pour que le cadre ne dépasse jamais 86 % de la hauteur d'écran,
   même avec un format très haut. */
.gallery figure.is-zoomed .plate{aspect-ratio:var(--zoom-ratio,16/9);cursor:zoom-out;
  width:min(100%, calc(86vh * var(--zoom-ar,1.78)));
  width:min(100%, calc(86svh * var(--zoom-ar,1.78)));
  margin-inline:auto}
.gallery figure.is-zoomed .plate img{position:absolute;inset:0;
  width:100%;height:100%;object-fit:contain}   /* l'image entière, sans recadrage */
.gallery figure.is-zoomed figcaption{text-align:center}
.gallery figure.is-zoomed .plate:hover img{transform:none}
.gallery figure.is-zoomed figcaption{color:var(--ink-2)}
html.js .gallery figure.is-zoomed .plate img{animation:zoom-open .5s var(--ease) both}
@keyframes zoom-open{from{opacity:.3;transform:scale(.97)}to{opacity:1;transform:none}}

/* vidéo du projet */
.video-frame{position:relative;background:var(--plate);aspect-ratio:16/9;
  overflow:hidden;display:grid;place-items:center;margin-top:clamp(20px,2.6vw,36px)}
.video-frame video,.video-frame iframe{width:100%;height:100%;border:0;object-fit:cover;display:block}
.video-frame svg{width:20%;height:auto;color:var(--ink-3)}

/* L'image d'attente de la vidéo. Le lecteur YouTube n'est inséré
   qu'au clic : la page ne charge ni son script ni ses cookies tant
   que le visiteur n'a rien demandé. C'est un vrai lien, donc sans
   JavaScript il ouvre YouTube au lieu de ne rien faire. */
.video-play{position:absolute;inset:0;display:block;overflow:hidden;cursor:pointer}
.video-play img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .9s var(--ease)}
.video-play::after{content:'';position:absolute;inset:0;z-index:1;
  background:rgba(0,0,0,.16);transition:background .45s}
.video-play:hover img{transform:scale(1.03)}
.video-play:hover::after{background:rgba(0,0,0,.04)}
/* identifiant pas encore rempli : pas de miniature, un cadre gris propre */
.video-play.sans-image img{display:none}
.video-play.sans-image::after{background:none}
.video-play.sans-image .video-play-label{background:none;color:var(--ink-2)}
.video-play:focus-visible{outline:2px solid var(--ink);outline-offset:3px}

.video-play-btn{position:absolute;top:50%;left:50%;z-index:2;
  transform:translate(-50%,-50%);border-radius:50%;
  width:clamp(62px,6.5vw,92px);height:clamp(62px,6.5vw,92px);
  background:var(--amber);color:var(--on-amber);display:grid;place-items:center;
  transition:transform .5s var(--ease)}
.video-play:hover .video-play-btn{transform:translate(-50%,-50%) scale(1.09)}
.video-play-btn svg{width:36%;height:auto;color:inherit;margin-left:6%}  /* le triangle paraît centré */

.video-play-label{position:absolute;left:0;right:0;bottom:0;z-index:2;color:#fff;
  padding:clamp(34px,5vw,60px) clamp(14px,2vw,26px) clamp(12px,1.6vw,22px);
  font-variation-settings:'wght' 500;
  background:linear-gradient(to top,rgba(0,0,0,.6),transparent)}

/* projet suivant */
.next-project{display:block;border-top:1px solid var(--rule);
  margin-top:clamp(70px,10vw,140px);padding:clamp(34px,5vw,70px) 0 clamp(50px,7vw,100px)}
.next-label{color:var(--ink-3)}
.next-name{display:block;width:max-content;max-width:100%;margin-top:.15em;
  font-family:var(--display);
  font-size:clamp(34px,6.4vw,104px);
  font-variation-settings:'wdth' 74,'wght' 900;
  line-height:.9;letter-spacing:var(--tracking);white-space:nowrap;
  transition:color .4s}
.next-project:hover .next-name{color:var(--amber)}


/* boutons du mémoire, sur la page du projet */
.doc-actions{display:flex;flex-wrap:wrap;gap:.8em 1em;margin-top:clamp(20px,2.6vw,36px)}

/* ============================================================
   LISEUSE DU MÉMOIRE (tfe.html)
   ============================================================ */
.liseuse-scene{position:relative;margin-top:clamp(28px,4vw,56px);
  height:min(80vh,920px);height:min(80svh,920px);
  display:grid;place-items:center;outline:none;
  background:var(--plate);border-radius:2px}
.liseuse-scene:focus-visible{box-shadow:0 0 0 2px var(--ink)}
.liseuse-pages{display:flex;justify-content:center;align-items:center;gap:0;
  opacity:0;transform:translateY(6px);transition:opacity .35s var(--ease),transform .45s var(--ease)}
.liseuse-pages.visible{opacity:1;transform:none}
.liseuse-pages canvas{display:block;background:#fff;
  box-shadow:0 1px 2px rgba(0,0,0,.08),0 12px 40px -14px rgba(0,0,0,.35)}
/* la reliure : une ombre douce au milieu de la double page */
.liseuse-pages.double canvas:first-child{box-shadow:inset -18px 0 22px -18px rgba(0,0,0,.28),0 12px 40px -14px rgba(0,0,0,.35)}
.liseuse-pages.double canvas:last-child{box-shadow:inset 18px 0 22px -18px rgba(0,0,0,.28),0 12px 40px -14px rgba(0,0,0,.35)}
.liseuse-zone{position:absolute;top:0;bottom:0;width:50%;border:0;padding:0;
  background:transparent;z-index:2}
.liseuse-zone.gauche{left:0;cursor:w-resize}
.liseuse-zone.droite{right:0;cursor:e-resize}
.liseuse-scene.vide .liseuse-zone{display:none}
.liseuse-etat{position:absolute;inset:auto 0 auto 0;text-align:center;color:var(--ink-2);
  padding:0 var(--gutter);margin:0;z-index:3}
.liseuse-barre{display:flex;justify-content:center;align-items:center;
  gap:clamp(12px,2vw,28px);margin-top:clamp(16px,2vw,24px)}
.liseuse-compteur{min-width:7ch;text-align:center;font-variant-numeric:tabular-nums;color:var(--ink-2)}
.liseuse-dl{text-align:center;margin-top:1em;font-size:.92em}
.liseuse-dl a{color:var(--ink-2);text-decoration:underline;text-underline-offset:.2em}
.liseuse-dl a:hover{color:var(--ink)}
@media (max-width:700px){
  .liseuse-scene{height:min(72vh,640px);height:min(72svh,640px)}
  .liseuse-mot{display:none}
}

/* ============================================================
   16 — RESPONSIVE
   ============================================================ */
@media (max-width:1000px){
  .about-grid,.project-grid{grid-template-columns:1fr}
  .bleed{grid-template-columns:repeat(2,1fr)}
  .tile:nth-child(3n){border-right:1px solid var(--rule)}
  .tile:nth-child(2n){border-right:0}
  .steps{grid-template-columns:repeat(2,1fr)}
  .gallery.rendus{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:700px){
  .bleed{grid-template-columns:1fr}
  .tile,.tile:nth-child(3n),.tile:nth-child(2n){border-right:0}
  .skills-grid{grid-template-columns:1fr}
  .gallery,.gallery.two,.gallery.rendus{grid-template-columns:1fr}
  .hero-type{top:40%}
  .hero-photo{height:38%;left:50%}
  .hero-cta{bottom:12%}
  .lead{max-width:none}
  .cover{aspect-ratio:4/3}
}
@media (max-width:420px){
  .nav{gap:14px}
  .nav a:not(.pill){font-size:13px}
  .pill{padding:.55em 1.1em}
  .steps{grid-template-columns:1fr}
}

/* ============================================================
   17 — MOTION RÉDUIT
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  html.js .mask>span{transform:none}
  html.js .wipe{clip-path:none}
  html.js .head-logo,html.js .tile{opacity:1}
  .cursor{display:none}
  @view-transition{ navigation:none }
  *{animation-duration:.001ms!important;transition-duration:.001ms!important}
}
