/* ═══════════════════════════════════════════════════════════════════════
   ABC DIGITAL TOUCH — Homepage · feuille d'intégration WordPress
   Généré par scripts/build-export.py — ne pas éditer à la main.

   TOUT est scopé sous .abchome : aucune règle ne touche body, html, a,
   button, img ni les titres globaux. Le header et le footer Elementor,
   Axeptio et HubSpot ne sont pas affectés.

   Chemin des médias : les images et vidéos sont référencées en ../../../../uploads/abc-home/…
   dans home-content.html. Pour les servir depuis la médiathèque
   WordPress, remplacez « ../../../../uploads/abc-home/ » par votre URL de base — par exemple
   https://abcdigitaltouch.fr/wp-content/uploads/abc-home/
   ═══════════════════════════════════════════════════════════════════════ */

/* Réinitialisation locale — strictement limitée au bloc de la homepage.

   Le prototype pose sa typographie et ses couleurs de base sur html/body.
   Ces deux sélecteurs sont écartés de l'export pour ne pas contaminer
   WordPress : leurs déclarations sont donc reportées ici, sur .abchome.
   Sans cela, tout élément sans couleur explicite — le H1 en premier —
   hérite de la couleur de texte du thème. */
.abchome, .abchome *, .abchome *::before, .abchome *::after { box-sizing: border-box; }
.abchome {
  margin: 0;
  color: var(--text);
  background: var(--ink);
  font-family: var(--ff-b);
  font-size: 17px;
  line-height: 1.62;
  overflow-x: clip;
  -webkit-font-smoothing: antialiased;
}
/* Le thème peut cibler les titres directement : l'héritage perdrait alors
   contre sa règle. On force la reprise, sans écraser les couleurs propres
   au design, qui sont toutes portées par des sélecteurs de classe. */
/* Un thème cible souvent les types d'éléments directement (h2 {...},
   li {...}) : l'héritage perd alors contre sa règle, et une propriété que
   le design laisse hériter — l'interligne au premier chef — est silencieuse-
   ment remplacée. On rétablit la chaîne pour les propriétés typographiques
   héritables, sur les types les plus souvent visés. Toutes les valeurs
   voulues par le design passent par des classes, donc plus spécifiques. */
.abchome h1, .abchome h2, .abchome h3, .abchome h4, .abchome h5, .abchome h6,
.abchome p, .abchome li, .abchome ul, .abchome ol, .abchome dl,
.abchome dt, .abchome dd, .abchome blockquote, .abchome figure,
.abchome figcaption, .abchome span, .abchome a, .abchome em, .abchome strong,
.abchome b, .abchome i, .abchome small, .abchome time, .abchome label,
.abchome th, .abchome td {
  color: inherit;
  font-family: inherit;
  line-height: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
}
/* Valeurs par défaut du navigateur que l'héritage ne restitue pas. */
.abchome h1, .abchome h2, .abchome h3, .abchome h4, .abchome h5, .abchome h6,
.abchome strong, .abchome b, .abchome th { font-weight: bold; }
.abchome em, .abchome i { font-style: italic; }
/* Les contrôles de formulaire n'héritent pas de la police par défaut.
   On reprend les propriétés une à une plutôt que le raccourci « font »,
   qui embarque aussi l'interligne et rendrait les boutons plus hauts que
   dans la maquette — le navigateur leur donne « normal ». */
.abchome button, .abchome input, .abchome select, .abchome textarea {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  font-style: inherit;
  line-height: normal;
  color: inherit;
  letter-spacing: inherit;
}
/* Marges de flux reprises du navigateur. Un thème qui redéfinit celles des
   titres ou des paragraphes déplacerait la composition validée ; ces règles
   la rétablissent. Toutes les marges voulues par le design passent par des
   sélecteurs de classe, donc plus spécifiques : elles gardent la main. */
.abchome h1 { margin: .67em 0; }
.abchome h2 { margin: .83em 0; }
.abchome h3 { margin: 1em 0; }
.abchome h4 { margin: 1.33em 0; }
.abchome h5 { margin: 1.67em 0; }
.abchome h6 { margin: 2.33em 0; }
.abchome p { margin: 1em 0; }
.abchome ul, .abchome ol { margin: 1em 0; padding-inline-start: 40px; }
.abchome blockquote, .abchome figure { margin: 1em 40px; }
.abchome dl { margin: 1em 0; }
.abchome img, .abchome video { display: block; max-width: 100%; }
.abchome a { color: inherit; }
.abchome ::selection { background: #1A6FFF; color: #06060A; }
.abchome :focus-visible { outline: 2px solid #4A8CFF; outline-offset: 4px; border-radius: 2px; }

/* ── Curseur personnalisé — les SEULES règles hors .abchome ─────────────
   La couche suit le pointeur sur toute la fenêtre : elle ne peut donc pas
   vivre à l'intérieur du bloc. Les deux règles ne s'appliquent que si le
   script a réellement démarré le canvas — la classe .has-tube est posée
   sur <body> à ce moment-là, jamais au chargement. Si vous ne voulez pas
   du curseur personnalisé, supprimez ce bloc : rien d'autre n'en dépend. */
.abc-cursor { position: fixed; inset: 0; z-index: 9998; pointer-events: none;
  opacity: 0; transition: opacity .35s cubic-bezier(.22,.61,.36,1); contain: strict; }
.abc-cursor.is-on { opacity: 1; }
body.has-tube,
body.has-tube a, body.has-tube button, body.has-tube summary,
body.has-tube input, body.has-tube textarea, body.has-tube select,
body.has-tube label, body.has-tube [role="button"] { cursor: none; }

/* ═══════════════════════════════════════════════════════════════════════
   ABC DIGITAL TOUCH — Homepage V1
   Direction A — Le Montage.

   Deux régimes :
   · par défaut   → tout est visible, le hero fait un écran. C'est ce que
                    voient les visiteurs sans JS et sous reduced-motion.
   · .js-motion   → hero en sticky sur 3 plans, révélations au scroll.

   Le bleu est rare : accents de CTA uniquement. Tout le reste est
   noir, blanc et image.
   ═══════════════════════════════════════════════════════════════════════ */

.abchome{
  --ink:#06060A;
  --ink-2:#0B0B11;
  --ink-3:#13131E;           /* fonds de survol — défini ici, jamais hérité */
  --text:#E8E8F0;
  --text-2:#B8B8C4;
  --text-3:#9A9AB4;          /* plancher texte — 7,37:1 sur --ink */
  --line:rgba(232,232,240,.12);
  --line-2:rgba(232,232,240,.26);
  --blue:#1A6FFF;
  --blue-lift:#4A8CFF;
  --on-blue:#06060A;

  --ff-d:'Syne',system-ui,sans-serif;
  --ff-b:'DM Sans',system-ui,sans-serif;

  --e:cubic-bezier(.16,1,.3,1);
  --nav-h:76px;
  --gut:1.5rem;
  --maxw:1360px;
  --hero-scroll:2600px;
}
@media(min-width:768px){ .abchome{ --gut:2.5rem } }
@media(min-width:1200px){ .abchome{ --gut:4rem } }

.abchome *, .abchome *::before, .abchome *::after{box-sizing:border-box}

@media(prefers-reduced-motion:reduce){}



.abchome a{color:inherit}



.abchome .wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--gut)}




/* ── Typographie commune ───────────────────────────────────────── */
.abchome .eyebrow{
  margin:0 0 1.5rem;font-size:.7rem;font-weight:500;letter-spacing:.22em;
  text-transform:uppercase;color:var(--text-3)
}
.abchome .h2{
  margin:0;font-family:var(--ff-d);font-weight:700;
  font-size:clamp(1.9rem,4.6vw,3.2rem);line-height:1.04;letter-spacing:-.032em;
  text-wrap:balance;max-width:17ch
}
.abchome .h2--lg{font-size:clamp(2.1rem,5.4vw,4rem);max-width:20ch}
.abchome .h2--xl{font-size:clamp(2.3rem,6.6vw,5rem);max-width:14ch;font-weight:800}
.abchome .lede{margin:1.6rem 0 0;max-width:56ch;color:var(--text-3);font-size:1.02rem}

/* Lien typographique — remplace les boutons pleins partout sauf le skip. */
.abchome .tlink{
  display:inline-flex;align-items:center;gap:.6rem;
  background:none;border:0;padding:.35rem 0;cursor:pointer;
  font-family:var(--ff-b);font-size:1rem;font-weight:500;color:var(--text);
  text-decoration:none;letter-spacing:.005em;
  border-bottom:1px solid var(--line-2);
  transition:color .25s var(--e),border-color .25s var(--e)
}
.abchome .tlink::after{content:'→';transition:transform .3s var(--e)}
.abchome .tlink:hover{color:var(--blue-lift);border-bottom-color:var(--blue)}
.abchome .tlink:hover::after{transform:translateX(5px)}
.abchome .tlink--lg{font-family:var(--ff-d);font-weight:600;font-size:clamp(1.05rem,2.2vw,1.35rem);letter-spacing:-.01em}

/* ── Navigation ────────────────────────────────────────────────── */







@media(min-width:860px){}
/* Sous 500 px, logo et CTA se partagent la barre sans se replier. */
@media(max-width:499.98px){
  
  
  
}

/* ═══════════════════════════════════════════════════════════════
   01 · HERO
   ═══════════════════════════════════════════════════════════════ */
.abchome .hero{position:relative;background:var(--ink)}
.abchome .hero__stage{
  position:relative;min-height:100svh;overflow:hidden;
  display:flex;align-items:flex-end;padding-top:var(--nav-h)
}
.abchome .hero__media{position:absolute;inset:0;z-index:0}

.abchome .plan{position:absolute;inset:0;opacity:0}
.abchome .plan.is-on{opacity:1}
.abchome .plan__poster, .abchome .plan__video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover
}
.abchome .plan__video{opacity:0;transition:opacity .8s var(--e)}
.abchome .plan__video.is-ready{opacity:1}

/* Grain — technique reprise de Card with Noise Pattern (@Ali-Hussein-dev) :
   une turbulence SVG tuilée, posée en data-URI, sans requête réseau ni
   WebGL. C'est ce qui donne au noir sa matière plutôt qu'une couleur.
   Le même motif sert au hero et aux quatre zones retravaillées. */
