/* ===================================
   REDARROW - FOND MESH PARTAGE
   Meme fond que /services et /qui-sommes-nous, applique aux pages
   qui utilisaient l'ancienne grille .ai-grid-background.
   Active par la classe .mesh-bg sur <body>.
   =================================== */

:root {
    --mesh-1: #dc2626;
    --mesh-2: #a855f7;
    --mesh-3: #3b82f6;
    --mesh-4: #ec4899;
    --mesh-ease: cubic-bezier(.2,.8,.3,1);
}

/* Le mesh est opaque et couvre tout le viewport : inutile de faire
   tourner le gradient anime de style-effects.css derriere. */
body.mesh-bg {
    background: #000 !important;
    animation: none !important;
}
body.mesh-bg::before { display: none; }

/* z-index -1 : le fond passe sous tout le contenu sans qu'aucune page
   n'ait a remonter son <main>. L'ancienne grille etait en z-index 0,
   donc au-dessus du texte (elle etait a 3 % d'opacite, ca ne se voyait
   pas) ; le mesh, lui, est opaque. */
.srv-mesh-bg {
    position: fixed; inset: 0;
    z-index: -1; pointer-events: none;
    overflow: hidden;
    background: #000;
}
.srv-mesh-bg::before, .srv-mesh-bg::after, .srv-mesh-bg span {
    content: ''; position: absolute;
    border-radius: 50%;
    filter: blur(120px);
    opacity: .5;
    will-change: transform, background;
    transition: background 1.6s var(--mesh-ease);
}
.srv-mesh-bg::before {
    width: 780px; height: 780px;
    top: -200px; left: -150px;
    background: var(--mesh-1);
    animation: srvMeshA 24s ease-in-out infinite alternate;
}
.srv-mesh-bg::after {
    width: 880px; height: 880px;
    top: 30%; right: -200px;
    background: var(--mesh-2);
    animation: srvMeshB 28s ease-in-out infinite alternate;
}
.srv-mesh-bg span {
    display: block;
    width: 680px; height: 680px;
    bottom: -150px; left: 35%;
    background: var(--mesh-3);
    animation: srvMeshC 26s ease-in-out infinite alternate;
}
.srv-mesh-bg span::after {
    content: ''; position: absolute;
    width: 560px; height: 560px;
    top: -300px; right: -200px;
    border-radius: 50%;
    background: var(--mesh-4);
    filter: blur(120px);
    opacity: .55;
    transition: background 1.6s var(--mesh-ease);
    animation: srvMeshD 30s ease-in-out infinite alternate;
}
.srv-mesh-grain {
    position: fixed; inset: 0; z-index: -1;
    pointer-events: none;
    background: linear-gradient(180deg, rgba(0,0,0,.2), rgba(0,0,0,.6));
    mix-blend-mode: multiply;
}

@keyframes srvMeshA {
    0%   { transform: translate3d(0,0,0) scale(1); }
    50%  { transform: translate3d(80px,60px,0) scale(1.1); }
    100% { transform: translate3d(40px,120px,0) scale(.95); }
}
@keyframes srvMeshB {
    0%   { transform: translate3d(0,0,0) scale(1); }
    50%  { transform: translate3d(-100px,80px,0) scale(1.05); }
    100% { transform: translate3d(-50px,-30px,0) scale(1.12); }
}
@keyframes srvMeshC {
    0%   { transform: translate3d(0,0,0) scale(1); }
    50%  { transform: translate3d(80px,-60px,0) scale(1.08); }
    100% { transform: translate3d(-80px,-30px,0) scale(.96); }
}
@keyframes srvMeshD {
    0%   { transform: translate3d(0,0,0) scale(1); }
    50%  { transform: translate3d(-60px,60px,0) scale(1.1); }
    100% { transform: translate3d(60px,-50px,0) scale(1); }
}

/* Mobile : 4 radial-gradient statiques au lieu de 4 blobs flous animes.
   Rendu quasi identique, cout GPU quasi nul. */
@media (max-width: 768px) {
    .srv-mesh-bg {
        background:
            radial-gradient(60% 45% at 12% 8%,  rgba(220,38,38,.55) 0%, transparent 60%),
            radial-gradient(70% 50% at 92% 32%, rgba(168,85,247,.55) 0%, transparent 60%),
            radial-gradient(55% 45% at 50% 92%, rgba(59,130,246,.55) 0%, transparent 60%),
            radial-gradient(45% 40% at 28% 78%, rgba(236,72,153,.55) 0%, transparent 60%),
            #000;
    }
    .srv-mesh-bg::before,
    .srv-mesh-bg::after,
    .srv-mesh-bg span,
    .srv-mesh-bg span::after { display: none !important; }
}

