/* ===== Motion : loader, révélations, hero, fond ===== */
#loader{position:fixed;inset:0;z-index:100;display:grid;place-items:center;background:var(--bg);pointer-events:none;animation:ldOut .8s ease forwards}
#loader img{width:92px;height:auto;animation:ldIn .8s var(--ease) both}
@keyframes ldOut{0%,72%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}
@keyframes ldIn{0%{opacity:0;transform:scale(.82)}45%{opacity:1;transform:scale(1)}100%{transform:scale(1.05)}}
.rv{will-change:opacity,transform}.rv.in{will-change:auto}
.rv.fl:not(.in){transform:translateX(-34px)}.rv.fr:not(.in){transform:translateX(34px)}
.rv.done{transition-delay:0s}
/* hero */
.hero h1{transform-origin:left center;animation:breathe 8s ease-in-out infinite}
@keyframes breathe{50%{scale:1.012}}
.arch img{animation:kb 22s ease-in-out infinite alternate;will-change:transform}
.sm img{animation:kb 28s ease-in-out infinite alternate-reverse}
@keyframes kb{to{transform:scale(1.08) translate(-1.5%,1%)}}
.col{isolation:isolate}
.halo{position:absolute;inset:4% -8% 0;z-index:-1;border-radius:50%;background:radial-gradient(circle,rgba(214,42,115,.30),rgba(201,163,90,.15) 45%,transparent 70%);animation:halo 7s ease-in-out infinite;will-change:transform,opacity}
@keyframes halo{50%{transform:scale(1.1);opacity:.65}}
.blob{animation:blobm 18s ease-in-out infinite alternate;will-change:transform}
.blob+.blob{animation-duration:24s;animation-direction:alternate-reverse}
@keyframes blobm{to{transform:translate3d(40px,-30px,0) scale(1.12)}}
/* fond : mesh + grain + particules */
body:before{content:'';position:fixed;inset:0;z-index:-1;pointer-events:none;will-change:transform;
background:radial-gradient(40% 35% at 15% 20%,rgba(247,199,211,.55),transparent 70%),radial-gradient(35% 30% at 85% 35%,rgba(201,163,90,.14),transparent 70%),radial-gradient(45% 40% at 40% 90%,rgba(255,215,226,.6),transparent 70%);animation:mesh 40s ease-in-out infinite alternate}
@keyframes mesh{to{transform:translate3d(2%,1.5%,0) scale(1.12)}}
body:after{content:'';position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.05;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence baseFrequency='.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.pfx{position:fixed;inset:0;z-index:-1;overflow:hidden;pointer-events:none}.pfx-h{position:absolute;z-index:0}
.pt{position:absolute;bottom:-10px;width:var(--s);height:var(--s);border-radius:50%;background:radial-gradient(circle,#fff,var(--gold) 60%,transparent);opacity:0;will-change:transform,opacity;animation:rise var(--t) linear var(--dl) infinite}
@keyframes rise{0%{opacity:0;transform:translate3d(0,0,0)}15%{opacity:.75}100%{opacity:0;transform:translate3d(var(--x),-110vh,0)}}
.pfx-h .pt{animation-name:riseh}@keyframes riseh{0%{opacity:0;transform:translate3d(0,0,0)}15%{opacity:.8}100%{opacity:0;transform:translate3d(var(--x),-700px,0)}}
@media(prefers-reduced-motion:reduce){#loader,.pfx,.halo{display:none!important}.rv.fl,.rv.fr{transform:none!important}body:before{animation:none}}
main{overflow-x:clip}