.abchome .tex{
  position:absolute;inset:0;pointer-events:none;z-index:0;
  opacity:.05;mix-blend-mode:overlay;background-size:200px 200px;
  -webkit-mask-image:linear-gradient(to bottom,transparent 0%,#000 14%,#000 84%,transparent 100%);
  mask-image:linear-gradient(to bottom,transparent 0%,#000 14%,#000 84%,transparent 100%);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E")
}

.abchome .hero__grain{
  position:absolute;inset:0;pointer-events:none;z-index:6;opacity:.06;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E")
}
.abchome .hero__veil{
  position:absolute;inset:0;pointer-events:none;
  background:
    linear-gradient(to top,rgba(6,6,10,.96) 0%,rgba(6,6,10,.86) 30%,rgba(6,6,10,.5) 58%,rgba(6,6,10,.3) 80%,rgba(6,6,10,.5) 100%),
    radial-gradient(120% 100% at 40% 46%,transparent 32%,rgba(6,6,10,.55) 100%)
}
/* Le voile de sortie n'est pas un aplat : c'est un dégradé latéral. À
   gauche, sous la phrase et les deux liens, il est presque opaque et le
   texte reste parfaitement lisible ; à droite, une bande d'environ 40 %
   laisse passer la matière du plan qui continue de tourner. La composition
   reste celle du hero — aucun second hero, aucun média supplémentaire. */
.abchome .hero__veil{z-index:2}
.abchome .plan{z-index:0}
.abchome .hero__black{
  position:absolute;inset:0;z-index:2;opacity:0;pointer-events:none;
  background:linear-gradient(to left,
    rgba(6,6,10,.80) 0%,
    rgba(6,6,10,.90) 38%,
    rgba(6,6,10,.965) 62%,
    rgba(6,6,10,.985) 100%)
}
/* Sous 900 px la colonne de texte occupe toute la largeur : le voile
   redevient uniforme, la lisibilité prime sur l'effet. */
@media(max-width:899.98px){
  .abchome .hero__black{background:rgba(6,6,10,.96)}
}

/* Fenêtre du dernier temps. Elle est posée au-dessus du voile et du fondu
   noir : c'est la seule position où la matière reste réellement visible,
   le voile atteignant 96 % d'opacité juste sous la phrase. Elle n'existe
   que sur ce temps — les trois premiers plans du hero ne changent pas.
   .hero__media portant déjà un z-index, la fenêtre ne peut jamais passer
   devant la colonne de texte. */
.abchome .hero__win{
  position:absolute;inset:0 0 0 auto;width:46%;z-index:4;pointer-events:none;
  opacity:0;transition:opacity 1.1s var(--e);
  -webkit-mask-image:linear-gradient(to left,#000 26%,rgba(0,0,0,.55) 68%,transparent 100%);
  mask-image:linear-gradient(to left,#000 26%,rgba(0,0,0,.55) 68%,transparent 100%)
}
.abchome .hero__win video{
  width:100%;height:100%;object-fit:cover;display:block;
  filter:grayscale(1) contrast(1.06) brightness(.98)
}
.abchome.abc-motion .hero.is-out .hero__win{opacity:.38}
@media(max-width:899.98px){
  /* Mobile : la fenêtre passe derrière toute la largeur, plus discrète,
     et reste sur le poster — aucune vidéo n'est chargée. */
  .abchome .hero__win{
    width:100%;
    -webkit-mask-image:linear-gradient(to bottom,#000 0%,rgba(0,0,0,.5) 52%,transparent 88%);
    mask-image:linear-gradient(to bottom,#000 0%,rgba(0,0,0,.5) 52%,transparent 88%)
  }
  /* Le haut du plan 03 est très lumineux : sur mobile le cadrage descend
     vers une zone médiane, sinon la barre de navigation devient illisible
     avant que le fond du header ne se solidifie. */
  .abchome .hero__win video{object-position:50% 58%}
  .abchome.abc-motion .hero.is-out .hero__win{opacity:.28}
}

.abchome .hero__copy{
  position:relative;z-index:2;width:100%;max-width:var(--maxw);margin:0 auto;
  padding:0 var(--gut) clamp(3rem,9vh,6rem)
}
.abchome .beat{display:flex;flex-direction:column;gap:1.1rem;align-items:flex-start}
.abchome .hero__kicker{
  margin:0;display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;
  font-size:.68rem;font-weight:500;letter-spacing:.24em;text-transform:uppercase;color:var(--text-2)
}
.abchome .hero__kicker i{width:22px;height:1px;background:var(--line-2);display:block}
.abchome .hero__h1{
  margin:0;font-family:var(--ff-d);font-weight:800;
  font-size:clamp(1.85rem,6.2vw,5.1rem);line-height:.98;letter-spacing:-.038em;
  text-wrap:balance;max-width:15ch
}
/* Le plancher du clamp est calibré sur « durablement », le mot le plus
   long du titre : 10,02 × la taille de police. Sous 360 px, la largeur
   utile ne suffit plus et le titre repasse en valeur relative. */
@media(max-width:359.98px){.abchome .hero__h1{font-size:8.2vw}}
/* Sous 480 px, la ligne de contexte s'empile au lieu de laisser un
   filet orphelin en fin de ligne. */
@media(max-width:479.98px){
  .abchome .hero__kicker{flex-direction:column;align-items:flex-start;gap:.3rem}
  .abchome .hero__kicker i{display:none}
}
/* Le mot occupe 90 à 95 % de la largeur utile et déborde à peine —
   la tension reste lisible comme un parti pris, jamais comme une coupe.
   Le coefficient vw est calibré sur ACQUISITION, le plus long des deux. */
.abchome .hero__word{
  margin:0 0 0 -.04em;font-family:var(--ff-d);font-weight:800;text-transform:uppercase;
  font-size:clamp(1.9rem,8.4vw,7.5rem);line-height:.84;letter-spacing:-.045em;
  white-space:nowrap
}
.abchome .hero__note{margin:0;max-width:38ch;color:var(--text-2);font-size:clamp(.95rem,1.6vw,1.1rem)}
/* Contexte du H1 : qui parle, de quoi il s'agit, pour qui. Il reste sous
   le titre en permanence — ce n'est pas un temps de la séquence. */
.abchome .hero__lead{
  margin:clamp(1rem,2.4vh,1.6rem) 0 0;max-width:56ch;
  color:var(--text-3);font-size:clamp(.9rem,1.35vw,1rem);line-height:1.6
}
.abchome .hero__out{
  margin:0;font-family:var(--ff-d);font-weight:800;
  font-size:clamp(1.75rem,6vw,4.6rem);line-height:1;letter-spacing:-.036em;
  text-wrap:balance;max-width:16ch
}
/* Deux CTA de nature différente : l'un commercial, l'autre exploratoire.
   Ils ne partagent ni le même corps ni la même couleur, et surtout pas
   la même capsule. La respiration entre eux est explicite. */
.abchome .hero__acts{
  margin:clamp(1.75rem,4vh,2.75rem) 0 0;
  display:flex;flex-wrap:wrap;align-items:center;
  gap:clamp(1.5rem,3vw,3rem)
}
/* Lien secondaire : plus petit, sans filet, il ne concurrence jamais
   le lien principal. Signalé par la flèche et le contraste seuls. */
.abchome .tlink--min{
  border-bottom:0;padding:0;font-size:.92rem;color:var(--text-3);letter-spacing:.01em
}
.abchome .tlink--min::after{font-size:.9em}
.abchome .tlink--min:hover{color:var(--text)}

.abchome .hero__cue{
  position:absolute;right:var(--gut);bottom:clamp(3rem,9vh,6rem);z-index:2;margin:0;
  font-size:.68rem;letter-spacing:.24em;text-transform:uppercase;color:var(--text-3)
}
.abchome .hero__rail{display:none}

/* Sans JS : les quatre temps s'empilent, tout est lisible. */
.abchome .hero__copy .beat + .beat{margin-top:2.5rem}
.abchome.abc-js .plan__poster{opacity:1}

/* ── Régime animé ─────────────────────────────────────────────── */
.abchome.abc-motion .hero{height:calc(100svh + var(--hero-scroll))}
.abchome.abc-motion .hero__stage{position:sticky;top:0;height:100svh;min-height:0}
.abchome.abc-motion .hero__copy{display:grid;grid-template-columns:minmax(0,1fr)}
.abchome.abc-motion .beat{grid-area:1/1;align-self:end;opacity:0;visibility:hidden;margin-top:0!important}
.abchome.abc-motion .beat.is-on{opacity:1;visibility:visible}
.abchome.abc-motion .hero__rail{
  display:block;position:absolute;left:0;right:0;bottom:0;height:1px;z-index:3;
  background:var(--line)
}
.abchome.abc-motion .hero__rail span{
  display:block;height:100%;width:100%;background:var(--text-2);
  transform:scaleX(0);transform-origin:left center
}
.abchome.abc-motion .plan{transition:opacity .9s var(--e)}
.abchome.abc-motion .beat{transition:opacity .55s var(--e),visibility .55s var(--e)}
.abchome.abc-motion .hero__cue{transition:opacity .4s var(--e)}
.abchome.abc-motion .hero__cue.is-off{opacity:0}

/* ═══════════════════════════════════════════════════════════════
   Sections communes
   ═══════════════════════════════════════════════════════════════ */
.abchome .sec{position:relative;padding:clamp(5rem,13vh,9.5rem) 0}
.abchome .sec--quiet{padding:clamp(4rem,10vh,7rem) 0}
/* Le hero s'achève en noir plein ; la preuve démarre dans ce même noir,
   avec une amorce longue pour que la bascule reste imperceptible. */
.abchome #preuve{padding-top:clamp(7rem,20vh,14rem)}
.abchome .sec--rule{border-top:1px solid var(--line)}

.abchome [data-rv]{opacity:1}
.abchome.abc-motion [data-rv]{opacity:0;transform:translateY(14px)}
.abchome.abc-motion [data-rv].is-in{
  opacity:1;transform:none;
  transition:opacity 1s var(--e),transform 1s var(--e)
}

/* Les grands titres se dévoilent par un masque plutôt qu'en fondu :
   c'est ce qui fait la différence entre « un bloc arrive » et
   « une page se déroule ». Mécanique reprise de Text Reveal (Mask). */
.abchome.abc-motion .h2[data-rv], .abchome.abc-motion .quote blockquote[data-rv]{
  opacity:1;transform:none;
  clip-path:inset(0 0 105% 0)
}
.abchome.abc-motion .h2[data-rv].is-in, .abchome.abc-motion .quote blockquote[data-rv].is-in{
  clip-path:inset(0 0 -20% 0);
  transition:clip-path 1.1s var(--e)
}

/* ── 02 · Preuve — bande de marques ────────────────────────────
   Réf. Logo Marquee (@ddoemonn) pour l'accessibilité (pause au survol
   ET au focus, reduced-motion) et Blurred Marquee (@grootstudio) pour
   les bords masqués. Les marques entrent et sortent du noir. */
.abchome .sec--proof{padding:clamp(3.5rem,9vh,6rem) 0 clamp(5rem,13vh,9rem)}
.abchome .brands{
  --fade:16%;
  display:flex;flex-direction:column;gap:.25rem;overflow:hidden;
  margin-bottom:clamp(3.5rem,9vh,6rem);
  -webkit-mask-image:linear-gradient(to right,transparent,#000 var(--fade),#000 calc(100% - var(--fade)),transparent);
  mask-image:linear-gradient(to right,transparent,#000 var(--fade),#000 calc(100% - var(--fade)),transparent)
}
.abchome .brands__row{display:flex;overflow:hidden}
.abchome .brands__track{display:flex;flex:none;min-width:100%;will-change:transform}
.abchome.abc-motion .brands__track[data-dir="l"]{animation:abcd-br-l var(--dur,200s) linear infinite}
.abchome.abc-motion .brands__track[data-dir="r"]{animation:abcd-br-r var(--dur,250s) linear infinite}
@keyframes abcd-br-l{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
@keyframes abcd-br-r{from{transform:translate3d(-50%,0,0)}to{transform:translate3d(0,0,0)}}
.abchome .brands:hover .brands__track, .abchome .brands:focus-within .brands__track{animation-play-state:paused}

.abchome .brand{
  flex:none;display:flex;align-items:center;
  height:clamp(2.6rem,5vw,3.6rem);padding:0 clamp(1.5rem,3.5vw,3rem);
  transition:color .6s var(--e),opacity .6s var(--e)
}
/* Nom typographique temporaire : corps unique, aucune variation simulée. */
.abchome .brand__t{
  font-family:var(--ff-d);font-weight:500;
  font-size:clamp(1.05rem,2.1vw,1.5rem);line-height:1;letter-spacing:-.018em;
  color:var(--text-3);white-space:nowrap
}
/* Logo réel : il suffit de remplacer .brand__t par cette image. */
.abchome .brand__i{height:100%;width:auto;object-fit:contain;
          filter:grayscale(1) brightness(0) invert(1);opacity:.55;
          transition:opacity .4s var(--e)}
.abchome .brands .brand:hover .brand__i{opacity:1}
.abchome .brands .brand:hover .brand__t{color:var(--text)}
.abchome .brands:hover .brand{opacity:.45}
.abchome .brands .brand:hover{opacity:1}
.abchome .brands .brand:hover{color:var(--text)}
.abchome .proof__k{margin-bottom:clamp(2.5rem,6vh,4rem)}

.abchome .figures{display:grid;gap:clamp(2.5rem,6vw,5rem);grid-template-columns:1fr}
@media(min-width:640px){.abchome .figures{grid-template-columns:1fr 1fr}}
.abchome .figures>p{margin:0;display:flex;flex-direction:column;gap:.6rem}
.abchome .figures__n{
  font-family:var(--ff-d);font-weight:800;
  font-size:clamp(3.4rem,10vw,7rem);line-height:.84;letter-spacing:-.055em;
  font-variant-numeric:tabular-nums
}
.abchome .figures__l{color:var(--text-3);font-size:.95rem;line-height:1.5}

/* ── 03 · Module conversationnel ───────────────────────────────
   Reproduction de @kokonutd/v0-ai-chat, mesure pour mesure :
   colonne max-w-4xl (56rem) centrée · titre 4xl au-dessus · boîte
   rounded-xl (12px) + bordure 1px · textarea px-4 py-3, min 60px,
   max 200px, auto-extensible · barre d'outils p-3 · bouton d'envoi
   qui s'inverse en blanc dès qu'il y a du texte · rangée de pills
   rounded-full bordées, gap 12px, sous la boîte.
   Seule la palette change : neutral-900/800 → ink de marque. */
/* ── Écrin du module conversationnel ────────────────────────────
   Le chat reste le point focal : rien de ce qui suit ne le touche.
   Trois couches seulement derrière lui — une bande de matière à droite,
   une lumière bleue très sombre, le grain commun. */
.abchome .sec--pb{position:relative;overflow:hidden}
.abchome .sec--pb>.wrap, .abchome .sec--pb>.v0{position:relative;z-index:1}
/* Écrin central : une grande matière derrière le module, plus large et
   plus haute que la section, éteinte sur les bords. Le plan 03 est déjà
   en cache — il sert de poster au hero — donc aucune requête de plus.

   Deux masques se composent par imbrication plutôt que par mask-composite,
   dont la syntaxe diffère encore entre moteurs :
   · le conteneur porte le fondu VERTICAL, calé pour être déjà à zéro bien
     avant les limites de la section — c'est ce qui supprime la couture ;
   · l'enfant porte le fondu RADIAL, qui éteint les bords latéraux.
   La couche déborde de 12 % en haut comme en bas : la rampe est donc plus
   longue que la zone réellement visible, et la matière n'apparaît jamais
   d'un coup. */
.abchome .pb__band{
  position:absolute;left:50%;top:-12%;transform:translateX(-50%);
  width:min(94%,88rem);height:124%;z-index:0;pointer-events:none;
  -webkit-mask-image:linear-gradient(to bottom,
    transparent 0%,transparent 12%,rgba(0,0,0,.45) 24%,#000 36%,
    #000 62%,rgba(0,0,0,.4) 78%,transparent 90%,transparent 100%);
  mask-image:linear-gradient(to bottom,
    transparent 0%,transparent 12%,rgba(0,0,0,.45) 24%,#000 36%,
    #000 62%,rgba(0,0,0,.4) 78%,transparent 90%,transparent 100%)
}
.abchome .pb__band::before{
  content:'';position:absolute;inset:0;
  background:url("../../../../uploads/abc-home/plan-03.jpg") center 24% / cover no-repeat;
  filter:grayscale(1) contrast(1.04) brightness(1.05);
  opacity:.34;
  -webkit-mask-image:radial-gradient(46% 68% at 50% 50%,#000 0%,rgba(0,0,0,.5) 52%,transparent 100%);
  mask-image:radial-gradient(46% 68% at 50% 50%,#000 0%,rgba(0,0,0,.5) 52%,transparent 100%)
}
/* Lumière diffuse : le bleu de marque, à une intensité où il ne se voit
   pas comme une couleur mais comme une profondeur. */
.abchome .pb__glow{
  position:absolute;inset:0;z-index:0;pointer-events:none;
  background:
    /* Poche sombre au centre : la matière fleurit autour du module, mais
       le texte retrouve un fond franc. Sans elle, le sous-titre tombait à
       2,89:1, sous le seuil AA — mesuré, pas estimé. */
    radial-gradient(52% 46% at 50% 42%,rgba(6,6,10,.62) 0%,rgba(6,6,10,.34) 58%,transparent 80%),
    radial-gradient(52% 40% at 50% 44%,rgba(26,111,255,.14),transparent 72%),
    radial-gradient(86% 42% at 50% 52%,rgba(26,111,255,.05),transparent 76%)
}
@media(max-width:899.98px){
  /* Mobile : la bande passe derrière toute la colonne, très effacée, et le
     halo se resserre. Rien qui puisse gêner la lecture du module. */
  .abchome .pb__band{width:132%;top:-10%;height:120%}
  .abchome .pb__band::before{opacity:.3;
    -webkit-mask-image:radial-gradient(46% 62% at 50% 46%,#000 0%,rgba(0,0,0,.45) 55%,transparent 100%);
    mask-image:radial-gradient(46% 62% at 50% 46%,#000 0%,rgba(0,0,0,.45) 55%,transparent 100%)}
  .abchome .pb__glow{background:
    radial-gradient(70% 44% at 50% 40%,rgba(6,6,10,.6) 0%,rgba(6,6,10,.3) 60%,transparent 82%),
    radial-gradient(90% 40% at 50% 32%,rgba(26,111,255,.09),transparent 70%)}
}

.abchome .v0{max-width:56rem;margin:0 auto;padding:0 var(--gut);text-align:center}
/* La composition reste centrée : titre, sous-titre et module sur le même
   axe, l'écrin derrière eux. */
.abchome .v0__h{
  margin:0;font-family:var(--ff-d);font-weight:700;
  font-size:clamp(1.75rem,4.4vw,2.6rem);line-height:1.06;letter-spacing:-.032em;
  text-wrap:balance
}
.abchome .v0__sub{margin:1rem 0 0;color:var(--text-3);font-size:1rem}
.abchome .v0__col{margin-top:2rem;text-align:left}

/* Fil de conversation — au-dessus de la boîte, comme un vrai assistant. */
.abchome .v0__thread{display:flex;flex-direction:column;gap:1.25rem;margin-bottom:1.25rem}
.abchome .v0__thread:empty{display:none}
.abchome .msg{display:flex;flex-direction:column;gap:.4rem;max-width:100%;opacity:0;transform:translateY(10px)}
.abchome .msg.is-in{opacity:1;transform:none;transition:opacity .45s var(--e),transform .45s var(--e)}
.abchome .msg__who{font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-3)}
.abchome .msg__t{margin:0;font-size:.975rem;line-height:1.62;color:var(--text-2)}
.abchome .msg__t + .msg__t{margin-top:.8rem}
.abchome .msg--you{align-self:flex-end;align-items:flex-end;text-align:right;max-width:min(100%,36rem)}
.abchome .msg--you .msg__t{
  color:var(--text);font-family:var(--ff-d);font-weight:600;letter-spacing:-.015em;
  font-size:clamp(1rem,2vw,1.2rem);line-height:1.32;
  border-right:2px solid var(--blue);padding-right:.9rem
}
.abchome .msg--abc{align-self:flex-start;max-width:min(100%,44rem)}
.abchome .msg__acts{display:flex;flex-wrap:wrap;gap:1.25rem;margin-top:1.1rem}

/* Boîte de saisie */
.abchome .v0__box{
  position:relative;background:var(--ink-2);
  border:1px solid var(--line);border-radius:12px
}
.abchome .v0__scroll{overflow-y:auto}
.abchome .v0__ta{
  display:block;width:100%;padding:.75rem 1rem;resize:none;background:transparent;
  border:0;outline:none;color:var(--text);
  font-family:var(--ff-b);font-size:.9rem;line-height:1.5;
  min-height:60px;overflow:hidden
}
.abchome .v0__ta::placeholder{color:var(--text-3);font-size:.9rem}
.abchome .v0__box:focus-within{border-color:var(--line-2)}

.abchome .v0__bar{display:flex;align-items:center;justify-content:space-between;padding:.75rem;gap:.5rem}
.abchome .v0__grp{display:flex;align-items:center;gap:.5rem}

.abchome .v0__icon{
  display:inline-flex;align-items:center;gap:.25rem;
  padding:.5rem;border:0;border-radius:8px;background:transparent;cursor:pointer;
  color:var(--text);transition:background .25s var(--e)
}
.abchome .v0__icon:hover{background:var(--ink-3)}
.abchome .v0__icon span{
  font-size:.7rem;color:var(--text-3);max-width:0;overflow:hidden;white-space:nowrap;
  transition:max-width .3s var(--e)
}
.abchome .v0__icon:hover span, .abchome .v0__icon:focus-visible span{max-width:7rem}

.abchome .v0__dashed{
  display:inline-flex;align-items:center;gap:.25rem;
  padding:.25rem .5rem;border-radius:8px;text-decoration:none;
  border:1px dashed var(--line-2);color:var(--text-3);
  font-size:.8rem;white-space:nowrap;
  transition:border-color .25s var(--e),background .25s var(--e),color .25s var(--e)
}
.abchome .v0__dashed:hover{border-color:var(--text-3);background:var(--ink-3);color:var(--text)}

.abchome .v0__send{
  display:inline-grid;place-items:center;
  padding:.375rem;border-radius:8px;cursor:pointer;
  border:1px solid var(--line-2);background:transparent;color:var(--text-3);
  transition:background .25s var(--e),color .25s var(--e),border-color .25s var(--e)
}
.abchome .v0__send:hover{border-color:var(--text-3);background:var(--ink-3)}
.abchome .v0__send.is-armed{background:var(--text);color:var(--ink);border-color:var(--text)}

/* Pills sous la boîte */
.abchome .v0__acts{
  display:flex;align-items:center;justify-content:center;flex-wrap:wrap;
  gap:.75rem;margin-top:1rem
}
.abchome .v0act{
  display:inline-flex;align-items:center;gap:.5rem;
  padding:.5rem 1rem;border-radius:100px;cursor:pointer;
  background:var(--ink-2);border:1px solid var(--line);
  color:var(--text-3);font-family:var(--ff-b);font-size:.75rem;
  transition:background .25s var(--e),color .25s var(--e),border-color .25s var(--e)
}
.abchome .v0act:hover{background:var(--ink-3);color:var(--text)}
.abchome .v0act[aria-pressed="true"]{color:var(--blue-lift);border-color:rgba(26,111,255,.5)}
.abchome .v0act svg{flex:none;opacity:.75}

@media(max-width:639.98px){
  .abchome .v0__acts{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;
            margin-inline:calc(var(--gut) * -1);padding-inline:var(--gut);
            scrollbar-width:none}
  .abchome .v0__acts::-webkit-scrollbar{display:none}
  .abchome .v0act{white-space:nowrap}
  .abchome .v0__dashed span{display:none}
}

/* ── 03bis · Situations — couche éditoriale ────────────────────
   Une liste numérotée, deux colonnes sur grand écran. Aucun cadre,
   aucune carte : des filets et de la typographie. Le contenu est
   identique avec ou sans JavaScript. */
.abchome .sec--sit{position:relative;padding:clamp(5rem,12vh,8.5rem) 0}
.abchome .sec--sit>.wrap{position:relative;z-index:1}
.abchome .sit{display:grid;grid-template-columns:1fr;gap:clamp(2rem,5vh,3rem)}
/* Le chapitre s'annonce par son titre, pas par un chapeau. Deux lignes :
   la première recule, la seconde porte le mot qui compte. Le décalage et
   le contraste suffisent — aucun effet supplémentaire. */
.abchome .sit__h{
  margin:0;font-family:var(--ff-d);font-weight:800;letter-spacing:-.042em;
  font-size:clamp(1.75rem,5.4vw,4.7rem);line-height:.94;
  display:flex;flex-direction:column;align-items:flex-start
}
.abchome .sit__h span{display:block;color:var(--text-3)}
.abchome .sit__h .sit__h-b{color:var(--text)}
.abchome .sit__intro{margin:0;max-width:52ch;color:var(--text-3);font-size:1rem;line-height:1.62}
.abchome .sit__l{list-style:none;margin:0;padding:0;counter-reset:sit}
.abchome .sit__i{
  counter-increment:sit;position:relative;border-top:1px solid var(--line);
  padding:clamp(1.5rem,3.5vh,2.2rem) 0 clamp(1.5rem,3.5vh,2.2rem) 3.2rem
}
.abchome .sit__i:last-child{border-bottom:1px solid var(--line)}
.abchome .sit__i::before{
  content:'0' counter(sit);position:absolute;left:0;top:clamp(1.65rem,3.75vh,2.4rem);
  font-size:.68rem;letter-spacing:.18em;color:var(--text-3);font-variant-numeric:tabular-nums
}
.abchome .sit__t{
  margin:0;font-family:var(--ff-d);font-weight:700;letter-spacing:-.026em;
  font-size:clamp(1.1rem,2.1vw,1.45rem);line-height:1.2;color:var(--text);text-wrap:balance
}
.abchome .sit__p{margin:.7rem 0 0;max-width:60ch;color:var(--text-3);font-size:.98rem;line-height:1.62}
/* Lien éditorial dans le corps du texte : jamais de soulignement plein,
   un filet discret qui se réveille au survol. */
.abchome .sit__p a{
  color:var(--text-2);text-decoration:none;border-bottom:1px solid var(--line-2);
  transition:color .25s var(--e),border-color .25s var(--e)
}
.abchome .sit__p a:hover{color:var(--blue-lift);border-bottom-color:var(--blue)}
@media(min-width:900px){
  /* Le titre occupe toute la largeur en haut ; la liste commence dessous,
     avec le chapeau dans la colonne opposée. Beaucoup de vide entre les
     deux : c'est ce vide qui donne son rang au chapitre. */
  .abchome .sit{grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr);
       column-gap:clamp(3rem,7vw,6.5rem);align-items:start;
       row-gap:clamp(3.5rem,9vh,6rem)}
  .abchome .sit__head{grid-column:1 / -1}
  .abchome .sit__lede{grid-column:1;position:sticky;top:calc(var(--nav-h) + 4vh)}
  .abchome .sit__l{grid-column:2}
  .abchome .sit__i{padding-left:3.6rem}
}

/* ── 04 · Conviction — chorégraphie ────────────────────────────
   Réf. Scroll Choreography (@componentry) : des éléments dispersés dans
   le cadre convergent vers une composition unique au fil du scroll.
   Ici la convergence est typographique — pas de schéma, pas de nœuds.
   --p (0 → 1) est piloté en JS. */
.abchome .cvz{position:relative;background:var(--ink)}
.abchome.abc-motion .cvz{height:260vh}
.abchome .cvz__stage{
  position:relative;min-height:100svh;overflow:hidden;
  display:flex;flex-direction:column;justify-content:center;
  padding:clamp(5rem,12vh,8rem) var(--gut)
}
.abchome.abc-motion .cvz__stage{position:sticky;top:0;height:100svh}

.abchome .cvz__field{position:absolute;inset:0;pointer-events:none}
@media(min-width:900px){
  /* Le champ de mots occupe la moitié droite : la colonne de texte garde
     la gauche, et la convergence finale se lit comme une seconde colonne. */
  .abchome .cvz__field{inset:0 0 0 48%}
}
.abchome .cvw{
  position:absolute;left:var(--x);top:var(--y);
  will-change:transform;
  font-family:var(--ff-d);font-weight:700;letter-spacing:-.03em;line-height:1;
  color:var(--text-3);white-space:nowrap;
  font-size:clamp(1.5rem,4.6vw,3.4rem);
  transform-origin:left center
}
/* État final : colonne alignée à gauche, tailles égalisées, filet commun. */
/* Aucun filet, aucune connexion : l'ordre se lit à l'alignement seul. */

.abchome .cvz__copy{position:relative;z-index:2;display:flex;flex-direction:column;gap:1.25rem;
           max-width:var(--maxw);margin:0 auto;width:100%}
@media(min-width:900px){
  .abchome .cvz__copy, .abchome .cvz__cta{max-width:calc(var(--maxw) * .44)}
  .abchome .cvz__copy{margin-inline:0}
  .abchome .cvz__cta{margin-inline:0}
  .abchome .cvz__stage{align-items:flex-start}
}
.abchome .cvz__t{
  margin:0;font-family:var(--ff-d);font-weight:700;
  font-size:clamp(1.9rem,5vw,3.6rem);line-height:1.04;letter-spacing:-.034em;
  max-width:18ch;text-wrap:balance;grid-area:1/1
}
.abchome.abc-motion .cvz__copy{display:grid;grid-template-columns:minmax(0,1fr)}
.abchome.abc-motion .cvz__copy .eyebrow{grid-row:1;margin-bottom:1.25rem}
.abchome.abc-motion .cvz__t{grid-row:2;grid-column:1;transition:opacity .5s var(--e),transform .5s var(--e)}
.abchome.abc-motion .cvz__t[data-state="b"]{opacity:0;transform:translateY(10px)}
.abchome.abc-motion .cvz.is-b .cvz__t[data-state="a"]{opacity:0;transform:translateY(-10px)}
.abchome.abc-motion .cvz.is-b .cvz__t[data-state="b"]{opacity:1;transform:none}
/* Appui du propos : lisible en permanence, il ne participe pas à la
   bascule et occupe donc sa propre ligne de grille. */
.abchome .cvz__p{margin:0;max-width:44ch;color:var(--text-3);font-size:.98rem;line-height:1.62}
.abchome.abc-motion .cvz__p{grid-row:3;grid-column:1;margin-top:clamp(1.5rem,4vh,2.5rem)}

.abchome .cvz__cta{position:relative;z-index:2;margin:clamp(2rem,5vh,3rem) auto 0;
          max-width:var(--maxw);width:100%}

@media(max-width:767.98px){
  /* Mobile : pas de scrub. Les mots s'alignent d'emblée, le propos reste. */
  .abchome.abc-motion .cvz{height:auto}
  .abchome.abc-motion .cvz__stage{position:relative;height:auto;min-height:0;
                         padding:clamp(4rem,10vh,6rem) var(--gut)}
  .abchome .cvz__field{position:relative;inset:auto;display:flex;flex-direction:column;
              gap:.15rem;margin-bottom:2.5rem}
  .abchome .cvw{position:relative;left:auto;top:auto;transform:none!important;
       font-size:clamp(1.4rem,7vw,2rem);color:var(--text)}
}

/* ── Pivot « Et chez vous ? » ──────────────────────────────────
   Une transition, pas une conversion : aucun lien, aucun bouton. Le
   chapitre Contact arrive juste après. Le titre déborde volontairement
   à gauche et se laisse rogner par le cadre — c'est ce qui lui donne
   son échelle. Aucun média : une lumière, du grain, de la typographie. */
.abchome .andyou{
  position:relative;overflow:hidden;
  min-height:clamp(20rem,58vh,34rem);display:flex;align-items:center;
  padding:clamp(4rem,11vh,7rem) 0;
  background:
    /* Le pivot se dissout dans le noir du Contact : aucune couture. */
    linear-gradient(to bottom,transparent 56%,var(--ink) 100%),
    radial-gradient(70% 60% at 18% 46%,rgba(26,111,255,.085),transparent 70%),
    radial-gradient(60% 50% at 86% 78%,rgba(232,232,240,.035),transparent 72%)
}
.abchome .andyou__in{position:relative;z-index:1;width:100%;max-width:var(--maxw);margin:0 auto;padding:0 var(--gut)}
.abchome .andyou__t{
  margin:0 0 0 -.055em;font-family:var(--ff-d);font-weight:800;
  font-size:clamp(2.6rem,14.6vw,12.7rem);line-height:.84;letter-spacing:-.05em;
  color:var(--text)
}


/* ── 06 · Témoignages — marquee ────────────────────────────────
   Reproduction de @shadcnspace/marquee-01 : deux rangées défilant en
   sens opposés, --duration 20s, cartes w-64 (16rem) rounded-lg avec
   bordure 1px et padding 1rem, avatar 32px, nom text-sm / rôle text-xs,
   corps text-sm tronqué, gap 1rem, dégradés de bord sur 1/4 de largeur,
   pause au survol. Palette et typographie passées en ABC. */
.abchome .sec--tm{padding:clamp(5rem,13vh,9rem) 0}
.abchome .mq{
  position:relative;display:flex;flex-direction:column;gap:1rem;
  width:100%;overflow:hidden;margin-top:clamp(2.5rem,6vh,4rem);
  --mq-dur:34s
}
.abchome .mq__row{display:flex;overflow:hidden;padding:.5rem 0}
.abchome .mq__track{display:flex;gap:1rem;flex:none;min-width:100%;will-change:transform;
           list-style:none;margin:0;padding:0}
.abchome.abc-motion .mq__track[data-dir="fwd"]{animation:abcd-mq-l var(--mq-dur) linear infinite}
.abchome.abc-motion .mq__track[data-dir="rev"]{animation:abcd-mq-r var(--mq-dur) linear infinite}
@keyframes abcd-mq-l{from{transform:translateX(0)}to{transform:translateX(calc(-50% - .5rem))}}
@keyframes abcd-mq-r{from{transform:translateX(calc(-50% - .5rem))}to{transform:translateX(0)}}
.abchome .mq:hover .mq__track, .abchome .mq:focus-within .mq__track{animation-play-state:paused}

.abchome .mqc{
  position:relative;width:16rem;flex:none;text-align:left;list-style:none;
  overflow:hidden;padding:1rem;border-radius:8px;
  background:var(--ink-2);border:1px solid var(--line);
  display:flex;flex-direction:column;gap:.5rem;
  font-family:var(--ff-b);
  transition:border-color .3s var(--e),background .3s var(--e)
}
.abchome .mqc:has(.mqc__open){cursor:pointer}
.abchome .mqc:hover{border-color:var(--line-2);background:var(--ink-3)}
.abchome .mqc__f{margin:0;display:flex;flex-direction:column;gap:.5rem}
.abchome .mqc__top{display:flex;flex-direction:row;align-items:center;gap:.5rem}
.abchome .mqc__av{
  width:32px;height:32px;flex:none;border-radius:50%;overflow:hidden;
  background:var(--ink-3);border:1px solid var(--line-2);
  display:grid;place-items:center;
  font-family:var(--ff-d);font-weight:700;font-size:.62rem;color:var(--text-3)
}
.abchome .mqc__av img{width:100%;height:100%;object-fit:cover;filter:grayscale(1) contrast(1.05)}
.abchome .mqc__who{display:flex;flex-direction:column;min-width:0}
.abchome .mqc__n{font-size:.875rem;font-weight:500;color:var(--text);white-space:nowrap;
        overflow:hidden;text-overflow:ellipsis}
.abchome .mqc__r{font-size:.75rem;font-weight:500;color:var(--text-3);white-space:nowrap;
        overflow:hidden;text-overflow:ellipsis}
.abchome .mqc__b{
  margin:0;font-size:.875rem;line-height:1.5;color:var(--text-2);
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden
}
.abchome .mqc__b p{margin:0}
/* Le bouton recouvre la carte : la citation reste un <blockquote>, et
   l'ensemble reste cliquable et atteignable au clavier. Il est vide —
   son intitulé est porté par aria-label, aucun texte n'est déporté. */
.abchome .mqc__open{
  position:absolute;inset:0;z-index:1;appearance:none;
  border:0;background:none;padding:0;cursor:pointer
}
.abchome .mqc:has(.mqc__open:focus-visible){border-color:var(--line-2);background:var(--ink-3)}
.abchome .mqc__kpi{margin:0;font-size:.72rem;color:var(--text-3)}
.abchome .mqc__kpi b{font-family:var(--ff-d);font-weight:700;color:var(--text)}

.abchome .mq__fade{position:absolute;inset-block:0;width:22%;pointer-events:none;z-index:2}
.abchome .mq__fade--l{left:0;background:linear-gradient(to right,var(--ink),transparent)}
.abchome .mq__fade--r{right:0;background:linear-gradient(to left,var(--ink),transparent)}

/* Sans animation : les rangées deviennent défilables au doigt/clavier. */
/* Sans mouvement — pas de script, ou mouvement réduit — le défilé devient
   une grille : les sept avis sont lus en entier, rien n'est tronqué et
   aucun geste n'est requis. */
.abchome .mq__row.is-manual{overflow-x:auto;scrollbar-width:none}
.abchome .mq__row.is-manual::-webkit-scrollbar{display:none}
.abchome:not(.abc-motion) .mq{gap:0}
.abchome:not(.abc-motion) .mq__row{display:block;overflow:visible;padding:0}
.abchome:not(.abc-motion) .mq__track{
  display:grid;grid-template-columns:1fr;gap:0;
  max-width:var(--maxw);margin:0 auto;padding:0 var(--gut);min-width:0
}
@media(min-width:768px){
  .abchome:not(.abc-motion) .mq__track{grid-template-columns:1fr 1fr;column-gap:clamp(2rem,5vw,4rem)}
}
.abchome:not(.abc-motion) .mqc{
  width:auto;border:0;border-top:1px solid var(--line);border-radius:0;
  background:none;padding:1.6rem 0
}
.abchome:not(.abc-motion) .mqc:hover{background:none;border-top-color:var(--line)}
.abchome:not(.abc-motion) .mqc__b{display:block;overflow:visible;-webkit-line-clamp:none}
.abchome:not(.abc-motion) .mqc__b p + p{margin-top:.6rem}

/* Verbatim intégral */
.abchome .tmd{
  border:1px solid var(--line-2);border-radius:12px;background:var(--ink-2);
  color:var(--text);max-width:44rem;width:calc(100% - 2rem);padding:clamp(1.75rem,4vw,2.75rem);
  position:fixed;inset:0;margin:auto
}
.abchome .tmd::backdrop{background:rgba(6,6,10,.86)}
.abchome .tmd__x{
  position:absolute;top:.9rem;right:.9rem;width:36px;height:36px;cursor:pointer;
  border:1px solid var(--line);border-radius:50%;background:transparent;color:var(--text-3);
  transition:color .25s var(--e),border-color .25s var(--e)
}
.abchome .tmd__x:hover{color:var(--text);border-color:var(--text-3)}
.abchome .tmd__q{
  margin:0 2rem 0 0;font-family:var(--ff-d);font-weight:600;letter-spacing:-.022em;
  font-size:clamp(1.05rem,2.3vw,1.5rem);line-height:1.34
}
.abchome .tmd__q p{margin:0}
.abchome .tmd__q p + p{margin-top:.8em}
.abchome .tmd__by{margin:1.75rem 0 0;display:flex;flex-direction:column;gap:.15rem;font-size:.92rem}
.abchome .tmd__by b{font-weight:500;color:var(--text)}
.abchome .tmd__by span{color:var(--text-3);font-size:.86rem}
.abchome .tmd__kpi{margin:1rem 0 0;font-size:.86rem;color:var(--text-3);line-height:1.5}
.abchome .tmd__kpi b{font-family:var(--ff-d);font-weight:700;color:var(--text)}
.abchome .tmd__kpi:empty{display:none}

/* ── 07 · Méthode — Scroll 01 ──────────────────────────────────
   Reproduction de @felipemenezes098/scroll-01 : deux colonnes, média
   collant à gauche qui permute par fondu 0,15 s linéaire, colonne texte
   à droite avec py 35vh et espacement 30vh entre blocs. Sous 768 px,
   la référence bascule sur une pile simple — on la suit. */
.abchome .s01{max-width:var(--maxw);margin:clamp(3rem,8vh,5rem) auto 0;padding:0 var(--gut)}
.abchome .s01__media{display:none}
.abchome .s01__inline{
  width:100%;height:clamp(13rem,42vw,18rem);object-fit:cover;
  filter:grayscale(1) contrast(1.05);margin-top:1.5rem
}
.abchome .s01__item{display:flex;flex-direction:column;gap:.7rem;max-width:52ch}
.abchome .s01__flow{display:flex;flex-direction:column;gap:clamp(3.5rem,9vh,5rem)}
.abchome .s01__n{font-size:.7rem;letter-spacing:.2em;color:var(--text-3);font-variant-numeric:tabular-nums}
.abchome .s01__t{margin:0;font-family:var(--ff-d);font-weight:700;
        font-size:clamp(1.5rem,3.6vw,2.4rem);line-height:1.06;letter-spacing:-.03em}
.abchome .s01__p{margin:0;color:var(--text-3);font-size:1rem}

@media(min-width:768px){
  .abchome .s01{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.5rem,5vw,4.5rem)}
  .abchome .s01__inline{display:none}
  .abchome .s01__media{
    display:block;position:sticky;top:calc(var(--nav-h) + 3vh);
    height:min(70vh,34rem);overflow:hidden;background:var(--ink-2)
  }
  .abchome .s01__media img{
    position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
    filter:grayscale(1) contrast(1.05);opacity:0;
    transition:opacity .15s linear
  }
  .abchome .s01__media img.is-on{opacity:1}
  .abchome .s01__idx{
    position:absolute;left:1rem;bottom:1rem;z-index:2;
    font-size:.7rem;letter-spacing:.16em;color:var(--text-2);
    font-variant-numeric:tabular-nums;
    background:linear-gradient(to top,rgba(6,6,10,.8),transparent);padding:.4rem .6rem
  }
  .abchome .s01__idx i{font-style:normal;opacity:.5;margin:0 .3rem}
  .abchome .s01__flow{display:block;padding:35vh 0}
  .abchome .s01__item{margin-bottom:30vh}
  .abchome .s01__item:last-child{margin-bottom:0}
  .abchome.abc-motion .s01__item{opacity:var(--o,1);transform:translateY(var(--y,0))}
}

/* ── 11 · Contact ──────────────────────────────────────────────
   Grille asymétrique inspirée de contact-01 (@shadcnspace), mais
   l'entrée n'est pas un formulaire : deux chemins typographiques,
   et seul celui choisi se déploie. */
.abchome .cx{position:relative;padding:clamp(5rem,13vh,9rem) 0 0;border-top:1px solid var(--line)}
.abchome .cx__h{
  margin:.75rem 0 0;font-family:var(--ff-d);font-weight:800;
  /* Calibré sur « acquisition. », la ligne la plus longue : le titre
     remplit la colonne sans jamais être coupé. */
  font-size:clamp(1.9rem,4.6vw,3.6rem);line-height:1.02;letter-spacing:-.036em;
  max-width:20ch
}

.abchome .cx__paths{
  max-width:var(--maxw);margin:clamp(4rem,11vh,8rem) auto 0;padding:0 var(--gut);
  display:grid;grid-template-columns:1fr;border-top:1px solid var(--line)
}
@media(min-width:840px){.abchome .cx__paths{grid-template-columns:1fr 1fr}}
/* Les deux cartes sont de natures différentes — « Prendre rendez-vous »
   ouvre un panneau (<button>), « Nous écrire » mène à la page de contact
   (<a>). font-family et text-decoration sont donc posés explicitement :
   sans eux, le <button> hériterait de la police de l'UA (Arial) et le
   lien serait souligné. Les deux cartes restent strictement identiques. */
.abchome .cxp{
  display:grid;grid-template-columns:auto 1fr;gap:.5rem 1.5rem;align-items:baseline;
  text-align:left;background:none;border:0;border-bottom:1px solid var(--line);
  padding:clamp(2rem,5vh,3.25rem) 0;cursor:pointer;color:var(--text-3);
  font-family:var(--ff-b);text-decoration:none;
  transition:color .35s var(--e)
}
@media(min-width:840px){
  .abchome .cxp{border-bottom:0;padding-right:2rem}
  .abchome .cxp + .cxp{border-left:1px solid var(--line);padding-left:clamp(2rem,4vw,3.5rem)}
}
.abchome .cxp:hover, .abchome .cxp:focus-visible{color:var(--text)}
.abchome .cxp__n{font-family:var(--ff-b);font-size:.68rem;letter-spacing:.18em;opacity:.7}
.abchome .cxp__t{
  font-family:var(--ff-d);font-weight:700;letter-spacing:-.032em;line-height:1.04;
  font-size:clamp(1.6rem,4.4vw,2.8rem);color:var(--text);
  display:flex;align-items:baseline;gap:.7rem
}
.abchome .cxp__t::after{content:'→';font-family:var(--ff-b);font-weight:400;font-size:.55em;
               transition:transform .35s var(--e)}
.abchome .cxp:hover .cxp__t::after{transform:translateX(6px)}
.abchome .cxp__d{grid-column:2;font-size:.95rem;line-height:1.55;max-width:34ch}
.abchome .cx__paths.is-off{opacity:0;pointer-events:none;
                  transition:opacity .35s var(--e)}

/* Panneaux — déploiement par grid-template-rows, sans saut de mise en page. */
.abchome .cx__panel{display:grid;grid-template-rows:0fr;transition:grid-template-rows .6s var(--e)}
.abchome .cx__panel[hidden]{display:none}
.abchome .cx__panel.is-open{grid-template-rows:1fr}
.abchome .cx__panel-in{overflow:hidden;padding-top:clamp(2.5rem,6vh,4rem);
              padding-bottom:clamp(2rem,5vh,3rem);display:flex;flex-direction:column;gap:2rem}
.abchome .cx__back{margin:0}
.abchome .cx__panel-in .conv__re{margin:0;font-size:.82rem;color:var(--text-3);letter-spacing:.03em}

/* ── Formulaire éditorial ──────────────────────────────────────
   Label discret, champ très grand, filet horizontal. Aucun cadre,
   aucune carte : le formulaire fait partie de la page. */
/* ── Formulaire ────────────────────────────────────────────────────────
   Styles conservés sans balisage associé : le parcours « Nous écrire »
   mène pour l'instant à la page de contact du site. Ils reprendront du
   service tel quel le jour où un formulaire réellement branché sera
   réintégré ici — d'où leur maintien plutôt qu'une suppression. */
.abchome .frm{display:flex;flex-direction:column;gap:clamp(2rem,5vh,3rem);max-width:52rem}
.abchome .frm__row{display:grid;grid-template-columns:1fr;gap:clamp(2rem,5vh,3rem)}
@media(min-width:640px){.abchome .frm__row{grid-template-columns:1fr 1fr}}
.abchome .frm__f{display:flex;flex-direction:column;gap:.4rem;min-width:0}
.abchome .frm__f label{font-size:.7rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-3)}
.abchome .frm__f label em{font-style:normal;text-transform:none;letter-spacing:.04em;opacity:.7}
.abchome .frm__f input, .abchome .frm__f textarea{
  width:100%;background:transparent;color:var(--text);
  border:0;border-bottom:1px solid var(--line-2);border-radius:0;
  padding:.5rem 0 .8rem;
  font-family:var(--ff-d);font-weight:600;letter-spacing:-.018em;
  font-size:clamp(1.05rem,1.9vw,1.35rem);line-height:1.4;
  transition:border-color .35s var(--e)
}
.abchome .frm__f textarea{font-family:var(--ff-b);font-weight:400;letter-spacing:0;
                 font-size:clamp(.98rem,1.6vw,1.05rem);line-height:1.6;resize:vertical;min-height:3rem}
.abchome .frm__f input::placeholder, .abchome .frm__f textarea::placeholder{color:rgba(154,154,180,.4)}
.abchome .frm__f input:focus, .abchome .frm__f textarea:focus{outline:none;border-bottom-color:var(--text)}
.abchome .frm__f.is-bad input, .abchome .frm__f.is-bad textarea{border-bottom-color:#FF6B70}
.abchome .frm__e{font-size:.76rem;color:#FF6B70}
.abchome .frm__e:empty{display:none}
.abchome .frm__c{display:grid;grid-template-columns:auto 1fr;gap:.4rem .75rem;align-items:start}
.abchome .frm__c input{width:18px;height:18px;margin-top:.25rem;accent-color:var(--blue)}
.abchome .frm__c label{font-size:.88rem;color:var(--text-3);line-height:1.5}
.abchome .frm__c .frm__e{grid-column:2}
.abchome .frm__state{margin:0;font-size:.85rem;color:var(--text-3);line-height:1.55}

/* ── Agenda ────────────────────────────────────────────────────── */
.abchome .book{width:100%}
.abchome .book__frame{
  width:100%;min-height:clamp(20rem,52vh,38rem);
  border:1px solid var(--line);background:var(--ink-2);
  display:grid;place-items:center;padding:2rem;overflow:hidden
}
.abchome .book__frame iframe{width:100%;height:clamp(20rem,52vh,38rem);border:0}
.abchome .book__dev{text-align:center;display:flex;flex-direction:column;gap:.6rem}
.abchome .book__dev b{font-family:var(--ff-d);font-weight:600;font-size:1.05rem;color:var(--text)}
.abchome .book__dev span{font-size:.85rem;color:var(--text-3)}
@media(max-width:767.98px){
  .abchome .book__frame{min-height:70vh;padding:1rem}
  .abchome .book__frame iframe{height:70vh}
}

/* ── Transitions de fin de récit ───────────────────────────────── */
.abchome #temoignages{border-top:1px solid var(--line)}
.abchome #florent{padding-top:clamp(4rem,10vh,7rem)}
.abchome .sec--cta{padding-top:clamp(7rem,18vh,12rem)}



/* ═══════════════════════════════════════════════════════════════
   Composition statique
   .js-motion n'est posée que si JavaScript répond ET que l'utilisateur
   n'a pas demandé moins d'animation. Son absence couvre donc les deux
   cas — et les sections ne se contentent pas de « ne plus bouger » :
   elles se rendent dans l'état qui a du sens.
   ═══════════════════════════════════════════════════════════════ */
.abchome:not(.abc-motion) .brands{-webkit-mask-image:none;mask-image:none}
.abchome:not(.abc-motion) .brands__row{overflow-x:auto;scrollbar-width:none}
.abchome:not(.abc-motion) .brands__track{animation:none;transform:none}
.abchome:not(.abc-motion) .mq__track{animation:none;transform:none}
.abchome:not(.abc-motion) .mq__fade{display:none}
.abchome:not(.abc-motion) .cvz{height:auto}
.abchome:not(.abc-motion) .cvz__stage{position:relative;height:auto;min-height:0}
.abchome:not(.abc-motion) .cvz__field{position:relative;inset:auto;display:flex;flex-direction:column;
              gap:.2rem;margin-bottom:2.5rem}
.abchome:not(.abc-motion) .cvw{position:relative;left:auto;top:auto;transform:none;color:var(--text)}
.abchome:not(.abc-motion) .cvz__t[data-state="b"]{margin-top:.35em;color:var(--text-2)}
.abchome:not(.abc-motion) .s01{display:block}
.abchome:not(.abc-motion) .s01__media{display:none}
.abchome:not(.abc-motion) .s01__inline{display:block}
.abchome:not(.abc-motion) .s01__flow{display:flex;flex-direction:column;gap:clamp(3rem,8vh,4.5rem);padding:0}
.abchome:not(.abc-motion) .s01__item{margin-bottom:0;opacity:1;transform:none}
.abchome:not(.abc-motion) .cl__i{height:auto}
.abchome:not(.abc-motion) .cl__bg{opacity:.3}
.abchome:not(.abc-motion) .cl__t{color:var(--text)}
.abchome:not(.abc-motion) .cl__d{opacity:1;max-height:none;overflow:visible;color:var(--text-2)}
.abchome:not(.abc-motion) .cl__go i, .abchome:not(.abc-motion) .cl__go em{opacity:1;transform:none}
.abchome:not(.abc-motion) .brands__row::-webkit-scrollbar{display:none}

/* Ceinture et bretelles : si la préférence change après le chargement. */
@media (prefers-reduced-motion: reduce){
  .abchome .brands__track, .abchome .mq__track{animation:none!important}
  .abchome .cx__panel{grid-template-rows:1fr}

  /* Résultats : plus d'empilement collant, trois chapitres qui se suivent. */
  .abchome .stk__i{position:static;height:auto;padding:0 var(--gut) clamp(1.5rem,4vh,2.5rem)}
  .abchome .stk__card{height:auto;transform:none;grid-template-rows:auto auto}
  .abchome .stk__media{aspect-ratio:16/9}
  .abchome .stk__media img{transform:none}

  /* Expertises : l'ouverture reste, sans transition ni zoom. */
  .abchome .cl__i, .abchome .cl__bg, .abchome .cl__d, .abchome .cl__t, .abchome .cl__go i, .abchome .cl__go em, .abchome .cl__bg img{transition:none}
  .abchome .cl__bg img{transform:none}
  .abchome .cl__d{max-height:none;overflow:visible}

  /* Fondateur : la superposition reste, aucun déplacement. */
  .abchome .fd__main img, .abchome .fd__crop, .abchome .fd__back, .abchome .fd__front{transform:none}
  .abchome .fd__crop img{transform:scale(3.6)}
}


/* ── 10 · Ressources — composition éditoriale ───────────────────
   Article 01 dominant, 02 et 03 en appui. Alimenté par la REST API
   WordPress ; le repli HTML garde la même structure. */
.abchome .posts{
  max-width:var(--maxw);margin:clamp(2.5rem,6vh,4rem) auto 0;padding:0 var(--gut);
  display:grid;grid-template-columns:1fr;gap:clamp(2rem,4vw,3rem)
}
@media(min-width:900px){
  .abchome .posts{grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);
         grid-template-rows:auto auto;align-items:start;
         column-gap:clamp(2.5rem,5vw,4.5rem);row-gap:clamp(2rem,4vh,3rem)}
  .abchome .post--lead{grid-row:1 / span 2}
}
.abchome .post{
  display:flex;flex-direction:column;gap:.65rem;text-decoration:none;
  border-top:1px solid var(--line);padding-top:1.25rem;
  transition:border-color .35s var(--e)
}
.abchome .post:hover{border-top-color:var(--text-3)}
.abchome .post__media{display:block;overflow:hidden;background:var(--ink-2);margin-bottom:.4rem}
.abchome .post__media img{
  width:100%;height:100%;object-fit:cover;aspect-ratio:16/10;
  filter:grayscale(1) contrast(1.05);
  transition:filter .5s var(--e),transform .7s var(--e)
}
.abchome .post:hover .post__media img{filter:grayscale(.4) contrast(1.05);transform:scale(1.02)}
.abchome .post--lead .post__media img{aspect-ratio:4/3}
.abchome .post__k{
  display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;
  font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-3)
}
.abchome .post__k i{width:14px;height:1px;background:var(--line-2);display:block;flex:none}
.abchome .post__t{
  font-family:var(--ff-d);font-weight:700;letter-spacing:-.028em;line-height:1.1;
  font-size:clamp(1.25rem,2.6vw,1.75rem);color:var(--text);text-wrap:balance;
  transition:color .3s var(--e)
}
.abchome .post--lead .post__t{font-size:clamp(1.6rem,4vw,2.75rem);letter-spacing:-.034em}
.abchome .post:hover .post__t{color:var(--blue-lift)}
.abchome .post__x{color:var(--text-3);font-size:.95rem;line-height:1.55;max-width:52ch}
/* Sans image mise en avant : composition typographique, jamais d'image cassée. */
.abchome .post:not(:has(.post__media)) .post__t{padding-top:.2rem}

/* ── Curseur personnalisé ───────────────────────────────────────
   Canvas 2D plein écran, hors du flux, sans coût de mise en page.
   Ces deux règles sont volontairement HORS du scope .abchome : la
   couche suit le pointeur sur toute la fenêtre. Elles ne s'appliquent
   que si le script a réellement démarré le canvas (classe .has-tube
   posée sur <body> à ce moment-là, jamais au chargement). */




/* ── Traitements typographiques ─────────────────────────────────
   Trois zones seulement dans toute la page : la phrase de bascule
   de la Conviction, le titre du Contact, et le titre actif des
   Expertises. Partout ailleurs, la typographie ne bouge pas. */

/* Magic Text — calque fantôme + révélation mot à mot */
.abchome .mw{position:relative;display:inline-block;white-space:pre}
.abchome .mw__ghost{position:absolute;inset:0;opacity:.18;pointer-events:none}
.abchome .mw__on{position:relative;opacity:var(--o,1)}
.abchome .abc-motion .cvz__t--magic .mw__on{opacity:var(--o,0)}

/* Lumière lente traversant le titre du Contact.
   Mécanique de background-clip:text reprise de Text Glitch Effect. */
.abchome .cx__h--sheen{
  background-image:linear-gradient(100deg,
    var(--text) 0%, var(--text) 38%,
    #FFFFFF 47%, #FFFFFF 53%,
    var(--text) 62%, var(--text) 100%);
  background-size:280% 100%;
  background-position:120% 0;
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent
}
.abchome .abc-motion .cx__h--sheen.is-in{
  transition:background-position 3.6s cubic-bezier(.22,1,.28,1) .35s;
  background-position:-20% 0
}
.abchome:not(.abc-motion) .cx__h--sheen{
  background:none;-webkit-text-fill-color:var(--text);color:var(--text)
}

/* Scramble — uniquement sur l'expertise qui devient active.
   Pool et cadence repris de Special Text (@tom_ui) : 20 ms, deux phases,
   250 à 450 ms au total. Le mot redevient parfaitement lisible ensuite. */


/* ═══════════════════════════════════════════════════════════════
   05 · RÉSULTATS — chapitres empilés
   Mécanique de Stacking Cards (@danielpetho) : chaque cas est un
   panneau collant, réduit et repoussé par le suivant. Un KPI héro
   monumental, un KPI secondaire, un média plein cadre.
   ═══════════════════════════════════════════════════════════════ */
.abchome .sec--res{padding-bottom:0}
.abchome .stk{position:relative;margin-top:clamp(2.5rem,6vh,4rem)}
.abchome .stk__i{position:sticky;top:0;height:100svh;display:flex;align-items:center;
        padding:calc(var(--nav-h) + 2vh) var(--gut) 2vh}

/* La carte : un diptyque. À gauche la page éditoriale, à droite l'image.
   Rien n'est posé « sur » la photo : les deux matières se font face. */
.abchome .stk__card{
  position:relative;width:100%;max-width:var(--maxw);margin:0 auto;
  height:min(78svh,42rem);overflow:hidden;
  background:var(--ink-2);border:1px solid var(--line);
  transform-origin:top center;transform:scale(var(--s,1)) translateY(var(--t,0));
  display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto
}

/* ── Panneau éditorial ──────────────────────────────────────────── */
.abchome .stk__panel{
  position:relative;z-index:2;grid-row:1;min-width:0;
  padding:clamp(1.5rem,3.2vw,2.9rem);
  display:flex;flex-direction:column;justify-content:flex-start;
  background:linear-gradient(160deg,var(--ink-2) 0%,var(--ink) 100%)
}
.abchome .stk__meta{
  margin:0;display:flex;align-items:center;gap:.85rem;
  font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-3)
}
.abchome .stk__meta i{width:22px;height:1px;background:var(--line-2);display:block;flex:none}
.abchome .stk__meta span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.abchome .stk__n{
  font-family:var(--ff-d);font-weight:700;font-size:.8rem;letter-spacing:.06em;
  color:var(--text-2);flex:none
}
.abchome .stk__client{
  margin:auto 0 clamp(1.4rem,3.5vh,2.4rem);font-family:var(--ff-d);font-weight:700;
  letter-spacing:-.03em;font-size:clamp(1.15rem,2.1vw,1.7rem);color:var(--text-2);line-height:1.1
}

/* ── Bloc chiffré : un seul chiffre monumental, un rappel discret ── */
.abchome .stk__kpi{display:flex;flex-direction:column;align-items:flex-start;width:100%}
.abchome .stk__hero{margin:0;display:flex;flex-direction:column;gap:.45rem;align-items:flex-start}
.abchome .stk__hero b{
  display:block;font-family:var(--ff-d);font-weight:800;letter-spacing:-.055em;
  line-height:.82;font-size:clamp(3.4rem,9.2vw,8rem);color:var(--text);
  font-variant-numeric:tabular-nums;white-space:nowrap;word-spacing:-.16em
}
.abchome .stk__hero span{
  font-size:clamp(.92rem,1.5vw,1.1rem);color:var(--text-2);line-height:1.32;max-width:24ch
}
.abchome .stk__sec{
  margin:clamp(1rem,2.4vh,1.6rem) 0 0;padding-top:clamp(.9rem,2vh,1.3rem);
  border-top:1px solid var(--line);width:100%;
  font-size:.9rem;color:var(--text-3);line-height:1.45
}
.abchome .stk__sec b{font-family:var(--ff-d);font-weight:700;color:var(--text-2);font-size:1rem}

/* ── Image : plein cadre dans sa moitié, jamais recouverte de texte ─ */
.abchome .stk__media{position:relative;margin:0;overflow:hidden;background:var(--ink-3)}
/* Trois cadrages distincts sur la même matière : les cas ne se confondent pas. */
.abchome .stk__i[data-i="0"] .stk__media img{--pos:28% 38%}
.abchome .stk__i[data-i="1"] .stk__media img{--pos:72% 62%}
.abchome .stk__i[data-i="2"] .stk__media img{--pos:46% 18%}
.abchome .stk__media img{
  width:100%;height:100%;object-fit:cover;display:block;
  object-position:var(--pos,50% 50%);
  filter:grayscale(1) contrast(1.16) brightness(.86);
  transform:scale(var(--z,1.06))
}
/* Un voile très léger côté panneau : la jonction ne doit pas trancher. */
.abchome .stk__media::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(to right,rgba(6,6,10,.55),transparent 32%)
}

@media(min-width:900px){
  .abchome .stk__card{grid-template-columns:1.06fr .94fr;grid-template-rows:1fr}
  .abchome .stk__panel{grid-column:1;grid-row:1;padding:clamp(2rem,3.4vw,3.4rem)}
  .abchome .stk__media{grid-column:2;grid-row:1}
  .abchome .stk__media::after{background:linear-gradient(to right,rgba(6,6,10,.6),transparent 26%)}
  .abchome .stk__hero span{max-width:22ch}
}

@media(max-width:899.98px){
  /* Empilé : l'image d'abord, la page ensuite. */
  .abchome .stk__card{grid-template-rows:minmax(0,.68fr) auto}
  .abchome .stk__media{grid-row:1;order:-1}
  .abchome .stk__panel{grid-row:2;background:var(--ink-2)}
  .abchome .stk__media::after{background:linear-gradient(to bottom,transparent 55%,rgba(6,6,10,.6))}
}
@media(max-width:767.98px){
  /* Mobile : pas d'empilement, trois panneaux qui se suivent. */
  .abchome .stk__i{position:relative;height:auto;padding:0 var(--gut) 1.25rem}
  .abchome .stk__card{height:auto;transform:none!important;grid-template-rows:auto auto}
  .abchome .stk__media{aspect-ratio:16/10}
  /* Le secteur passe à la ligne plutôt que d'être coupé. */
  .abchome .stk__meta{flex-wrap:wrap;row-gap:.35rem}
  .abchome .stk__meta span:last-child{white-space:normal;overflow:visible;text-overflow:clip}
  .abchome .stk__hero b{font-size:clamp(2.6rem,14.5vw,5rem)}
}

/* ═══════════════════════════════════════════════════════════════
   08 · EXPERTISES — liste cinématographique
   Mécanique de Cinematic List (@daiwiikharihar) : la ligne survolée
   s'ouvre et révèle un média plein cadre derrière la typographie ;
   les autres s'effacent. Aucune carte, aucun soulignement.
   ═══════════════════════════════════════════════════════════════ */
.abchome .sec--xp{padding-bottom:clamp(3rem,8vh,5rem)}
.abchome .xp__head{margin-bottom:clamp(2.5rem,6vh,4rem)}
.abchome .cl{border-top:1px solid var(--line)}
.abchome .cl__i{
  position:relative;display:block;overflow:hidden;text-decoration:none;
  border-bottom:1px solid var(--line);
  height:clamp(6.5rem,13vh,8.75rem);
  transition:height .6s cubic-bezier(.22,.61,.36,1)
}
/* Média de fond : invisible au repos. Le noir reste le fond de la section ;
   l'image n'apparaît que sur la ligne active, une seule à la fois. */
.abchome .cl__bg{position:absolute;inset:0;z-index:0;opacity:0;transition:opacity .5s ease}
.abchome .cl__bg img{
  width:100%;height:100%;object-fit:cover;object-position:var(--pos,50% 50%);
  filter:grayscale(1) contrast(1.12) brightness(var(--lift,.82));
  transform:scale(1.05);transition:transform .7s cubic-bezier(.22,.61,.36,1)
}
.abchome .cl__bg::after{
  content:'';position:absolute;inset:0;
  background:linear-gradient(to top,rgba(6,6,10,.86),rgba(6,6,10,.3) 62%,rgba(6,6,10,.04))
}
/* Six cadrages distincts, et une exposition par ligne. Les trois plans
   n'ont pas la même densité : plan-02 est uniformément sombre, plan-03
   passe du très clair au très noir du haut vers le bas. Sans ce réglage,
   la moitié des révélations ne montrait rien. Le traitement — noir et
   blanc, même contraste — reste identique partout. */
.abchome .cl__i:nth-child(1) .cl__bg img{--pos:20% 45%;--lift:.95}
.abchome .cl__i:nth-child(2) .cl__bg img{--pos:70% 60%;--lift:1.25}
.abchome .cl__i:nth-child(3) .cl__bg img{--pos:40% 20%;--lift:.72}
.abchome .cl__i:nth-child(4) .cl__bg img{--pos:85% 20%;--lift:1.25}
.abchome .cl__i:nth-child(5) .cl__bg img{--pos:10% 55%;--lift:.95}
.abchome .cl__i:nth-child(6) .cl__bg img{--pos:55% 5%;--lift:.95}

.abchome .cl__row{
  position:relative;z-index:1;height:100%;
  max-width:var(--maxw);margin:0 auto;padding:0 var(--gut);
  display:grid;grid-template-columns:auto 1fr auto;gap:.9rem 2.25rem;
  align-items:center;align-content:center
}
.abchome .cl__n{
  align-self:center;font-size:.68rem;letter-spacing:.18em;color:var(--text-3);
  font-variant-numeric:tabular-nums;transition:color .5s var(--e)
}
.abchome .cl__t{
  font-family:var(--ff-d);font-weight:700;text-transform:uppercase;
  font-size:clamp(1.9rem,4.8vw,4.4rem);line-height:.98;letter-spacing:-.042em;
  color:var(--text-2);white-space:nowrap;
  transition:color .5s var(--e)
}
.abchome .cl__d{
  grid-column:2;grid-row:2;max-width:48ch;font-size:1rem;line-height:1.55;
  color:transparent;opacity:0;max-height:0;overflow:hidden;
  transition:opacity .5s var(--e),max-height .6s cubic-bezier(.22,.61,.36,1),color .5s var(--e)
}
.abchome .cl__go{
  grid-column:3;grid-row:1 / span 2;display:flex;align-items:center;gap:1rem;
  color:var(--text-3);font-size:.72rem;letter-spacing:.16em;text-transform:uppercase
}
.abchome .cl__go i, .abchome .cl__go em{
  opacity:0;transition:opacity .5s var(--e),transform .5s var(--e),
             background .5s var(--e),color .5s var(--e),border-color .5s var(--e)
}
.abchome .cl__go i{font-style:normal;transform:translateY(10px)}
.abchome .cl__go em{
  font-style:normal;display:grid;place-items:center;width:44px;height:44px;flex:none;
  border:1px solid var(--line-2);border-radius:50%;font-size:1rem;transform:scale(.8)
}

/* ── Ligne ouverte ──────────────────────────────────────────────
   Deux régimes s'excluent.

   · .cl.is-driven — le script tourne : une seule ligne porte .is-on,
     posée au chargement sur la première, déplacée au survol et au focus,
     rendue à la première quand le pointeur quitte la section. Le survol
     n'ouvre donc jamais une seconde image en parallèle.

   · .cl:not(.is-driven) — filet de sécurité si le script n'a pas pu se
     monter : le survol et le focus rouvrent la ligne, en CSS pur. */
@media(hover:hover) and (min-width:768px){
  .abchome .cl.is-driven .cl__i.is-on, .abchome .cl:not(.is-driven) .cl__i:hover, .abchome .cl:not(.is-driven) .cl__i:focus-within{height:clamp(21rem,46vh,28rem)}

  .abchome .cl.is-driven .cl__i.is-on .cl__bg, .abchome .cl:not(.is-driven) .cl__i:hover .cl__bg, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__bg{opacity:1}

  .abchome .cl.is-driven .cl__i.is-on .cl__bg img, .abchome .cl:not(.is-driven) .cl__i:hover .cl__bg img, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__bg img{transform:scale(1)}

  .abchome .cl.is-driven .cl__i.is-on .cl__t, .abchome .cl:not(.is-driven) .cl__i:hover .cl__t, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__t{color:var(--text)}

  .abchome .cl.is-driven .cl__i.is-on .cl__n, .abchome .cl:not(.is-driven) .cl__i:hover .cl__n, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__n{color:var(--text-2)}

  .abchome .cl.is-driven .cl__i.is-on .cl__d, .abchome .cl:not(.is-driven) .cl__i:hover .cl__d, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__d{opacity:1;max-height:9rem;color:var(--text-2)}

  .abchome .cl.is-driven .cl__i.is-on .cl__go i, .abchome .cl:not(.is-driven) .cl__i:hover .cl__go i, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__go i{opacity:1;transform:none}

  .abchome .cl.is-driven .cl__i.is-on .cl__go em, .abchome .cl:not(.is-driven) .cl__i:hover .cl__go em, .abchome .cl:not(.is-driven) .cl__i:focus-within .cl__go em{opacity:1;transform:scale(1)}

  .abchome .cl.is-driven .cl__i.is-on:not(.cl__i--flat) .cl__go em, .abchome .cl:not(.is-driven) .cl__i:hover:not(.cl__i--flat) .cl__go em{
    background:var(--text);color:var(--ink);border-color:var(--text);transform:rotate(-45deg)
  }

  /* Les lignes en attente reculent : c'est ce qui rend l'active dominante. */
  .abchome .cl.is-driven .cl__i:not(.is-on) .cl__t{color:rgba(154,154,180,.34)}
  .abchome .cl:not(.is-driven):hover .cl__i:not(:hover) .cl__t{color:rgba(154,154,180,.34)}
}

/* Le lien de fin de chapitre respire toujours de la même façon. */
.abchome .after-cta{margin-top:clamp(2.5rem,7vh,4.5rem)}

/* Entre 768 et 900 px, la ligne n'a plus la place de porter le mot
   « Découvrir » à côté du titre : seul le cercle fléché subsiste. */
@media(max-width:899.98px){.abchome .cl__go i{display:none}}

/* Une ligne sans page dédiée ne promet aucun lien. */
.abchome .cl__i--flat{cursor:default}
.abchome .cl__i--flat .cl__go{display:none}

@media(max-width:767.98px),(hover:none){
  /* Sans survol — mobile comme tablette tactile — chaque expertise est
     un panneau typographique déjà ouvert, média compris. */
  .abchome .cl__i{height:auto;padding:clamp(1.5rem,5vw,2rem) 0}
  .abchome .cl__bg{opacity:.32}
  .abchome .cl__bg img{transform:scale(1)}
  .abchome .cl__row{display:flex;flex-direction:column;align-items:flex-start;gap:.55rem}
  .abchome .cl__n{order:-1;align-self:flex-start}
  .abchome .cl__t{white-space:normal;color:var(--text);font-size:clamp(1.6rem,8vw,2.4rem)}
  .abchome .cl__d{opacity:1;max-height:none;overflow:visible;color:var(--text-2);max-width:none}
  .abchome .cl__go{margin-top:.5rem}
  .abchome .cl__go i, .abchome .cl__go em{opacity:1;transform:none}
  .abchome .cl__go em{width:34px;height:34px}
}


/* ═══════════════════════════════════════════════════════════════
   09 · FONDATEUR — double page éditoriale
   Mécanique de Portfolio Hero (@waleedkibhen) : le nom en très grand
   corps passe DERRIÈRE puis DEVANT le portrait. La profondeur vient
   de la superposition réelle, pas d'un filtre. Un second cadrage du
   même cliché ouvre une fenêtre sur le plexi.
   ═══════════════════════════════════════════════════════════════ */
.abchome .sec--fd{padding:clamp(5rem,14vh,10rem) 0}
.abchome .fd{
  position:relative;max-width:var(--maxw);margin:0 auto;padding:0 var(--gut);
  display:grid;grid-template-columns:1fr;gap:0
}

/* Les deux moitiés du nom, en Syne 800, à des profondeurs différentes. */
.abchome .fd__back, .abchome .fd__front{
  display:block;font-family:var(--ff-d);font-weight:800;text-transform:uppercase;
  line-height:.8;letter-spacing:-.05em;white-space:nowrap;pointer-events:none
}
.abchome .fd__back{color:var(--text-3);opacity:.55}
.abchome .fd__front{color:var(--text)}

.abchome .fd__main{margin:0;overflow:hidden;background:var(--ink-2);position:relative}
.abchome .fd__main img{
  width:100%;height:100%;object-fit:cover;object-position:50% 16%;
  filter:grayscale(1) contrast(1.14) brightness(.96)
}
/* Second cadrage : un très gros plan du plexi, en fenêtre secondaire. */
.abchome .fd__crop{margin:0;overflow:hidden;background:var(--ink-2);border:1px solid var(--line)}
.abchome .fd__crop img{
  width:100%;height:100%;object-fit:cover;object-position:40% 94%;
  transform:scale(3.6);filter:grayscale(1) contrast(1.3) brightness(.94)
}

.abchome .fd__cap{
  margin:0;font-family:var(--ff-d);font-weight:700;letter-spacing:-.028em;
  font-size:clamp(1.15rem,2vw,1.5rem);line-height:1.15;color:var(--text);text-wrap:balance
}
.abchome .fd__role{
  margin:.6rem 0 0;max-width:34ch;
  font-size:.66rem;letter-spacing:.2em;line-height:1.75;
  text-transform:uppercase;color:var(--text-3)
}

.abchome .fd__txt{margin-top:clamp(2rem,5vh,3rem);display:flex;flex-direction:column;gap:1.1rem;align-items:flex-start}
.abchome .fd__txt .fd__role{margin-top:-.55rem}
.abchome .fd__lead{
  margin:0;font-family:var(--ff-d);font-weight:600;letter-spacing:-.022em;
  font-size:clamp(1.05rem,1.9vw,1.4rem);line-height:1.32;color:var(--text);
  max-width:32ch;text-wrap:pretty
}
.abchome .fd__p{margin:0;color:var(--text-3);font-size:.98rem;max-width:42ch}

/* ── Mobile : composition fixe, verticale, très lisible ────────── */
.abchome .fd__back{font-size:clamp(1.7rem,8.6vw,7.6rem);margin-bottom:-.24em;position:relative;z-index:0}
.abchome .fd__main{aspect-ratio:3/4;position:relative;z-index:1}
.abchome .fd__front{font-size:clamp(1.7rem,8.6vw,7.6rem);margin-top:-.3em;position:relative;z-index:2}
.abchome .fd__crop{display:none}

/* ── Desktop : double page ─────────────────────────────────────── */
@media(min-width:900px){
  .abchome .fd{
    grid-template-columns:repeat(12,1fr);
    grid-template-rows:auto auto auto;
    column-gap:clamp(1rem,2vw,2rem);row-gap:0;align-items:start
  }
  /* Prénom en haut, derrière l'image. */
  .abchome .fd__back{
    grid-column:1 / 13;grid-row:1;z-index:0;justify-self:start;
    font-size:clamp(1.7rem,8.6vw,7.6rem);margin:0 0 0 -.045em
  }
  /* Portrait : 52 % de la largeur, remonté sous le prénom. */
  .abchome .fd__main{
    grid-column:1 / 8;grid-row:1 / 4;z-index:1;
    align-self:start;margin-top:clamp(2.4rem,4.6vw,4.4rem);
    aspect-ratio:4/5;max-height:none
  }
  /* Fenêtre secondaire sur le plexi : elle chevauche le coin bas-droit du
     portrait et déborde sous lui, sans jamais toucher la colonne de texte. */
  .abchome .fd__crop{
    display:block;grid-column:5 / 8;grid-row:3;z-index:3;
    align-self:end;aspect-ratio:1/1;
    margin:0 0 clamp(8rem,10vw,10rem) 0
  }
  /* Nom de famille : par-dessus l'image, décalé à droite. */
  .abchome .fd__front{
    grid-column:1 / 13;grid-row:3;z-index:2;align-self:end;justify-self:start;
    font-size:clamp(1.7rem,8.6vw,7.6rem);margin:0 0 clamp(1rem,3vh,2.5rem) -.045em
  }
  .abchome .fd__txt{grid-column:8 / 13;grid-row:1 / 3;align-self:start;
           margin-top:clamp(4.5rem,9.5vw,8.5rem)}
}

/* Parallaxe très légère — trois vitesses, pilotées par --y (px). */
.abchome .abc-motion .fd__main img, .abchome.abc-motion .fd__main img{transform:translate3d(0,var(--y1,0),0) scale(1.04)}
.abchome .abc-motion .fd__crop, .abchome.abc-motion .fd__crop{transform:translate3d(0,var(--y2,0),0)}
.abchome .abc-motion .fd__back, .abchome.abc-motion .fd__back{transform:translate3d(0,var(--y3,0),0)}
@media(max-width:899.98px){
  .abchome.abc-motion .fd__main img, .abchome.abc-motion .fd__crop, .abchome.abc-motion .fd__back{transform:none}
  /* Le bas du portrait s'assombrit : le nom de famille reste lisible dessus. */
  .abchome .fd__main::after{
    content:'';position:absolute;inset:auto 0 0 0;height:32%;pointer-events:none;
    background:linear-gradient(to top,rgba(6,6,10,.82),rgba(6,6,10,0))
  }
}


/* ═══════════════════════════════════════════════════════════════
   CIBLES TACTILES
   Au doigt, toutes les commandes atteignent 44 px de haut. Ce bloc
   est en fin de feuille à dessein : .tlink--min remet son padding à
   zéro plus haut et annulerait la règle si elle était déclarée avant.
   Rien ne change au pointeur fin — le rythme desktop est conservé.
   ═══════════════════════════════════════════════════════════════ */
@media(hover:none),(max-width:767.98px){
  .abchome .tlink, .abchome .tlink--min{padding-block:.62rem}
  .abchome .v0act, .abchome .v0__icon, .abchome .v0__dashed, .abchome .v0__send{min-height:44px}
  .abchome .v0__send{min-width:44px}
  .abchome .mqc__open{min-height:44px}
  .abchome .tmd__x{min-width:44px;min-height:44px}
}
