/* ============================================================
   MICRO-ANIMATIONS : petites touches discrètes, façon Apple, sur tout le site.
   Une seule courbe (--ease), des durées courtes, rien qui bouge sans raison. Tout s'arrête si l'appareil demande moins de mouvement.
   ============================================================ */

/* les blocs qui arrivent au défilement : en plus de monter, ils sortent d'un très léger flou */
.rv{filter:blur(6px);transition:opacity .9s var(--ease),transform .9s var(--ease),filter .9s var(--ease)}
.rv.on{filter:none}

/* un appui se sent : le bouton s'enfonce un peu */
.pill,.pill.ghost,.ff-tab,.ff-type,.tool,.fc-pp,.isl-cta,.pm-links a,.pm-nav a,.chips a{transition-property:transform,background,color,box-shadow,opacity}
.pill:active,.ff-tab:active,.ff-type:active,.fc-pp:active,.isl-cta:active,.pm-links a:active,.pm-nav a:active,.chips a:active{transform:scale(.97)}
.tool:active{transform:translateY(-2px) scale(.97)}

/* au survol d'un projet, l'image avance à peine dans son cadre */
.ap-panel img,.fc-card.on .fc-panel.solo .fc-shots img{transition:transform .8s var(--ease),opacity .6s var(--ease)}
@media (hover:hover){
  .ap:hover .ap-panel img{transform:scale(1.035)}
  .fc-card.on:hover .fc-panel.solo .fc-shots img{transform:scale(1.025)}
}

/* les images arrivent en fondu une fois chargées (plus de pop) */
.ap-panel img:not(.ok),.pm-shot img:not(.ok),.pm-hero img:not(.ok){opacity:0}
.ap-panel img,.pm-shot img,.pm-hero img{transition:opacity .6s var(--ease),transform .8s var(--ease)}

/* le lien souligné se trace de gauche à droite */
.contact .links a,footer a{background-image:linear-gradient(currentColor,currentColor);background-size:0 1px;background-repeat:no-repeat;background-position:0 100%;transition:background-size .45s var(--ease),color .2s,border-color .2s}
@media (hover:hover){.contact .links a:hover,footer a:hover{background-size:100% 1px}}

@media (prefers-reduced-motion:reduce){
  .rv,.rv.on{filter:none}
  .pill:active,.ff-tab:active,.ff-type:active,.fc-pp:active,.isl-cta:active,.pm-links a:active,.pm-nav a:active,.chips a:active,.tool:active{transform:none}
  .ap:hover .ap-panel img,.fc-card.on:hover .fc-panel.solo .fc-shots img{transform:none}
  .ap-panel img:not(.ok),.pm-shot img:not(.ok),.pm-hero img:not(.ok){opacity:1}
}

/* ---------- aperçu du CV : la page entière tient dans l'écran ; zoom libre (molette, pincement, boutons), on glisse pour se déplacer ---------- */
#cvm .cvz{position:relative;margin:22px 0 0;height:calc(100svh - 300px);min-height:360px;border-radius:var(--r,20px);background:#f4f4f6;overflow:hidden;touch-action:none;cursor:zoom-in;user-select:none;-webkit-user-select:none}
#cvm .cvz.zoomed{cursor:grab}
#cvm .cvz.zoomed:active{cursor:grabbing}
#cvm .cvz img{position:absolute;left:0;top:0;max-width:none;max-height:none;width:auto;height:auto;transform-origin:0 0;mix-blend-mode:normal;box-shadow:0 0 0 1px rgba(0,0,0,.06);pointer-events:none;will-change:transform}
#cvm .cvz-hint{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);padding:8px 14px;border-radius:99px;background:rgba(11,11,12,.82);color:#fff;font-size:13px;font-weight:600;white-space:nowrap;pointer-events:none;transition:opacity .4s;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
#cvm .cvz-hint.gone{opacity:0}
#cvm .cvz-ctl{position:absolute;right:12px;top:12px;display:flex;gap:6px}
#cvm .cvz-ctl button{height:36px;min-width:36px;padding:0 12px;border:0;border-radius:99px;background:rgba(255,255,255,.92);box-shadow:0 0 0 1px rgba(0,0,0,.08),0 6px 16px -8px rgba(20,24,60,.35);font:600 14px/1 inherit;font-family:inherit;color:#0b0b0c;cursor:pointer}
#cvm .cvz-ctl button:hover{background:#fff}
#cvm .cvz-ctl button[data-cvin],#cvm .cvz-ctl button[data-cvout]{font-size:18px;padding:0}
@media (max-width:560px){#cvm .cvz{height:calc(100svh - 260px);min-height:300px}#cvm .cvz-hint{font-size:12px;bottom:12px}}