@media (prefers-reduced-motion: reduce) {
    .srv-mesh-bg::before, .srv-mesh-bg::after,
    .srv-mesh-bg span, .srv-mesh-bg span::after { animation: none !important; }
}

/* ===================================
   BLOCS CLAIRS SUR LE MESH

   L'ancien fond etait un gris-bleu uniforme (#1a1a24 -> #242d42) : des
   blocs a 2-8 % de blanc y restaient lisibles. Le mesh, lui, alterne du
   noir et des halos colores. Plutot que d'opacifier en sombre, on inverse
   comme les cards de references de /applications : surface blanche frostee,
   texte noir, le mesh ne se voit plus qu'autour.

   Restent volontairement sombres :
   - .aci-aurora-card    conteneur video, pas un bloc de texte
   - .pvB-card           media + fondu noir vers le corps de card : la passer
                         en clair demande de refaire le degrade, pas juste
                         le fond
   - .pvB-eyebrow, .pvB-ticker, .aci-sector-pill   pastilles posees sur le
                         fond, au meme niveau que les titres de section
   - .amp-step:hover     etat de survol d'une grille bordee, pas un panneau

   !important : Astro scope certains blocs <style> de page en
   .classe[data-astro-cid-xxx], soit une specificite (0,4,1) qui passe
   devant tout selecteur raisonnable ecrit ici. Idem pour les couleurs de
   texte, que style-effects.css force en blanc sur h1-h6 et p/span/a/li.
   =================================== */

body.mesh-bg {
    --lite-surface: linear-gradient(180deg, rgba(255,255,255,.95) 0%, rgba(255,255,255,.88) 100%);
    --ink: #18181b;
    --ink-2: #52525b;
    --ink-3: rgba(24,24,27,.66);
}

/* Pas de backdrop-filter sur ces blocs, volontairement.
   Ils sont a 88-96 % d'opacite : seuls 7 a 12 % du fond les traverse, et ce
   fond est deja floute a 120 px par le mesh, donc il n'a plus de detail a
   flouter. Le rendu est identique sans. En revanche le cout est reel : un
   backdrop-filter doit re-echantillonner et re-flouter sa zone a CHAQUE
   image tant que le fond bouge, et le mesh est anime en continu. Treize de
   ces blocs sur une page, plus le mix-blend-mode du grain par-dessus, c'est
   ce qui produisait le scintillement. */
/* --- cards en grille : cadre en verre qui laisse passer le mesh --- */
body.mesh-bg .pvB-trust-card,
body.mesh-bg .pvB-testi-card {
    border: 12px solid rgba(255,255,255,.18) !important;
    border-radius: 26px !important;
    background: var(--lite-surface) !important;
    background-clip: padding-box !important;
    box-shadow:
        inset 0 1px 0 rgba(255,255,255,.10),
        inset 0 -1px 0 rgba(255,255,255,.04),
        0 20px 50px -24px rgba(0,0,0,.7);
}
body.mesh-bg .pvB-trust-card { padding: 28px 24px 26px; }
body.mesh-bg .pvB-testi-card { padding: 30px 28px; }
body.mesh-bg .pvB-trust-card::before { inset: 0 0 auto 0; border-radius: 2px 2px 0 0; }
body.mesh-bg .pvB-trust-card:hover,
body.mesh-bg .pvB-testi-card:hover {
    border-color: rgba(255,255,255,.30) !important;
    box-shadow:
        inset 0 1px 0 rgba(255,255,255,.16),
        0 30px 70px -20px rgba(0,0,0,.8),
        0 0 0 1px color-mix(in oklab, var(--hue,#dc2626) 25%, transparent),
        0 0 60px -10px color-mix(in oklab, var(--hue,#dc2626) 40%, transparent);
}
body.mesh-bg .pvB-trust-title { color: var(--ink) !important; }
body.mesh-bg .pvB-trust-body { color: var(--ink-2) !important; }
body.mesh-bg .pvB-trust-body strong { color: var(--ink) !important; }
body.mesh-bg .pvB-trust-num { color: var(--ink-3) !important; }
body.mesh-bg .pvB-testi-quote { color: #27272a !important; }
body.mesh-bg .pvB-testi-author { color: var(--ink) !important; }
body.mesh-bg .pvB-testi-role { color: var(--ink-3) !important; }

/* --- liens et listes dans les blocs clairs ---
   style-effects.css force a/li en rgba(255,255,255,.9) !important : sans
   ca un lien de reponse de FAQ est blanc sur blanc, donc invisible. */
body.mesh-bg :is(.pvB-trust-card, .pvB-testi-card, .aipB-faq details, .amp-split-body) a {
    color: #b91c1c !important;
    text-decoration: underline;
    text-underline-offset: 2px;
}
body.mesh-bg :is(.pvB-trust-card, .pvB-testi-card, .aipB-faq details, .amp-split-body) a:hover {
    color: #7f1d1d !important;
}
body.mesh-bg :is(.pvB-trust-card, .pvB-testi-card, .aipB-faq details, .amp-split-body) li {
    color: var(--ink-2) !important;
}

/* --- liens dans le corps de texte, sur le fond sombre ---
   .pvB a est blanc comme le texte : sans soulignement un lien inline est
   invisible. Sur les blocs clairs c'est la regle plus haut qui s'applique. */
body.mesh-bg :is(.pvB-catalog-intro-text, .amp-band-lede, .pvB-hero-lede) a {
    color: #fca5a5 !important;
    text-decoration: underline;
    text-underline-offset: 3px;
}
body.mesh-bg :is(.pvB-catalog-intro-text, .amp-band-lede, .pvB-hero-lede) a:hover {
    color: #ffffff !important;
}

/* --- FAQ : pas de cadre, trop lourd sur des lignes d'accordeon fines --- */
body.mesh-bg .aipB-faq details {
    background: var(--lite-surface) !important;
    border: 1px solid rgba(0,0,0,.07) !important;
    box-shadow: 0 14px 36px -22px rgba(0,0,0,.65);
}
/* .35 se voyait sur fond sombre, plus assez sur fond blanc */
body.mesh-bg .aipB-faq details[open] { border-color: rgba(220,38,38,.5) !important; }
body.mesh-bg .aipB-faq summary { color: var(--ink) !important; }
body.mesh-bg .aipB-faq p { color: var(--ink-2) !important; }
body.mesh-bg .aipB-faq p strong { color: var(--ink) !important; }

/* --- panneau editorial : pleine hauteur contre la photo, pas de cadre --- */
body.mesh-bg .amp-split-body {
    background: linear-gradient(180deg, rgba(255,255,255,.96) 0%, rgba(250,250,252,.93) 100%) !important;
}
body.mesh-bg .amp-split-title { color: var(--ink) !important; }
body.mesh-bg .amp-split-text { color: var(--ink-2) !important; }
body.mesh-bg .amp-split-text strong { color: var(--ink) !important; }
body.mesh-bg .amp-split-body .amp-list li,
body.mesh-bg .amp-split-body .amp-list li span { color: var(--ink-2) !important; }
/* l'eyebrow et les puces reprennent --hue : #a855f7 et #3b82f6 tombent a
   3,5:1 sur blanc. On assombrit sans perdre la teinte. */
body.mesh-bg .amp-split-body .amp-split-eyebrow,
body.mesh-bg .amp-split-body .amp-list li svg {
    color: color-mix(in oklab, var(--hue,#dc2626) 72%, #000) !important;
}

/* Les cards empilees (.stack-card, home et pages agents) ne sont PAS dans
   cette couche, volontairement. Leur ancetre .content-wrapper peint un fond
   opaque #0a0a0f : le mesh ne passe jamais derriere elles, et leur verre a
   6 % de blanc y reste parfaitement lisible. Les avoir opacifiees revenait a
   corriger un probleme qui n'existait pas.
   Regle generale : avant d'ajouter un bloc ici, verifier que le mesh est bien
   visible derriere lui. Une faible opacite ne suffit pas a le prouver. */

/* ===================================
   HEROS A PHOTO TRANSLUCIDE

   .hero-bg img (home, 40 %) et .aci-hero-bg img (pages d'agents, 35 %)
   laissent voir ce qu'il y a derriere. C'etait le gradient uniforme du body ;
   depuis le mesh, ce sont des halos rouge et violet qui teintent la photo.
   On rend au conteneur le fond sur lequel la photo a ete calibree, ce qui
   arrete le mesh avant elle.

   Les autres images translucides du site (.aci-usecases-bg a 15 %,
   .aci-solution-bg a 45 %) n'en ont pas besoin : elles vivent sous
   .aci-content-wrapper, qui est deja opaque.
   =================================== */
body.mesh-bg .hero-bg,
body.mesh-bg .aci-hero-bg {
    background: linear-gradient(135deg, #1a1a24 0%, #252538 50%, #242d42 100%);
}

/* ===================================
   CALQUES PROMUS

   .pvB-reveal pose will-change: opacity, transform pour l'apparition au
   scroll, mais ne le relache jamais : les calques restent promus a vie
   (27 sur /qui-sommes-nous). Chacun est une surface que le compositeur
   garde en memoire et recompose quand le mesh bouge dessous. Une fois
   l'apparition jouee, on rend la main.
   Le will-change des blobs du mesh, lui, est legitime : ils animent en
   continu.
   =================================== */
body.mesh-bg .pvB-reveal.is-visible { will-change: auto; }
