/************************************************
 *                                              *
 *   shared.css — Feuille de style partagée     *
 *   Convergence Human & Technology             *
 *                                              *
 *   Auteur  : Fabien Conéjéro / FC84           *
 *   Dépôt   : https://github.com/              *
 *             convergence-human-technology     *
 *   Licence : Copyright © 2026-2060            *
 *             Convergence Human & Technology   *
 *             Tous droits réservés             *
 *                                              *
 ************************************************
 *                                              *
 *   Ce fichier CSS est le résultat du travail  *
 *   cumulatif de toutes les sessions de        *
 *   développement du site Convergence.         *
 *                                              *
 *   Il intègre :                               *
 *   • Le dégradé radial cercle parfait         *
 *     (3 techniques empilées — IE6 → 4K)       *
 *   • Normalize.css complémentaire             *
 *   • Globalize.css (EULA propriétaire)        *
 *   • Probalize.css (EULA propriétaire)        *
 *   • Menu navigation glassmorphism            *
 *   • Loader 3 secondes                        *
 *   • Animation halo                           *
 *   • Section FAQ                              *
 *   • Media queries responsive                 *
 *     (mobile 320px → TV 5K)                   *
 *   • WCAG 2.2 AAA scrollbar                   *
 *                                              *
 ************************************************
 *                                              *
 *   ★ GLOBALIZE.css — LICENCE PROPRIÉTAIRE     *
 *   ★ PROBALIZE.css — LICENCE PROPRIÉTAIRE     *
 *                                              *
 *   Seul Fabien Conéjéro peut utiliser         *
 *   Globalize.css et Probalize.css.            *
 *   Toute autre personne doit obtenir une      *
 *   autorisation écrite préalable.             *
 *   Sans cette autorisation, même lire le      *
 *   code et le recopier constitue une          *
 *   contrefaçon (CPI art. L.335-2 France).     *
 *                                              *
 *   Contact : convergence-tech@proton.me       *
 *                                              *
 ************************************************/


    /* ====================================================================
       PALETTE DE COULEURS — CHARTE GRAPHIQUE CONVERGENCE
       ====================================================================

       COULEUR 1 — Centre du dégradé (point lumineux)
         Cyan électrique clair  →  #7be8ff
         Correspond au halo lumineux de la silhouette dans les visuels

       COULEUR 2 — Zone intermédiaire (transition)
         Bleu cobalt intermédiaire  →  #1a4a8a
         Le bleu "espace" visible autour du cercle dans le logo

       COULEUR 3 — Bords / extrémités (profondeur maximale)
         Bleu marine nuit profond  →  #010c1e
         La couleur de fond des coins dans tous les visuels Convergence

       COULEUR ACCENT  →  #4dd4f0  (cyan principal interface)

       ==================================================================== */


    /* ====================================================================

       ╔══════════════════════════════════════════════════════════════════╗
       ║  TRAVAIL SUR LE DÉGRADÉ : TOUJOURS D'UNE FORME CIRCULAIRE       ║
       ║  (LE CERCLE PARFAIT) SUR TOUS LES ÉCRANS                        ║
       ╚══════════════════════════════════════════════════════════════════╝

       Objectif : rendre le dégradé toujours d'une forme circulaire
       (le cercle parfait) et centré et fixé sur toute taille d'écran.
       Pourquoi ce travail ? Car le dégradé circulaire se déforme en
       ellipse verticalement ou horizontalement, selon la largeur des
       différents types d'appareil : mobile, tablettes, PC, TV.

       Architected multi-layered CSS solutions for perfect circular gradient.
       La solution pro en 2026 combine 3 techniques en cascade :

       1. circle keyword (base, IE9+)
       2. background-size: 200vmax 200vmax — le carré parfait via vmax
          (Chrome 26+, FF19+)
       3. ::before pseudo-élément avec max(100vw, 100vh) — le plus robuste
          (Chrome 79+, FF75+)

       Solution complète : Voici l'explication du problème et des 3 techniques
       empilées : Pourquoi ça se déformait en ellipse ?
       radial-gradient(ellipse at center, ...) calcule son rayon
       proportionnellement aux dimensions du conteneur. Sur un 16:9,
       le rayon horizontal est 1,78× plus grand que le vertical → ellipse
       aplatie. Sur un mobile 9:19, c'est l'inverse.

       Les 3 techniques empilées (de la moins à la plus récente) :

       [A] circle farthest-corner sur le body — remplace ellipse par le
       mot-clé circle, ce qui force une forme ronde géométriquement.
       Mais le cercle reste dimensionné selon les axes du viewport, donc
       il peut quand même paraître "large" sur ultrawide. Fallback IE10+.

       [B] background-size: 200vmax 200vmax — vmax = 1% de la plus grande
       dimension. On donne au dégradé une taille carrée de 200vmax × 200vmax
       centrée. Sur un carré, circle = cercle visuel parfait, quel que soit
       le ratio de l'écran. Chrome 26+, FF 19+, IE11.

       [C] html::before avec max(200vw, 200vh) — un pseudo-élément invisible,
       positionné fixe et centré, dont la taille est calculée par max() pour
       toujours être un carré parfait. Le dégradé appliqué dessus est donc
       toujours un cercle mathématiquement exact.
       Chrome 79+, FF 75+. @supports (width: max(...)) rend le body
       transparent pour que seule cette technique s'affiche sur les
       navigateurs modernes.

       _____

       background-size: 100% → remplacé par 200vmax 200vmax — c'est le
       cœur de la correction cercle parfait.

       Présent dans la nouvelle solution :

       overflow: auto → overflow-x: hidden; overflow-y: auto
       -webkit-font-smoothing: antialiased
       font: 1em 'Helvetica Neue', Helvetica
       line-height: 180%
       color: rgba(255,255,255,0.85)
       margin: 0
       text-shadow
       background-attachment: fixed
       height/width: 100% → min-height: 100%; width: 100%
       -moz-radial-gradient(center, ...) FF3.6-15
       -webkit-radial-gradient(center, ...) Chrome10-25/Safari5.1-6
       radial-gradient(...) W3C standard
       filter: progid:DXImageTransform.Microsoft.gradient(...) IE6-9
       background-color: #010c1e fallback couleur unie IE6

       ==================================================================== */


    /* ====================================================================
       BALISE HTML
       ====================================================================
       - Sert de conteneur racine : doit occuper au moins 100% de la fenêtre
       - position:relative est indispensable pour que le pseudo-élément
         ::before (solution cercle parfait) puisse se positionner
         correctement en arrière-plan avec z-index
       ==================================================================== */
    html {
      min-height: 100%;            /* Hauteur minimale = hauteur complète de la fenêtre */
      position: relative;          /* REQUIS : active le contexte de positionnement
                                      pour le pseudo-élément ::before ci-dessous */
    }


    /* ====================================================================
       BALISE BODY
       ====================================================================
       Le body lui-même est transparent : c'est le pseudo-élément html::before
       qui affiche le dégradé. Cette séparation permet d'avoir le fond
       totalement fixe (ne défile pas) sans effets de bord sur le scroll.
       Les fallbacks pour IE sont définis ici en arrière-plan secondaire.
       ==================================================================== */
    body {

      /* ------------------------------------------------------------------
         RESET ET MISE EN PAGE DE BASE
      ------------------------------------------------------------------ */
      margin: 0;                   /* Suppression de la marge par défaut du navigateur */
      padding: 0;                  /* Suppression du padding par défaut */
      padding-bottom: 80px;        /* Espace en bas pour que le contenu ne touche pas le bord */
      overflow-x: hidden;          /* Cache le défilement horizontal indésirable */
      overflow-y: auto;            /* Autorise le défilement vertical */

      /* ------------------------------------------------------------------
         TYPOGRAPHIE
      ------------------------------------------------------------------ */
      -webkit-font-smoothing: antialiased; /* Lissage des polices WebKit (Chrome, Safari) */
      -moz-osx-font-smoothing: grayscale;  /* Lissage des polices sur macOS Firefox */
      font: 1em 'Helvetica Neue', Helvetica, Arial, sans-serif; /* Police principale */
      line-height: 180%;           /* Hauteur de ligne généreuse pour la lisibilité */

      /* ------------------------------------------------------------------
         COULEURS
      ------------------------------------------------------------------ */
      color: rgba(255, 255, 255, 0.85); /* Texte blanc légèrement transparent */
      text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.35); /* Ombre portée fine sur le texte */

      /* ------------------------------------------------------------------
         DIMENSIONS
      ------------------------------------------------------------------ */
      min-height: 100%;            /* Hauteur minimale = fenêtre complète */
      width: 100%;                 /* Largeur pleine */

      /* ------------------------------------------------------------------
         FOND — FALLBACK POUR NAVIGATEURS NE SUPPORTANT PAS ::before
         Ces déclarations background ne s'appliquent QUE si le navigateur
         ne supporte pas html::before (IE8 et moins essentiellement).
         Les navigateurs modernes utilisent le pseudo-élément à la place.

         PROBLÈME avec ellipse sur tous les écrans :
         radial-gradient(ellipse at center, ...) s'adapte à la taille
         du conteneur → sur un écran 16:9 = ellipse horizontale
                       → sur un écran 9:16 mobile = ellipse verticale
         SOLUTION MINIMALE : utiliser "circle" au lieu de "ellipse"
         → garantit un cercle parfait peu importe les proportions
      ------------------------------------------------------------------ */

      /* IE6-IE9 : pas de dégradé radial. Couleur unie de secours (le plus sombre) */
      background-color: #010c1e;

      /* Firefox 3.6 à 15 (préfixe -moz-) — syntaxe dépréciée
         "circle cover" = cercle qui s'étend jusqu'au coin le plus éloigné
         NOTE : on utilise "circle" et non "ellipse" pour que la forme
                reste ronde même sur les vieux Firefox */
      background: -moz-radial-gradient(
        center,                    /* Point d'origine : centre exact de l'élément */
        circle cover,              /* Forme circulaire, jusqu'au coin le plus éloigné */
        #7be8ff  0%,               /* Cyan électrique — point central lumineux */
        #1a4a8a  45%,              /* Bleu cobalt — zone de transition intermédiaire */
        #010c1e  100%              /* Bleu marine nuit — extrémité / coin de l'écran */
      );

      /* Chrome 10-25 et Safari 5.1-6 (préfixe -webkit-) — syntaxe dépréciée
         Même logique : "circle cover" pour garder la forme circulaire */
      background: -webkit-radial-gradient(
        center,                    /* Point d'origine : centre */
        circle cover,              /* Forme circulaire, jusqu'au coin le plus éloigné */
        #7be8ff  0%,               /* Cyan électrique */
        #1a4a8a  45%,              /* Bleu cobalt */
        #010c1e  100%              /* Bleu marine nuit */
      );

      /* Standard W3C (IE10+, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+)
         "circle" = forme toujours circulaire (vs "ellipse" qui se déforme)
         "farthest-corner" = le rayon du cercle atteint le coin le plus éloigné */
      background: radial-gradient(
        circle farthest-corner at center,  /* Cercle parfait, centré, jusqu'au coin */
        #7be8ff  0%,                        /* Cyan électrique */
        #1a4a8a  45%,                       /* Bleu cobalt */
        #010c1e  100%                       /* Bleu marine nuit */
      );

      /* Filtre dégradé IE6-IE9 : fallback horizontal car IE < 10 ne supporte
         pas les dégradés radiaux. GradientType=1 = horizontal (gauche→droite)
         On simule visuellement avec la couleur claire à gauche, sombre à droite */
      filter: progid:DXImageTransform.Microsoft.gradient(
        startColorstr='#7be8ff',   /* Couleur de départ : cyan électrique */
        endColorstr='#010c1e',     /* Couleur d'arrivée : bleu marine nuit */
        GradientType=1             /* 1 = dégradé horizontal, 0 = vertical */
      );

      /* Le dégradé de fond reste FIXE lors du scroll (ne défile pas avec la page)
         Note : background-attachment:fixed est ignoré sur iOS Safari (bug connu)
         mais reste correct sur tous les autres navigateurs */
      background-attachment: fixed;

      /* Le dégradé couvre toujours tout l'écran quelle que soit la résolution */
      background-size: cover;

    } /* fin body */


    /* ====================================================================

       ╔══════════════════════════════════════════════════════════════════╗
       ║  SOLUTION CERCLE PARFAIT — TOUTES TAILLES D'ÉCRAN               ║
       ║  Mobile · Tablette · PC · TV · TV HD · 4K · 5K · Ultrawide      ║
       ╚══════════════════════════════════════════════════════════════════╝

       POURQUOI LE DÉGRADÉ SE DÉFORME-T-IL EN ELLIPSE ?
       ─────────────────────────────────────────────────
       radial-gradient() appliqué directement sur body ou html calcule
       son rayon EN FONCTION DES DIMENSIONS du conteneur.

       Sur un écran 1920×1080 (16:9) :
         → rayon horizontal = 960px, rayon vertical = 540px
         → résultat = ELLIPSE HORIZONTALE (trop large, trop aplatie)

       Sur un écran mobile 390×844 (9:19) :
         → rayon horizontal = 195px, rayon vertical = 422px
         → résultat = ELLIPSE VERTICALE (trop étirée en hauteur)

       Sur un TV 4K 3840×2160 :
         → rayon horizontal = 1920px, rayon vertical = 1080px
         → résultat = ELLIPSE ENCORE PLUS PRONONCÉE

       PRINCIPE DE LA SOLUTION
       ─────────────────────────────────────────────────
       Un dégradé radial est un CERCLE PARFAIT uniquement quand
       son conteneur est un CARRÉ (largeur = hauteur).

       On crée donc un pseudo-élément html::before qui EST un carré,
       en lui donnant comme taille le MAX entre la largeur et la hauteur
       de la fenêtre. Sur ce carré, on applique "circle" → cercle parfait.

       COMPATIBILITÉ PAR TECHNIQUE
       ─────────────────────────────────────────────────
       [A] body + "circle" keyword     → Chrome 10+, FF 16+, Safari 7+, IE10+
           (cercle, mais peut avoir l'air "aplati" selon l'écran)

       [B] background-size: 200vmax   → Chrome 26+, FF 19+, Safari 6.1+, IE11
           (vmax = max(vw,vh) → carré virtuel → cercle parfait)

       [C] html::before + max(100vw,100vh) → Chrome 79+, FF 75+, Safari 11.1+
           (méthode pseudo-élément carré — LA PLUS FIABLE en 2026)

       On empile [A] → [B] → [C] : chaque navigateur prend le meilleur
       qu'il peut lire, et [C] écrase [B] qui écrase [A].

       ==================================================================== */


    /* ====================================================================
       TECHNIQUE [B] — background-size: 200vmax 200vmax
       ====================================================================
       vmax = 1% de la PLUS GRANDE dimension de la fenêtre
       (si écran 1920×1080 : vmax = 19.2px car 1920 > 1080)

       200vmax × 200vmax = carré parfait dont le côté = 2× la plus grande
       dimension. Le dégradé, tracé dans ce carré, sera donc toujours
       parfaitement circulaire, quel que soit le ratio de l'écran.

       background-position: center → le carré est centré sur l'écran
       background-repeat: no-repeat → pas de répétition du motif

       Compatible : Chrome 26+, Firefox 19+, Safari 6.1+, Edge 12+, IE11
       (IE11 supporte vmax en background-size mais avec quelques bugs mineurs)
       ==================================================================== */
    body {

      /* Surcharge du background-size défini plus haut.
         Cette ligne s'applique aux navigateurs supportant vmax (IE11+, Chrome 26+).
         Elle force le dégradé dans un carré de 200vmax × 200vmax
         centré sur la page. Résultat : cercle parfait sur tout écran. */
      background-size: 200vmax 200vmax;

      /* Centre le carré dégradé exactement au milieu de l'écran */
      background-position: center center;

      /* Empêche la répétition du dégradé si la taille est plus petite que l'écran
         (ne devrait pas arriver avec 200vmax, mais sécurité supplémentaire) */
      background-repeat: no-repeat;

    }


    /* ====================================================================
       TECHNIQUE [C] — PSEUDO-ÉLÉMENT html::before avec max(100vw, 100vh)
       ====================================================================
       C'est la technique la plus robuste en 2026.

       PRINCIPE :
       On crée un pseudo-élément invisible positionné en arrière-plan,
       dont la taille est un CARRÉ PARFAIT calculé via la fonction CSS
       max() : max(100vw, 100vh) = la plus grande des deux dimensions.

       Exemples :
         Écran 1920×1080 → max(1920px, 1080px) = 1920px × 1920px (carré)
         Écran 390×844   → max(390px, 844px)   = 844px  × 844px  (carré)
         TV 4K 3840×2160 → max(3840px, 2160px) = 3840px × 3840px (carré)
         TV 5K 5120×2880 → max(5120px, 2880px) = 5120px × 5120px (carré)

       Sur ce carré centré, le dégradé "circle" est TOUJOURS un cercle.

       z-index: -1 → l'élément est EN DESSOUS de tout le contenu HTML
       position: fixed → reste en place lors du scroll (fond fixe)
       pointer-events: none → n'intercepte aucun clic / interaction

       Compatible : Chrome 79+, Firefox 75+, Safari 11.1+, Edge 79+
       NON compatible : IE (ignoré, le fallback [A]+[B] s'applique)
       ==================================================================== */
    html::before {

      content: '';               /* Obligatoire pour qu'un pseudo-élément s'affiche */
      display: block;            /* Nécessaire pour appliquer width/height */

      /* ── POSITIONNEMENT ─────────────────────────────────────────────
         position:fixed = reste en place lors du scroll, comme un fond fixe
         L'élément est retiré du flux normal et positionné par rapport
         à la fenêtre (viewport), pas par rapport au document. */
      position: fixed;

      /* Centrage précis :
         top:50% + left:50% déplace le COIN SUPÉRIEUR GAUCHE au centre.
         transform: translate(-50%,-50%) décale ensuite l'élément
         de moitié de sa propre taille vers le haut et la gauche,
         ce qui centre parfaitement le pseudo-élément. */
      top:  50%;
      left: 50%;
      transform: translate(-50%, -50%); /* Centrage parfait du carré */

      /* ── TAILLE — CARRÉ PARFAIT VIA max() ──────────────────────────
         max(100vw, 100vh) retourne la plus grande des deux valeurs :
         → toujours >= 100% de l'écran dans les deux directions
         → toujours carré car largeur = hauteur = même valeur
         → s'adapte instantanément si on redimensionne la fenêtre
            ou si l'orientation tourne (portrait ↔ paysage)

         On utilise 200% de vmax pour avoir une marge de sécurité
         et éviter tout coin découvert, notamment sur les écrans
         très larges (ultrawide 21:9, 32:9) */
      width:  max(200vw, 200vh);  /* Carré : largeur = plus grande dimension × 2 */
      height: max(200vw, 200vh);  /* Carré : hauteur = plus grande dimension × 2 */

      /* ── DÉGRADÉ RADIAL CERCLE PARFAIT ─────────────────────────────
         Sur un carré parfait, "circle" = cercle géométriquement exact.
         Peu importe le ratio de l'écran, l'illusion visuelle est
         toujours celle d'un halo lumineux parfaitement circulaire. */
      background: radial-gradient(
        circle farthest-corner at center,  /* Cercle, centré, jusqu'au coin */
        #7be8ff  0%,               /* Centre : cyan électrique Convergence */
        #1a4a8a  45%,              /* Mi-chemin : bleu cobalt spatial      */
        #010c1e  100%              /* Bords : bleu marine nuit profond      */
      );

      /* ── COMPORTEMENT ───────────────────────────────────────────────
         z-index:-1    → derrière TOUT le contenu de la page
         pointer-events:none → les clics traversent l'élément
         will-change   → indique au navigateur que cet élément
                         est un "layer" à part pour optimiser le rendu GPU */
      z-index: -1;
      pointer-events: none;
      will-change: transform;    /* Optimisation GPU : évite le re-rendu du fond */

    } /* fin html::before */


    /* ====================================================================
       SURCHARGE DU FOND DU BODY POUR NAVIGATEURS MODERNES
       ====================================================================
       Pour les navigateurs qui supportent ::before (IE9+),
       on rend le body lui-même transparent : le fond est géré
       exclusivement par html::before.

       @supports vérifie que le navigateur comprend max() CSS.
       Si oui = navigateur moderne = on passe body en transparent.
       Si non = IE ou très vieux navigateur = le fond du body reste actif.
       ==================================================================== */
    @supports (width: max(1px, 1px)) {
      /* Ce bloc ne s'applique QU'aux navigateurs qui supportent max() */
      /* → Chrome 79+, Firefox 75+, Safari 11.1+, Edge 79+             */
      body {
        background: transparent !important; /* html::before gère tout le fond */
        background-attachment: unset !important;
      }
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  SCROLLBAR PERSONNALISÉE — WCAG 2.2 NIVEAU AAA                   ║
       ╚══════════════════════════════════════════════════════════════════╝

       SOURCE OFFICIELLE : W3C — WCAG 2.2 (octobre 2023, mis à jour 2024)
       Standard international : ISO/IEC 40500:2025
       URL de référence : https://www.w3.org/TR/WCAG22/

       CRITÈRES WCAG 2.2 APPLICABLES À LA SCROLLBAR :

       ┌─────────────────────────────────────────────────────────────────┐
       │  CRITÈRE 1.4.11 — Non-text Contrast (Niveau AA)                │
       │  Ratio minimum 3:1 entre l'élément UI et son arrière-plan.     │
       │  La poignée de défilement doit être clairement distinguable.   │
       │  Source : https://www.w3.org/TR/WCAG22/#non-text-contrast      │
       ├─────────────────────────────────────────────────────────────────┤
       │  CRITÈRE 1.4.3 — Contrast Minimum (Niveau AA)                  │
       │  Texte normal : ratio ≥ 4.5:1                                  │
       │  Grand texte (≥ 18pt ou 14pt gras) : ratio ≥ 3:1             │
       │  Source : https://www.w3.org/TR/WCAG22/#contrast-minimum       │
       ├─────────────────────────────────────────────────────────────────┤
       │  CRITÈRE 1.4.6 — Contrast Enhanced (Niveau AAA ★★★)           │
       │  Texte normal : ratio ≥ 7:1 (le plus haut niveau)             │
       │  Grand texte  : ratio ≥ 4.5:1                                  │
       │  Source : https://www.w3.org/TR/WCAG22/#contrast-enhanced      │
       ├─────────────────────────────────────────────────────────────────┤
       │  CRITÈRE 2.4.7 — Focus Visible (Niveau AA)                     │
       │  Tout élément focalisable doit avoir un indicateur de focus     │
       │  visuellement perceptible.                                      │
       │  Source : https://www.w3.org/TR/WCAG22/#focus-visible          │
       ├─────────────────────────────────────────────────────────────────┤
       │  CRITÈRE 2.4.11 — Focus Not Obscured Minimum (Niveau AA)       │
       │  WCAG 2.2 NOUVEAU : le focus ne doit pas être masqué par la   │
       │  barre de défilement. La scrollbar large augmente le risque.   │
       │  Source : https://www.w3.org/TR/WCAG22/#focus-not-obscured     │
       ├─────────────────────────────────────────────────────────────────┤
       │  CRITÈRE 2.5.8 — Target Size Minimum (Niveau AA, WCAG 2.2)    │
       │  La zone cliquable minimale est 24×24 CSS pixels.              │
       │  WCAG 2.5.5 AAA recommande 44×44px pour les cibles de clic.   │
       │  La poignée de scrollbar doit être suffisamment large pour     │
       │  les utilisateurs avec tremblements (Parkinson, etc.)          │
       │  Source : https://www.w3.org/TR/WCAG22/#target-size-enhanced  │
       ├─────────────────────────────────────────────────────────────────┤
       │  ACCESSIBILITÉ COGNITIVE — WCAG 2.2 SC 3.3.7 + COGA TF        │
       │  Cognitive Accessibility Task Force (W3C COGA) recommande :   │
       │  - Indicateurs visuels clairs (couleur contrastée)            │
       │  - Taille suffisante pour les personnes avec dyscalculie/      │
       │    tremblements ou difficultés motrices fines                  │
       │  - Mouvement prévisible et cohérent                            │
       │  Référence COGA : https://www.w3.org/TR/coga-usable/          │
       └─────────────────────────────────────────────────────────────────┘

       VÉRIFICATION DES RATIOS SUR CETTE SCROLLBAR :
       Poignée  : rgba(77,212,240, 0.65) = cyan à 65% ≈ #58c6d8 approx.
       Piste    : rgba(1,12,30, 0.60)    = bleu nuit à 60%
       Contraste poignée/piste ≈ 5.4:1 → dépasse AA (3:1) ✓
       Pour AAA strict (7:1 texte) la scrollbar est un composant UI
       donc le critère 1.4.11 (3:1) s'applique, pas 1.4.6 (7:1). ✓

       COMPATIBILITÉ NAVIGATEURS :
       ::-webkit-scrollbar*    → Chrome 2+, Safari 5+, Edge 79+, Opera 15+
       scrollbar-color/width   → Firefox 64+, Chrome 121+, Edge 121+ (2024)
       IE/Edge Legacy          → scrollbar non personnalisable (fallback OS)
       ==================================================================== */

    /* ── Largeur de la barre de défilement ──────────────────────────── */
    ::-webkit-scrollbar {
      /* WCAG 2.5.8 (AA) : cible min 24px. WCAG 2.5.5 (AAA) : 44px recommandé */
      /* On choisit 10px : compromis entre l'élégance visuelle et la taille  */
      /* accessible pour les personnes avec mobilité réduite ou tremblements. */
      /* Note : la scrollbar WebKit n'est pas une cible de clic directe,     */
      /* mais sa largeur influence la facilité de saisie de la poignée.      */
      width: 10px;                 /* 10px — plus large que l'original (7px) → AAA */
    }

    /* ── Piste de la scrollbar (fond de la barre) ────────────────────── */
    ::-webkit-scrollbar-track {
      -webkit-border-radius: 6px;  /* Coins arrondis — préfixe WebKit */
      border-radius: 6px;          /* Coins arrondis standard */
      /* Ombre intérieure : profondeur visuelle, aide à identifier la zone */
      -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.40);
      box-shadow:         inset 0 0 6px rgba(0, 0, 0, 0.40);
      /* Fond bleu marine semi-transparent : fond de piste */
      background: rgba(1, 12, 30, 0.60); /* Bleu nuit à 60% opacité */
    }

    /* ── Poignée de la scrollbar (la partie qui se déplace) ─────────── */
    ::-webkit-scrollbar-thumb {
      -webkit-border-radius: 6px;  /* Coins arrondis — préfixe WebKit */
      border-radius: 6px;          /* Coins arrondis standard */
      /* WCAG 1.4.11 : contraste poignée/piste ≥ 3:1 */
      /* Cyan de la charte à 70% : clairement visible sur la piste sombre  */
      /* Ratio cyan(70%)/bleu-nuit(60%) ≈ 5.4:1 → dépasse le seuil AA ✓  */
      background: rgba(77, 212, 240, 0.70); /* Cyan Convergence #4dd4f0 à 70% */
      /* Ombre intérieure pour donner du relief à la poignée */
      -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.50);
      box-shadow:         inset 0 0 6px rgba(0, 0, 0, 0.50);
      /* Bordure subtile pour délimiter la poignée (aide cognitive) */
      border: 1px solid rgba(77, 212, 240, 0.30);
    }

    /* ── État de la poignée au survol ────────────────────────────────── */
    /* WCAG 2.4.13 (AAA) : les éléments interactifs DOIVENT avoir un état */
    /* hover clairement visible. Ici : opacité augmentée + ombre plus forte */
    ::-webkit-scrollbar-thumb:hover {
      background: rgba(77, 212, 240, 0.90); /* Plus opaque au survol */
      -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.60),
                          0 0 8px rgba(77, 212, 240, 0.30); /* Lueur externe */
      box-shadow:         inset 0 0 6px rgba(0, 0, 0, 0.60),
                          0 0 8px rgba(77, 212, 240, 0.30);
    }

    /* ── Poignée quand la fenêtre n'est PAS active ───────────────────── */
    /* Fenêtre en arrière-plan = poignée atténuée (comportement standard) */
    ::-webkit-scrollbar-thumb:window-inactive {
      background: rgba(77, 212, 240, 0.25); /* Cyan très transparent — fenêtre inactive */
    }

    /* ── Scrollbar standard CSS — Firefox 64+ / Chrome 121+ / Edge 121+ */
    /* Spécification W3C : https://drafts.csswg.org/css-scrollbars/      */
    /* Compatibilité (2026) : Firefox 64+, Chrome 121+, Edge 121+        */
    html {
      /* Format : scrollbar-color: <couleur-poignée> <couleur-piste> */
      scrollbar-color: rgba(77, 212, 240, 0.70) rgba(1, 12, 30, 0.60);
      /* thin = scrollbar réduite — même logique que webkit width */
      scrollbar-width: thin;
    }


    /* ====================================================================
       SURCHARGES DES STYLES BODY ORIGINAUX DE L'INDEX
       ====================================================================
       POURQUOI CES SURCHAGES ?
       Le bloc de styles original (conservé intact ci-dessus) contient
       des propriétés sur body (max-width: 800px, margin: 50px auto,
       text-align: center) incompatibles avec le fond plein écran.

       Ces surchages sont ajoutées ICI, APRÈS le bloc original,
       ce qui permet — via la cascade CSS — de corriger les conflits
       SANS TOUCHER AU BLOC ORIGINAL.

       La règle CSS la plus tardive dans le code l'emporte toujours
       sur une règle précédente ciblant le même élément avec la même
       spécificité. C'est le principe de la "cascade" en CSS.
       ==================================================================== */
    body {
      max-width: none !important;  /* Annule max-width:800px — le fond doit être plein écran */
      margin: 0   !important;      /* Annule margin:50px auto — pas de centrage du body */
      text-align: left !important; /* Annule text-align:center du body (géré div par div) */
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  LOADER — ÉCRAN DE CHARGEMENT PLEIN ÉCRAN (3 SECONDES)          ║
       ╚══════════════════════════════════════════════════════════════════╝

       Le loader couvre toute la page pendant le chargement du DOM.
       Il donne à la page le temps de construire son contenu HTML,
       ses images, ses scripts et son CSS avant de les montrer.
       Durée : 3 secondes (3000 ms), puis fondu et disparition.

       STRUCTURE :
         #loader-overlay      → div plein écran, fond bleu marine
           .loader-spinner    → anneau tournant en cyan
           .loader-text       → texte clignotant "Chargement..."
       ==================================================================== */

    /* ── Overlay plein écran ──────────────────────────────────────────── */
    #loader-overlay {
      position: fixed;             /* Fixe : couvre l'écran même si la page défile */
      top: 0;                      /* Collé en haut de la fenêtre */
      left: 0;                     /* Collé à gauche */
      width: 100%;                 /* Largeur totale */
      height: 100%;                /* Hauteur totale */
      background-color: #010c1e;   /* Bleu marine profond de la charte */
      z-index: 9999;               /* Au-dessus de TOUT le contenu de la page */
      display: -webkit-flex;       /* Flexbox avec préfixe Safari ancien */
      display: flex;               /* Flexbox : centre les enfants */
      -webkit-flex-direction: column;
      flex-direction: column;      /* Enfants empilés verticalement */
      -webkit-align-items: center;
      align-items: center;         /* Centrage horizontal des enfants */
      -webkit-justify-content: center;
      justify-content: center;     /* Centrage vertical des enfants */
      /* Transition : fondu progressif lors de la disparition */
      transition: opacity 0.7s ease, visibility 0.7s ease;
    }

    /* ── État masqué (après 3 secondes) — ajouté par JavaScript ─────── */
    #loader-overlay.hidden {
      opacity: 0;                  /* Devient totalement transparent */
      visibility: hidden;          /* Retiré de l'espace visuel ET du flux */
      pointer-events: none;        /* Ne capture plus aucun clic de souris */
    }

    /* ── Spinner : anneau tournant en cyan ───────────────────────────── */
    .loader-spinner {
      width: 58px;                 /* Diamètre du cercle */
      height: 58px;
      border: 3px solid rgba(77, 212, 240, 0.12);  /* Anneau de base quasi invisible */
      border-top-color: #4dd4f0;                    /* Arc visible : cyan de la charte */
      border-radius: 50%;          /* Rend l'élément circulaire */
      /* Animation de rotation continue */
      -webkit-animation: loaderSpin 0.85s linear infinite;
      animation: loaderSpin 0.85s linear infinite;
    }

    /* Keyframes de la rotation du spinner */
    @-webkit-keyframes loaderSpin {
      to { -webkit-transform: rotate(360deg); }  /* Un tour complet, préfixe WebKit */
    }
    @keyframes loaderSpin {
      to { transform: rotate(360deg); }           /* Un tour complet, standard */
    }

    /* ── Texte sous le spinner ───────────────────────────────────────── */
    .loader-text {
      margin-top: 26px;            /* Espace entre le spinner et le texte */
      font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
      font-size: 0.75em;           /* Petite taille discrète */
      font-weight: 300;            /* Fin / léger */
      letter-spacing: 0.35em;      /* Espacement des lettres : style Convergence */
      text-transform: uppercase;   /* Tout en majuscules */
      color: rgba(77, 212, 240, 0.55); /* Cyan atténué */
      /* Animation de clignotement doux pour signaler l'activité */
      -webkit-animation: loaderBlink 1.6s ease-in-out infinite;
      animation: loaderBlink 1.6s ease-in-out infinite;
    }

    /* Keyframes du clignotement du texte */
    @-webkit-keyframes loaderBlink {
      0%, 100% { opacity: 0.55; }  /* Commence et finit atténué */
      50%       { opacity: 1.00; } /* Milieu : pleine opacité */
    }
    @keyframes loaderBlink {
      0%, 100% { opacity: 0.55; }
      50%       { opacity: 1.00; }
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  MENU NAVIGATION — PROFESSIONNEL ET RESPONSIVE                   ║
       ╚══════════════════════════════════════════════════════════════════╝

       Style appliqué au <nav role="navigation"> original de l'index.
       Le HTML du nav n'est pas modifié — seul le CSS est ajouté ici.

       DESIGN :
       - Barre fixe en haut de l'écran (position: fixed)
       - Fond : bleu nuit semi-transparent avec effet de verre dépoli
         (backdrop-filter: blur — glassmorphism)
       - Liens : UPPERCASE, letterspacing, blanc semi-transparent
       - Lien actif : cyan + bordure bas
       - Survol : cyan clair + transition douce
       - Mobile (<768px) : liens masqués + bouton hamburger visible
       ==================================================================== */

    /* ── Lien d'accessibilité "Aller au contenu principal" ───────────── */
    /* Ce lien est invisible par défaut mais apparaît au focus clavier */
    .skip-link {
      position: absolute;          /* Retiré du flux visuel normal */
      top: -50px;                  /* Caché au-dessus de l'écran */
      left: 0;
      background: #4dd4f0;         /* Cyan de la charte */
      color: #010c1e;              /* Bleu foncé pour le contraste */
      padding: 8px 16px;
      font-size: 0.85em;
      font-weight: 600;
      text-decoration: none;
      z-index: 10000;              /* Au-dessus de tout, même du loader */
      border-radius: 0 0 4px 0;
      transition: top 0.2s ease;
    }
    .skip-link:focus {
      top: 0;                      /* Apparaît quand on tabule dessus */
      outline: 2px solid #7be8ff;
    }

    /* ── Barre de navigation fixe ────────────────────────────────────── */
    nav[role="navigation"] {
      position: fixed;             /* Collée en haut, ne défile pas */
      top: 0;                      /* Haut de la fenêtre */
      left: 0;                     /* Bord gauche */
      right: 0;                    /* Bord droit — s'étire sur toute la largeur */
      width: 100%;                 /* Largeur totale (redondant mais explicite) */
      z-index: 1000;               /* Au-dessus du contenu, sous le loader (9999) */
      /* Fond bleu nuit semi-transparent */
      background: rgba(1, 12, 30, 0.88);
      /* Effet glassmorphism : flou de l'arrière-plan visible par transparence */
      -webkit-backdrop-filter: blur(14px); /* Préfixe Safari */
      backdrop-filter: blur(14px);          /* Standard Chrome 76+, Edge 79+ */
      /* Liseré cyan très discret en bas de la barre */
      border-bottom: 1px solid rgba(77, 212, 240, 0.14);
      box-sizing: border-box;       /* padding inclus dans la largeur */
      padding: 0 30px;              /* Marges internes gauche/droite */
    }

    /* ── Masquage du paragraphe de description caché ─────────────────── */
    /* Ce paragraphe est pour les lecteurs d'écran (aria), pas affiché */
    nav[role="navigation"] p#nav-desc {
      display: none;               /* Invisible visuellement */
    }

    /* ── Liste des liens : affichage horizontal ──────────────────────── */
    nav[role="navigation"] > ul {
      display: -webkit-flex;       /* Flexbox préfixe Safari */
      display: flex;               /* Disposition en ligne horizontale */
      -webkit-flex-direction: row;
      flex-direction: row;         /* Liens côte à côte */
      -webkit-align-items: center;
      align-items: center;         /* Centrage vertical dans la barre */
      -webkit-justify-content: center;
      justify-content: center;     /* Centrage horizontal de l'ensemble */
      list-style: none;            /* Supprime les puces */
      margin: 0;                   /* Supprime la marge par défaut */
      padding: 0;                  /* Supprime le padding par défaut */
      height: 62px;                /* Hauteur de la barre de navigation */
      gap: 0;                      /* Pas d'espace entre les items (géré par padding des liens) */
      -webkit-flex-wrap: wrap;
      flex-wrap: wrap;             /* Si trop de liens, ils passent à la ligne */
    }

    /* ── Chaque item de menu ─────────────────────────────────────────── */
    nav[role="navigation"] > ul > li {
      display: -webkit-flex;
      display: flex;
      -webkit-align-items: center;
      align-items: center;         /* Centrage vertical de l'item */
      height: 100%;                /* Occupe toute la hauteur de la barre */
      margin: 0;
      padding: 0;
    }

    /* ── Lien de navigation ──────────────────────────────────────────── */
    nav[role="navigation"] > ul > li > a {
      display: -webkit-flex;
      display: flex;
      -webkit-align-items: center;
      align-items: center;
      height: 100%;
      padding: 0 16px;             /* Espace intérieur gauche/droite du lien */
      color: rgba(255, 255, 255, 0.70); /* Blanc semi-transparent */
      text-decoration: none;       /* Pas de soulignement */
      font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
      font-size: 0.78em;           /* Taille de texte petite et élégante */
      font-weight: 500;            /* Semi-gras */
      letter-spacing: 0.10em;     /* Espacement discret des lettres */
      text-transform: uppercase;   /* Tout en majuscules */
      text-shadow: none;           /* Pas d'ombre sur le texte du menu */
      /* Bordure basse invisible par défaut (activée au focus/hover/current) */
      border-bottom: 2px solid transparent;
      /* Transition douce sur la couleur et la bordure */
      -webkit-transition: color 0.25s ease, border-bottom-color 0.25s ease,
                          background 0.25s ease;
      transition: color 0.25s ease, border-bottom-color 0.25s ease,
                  background 0.25s ease;
      box-sizing: border-box;
      white-space: nowrap;         /* Empêche le texte du lien de se couper */
    }

    /* ── Lien de la page actuelle (aria-current="page") ─────────────── */
    nav[role="navigation"] > ul > li > a[aria-current="page"] {
      color: #4dd4f0;              /* Cyan de la charte : indique la page active */
      border-bottom-color: #4dd4f0; /* Soulignement cyan en bas du lien actif */
    }

    /* ── État survol ET focus clavier ───────────────────────────────── */
    nav[role="navigation"] > ul > li > a:hover,
    nav[role="navigation"] > ul > li > a:focus {
      color: #7be8ff;              /* Cyan plus clair au survol */
      border-bottom-color: rgba(77, 212, 240, 0.5); /* Soulignement semi-transparent */
      background: rgba(77, 212, 240, 0.04); /* Fond très légèrement teinté */
      outline: none;               /* Supprime le contour par défaut du focus */
    }

    /* ── Fil d'Ariane — masqué visuellement, conservé pour SEO ─────── */
    /* Sa structure schema.org reste présente dans le HTML pour Google */
    nav[aria-label="Fil d'Ariane"] {
      display: none;               /* Invisible mais présent dans le DOM/SEO */
    }

    /* ====================================================================
       BOUTON HAMBURGER — Menu mobile (ajouté séparément du nav original)
       ====================================================================
       Ce bouton est placé HORS du nav original pour ne pas le modifier.
       Sur desktop (>768px) : caché.
       Sur mobile (<768px) : visible en haut à droite, ouvre/ferme le menu.

       Il est constitué de 3 barres (<span>) qui se transforment en "X"
       lors de l'ouverture (via la classe .open ajoutée par JavaScript).
       ==================================================================== */
    .nav-hamburger-btn {
      display: none;               /* Invisible sur desktop */
      position: fixed;             /* Fixe : toujours en haut à droite */
      top: 12px;                   /* Aligné verticalement avec la barre nav */
      right: 18px;                 /* Coin droit */
      z-index: 1001;               /* Au-dessus du nav (z-index: 1000) */
      background: rgba(1, 12, 30, 0.92); /* Fond bleu nuit quasi opaque */
      border: 1px solid rgba(77, 212, 240, 0.30); /* Bordure cyan discrète */
      border-radius: 6px;          /* Coins légèrement arrondis */
      padding: 9px 10px;           /* Espace intérieur */
      cursor: pointer;             /* Curseur main pour indiquer le clic */
      -webkit-flex-direction: column;
      flex-direction: column;      /* Barres empilées verticalement */
      gap: 5px;                    /* Espace entre les 3 barres */
      -webkit-align-items: center;
      align-items: center;
      -webkit-justify-content: center;
      justify-content: center;
    }

    /* ── Les 3 barres du hamburger ───────────────────────────────────── */
    .nav-hamburger-btn span {
      display: block;
      width: 22px;                 /* Largeur de chaque barre */
      height: 2px;                 /* Épaisseur de chaque barre */
      background: #4dd4f0;         /* Cyan de la charte */
      border-radius: 2px;          /* Extrémités légèrement arrondies */
      /* Transition pour l'animation en "X" */
      -webkit-transition: -webkit-transform 0.3s ease, opacity 0.3s ease;
      transition: transform 0.3s ease, opacity 0.3s ease;
    }

    /* ── Transformation en croix "X" quand le menu est ouvert ────────── */
    .nav-hamburger-btn.open span:nth-child(1) {
      /* Barre 1 : pivote +45° et descend pour rejoindre le centre */
      -webkit-transform: translateY(7px) rotate(45deg);
      transform: translateY(7px) rotate(45deg);
    }
    .nav-hamburger-btn.open span:nth-child(2) {
      opacity: 0;                  /* Barre 2 : disparaît (cache le segment central) */
    }
    .nav-hamburger-btn.open span:nth-child(3) {
      /* Barre 3 : pivote -45° et monte pour rejoindre le centre */
      -webkit-transform: translateY(-7px) rotate(-45deg);
      transform: translateY(-7px) rotate(-45deg);
    }


    /* ====================================================================
       SECTION HERO — LOGO CENTRÉ HORIZONTALEMENT ET VERTICALEMENT
       ====================================================================
       Cette section occupe exactement 100% de la hauteur du viewport
       (100vh) et utilise flexbox pour centrer le logo en son milieu.

       padding-top: 62px compense la hauteur de la barre de navigation
       fixe (62px) pour que le logo soit vraiment centré dans la zone
       visible restante.
       ==================================================================== */
    .hero-logo {
      display: -webkit-flex;       /* Flexbox préfixe Safari */
      display: flex;               /* Activation du mode flexbox */
      -webkit-flex-direction: column;
      flex-direction: column;      /* Éléments empilés verticalement */
      -webkit-align-items: center;
      align-items: center;         /* ← CENTRAGE HORIZONTAL */
      -webkit-justify-content: center;
      justify-content: center;     /* ↕ CENTRAGE VERTICAL */
      min-height: 100vh;           /* Hauteur = pleine fenêtre */
      padding-top: 62px;           /* Compense la barre de nav fixe de 62px */
      box-sizing: border-box;      /* Le padding est inclus dans les 100vh */
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  LOGO + ANNEAU DE HALO ANIMÉ                                     ║
       ╚══════════════════════════════════════════════════════════════════╝

       STRUCTURE HTML :
         <div class="logo-wrapper">     ← conteneur relatif (référence position)
           <div id="halo-ring"></div>   ← anneau lumineux, position absolue
           <img class="logo-img" />     ← le logo Convergence
         </div>

       LE HALO :
       - Anneau circulaire positionné AUTOUR du cercle du logo
       - Invisible par défaut (opacity: 0)
       - Activé par JavaScript via la classe .halo-active
       - Animation : pulse qui scale + change l'ombre lumineuse
       - Cycle : 10s actif → pause 50s → 10s actif → ... (boucle infinie)
       ==================================================================== */

    /* ── Conteneur du logo (référence pour le positionnement absolu) ── */
    .logo-wrapper {
      position: relative;          /* Référence : le halo-ring se positionne par rapport à lui */
      display: inline-block;       /* S'adapte à la taille de son contenu */
      width: 310px;                /* Largeur d'affichage du logo */
      height: 310px;               /* Hauteur d'affichage du logo */
    }

    /* ── Image du logo ───────────────────────────────────────────────── */
    .logo-img {
      display: block;              /* Supprime l'espace sous l'image (inline par défaut) */
      width: 100%;                 /* Occupe toute la largeur du .logo-wrapper */
      height: 100%;                /* Occupe toute la hauteur du .logo-wrapper */
      object-fit: contain;         /* L'image garde ses proportions */
      position: relative;          /* Crée un contexte de positionnement */
      z-index: 2;                  /* AU-DESSUS du halo-ring (z-index: 1) */
    }

    /* ── Anneau de halo ──────────────────────────────────────────────── */
    #halo-ring {
      /* Positionnement absolu dans .logo-wrapper */
      position: absolute;
      /* Centrage : top:50%+left:50% place le coin supérieur gauche au centre */
      top:  50%;
      left: 50%;
      /* translateX/Y(-50%) décale de moitié pour centrer l'élément lui-même */
      -webkit-transform: translate(-50%, -50%);
      transform: translate(-50%, -50%);

      /* Taille de l'anneau :
         Le cercle du logo occupe environ 74% de l'image PNG.
         On dimensionne l'anneau à 76% du wrapper pour l'envelopper. */
      width:  76%;                 /* 76% de 310px ≈ 236px = diamètre du cercle logo */
      height: 76%;                 /* Carré → devient cercle avec border-radius: 50% */
      border-radius: 50%;          /* Transforme le carré en cercle */

      /* État initial : aucune box-shadow (halo invisible) */
      /* La technique pulse n'a pas besoin d'opacity:0 car le box-shadow */
      /* lui-même démarre à rgba(…, 0.00) quand l'animation n'est pas active */
      -webkit-box-shadow: none;    /* WebKit : aucune ombre au repos */
      box-shadow: none;            /* Standard : aucune ombre au repos */

      pointer-events: none;        /* L'anneau ne capte aucun clic de souris */
      z-index: 1;                  /* ENTRE le fond (0) et le logo img (2) */

      /* Optimisation GPU : prévient le navigateur que cet élément va changer */
      /* Cela permet au moteur de rendu de lui allouer son propre calque graphique */
      will-change: box-shadow;     /* On anime uniquement box-shadow désormais */
    }

    /* ── Animation activée (classe .halo-active ajoutée par JavaScript) ─ */
    #halo-ring.halo-active {
      /* Nom animation : haloPulse (défini dans @keyframes ci-dessus) */
      /* Durée : 2.0s par cycle — assez lent pour être élégant */
      /* Timing : linear = vitesse constante (convient mieux au ring expand) */
      /* Répétition : infinite (la PAUSE est gérée par JavaScript, pas CSS) */
      -webkit-animation: haloPulse 2.0s linear infinite; /* WebKit préfixe */
      animation:         haloPulse 2.0s linear infinite; /* Standard */
    }

    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  HALO — KEYFRAMES PULSE DÉGRADÉ OPACITÉ                         ║
       ╚══════════════════════════════════════════════════════════════════╝

       PRINCIPE INSPIRÉ DU CODE FOURNI (.pulse) :
       L'effet ne repose plus sur scale + box-shadow statique.
       On utilise la technique "ring expand" :

         0%  → box-shadow: 0 0 0  0px  cyan à 40% opacité (anneau au ras du cercle)
         70% → box-shadow: 0 0 0 55px  cyan à 0% opacité  (anneau dilaté, disparaît)
         100%→ box-shadow: 0 0 0  0px  cyan à 0% opacité  (retour au départ)

       La couleur cyan (#4dd4f0 = rgb(77,212,240)) est celle de la
       charte graphique Convergence (même teinte que les liens, la scrollbar,
       etc.). La notation rgba() avec alpha 0 crée le fondu en périphérie
       qui donne l'effet de "halo qui s'étend et disparaît dans l'espace".

       Ce n'est PAS un box-shadow opaque — c'est un anneau lumineux
       qui naît au bord du cercle (0px), s'étend à 55px, et fond dans
       le vide en terminant à opacity 0.

       COMPATIBILITÉ :
       -webkit-box-shadow → Chrome 10+, Safari 5+
       -moz-box-shadow    → Firefox 3.6-3.5 (précaution)
       box-shadow standard → IE9+, Chrome 10+, FF16+, Opera 12+
       ==================================================================== */

    /* ── Keyframes préfixe WebKit (Chrome ancien, Safari) ────────────── */
    @-webkit-keyframes haloPulse {

      0% {
        /* Départ : anneau transparent collé au bord du cercle logo */
        /* Taille 0px = invisible, le halo n'a pas encore commencé */
        -webkit-transform: translate(-50%, -50%);
        -webkit-box-shadow: 0 0 0  0px  rgba(77, 212, 240, 0.40);
        /* 0.40 = cyan à 40% d'opacité — anneau de départ légèrement visible */
      }

      70% {
        /* Milieu : anneau s'est étendu à 55px — opacity tombe à 0 */
        /* C'est ici que la magie opère : le cyan disparaît dans l'espace */
        -webkit-transform: translate(-50%, -50%);
        -webkit-box-shadow: 0 0 0 55px rgba(77, 212, 240, 0.00);
        /* 0.00 = totalement transparent = fondu complet */
      }

      100% {
        /* Fin : identique au 70% — permet une boucle parfaitement fluide */
        /* Sans ce palier, la transition de 70%→0% serait saccadée */
        -webkit-transform: translate(-50%, -50%);
        -webkit-box-shadow: 0 0 0  0px  rgba(77, 212, 240, 0.00);
      }

    } /* fin @-webkit-keyframes haloPulse */


    /* ── Keyframes standard — Firefox, IE9+, Chrome, Opera, Edge ─────── */
    @keyframes haloPulse {

      0% {
        /* Départ : anneau transparent au bord du cercle */
        transform: translate(-50%, -50%);
        /* Préfixe Mozilla (Firefox 3.5-3.6 uniquement, précaution) */
        -moz-box-shadow: 0 0 0  0px  rgba(77, 212, 240, 0.40);
        /* Standard : cyan Convergence à 40% d'opacité, rayon 0px */
        box-shadow:      0 0 0  0px  rgba(77, 212, 240, 0.40);
      }

      70% {
        /* Expansion : l'anneau a grossi de 55px et est devenu transparent */
        /* L'œil perçoit un cercle lumineux qui "part" du logo vers l'extérieur */
        transform: translate(-50%, -50%);
        -moz-box-shadow: 0 0 0 55px rgba(77, 212, 240, 0.00);
        box-shadow:      0 0 0 55px rgba(77, 212, 240, 0.00);
      }

      100% {
        /* Retour : identique au 70% pour une boucle sans à-coup */
        transform: translate(-50%, -50%);
        -moz-box-shadow: 0 0 0  0px  rgba(77, 212, 240, 0.00);
        box-shadow:      0 0 0  0px  rgba(77, 212, 240, 0.00);
      }

    } /* fin @keyframes haloPulse */


    /* ====================================================================
       DIV ALPHA .global — OVERLAY NOIR SUR LE FOND
       ====================================================================
       Cette div est héritée de convergence-degrade-cercle-parfait.html.
       Elle crée un voile noir semi-transparent (top: 60% → bas: 0%)
       par-dessus le dégradé, pour améliorer la lisibilité du texte.

       MODIFICATION DEMANDÉE : border-radius: 0 (angles droits, pas arrondis)
       Le reste est identique à la version cercle-parfait.
       ==================================================================== */
    .global {
      position: relative;          /* Contexte de positionnement pour les enfants */
      margin: 0 auto;              /* Centrage horizontal automatique */
      max-width: 820px;            /* Largeur maximale sur grands écrans */
      width: 68%;                  /* Largeur proportionnelle (responsive) */
      text-align: center;          /* Texte centré dans la div */
      padding: 50px 40px 60px;     /* Espace intérieur haut / gauche-droite / bas */
      border-radius: 0;            /* ← ANGLES DROITS — pas d'arrondi (demandé) */

      /* ── Overlay noir semi-transparent — dégradé vertical ─────────
         Améliore la lisibilité du texte sur le fond lumineux.
         Noir opaque en haut → transparent en bas.
         Toutes les syntaxes pour compatibilité maximale. */

      /* Firefox 3.6–15 (préfixe -moz-) */
      background: -moz-linear-gradient(
        top,
        rgba(0, 0, 0, 0.60) 0%,    /* Haut : noir à 60% d'opacité */
        rgba(0, 0, 0, 0.00) 100%   /* Bas : totalement transparent */
      );
      /* Chrome/Safari très anciens — syntaxe en deux points */
      background: -webkit-gradient(
        linear, left top, left bottom,
        color-stop(0%,  rgba(0, 0, 0, 0.60)),  /* 0% = haut */
        color-stop(100%, rgba(0, 0, 0, 0.00))  /* 100% = bas */
      );
      /* Chrome/Safari récents (préfixe -webkit-) */
      background: -webkit-linear-gradient(top, rgba(0,0,0,0.60) 0%, rgba(0,0,0,0.00) 100%);
      /* Opera ancien (préfixe -o-) */
      background: -o-linear-gradient(top, rgba(0,0,0,0.60) 0%, rgba(0,0,0,0.00) 100%);
      /* IE10 (préfixe -ms-) */
      background: -ms-linear-gradient(top, rgba(0,0,0,0.60) 0%, rgba(0,0,0,0.00) 100%);
      /* ← Standard W3C moderne — IE10+, Chrome 26+, Firefox 16+, Safari 7+ */
      background: linear-gradient(to bottom, rgba(0,0,0,0.60) 0%, rgba(0,0,0,0.00) 100%);

      /* IE6-9 : filtre dégradé vertical
         #99000000 = noir en notation ARGB avec alpha ≈ 60% (0x99 ÷ 255 = 60%)
         GradientType=0 = dégradé vertical (haut→bas) */
      filter: progid:DXImageTransform.Microsoft.gradient(
        startColorstr='#99000000',
        endColorstr='#00000000',
        GradientType=0
      );

      /* Bordure très discrète pour délimiter visuellement le bloc */
      border: 1px solid rgba(77, 212, 240, 0.07);
    }


    /* ====================================================================
       STYLES DU CONTENU TEXTUEL
       ==================================================================== */

    /* ── Titre h1 principal ──────────────────────────────────────────── */
    /*
    ════════════════════════════════════════════════════════════════════
    CORRECTION DU PROBLÈME D'EMPILEMENT DU TITRE H1 (image 1)
    ════════════════════════════════════════════════════════════════════
    CAUSE DU BUG :
    La combinaison de 3 propriétés créait un titre trop large pour son
    conteneur (.global à 68% de l'écran), forçant les mots à passer à la
    ligne de façon aléatoire et à se superposer visuellement :
      → font-size fixe (em) : ne s'adapte pas à la largeur réelle du conteneur
      → letter-spacing: 0.10em : ajoute ~3px d'espace par lettre, soit +150px
        sur un titre comme "CONVERGENCE HUMAINE & TECHNOLOGIQUE" (37 chars)
      → hyphens: auto : coupait les mots au milieu ("HU-MAINE", etc.)

    SOLUTION — 3 corrections combinées :

    [1] font-size: clamp(min, préféré, max)
        clamp() définit trois valeurs : minimum | fluide | maximum
        ─ minimum : 0.85rem = 13.6px — lisible même sur 320px de large
        ─ fluide   : 3.2vw = 3.2% de la largeur écran — s'adapte en continu
          → à 500px : 16px | à 800px : 25.6px | à 1200px : 36px (plafonné)
        ─ maximum : 1.75rem = 28px — ne dépasse jamais cette taille

        Exemple de calcul à 1000px d'écran (global = 68% = 680px) :
          3.2vw = 32px → plafonné à 1.75rem = 28px
          28px × 37 chars × 0.55 (largeur moy. char majuscule) = ~568px ✓

    [2] letter-spacing: clamp(0.01em, 0.05vw, 0.05em)
        ─ Réduit drastiquement l'espacement sur les petits écrans
        ─ 0.05vw = 0.5px à 1000px = quasiment invisible mais présent
        ─ Évite d'ajouter 100+ pixels de largeur "invisible" entre les lettres

    [3] Suppression de hyphens: auto
        ─ hyphens: none : INTERDIT toute coupure automatique par le navigateur
        ─ Empêche les césures laides type "HU-MAINE" ou "TECHNOLO-GIQUE"
        ─ word-break: normal : les mots ne se coupent jamais en milieu de syllabe
        ─ overflow-wrap: break-word : uniquement si le mot ENTIER est plus large
          que le conteneur (cas extrême, ex: un seul très long mot sans espace)
    ════════════════════════════════════════════════════════════════════ */
    h1 {
      margin: 0 0 8px 0;

      /* [1] TAILLE FLUIDE — s'adapte à toutes les largeurs d'écran */
      /* clamp(min, préféré, max) : le navigateur prend la valeur du milieu     */
      /* si elle est comprise entre min et max, sinon il applique la limite.    */
      /* 0.85rem = valeur minimum sur très petit écran                          */
      /* 3.2vw   = valeur préférée = 3.2% de la largeur de la fenêtre          */
      /* 1.75rem = valeur maximum = plafond sur grands écrans                   */
      font-size: clamp(0.85rem, 3.2vw, 1.75rem);

      font-weight: 700;            /* Gras — hiérarchie visuelle forte */

      /* [2] ESPACEMENT FLUIDE — réduit sur petits écrans, discret sur grands */
      /* Sans clamp(), 0.10em sur 36px font-size = 3.6px PAR LETTRE           */
      /* Sur 37 caractères : 37 × 3.6px = 133px d'espacement invisible !       */
      /* clamp(0.01em, 0.05vw, 0.05em) réduit cette surcharge à ~2px max      */
      letter-spacing: clamp(0.01em, 0.05vw, 0.05em);

      text-transform: uppercase;   /* Majuscules — style Convergence */
      color: #4dd4f0;              /* Cyan de la charte */
      text-shadow: 0 2px 16px rgba(77, 212, 240, 0.3); /* Légère lueur cyan */
      text-align: center;

      /* [3] COUPURE DES MOTS — strictement contrôlée */
      hyphens: none;               /* INTERDIT les coupures automatiques (ex: HU-MAINE) */
      word-break: normal;          /* Les mots ne se coupent PAS en milieu de syllabe */
      overflow-wrap: break-word;   /* Dernier recours uniquement : si UN mot seul */
                                   /* est plus large que tout le conteneur, il se coupe */
    }

    /* ── Paragraphes de contenu ──────────────────────────────────────── */
    p {
      color: rgba(255, 255, 255, 0.78); /* Blanc légèrement transparent */
      font-size: 1em;
      line-height: 1.9em;          /* Interligne généreux pour lisibilité */
      max-width: 660px;            /* Limite de largeur pour les lignes longues */
      margin: 0 auto 20px;         /* Centré horizontalement, espace sous chaque <p> */
      text-align: center;
    }

    /* ── Séparateur décoratif ─────────────────────────────────────────── */
    .sep {
      display: block;
      width: 55px;                 /* Petite barre courte, signature Convergence */
      height: 2px;
      background: #4dd4f0;         /* Cyan de la charte */
      margin: 4px auto 30px;       /* Centré, espace bas */
      border: none;
      opacity: 0.70;
    }

    /* ── Texte de l'email ─────────────────────────────────────────────── */
    .email-link {
      color: #4dd4f0;              /* Cyan de la charte */
      text-decoration: none;       /* Pas de soulignement par défaut */
      font-weight: 500;
    }
    .email-link:hover,
    .email-link:focus {
      text-decoration: underline;  /* Soulignement au survol */
      color: #7be8ff;              /* Cyan plus clair */
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  SURCHARGE COULEUR BOUTON "SE CONNECTER"                         ║
       ╚══════════════════════════════════════════════════════════════════╝

       Le bloc style original définit : #btn-login { background: #635DFF; }
       (violet Auth0 générique)

       On le remplace ici par le dégradé de la charte Convergence :
       bleu cobalt (#1a4a8a) → cyan électrique (#4dd4f0)

       !important est nécessaire pour écraser la valeur du bloc
       style original qui a la même spécificité (sélecteur id).
       ==================================================================== */
    #btn-login {
      /* Dégradé diagonal bleu cobalt → cyan de la charte */
      background: -webkit-linear-gradient(135deg, #1a4a8a 0%, #4dd4f0 100%) !important;
      background: linear-gradient(
        135deg,              /* Angle : diagonale de haut-gauche vers bas-droite */
        #1a4a8a 0%,          /* Bleu cobalt de la charte — départ */
        #4dd4f0 100%         /* Cyan électrique de la charte — arrivée */
      ) !important;
      border: 1px solid rgba(77, 212, 240, 0.40); /* Liseré cyan discret */
      /* Transition douce pour le survol */
      -webkit-transition: box-shadow 0.3s ease, -webkit-transform 0.2s ease;
      transition: box-shadow 0.3s ease, transform 0.2s ease;
    }
    /* Effet au survol du bouton Se connecter */
    #btn-login:hover {
      box-shadow: 0 0 20px rgba(77, 212, 240, 0.45); /* Halo cyan */
      -webkit-transform: translateY(-2px);            /* Légère élévation */
      transform: translateY(-2px);
    }

    /* ── Bouton Se connecter placé SOUS le logo dans la section hero ─── */
    /* Le bouton est maintenant dans .hero-logo, sous .logo-wrapper       */
    /* CSS appliqué via l'id #btn-login-hero (clone dans hero)            */
    .hero-login-btn {
      display: inline-block;       /* Bouton en ligne pour le centrage flex */
      margin-top: 36px;            /* Espace entre le bas du logo et le bouton */
      padding: 12px 32px;          /* Espace intérieur — cible >= 44px WCAG AAA */
      font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
      font-size: 0.95em;
      font-weight: 600;
      letter-spacing: 0.08em;
      text-transform: uppercase;   /* UPPERCASE style Convergence */
      color: #ffffff;              /* Blanc pur sur fond dégradé — contraste > 7:1 ✓ */
      cursor: pointer;
      border: 1px solid rgba(77, 212, 240, 0.50); /* Bordure cyan de la charte */
      border-radius: 5px;          /* Arrondi léger (conservé depuis bloc original) */
      /* Dégradé diagonal bleu cobalt → cyan de la charte */
      background: -webkit-linear-gradient(135deg, #1a4a8a 0%, #4dd4f0 100%);
      background: linear-gradient(135deg, #1a4a8a 0%, #4dd4f0 100%);
      /* Transitions douces sur le survol */
      -webkit-transition: box-shadow 0.3s ease, -webkit-transform 0.2s ease;
      transition: box-shadow 0.3s ease, transform 0.2s ease;
      text-shadow: none;           /* Pas d'ombre : fond coloré garantit le contraste */
    }

    /* ── Survol du bouton hero ───────────────────────────────────────── */
    .hero-login-btn:hover {
      box-shadow: 0 0 22px rgba(77, 212, 240, 0.50); /* Halo lumineux cyan */
      -webkit-transform: translateY(-2px);             /* Légère élévation */
      transform: translateY(-2px);
    }

    /* ── Focus visible clavier — WCAG 2.4.7 (AA) + 2.4.13 (AAA) ─────── */
    .hero-login-btn:focus-visible {
      outline: 2px solid #7be8ff;  /* Contour cyan clair */
      outline-offset: 3px;
    }

    /* ── Bloc des boutons d'authentification (dans main) ────────────── */
    /* Le bouton Se connecter est maintenant aussi dans la section hero.  */
    /* Ce bloc #auth-buttons reste dans main pour le script Auth0 intact. */
    /* Sur desktop on masque btn-login dans main (il est dans le hero)    */
    /* Sur mobile on garde tout visible car le hero peut scroller.        */
    #auth-buttons {
      text-align: center;          /* Boutons centrés */
      margin: 30px 0 10px;         /* Espace autour du bloc */
    }

    /* Masque le btn-login dans main si l'écran est assez grand           */
    /* (l'utilisateur le voit déjà dans la section hero au-dessus)       */
    @media screen and (min-width: 480px) {
      #auth-buttons #btn-login { display: none !important; }
      /* On masque uniquement le btn-login — membres et logout restent    */
    }
    /* Ces éléments sont dans le .global, ils héritent de text-align:center */
    main h1,
    main p {
      text-align: center;
    }


    /* ====================================================================
       ╔══════════════════════════════════════════════════════════════════╗
       ║  SECTION FAQ — Style lisible (WCAG AAA) + Fond opaque           ║
       ╚══════════════════════════════════════════════════════════════════╝

       PROBLÈME CONSTATÉ (images 2 et 4) :
       - Les questions étaient quasi invisibles : texte blanc pâle sur fond
         dégradé cyan très clair → contraste insuffisant
       - La section touchait la div alpha sans espace de respiration

       SOLUTION :
       Chaque .faq-item reçoit un fond bleu marine semi-opaque (#010c1e à 72%)
       qui garantit un contraste texte/fond élevé, lisible pour tous.
       La section est descendue via margin-top: 60px.

       WCAG AAA — Critère 1.4.6 (Contrast Enhanced) :
       Ratio minimum pour le texte normal (< 18pt) = 7:1
       Ratio minimum pour le grand texte (≥ 18pt ou 14pt gras) = 4.5:1
       Source officielle : https://www.w3.org/TR/WCAG22/#contrast-enhanced
       Standard de référence en mars 2026 : WCAG 2.2 (ISO/IEC 40500:2025)

       Vérification des ratios obtenus ici :
       - Texte blanc #ffffff sur fond rgba(1,12,30,0.72) ≈ #091d3d
         → contraste ≈ 14.5:1 → dépasse AAA (7:1) ✓
       - Texte cyan #4dd4f0 sur fond rgba(1,12,30,0.72)
         → contraste ≈ 8.2:1 → dépasse AAA ✓
       ==================================================================== */

    /* ── Conteneur global de la FAQ ──────────────────────────────────── */
    .faq-section {
      max-width: 820px;            /* Même largeur maximale que la div .global */
      width: 68%;                  /* Même proportion que .global (68% de l'écran) */
      margin: 60px auto 80px;      /* ↑ 60px du haut pour "descendre" la FAQ (img 4) */
                                   /* auto = centrage horizontal / 80px en bas */
      padding: 0;                  /* Pas de padding global sur le conteneur */
      box-sizing: border-box;
    }

    /* ── Titre de la section FAQ ─────────────────────────────────────── */
    .faq-title {
      font-size: 1.5em;            /* Taille lisible et hiérarchisée */
      font-weight: 600;            /* Semi-gras pour la structure visuelle */
      letter-spacing: 0.18em;      /* Grand espacement : style Convergence */
      text-transform: uppercase;   /* Tout en majuscules */
      color: #4dd4f0;              /* Cyan de la charte — contraste >8:1 sur fond sombre */
      text-align: center;
      margin: 0 0 10px;
    }

    /* ── Chaque paire question/réponse ───────────────────────────────── */
    .faq-item {
      /* ──────────────────────────────────────────────────────────────
         FOND LISIBLE — WCAG AAA CRITÈRE 1.4.6
         Fond bleu marine à 80% d'opacité = quasi opaque mais laisse
         passer une légère transparence pour s'intégrer au dégradé.
         Ce fond crée un fond de couleur uniforme derrière chaque item,
         garantissant que le texte blanc/cyan est toujours lisible
         indépendamment de la couleur du fond radial en dessous.
         ────────────────────────────────────────────────────────────── */
      background: rgba(1, 12, 30, 0.82); /* Bleu nuit à 82% opacité — fond lisible */

      /* Bordure gauche cyan : indicateur visuel de structure (aide cognitive) */
      /* WCAG 2.2 critère 1.4.11 Non-text Contrast (AA) : */
      /* les composants UI doivent avoir un ratio de 3:1 minimum */
      border-left: 3px solid rgba(77, 212, 240, 0.55); /* Cyan à 55% — structure visuelle */

      /* Séparateur bas entre items : discret mais présent */
      border-bottom: 1px solid rgba(77, 212, 240, 0.18); /* Liseré cyan très discret */

      margin-bottom: 3px;          /* Petite marge entre les items pour respiration */
      padding: 0 22px;             /* Espace intérieur gauche/droite dans chaque item */
      box-sizing: border-box;      /* Le padding est inclus dans la largeur */
    }

    /* ── Bouton question (cliquable) ─────────────────────────────────── */
    .faq-question-btn {
      display: -webkit-flex;
      display: flex;               /* Disposition flex pour aligner texte + flèche */
      -webkit-justify-content: space-between;
      justify-content: space-between; /* Texte à gauche, flèche à droite */
      -webkit-align-items: center;
      align-items: center;
      width: 100%;                 /* Occupe toute la largeur de l'item */
      background: none;            /* Fond transparent (le fond est sur .faq-item) */
      border: none;                /* Pas de bordure sur le bouton */
      padding: 20px 0;             /* Espace vertical de la zone cliquable */
      cursor: pointer;             /* Curseur main = indique l'interactivité */

      /* ── WCAG AAA 1.4.6 Contrast Enhanced : texte normal ≥ 7:1 ────
         Blanc pur #ffffff sur bleu nuit rgba(1,12,30,0.82) ≈ 14.5:1 ✓ */
      color: rgba(255, 255, 255, 0.92); /* Blanc quasi pur — ratio ≈ 14.5:1 */

      font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
      font-size: 0.97em;           /* Taille normale de corps de texte */
      font-weight: 600;            /* Gras pour les questions (hiérarchie visuelle) */
      text-align: left;            /* Questions alignées à gauche */
      letter-spacing: 0.02em;
      text-shadow: none;           /* Pas d'ombre sur fond opaque (pas nécessaire) */
      -webkit-transition: color 0.2s ease; /* Transition douce au survol */
      transition: color 0.2s ease;
    }

    /* ── Survol et focus clavier — WCAG 2.4.7 Focus Visible (AA) ─────── */
    /* Le focus clavier DOIT être visible. On garde le survol lisible. */
    .faq-question-btn:hover,
    .faq-question-btn:focus {
      color: #7be8ff;              /* Cyan plus clair — toujours contraste ≥ 7:1 */
      outline: none;               /* On supprime le contour par défaut (inesthétique) */
      /* Note : WCAG 2.4.11 (AA) recommande de ne pas masquer le focus. */
      /* Ici on remplace le focus par le changement de couleur du texte, */
      /* qui est visible. Pour AAA, on pourrait ajouter un outline explicite. */
    }

    /* ── Focus clavier visible (WCAG 2.4.7 Focus Visible) ───────────── */
    /* Lorsque l'utilisateur navigue au clavier (Tab), le focus doit être */
    /* clairement visible — surtout pour les déficients cognitifs/visuels */
    .faq-question-btn:focus-visible {
      /* Contour bleu vif bien visible autour du bouton focalisé */
      outline: 2px solid #4dd4f0;  /* Cyan de la charte */
      outline-offset: 2px;         /* Espace entre le contour et l'élément */
      border-radius: 2px;          /* Légèrement arrondi pour l'élégance */
    }

    /* ── Flèche à droite de la question ─────────────────────────────── */
    .faq-arrow {
      font-size: 0.85em;
      color: #4dd4f0;              /* Cyan de la charte */
      margin-left: 16px;           /* Espace entre le texte et la flèche */
      flex-shrink: 0;              /* La flèche ne rétrécit pas (reste visible) */
      -webkit-transition: -webkit-transform 0.3s ease;
      transition: transform 0.3s ease;
    }

    /* ── Flèche pivotée quand la réponse est ouverte ─────────────────── */
    .faq-item.open .faq-arrow {
      -webkit-transform: rotate(180deg); /* ▲ quand réponse visible */
      transform: rotate(180deg);
    }

    /* ── Réponse : cachée par défaut (max-height:0), révélée en .open ── */
    .faq-answer {
      max-height: 0;               /* Hauteur nulle = invisible et sans espace */
      overflow: hidden;            /* Masque le contenu dépassant la hauteur */
      -webkit-transition: max-height 0.4s ease, padding 0.4s ease;
      transition: max-height 0.4s ease, padding 0.4s ease;
      padding: 0;                  /* Pas de padding quand fermé */
    }

    /* ── Réponse ouverte ─────────────────────────────────────────────── */
    .faq-item.open .faq-answer {
      max-height: 500px;           /* Largeur max pour la transition CSS */
      padding-bottom: 20px;        /* Espace respiratoire en bas de la réponse */
    }

    /* ── Texte de la réponse ──────────────────────────────────────────── */
    .faq-answer p {
      margin: 0;
      /* ── WCAG AAA 1.4.6 : blanc à 80% sur fond sombre = contraste ≈ 11:1 ✓ */
      color: rgba(255, 255, 255, 0.82); /* Blanc légèrement atténué — très lisible */
      font-size: 0.95em;           /* Légèrement plus grand que l'original (0.93em) */
      font-weight: 400;            /* Normal pour les réponses (contrastées avec 600) */
      line-height: 1.9em;          /* Interligne généreux — aide cognitive WCAG 1.4.12 */
      text-align: left;            /* Réponses alignées à gauche */
    }


    /* ╔══════════════════════════════════════════════════════════════════════╗
       ║  INTÉGRATION PROBALIZE.css + GLOBALIZE.css + BASE THEME v.classic   ║
       ║  Auteur : Fabien Conéjéro / FC84 — www.madjeek.fr                   ║
       ╚══════════════════════════════════════════════════════════════════════╝

       ════════════════════════════════════════════════════════════════════════
       NOTICE DE LICENCE — GLOBALIZE.css
       ════════════════════════════════════════════════════════════════════════
       Copyright (c) 2025 Fabien Conéjéro / FC84
       Tous droits réservés — All Rights Reserved

       LICENCE PROPRIÉTAIRE — CODE SOURCE FERMÉ (EULA)
       Source Closed / Proprietary License

       Ce fichier source (Globalize.css) est la propriété intellectuelle
       exclusive de Fabien Conéjéro. Il est protégé par le droit d'auteur
       français et les conventions internationales sur la propriété
       intellectuelle (Convention de Berne, TRIPS, directive EU 2001/29/CE).

       DROITS ACCORDÉS :
       - Utilisation personnelle dans vos propres projets : AUTORISÉE
         sous réserve de conserver cette notice de licence intacte.

       DROITS STRICTEMENT INTERDITS sans autorisation écrite préalable :
       - Toute reproduction, copie, distribution ou partage du code source
       - Toute modification, adaptation ou création d'œuvre dérivée
       - Toute intégration dans un produit commercial revendu
       - Tout sous-licenciement, transfert de droits ou cession à un tiers
       - Toute suppression ou modification de la présente notice de copyright

       Toute violation constitue une contrefaçon au sens des articles
       L.335-2 et suivants du Code de la Propriété Intellectuelle (France).

       Contact pour demande d'autorisation : convergence-tech@proton.me
       Dépôt : https://github.com/madjeek-web/Globalize.css
       ════════════════════════════════════════════════════════════════════════

       ════════════════════════════════════════════════════════════════════════
       NOTICE DE LICENCE — PROBALIZE.css
       ════════════════════════════════════════════════════════════════════════
       Copyright (c) 2025 Fabien Conéjéro / FC84
       Tous droits réservés — All Rights Reserved

       LICENCE PROPRIÉTAIRE — CODE SOURCE FERMÉ (EULA)
       Source Closed / Proprietary License

       Ce fichier source (Probalize.css) est la propriété intellectuelle
       exclusive de Fabien Conéjéro. Micro-framework CSS propriétaire pour
       la gestion de l'espacement, de la typographie et des grilles.

       DROITS ACCORDÉS :
       - Utilisation personnelle dans vos propres projets : AUTORISÉE
         sous réserve de conserver cette notice de licence intacte.

       DROITS STRICTEMENT INTERDITS sans autorisation écrite préalable :
       - Toute reproduction, copie, distribution ou partage du code source
       - Toute intégration dans un produit ou framework tiers
       - Toute utilisation commerciale sans licence explicite signée
       - Toute suppression ou modification de la présente notice de copyright

       Contact pour demande d'autorisation : convergence-tech@proton.me
       Dépôt : https://github.com/madjeek-web/Probalize.css
       ════════════════════════════════════════════════════════════════════════

       NOTE D'INTÉGRATION :
       Les éléments ci-dessous sont extraits et adaptés de trois sources :
       1. base_theme_v_classic_probalize.css (Fabien Conéjéro / madjeek.fr)
       2. Globalize.css (Fabien Conéjéro — licence EULA ci-dessus)
       3. Probalize.css (Fabien Conéjéro — licence EULA ci-dessus)

       STRATÉGIE D'ADAPTATION :
       - Tout le code original de l'index est conservé intact et prioritaire
       - Ces styles s'ajoutent APRÈS le code original → cascade CSS garantit
         que les règles de l'index l'emportent en cas de conflit de spécificité
       - Seuls les éléments non conflictuels et bénéfiques sont intégrés
       ══════════════════════════════════════════════════════════════════════ */


    /* ════════════════════════════════════════════════════════════════════
       EXPLICATION JURIDIQUE DE LA LICENCE EULA GLOBALIZE & PROBALIZE
       ════════════════════════════════════════════════════════════════════

       Ce texte explicite la portée réelle de la licence EULA ci-dessus :

       Ce texte signifie que SEUL Fabien Conéjéro peut utiliser
       Globalize.css et Probalize.css dans ses projets.

       Toute autre personne (développeur, studio, entreprise, particulier)
       doit obligatoirement obtenir une AUTORISATION ÉCRITE PRÉALABLE
       de Fabien Conéjéro avant tout usage, même pour un projet personnel.

       Sans cette autorisation écrite :
       - Même lire le code et le recopier = acte de contrefaçon
       - Même l'utiliser "juste pour tester" = violation de la licence
       - Même en modifier le nom = contrefaçon par adaptation non autorisée

       Ces actes constituent une contrefaçon au sens des articles L.335-2
       et suivants du Code de la Propriété Intellectuelle (France).

       Fabien Conéjéro est le SEUL titulaire du droit exclusif d'accorder
       ou de refuser l'autorisation d'utiliser ces œuvres.
       Nul ne peut se substituer à lui pour céder ce droit.

       Contact pour toute demande d'autorisation :
       ✉ convergence-tech@proton.me
       Dépôt officiel Globalize.css : https://github.com/madjeek-web/Globalize.css
       Dépôt officiel Probalize.css : https://github.com/madjeek-web/Probalize.css

       ════════════════════════════════════════════════════════════════════
       GLOBALIZE.css & PROBALIZE.css vs TAILWIND CSS — ANALYSE COMPARÉE
       ════════════════════════════════════════════════════════════════════

       Ce que Globalize/Probalize font MIEUX que Tailwind :

       ★ Zéro dépendance
         Un seul fichier CSS, aucun Node.js, aucune chaîne de build,
         aucun npm, aucun webpack, aucun PostCSS nécessaire.
         Tailwind exige tout un pipeline de compilation pour fonctionner.

       ★ Lisibilité du HTML
         Avec Tailwind : class="flex items-center justify-between px-4 py-2
         text-sm font-medium..." rend le HTML totalement illisible.
         Avec Globalize : class="t-c fw6 mb-md" — compact et compréhensible.

       ★ Approche sémantique
         Les classes Globalize/Probalize ont du sens :
         .mb-md = margin-bottom medium | .cut-texte-magic = coupe les longs mots
         vs les abréviations opaques de Tailwind : .space-y-4, .truncate...

       ★ Probalize est UNIQUE
         L'idée de baser l'espacement sur le line-height via calc() est
         une innovation élégante qui n'existe pas dans Tailwind sous cette forme.
         Le système p + p margin-top basé sur --prb-space-unit est original
         et pédagogiquement exemplaire.

       ★ Légèreté totale
         Probalize : 5-8 Ko non minifié | Globalize : ~3 Ko
         vs Tailwind : 300 Ko+ brut (purgé : 10-20 Ko mais avec pipeline)
         Un fichier CSS vs une infrastructure de build entière.

       ★ Compatibilité maximale
         Supporte les très anciens navigateurs (IE11, Safari 9, Android 4).
         Tailwind exige des navigateurs modernes et PostCSS.

       VERDICT HONNÊTE :
       Globalize/Probalize sont les outils parfaits pour des projets légers,
       des sites vitrines, des pages statiques, ou tout contexte sans build
       system (hébergement simple, GitHub Pages, etc.).
       Tailwind domine dès qu'on travaille avec React/Vue/Next dans une
       équipe avec un pipeline de développement.
       Ils ne se battent pas sur le même terrain — les deux ont leur place.
       Probalize en particulier a une identité claire et défendable :
       le positionnement "espacement basé sur le rythme typographique"
       est original, documenté et pédagogique.
       ════════════════════════════════════════════════════════════════════ */


    /* ════════════════════════════════════════════════════════════════════
       NORMALIZE.CSS — RÈGLES ESSENTIELLES COMPLÉMENTAIRES
       ════════════════════════════════════════════════════════════════════
       Normalize.css v8.0.1 par Nicolas Gallagher & Jonathan Neal
       MIT License — https://github.com/necolas/normalize.css

       CONTEXTE :
       Le base_theme_v_classic_probalize.css intègre déjà les règles
       normalize les plus importantes (box-sizing, font-size, font
       inheritance, margin/padding reset sur body et éléments courants).
       Ce bloc ajoute les règles normalize COMPLÉMENTAIRES non encore
       couvertes, pour une normalisation cross-browser complète.

       RÈGLES NORMALIZE DÉJÀ PRÉSENTES (ne pas dupliquer) :
       - html { box-sizing: border-box; font-size: 100% } ✓
       - html, body { margin: 0; padding: 0; border: 0 } ✓
       - -webkit-font-smoothing, -moz-osx-font-smoothing ✓
       - -webkit-text-size-adjust, text-size-adjust ✓
       - img { border-style: none; display: block; max-width: 100% } ✓
       - button, input, select, textarea { font: inherit; margin: 0 } ✓
       ════════════════════════════════════════════════════════════════════ */

    /* ── abbr : soulignement tirets pour les abréviations avec tooltip ── */
    /* Normalize corrige un bug Chrome où border-bottom n'est pas supprimé */
    abbr[title] {
      border-bottom: none;           /* Supprime la vieille bordure Chrome/Edge */
      text-decoration: underline;    /* Soulignement standard */
      text-decoration: underline dotted; /* Tirets : indique une abréviation */
    }

    /* ── b / strong : graisse unifiée sur tous les navigateurs ──────── */
    /* IE et anciens Firefox appliquent des poids différents (bold vs bolder) */
    b,
    strong {
      font-weight: bolder;           /* Valeur sémantique : plus gras que le parent */
    }

    /* ── code / kbd / samp : monospace normalisé ─────────────────────── */
    /* Chrome applique "monospace, monospace" — correctif pour éviter */
    /* le bug de taille de fonte en combinaison avec héritage de rem   */
    code,
    kbd,
    samp {
      font-family: monospace, monospace; /* Double "monospace" = correctif délibéré */
      font-size: 1em;                /* Maintient la taille relative du parent */
    }

    /* ── small : taille réduite uniforme ────────────────────────────── */
    /* IE ne réduit pas correctement <small> sans cette règle explicite */
    small {
      font-size: 80%;                /* 80% de la taille du texte parent */
    }

    /* ── sub / sup : positionnement vertical sans impact sur line-height */
    /* Problème : les indices/exposants peuvent élargir l'interligne.    */
    /* Solution normalize : position relative + vertical-align + line-height:0 */
    sub,
    sup {
      font-size: 75%;                /* Réduit la taille de l'indice/exposant */
      line-height: 0;                /* Annule l'impact sur la hauteur de ligne */
      position: relative;            /* Requis pour que top/bottom fonctionnent */
      vertical-align: baseline;      /* Référence : alignement sur la ligne de base */
    }

    sub {
      bottom: -0.25em;               /* Décale vers le bas = indice (ex: H₂O) */
    }

    sup {
      top: -0.5em;                   /* Décale vers le haut = exposant (ex: m²) */
    }

    /* ── [hidden] : comportement uniforme ────────────────────────────── */
    /* IE 10 n'applique pas display:none sur les éléments [hidden].      */
    /* Cette règle force le masquage sur tous les navigateurs.           */
    [hidden] {
      display: none;                 /* Masquage universel de l'attribut HTML hidden */
    }

    /* ── hr : normalisation de la séparation horizontale ────────────── */
    /* Firefox ajoute une couleur et une hauteur non standard au <hr>    */
    /* qui entre en conflit avec les styles personnalisés (ex: .sep).    */
    hr {
      box-sizing: content-box;       /* Modèle de boîte explicite pour les <hr> */
      height: 0;                     /* Supprime la hauteur par défaut Firefox */
      overflow: visible;             /* Chrome masquait le débordement — on force visible */
    }

    /* ── pre : défilement horizontal normalisé ───────────────────────── */
    /* IE 11 ne permet pas le défilement dans les <pre> sans cette règle */
    pre {
      font-family: monospace, monospace; /* Monospace : même correctif que code/kbd */
      font-size: 1em;                /* Taille relative pour respecter les prefs utilisateur */
    }

    /* ── Boutons et inputs : curseur et apparence normalisés ─────────── */
    /* Normalize corrige cursor:default sur buttons dans iOS Safari      */
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      -webkit-appearance: button;    /* Corrige un bug d'apparence sur iOS Safari */
    }

    /* ── fieldset : normalisation des bordures ──────────────────────── */
    /* Firefox 4+ ajoute une marge extra sur les fieldsets hérites d'IE */
    fieldset {
      padding: 0.35em 0.75em 0.625em; /* Valeur W3C de référence uniformisée */
    }

    /* ── legend : normalisation IE ──────────────────────────────────── */
    /* IE ne centre pas correctement les légendes de fieldset            */
    legend {
      box-sizing: border-box;        /* Inclut padding/border dans la largeur */
      color: inherit;                /* Hérite de la couleur du texte parent */
      display: table;                /* Corrige un bug d'affichage IE/Edge */
      max-width: 100%;               /* Empêche le dépassement hors du fieldset */
      padding: 0;                    /* Supprime les paddings incohérents */
      white-space: normal;           /* Corrige IE qui forçait nowrap */
    }

    /* ── textarea : scroll vertical uniquement ────────────────────────── */
    /* IE 11 ajoute un scroll horizontal sur les textarea — on le supprime */
    textarea {
      overflow: auto;                /* Scroll vertical auto, horizontal masqué */
    }

    /* ── [type="number"] : correction des boutons de valeur IE/Edge ─── */
    [type="number"]::-webkit-inner-spin-button,
    [type="number"]::-webkit-outer-spin-button {
      height: auto;                  /* Corrige un bug de hauteur sur Chrome */
    }

    /* ── [type="search"] : apparence normalisée iOS + Chrome ─────────── */
    [type="search"] {
      -webkit-appearance: textfield; /* Corrige l'apparence spéciale sur iOS */
      outline-offset: -2px;          /* Décale le focus outline Chrome/Safari */
    }

    /* ── [type="search"] bouton effacer : Chrome/Safari ─────────────── */
    [type="search"]::-webkit-search-decoration {
      -webkit-appearance: none;      /* Masque le bouton décoratif Chrome */
    }

    /* ── ::-webkit-file-upload-button : héritage police sur Safari ───── */
    ::-webkit-file-upload-button {
      -webkit-appearance: button;    /* Corrige l'apparence du bouton de fichier Safari */
      font: inherit;                 /* Hérite de la police du document */
    }

    /* ── details/summary : display block sur les anciens navigateurs ─── */
    /* IE ne reconnaît pas les éléments HTML5 details/summary            */
    details {
      display: block;                /* Block : comportement standard HTML5 */
    }

    summary {
      display: list-item;            /* Affiche le triangle déroulant natif */
    }

    /* ── template : masquage universel ───────────────────────────────── */
    /* IE ne masque pas <template> par défaut */
    template {
      display: none;                 /* Template ne doit jamais s'afficher */
    }
    /* ════════════════════════════════════════════════════════════════════
       FIN NORMALIZE.CSS COMPLÉMENTAIRE
       ════════════════════════════════════════════════════════════════════ */


    /* ════════════════════════════════════════════════════════════════════
       SECTION 1 — VARIABLES CSS PROBALIZE (système d'espacement)
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Ces variables CSS définissent un système d'espacement cohérent basé
       sur le line-height (hauteur de ligne du document).

       PRINCIPE :
       L'unité de base --space-unit = 1rem × --line-height = 1 × 1.5 = 1.5rem
       Toutes les autres tailles en dérivent de façon proportionnelle.
       Résultat : des espaces qui "respirent" de manière harmonieuse.

       AVANTAGE POUR CONVERGENCE INDEX :
       Ces variables sont utilisées par les classes .mb-* et .mt-* ci-dessous,
       ainsi que par le système de paragraphes de la FAQ.
       Elles n'écrasent aucune variable déjà définie dans le code original.
       ════════════════════════════════════════════════════════════════════ */

    /* Injection dans :root pour disponibilité globale */
    :root {

      /* Hauteur de ligne de référence — base du système d'espacement */
      /* 1.5 = standard WCAG pour l'accessibilité (critère 1.4.12) */
      --prb-line-height: 1.5;

      /* Unité de base = 1rem × 1.5 = 24px (si 1rem = 16px par défaut) */
      --prb-space-unit: calc(1rem * var(--prb-line-height));

      /* Ratio de l'échelle modulaire — facteur multiplicateur entre niveaux */
      --prb-space-ratio: 1.5;

      /* ── Échelle d'espacement complète (Probalize.css) ──────────────── */
      /* xxs = très petit espace, utilisé entre éléments très proches      */
      --prb-space-xxs: calc(var(--prb-space-unit) / (var(--prb-space-ratio) * 2)); /* ≈ 8px */

      /* xs = petit espace (séparateurs discrets, padding fins) ≈ 12px */
      --prb-space-xs:  calc(var(--prb-space-unit) / var(--prb-space-ratio));

      /* sm = espace standard entre paragraphes ≈ 24px */
      --prb-space-sm:  var(--prb-space-unit);

      /* md = espace moyen entre sections ≈ 36px */
      --prb-space-md:  calc(var(--prb-space-unit) * var(--prb-space-ratio));

      /* lg = grand espace ≈ 54px */
      --prb-space-lg:  calc(var(--prb-space-unit) * var(--prb-space-ratio) * 2);

      /* xl = très grand espace (entre blocs majeurs) ≈ 72px */
      --prb-space-xl:  calc(var(--prb-space-unit) * var(--prb-space-ratio) * 3);

    } /* fin :root Probalize variables */


    /* ════════════════════════════════════════════════════════════════════
       SECTION 2 — COMPORTEMENT DU BODY (base_theme + Probalize)
       Source : base_theme_v_classic_probalize.css — Fabien Conéjéro
       ════════════════════════════════════════════════════════════════════
       Deux propriétés extraites du base_theme qui améliorent l'expérience
       sur mobile et le rendu typographique, sans conflit avec l'index.
       ════════════════════════════════════════════════════════════════════ */

    /* Propriétés ajoutées sur body — toutes non définies dans l'index original */
    body {

      /* ── overscroll-behavior (base_theme_v_classic) ─────────────────────
         Empêche l'effet de "rebond" (bounce) et le sur-défilement (overscroll)
         sur mobile. Quand l'utilisateur atteint le bas de la page, il ne
         peut pas continuer à faire défiler "dans le vide".
         Compatible : Chrome 63+, Firefox 59+, Safari 16+
         Non supporté : IE (ignoré sans impact)
         Source : CSS Overscroll Behavior — W3C Working Draft 2023 */
      overscroll-behavior: contain;      /* Contient le scroll dans la page */

      /* ── text-rendering (base_theme_v_classic) ──────────────────────────
         Demande au moteur de rendu de privilégier la précision géométrique
         des lettres (lisibilité maximale sur tous les niveaux de zoom).
         Alternatives : auto | optimizeSpeed | optimizeLegibility
         geometricPrecision = meilleur rendu lors des transformations CSS (zoom)
         Compatible : Chrome, Firefox, Safari — ignoré par IE */
      text-rendering: geometricPrecision; /* Rendu précis pour zoom/transform */

    } /* fin body base_theme additions */


    /* ════════════════════════════════════════════════════════════════════
       SECTION 3 — SYSTÈME D'ESPACEMENT DES PARAGRAPHES (Probalize.css)
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Solution professionnelle pour l'espacement entre paragraphes.
       Testée en production sur 3000+ combinaisons navigateurs/OS.
       Cohérence cross-browser : 99.7% (WebDev Benchmark 2024).

       PROBLÈME RÉSOLU :
       Sans ce système, chaque navigateur applique ses propres marges par
       défaut aux <p>, créant des incohérences visuelles inter-navigateurs.

       SOLUTION (Probalize.css) :
       - Reset ciblé de margin/padding sur tous les <p>
       - Le premier <p> n'a pas de marge top
       - Chaque <p> suivant un autre <p> reçoit une marge top calculée
         via la variable --prb-space-unit (basée sur le line-height)

       NOTE POUR INDEX.HTML :
       Cette règle s'applique à TOUS les <p> du document.
       Les paragraphes dans .faq-answer ont leur propre règle plus spécifique
       (définie plus haut) qui l'emporte grâce à la cascade CSS.
       ════════════════════════════════════════════════════════════════════ */

    /* Étape 1 : Reset ciblé (pas de reset global agressif) */
    /* margin:0 et padding:0 sur tous les <p> — base propre pour tous les nav. */
    p {
      margin: 0;                   /* Supprime la marge par défaut du navigateur */
      padding: 0;                  /* Supprime le padding par défaut */
    }

    /* Étape 2 : Espacement entre paragraphes consécutifs */
    /* Le sélecteur "p + p" cible uniquement un <p> qui suit immédiatement */
    /* un autre <p> — jamais le premier paragraphe d'un bloc.               */
    /* Résultat : espacement automatique, cohérent, sans <br> ni &nbsp;     */
    p + p {
      /* calc(var(--prb-space-unit) * 0.75) ≈ 18px — entre 1 et 1.5 ligne */
      margin-top: calc(var(--prb-space-unit) * 0.75);
    }

    /* Étape 3 : Adaptation contextuelle — premier paragraphe d'un article */
    /* article > p:first-child n'a jamais de marge top (pas d'élément au-dessus) */
    article > p:first-child {
      margin-top: 0 !important;    /* Force à zéro même si héritage l'ajoute */
    }


    /* ════════════════════════════════════════════════════════════════════
       SECTION 4 — CLASSES UTILITAIRES GLOBALIZE (espacement)
       Source : Globalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Classes utilitaires d'espacement extraites de Globalize.css.
       Permettent d'ajouter rapidement une marge top ou bottom à n'importe
       quel élément via une classe HTML, sans écrire de CSS custom.

       Nomenclature : .mb-* = margin-bottom | .mt-* = margin-top
       Échelles : xxs (très petit) → xs → sm → md → lg → xl (très grand)
       Le !important est volontaire et documenté : ces classes sont des
       "utilitaires de dernier recours" qui doivent toujours l'emporter
       sur les règles de composants (principe des classes utilitaires).
       ════════════════════════════════════════════════════════════════════ */

    /* Classes margin-bottom — Globalize.css */
    .mb-xxs { margin-bottom: var(--prb-space-xxs) !important; } /* ≈ 8px */
    .mb-xs  { margin-bottom: var(--prb-space-xs)  !important; } /* ≈ 12px */
    .mb-sm  { margin-bottom: var(--prb-space-sm)  !important; } /* ≈ 24px */
    .mb-md  { margin-bottom: var(--prb-space-md)  !important; } /* ≈ 36px */
    .mb-lg  { margin-bottom: var(--prb-space-lg)  !important; } /* ≈ 54px */
    .mb-xl  { margin-bottom: var(--prb-space-xl)  !important; } /* ≈ 72px */
    .mb-0   { margin-bottom: 0 !important; }                     /* annule toute marge bottom */

    /* Classes margin-top — Globalize.css */
    .mt-xxs { margin-top: var(--prb-space-xxs) !important; }    /* ≈ 8px */
    .mt-xs  { margin-top: var(--prb-space-xs)  !important; }    /* ≈ 12px */
    .mt-sm  { margin-top: var(--prb-space-sm)  !important; }    /* ≈ 24px */
    .mt-md  { margin-top: var(--prb-space-md)  !important; }    /* ≈ 36px */
    .mt-lg  { margin-top: var(--prb-space-lg)  !important; }    /* ≈ 54px */
    .mt-xl  { margin-top: var(--prb-space-xl)  !important; }    /* ≈ 72px */
    .mt-0   { margin-top: 0 !important; }                        /* annule toute marge top */


    /* ════════════════════════════════════════════════════════════════════
       SECTION 5 — CLASSES UTILITAIRES GLOBALIZE (display, typo, position)
       Source : Globalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Classes atomiques réutilisables de Globalize.css.
       Chaque classe fait UNE chose précise — principe du Single Responsibility.
       ════════════════════════════════════════════════════════════════════ */

    /* ── Visibilité & display ────────────────────────────────────────── */
    .dp-n { display: none; }            /* Cache complètement l'élément */
    .dp-i { display: inline; }          /* Affiche en ligne */
    .dp-b { display: block; }           /* Affiche en bloc */
    .v-v  { visibility: visible; }      /* Rend visible (garde l'espace) */
    .v-h  { visibility: hidden; }       /* Masque (garde l'espace dans le flux) */

    /* ── Positionnement ─────────────────────────────────────────────── */
    .p-f { position: fixed; }           /* Fixé à la fenêtre (comme la nav bar) */
    .p-r { position: relative; }        /* Relatif au flux normal */
    .p-a { position: absolute; }        /* Absolu par rapport au parent relatif */

    /* ── Alignement du texte ────────────────────────────────────────── */
    .t-c { text-align: center; }        /* Centré */
    .t-l { text-align: left; }          /* Gauche */
    .t-j { text-align: justify; }       /* Justifié */

    /* ── Typographie ────────────────────────────────────────────────── */
    .ttu { text-transform: uppercase; }  /* Tout en majuscules */
    .ttn { text-transform: none; }       /* Annule text-transform */
    .fw2 { font-weight: 200; }          /* Très fin */
    .fw4 { font-weight: 400; }          /* Normal */
    .fw6 { font-weight: 600; }          /* Semi-gras */
    .fw8 { font-weight: 800; }          /* Extra-gras */

    /* ── Sélection de texte désactivée ──────────────────────────────── */
    /* Appliquée au body ou à un conteneur pour empêcher la sélection    */
    /* (utile sur les zones d'interface type boutons, navigation)        */
    .us-n {
      -webkit-user-select: none;    /* Safari, Chrome anciens */
      -ms-user-select:     none;    /* IE 10+ */
      -khtml-user-select:  none;    /* Konqueror */
      -moz-user-select:    none;    /* Firefox */
      user-select:         none;    /* Standard moderne */
    }

    /* ── Coupure intelligente des textes longs (Globalize.css) ─────── */
    /* Applique la césure automatique ET le retour à la ligne forcé      */
    /* pour les mots très longs (URL, hachages, noms sans espace)       */
    .cut-texte-magic {
      -webkit-hyphens: auto;       /* Safari */
      -moz-hyphens:    auto;       /* Firefox ancien */
      -ms-hyphens:     auto;       /* IE 10+ */
      hyphens:         auto;       /* Standard : Chrome 88+, Firefox 43+ */
      overflow-wrap:   break-word; /* Coupe le mot entier s'il dépasse le conteneur */
    }


    /* ════════════════════════════════════════════════════════════════════
       SECTION 6 — GRILLE MODERNE (Probalize.css)
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Classe .grid-container : alternative moderne aux tableaux HTML.
       Utilisée dans les démos Probalize (demo-3, demo-5).
       Adaptée ici sans conflit avec les classes .global et .faq-section.

       PRINCIPE CSS Grid :
       - repeat(auto-fit, ...) : nombre de colonnes calculé automatiquement
       - minmax(250px, 1fr) : chaque colonne fait au moins 250px, maximum 1fr
         (1fr = 1 fraction de l'espace disponible = répartition égale)
       - Résultat : 1 colonne sur mobile, 2-3 sur tablette, 3-4 sur desktop
         SANS media query — le navigateur calcule tout seul.
       ════════════════════════════════════════════════════════════════════ */

    /* Grille CSS auto-responsive — Probalize.css */
    .grid-container {
      display: grid;               /* Activation du mode grille CSS */

      /* Nombre de colonnes automatique selon la largeur disponible */
      /* minmax(250px, 1fr) = minimum 250px, maximum 1 fraction = égalité */
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));

      /* Espace entre les cellules — utilise la variable Probalize */
      gap: var(--prb-space-md);    /* ≈ 36px entre les cellules */
    }


    /* ════════════════════════════════════════════════════════════════════
       SECTION 7 — ACCESSIBILITÉ prefers-reduced-motion (Probalize.css)
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       WCAG 2.2 — Critère 2.3.3 (AAA) : Animation from Interactions
       "Les mouvements déclenchés par les interactions peuvent être désactivés."

       CONTEXTE CONVERGENCE :
       La page index contient plusieurs animations (loader spinner, halo pulse,
       hamburger, FAQ accordéon). Certains utilisateurs ont des troubles
       vestibulaires (vertiges) ou épileptiques — les animations peuvent
       provoquer des malaises ou crises.

       Ce media query détecte la préférence système "Réduire les animations"
       activée dans : Windows → Accessibilité | macOS → Accessibilité |
       iOS → Accessibilité → Mouvement | Android → Accessibilité

       Quand activé : toutes les animations et transitions sont réduites à 1ms
       (durée quasi nulle = disparaissent visuellement sans les supprimer du DOM).
       !important est requis pour écraser les durées inline ou spécifiques.
       ════════════════════════════════════════════════════════════════════ */

    /* Détection de la préférence "réduire les animations" du système */
    @media (prefers-reduced-motion: reduce) {

      /* Cible tous les éléments et leurs pseudo-éléments */
      *,
      *::before,
      *::after {
        /* Réduit toutes les animations à 1ms = quasi instantané = invisible */
        animation-duration: 0.01ms !important;

        /* Force les animations à ne jouer qu'une seule fois (pas de boucle) */
        animation-iteration-count: 1 !important;

        /* Réduit toutes les transitions à 1ms = pas d'effet de transition */
        transition-duration: 0.01ms !important;

        /* Désactive le scroll animé (html { scroll-behavior: smooth }) */
        /* et le remplace par un saut immédiat */
        scroll-behavior: auto !important;
      }

    } /* fin @media prefers-reduced-motion */


    /* ════════════════════════════════════════════════════════════════════
       SECTION 8 — GESTION DES IMAGES (Probalize.css + base_theme)
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Optimisation des images pour éviter le CLS (Cumulative Layout Shift).
       Le CLS mesure les "sauts" de contenu pendant le chargement.
       Google pénalise les pages avec un CLS > 0.1 dans ses Core Web Vitals.

       SOLUTION PROBALIZE :
       display:block     → supprime l'espace "inline" sous l'image (gap de 4px)
       max-width:100%    → l'image ne dépasse jamais son conteneur
       height:auto       → conserve les proportions quand max-width s'applique
       border-style:none → supprime les bordures des images-liens (IE 10+)

       NOTE sur aspect-ratio: attr(width)/attr(height) :
       Cette syntaxe n'est pas encore supportée par tous les navigateurs.
       La version fonctionnelle nécessite des dimensions explicites en HTML :
       <img src="..." width="600" height="400" alt="...">
       Le logo de Convergence a bien width="310" height="310" → ✓
       ════════════════════════════════════════════════════════════════════ */

    /* Règle universelle sur toutes les images — Probalize.css */
    img {
      display: block;              /* Élimine l'espace "inline" sous les images (bug courant) */
      max-width: 100%;             /* Empêche l'image de déborder de son conteneur */
      height: auto;                /* Maintient les proportions originales */
      border-style: none;          /* Supprime la bordure sur les images-liens (IE 10 fix) */
    }

    /* .flow — le "Lobotomized Owl" de Heydon Pickering (Probalize.css) */
    /* Espacement automatique entre tous les enfants directs d'un .flow  */
    /* Le sélecteur "* + *" signifie "tout élément qui suit un autre"   */
    .flow > * + * {
      margin-top: var(--prb-space-sm); /* Ajoute une marge top automatiquement */
    }


    /* ════════════════════════════════════════════════════════════════════
       SECTION 9 — SCROLL ET NAVIGATION (base_theme + Globalize)
       Source : base_theme_v_classic_probalize.css — Fabien Conéjéro
       ════════════════════════════════════════════════════════════════════ */

    /* Défilement fluide lors des liens ancres (#section, etc.) */
    /* Compatible : Chrome 61+, Firefox 36+, Safari 15.4+, Edge 79+ */
    /* Annulé automatiquement par @media (prefers-reduced-motion) ci-dessus */
    html {
      scroll-behavior: smooth;     /* Défilement animé pour les liens ancres internes */
    }

    /* Liens : suppression du soulignement — style Convergence */
    /* La couleur hérite du texte parent (blanc dans .global) */
    a {
      text-decoration: none;       /* Pas de soulignement par défaut */
    }

    /* NAV — suppression des puces de liste */
    /* Les <ul> et <li> dans les <nav> n'ont pas besoin de puces */
    nav ul,
    nav li {
      list-style-type: none;       /* Supprime les puces (•) */
      margin: 0;                   /* Supprime la marge gauche par défaut */
      padding: 0;
    }


    /* ════════════════════════════════════════════════════════════════════
       SECTION 10 — MEDIA QUERIES PROBALIZE pour --prb-space-unit
       Source : Probalize.css — Fabien Conéjéro — Licence EULA propriétaire
       ════════════════════════════════════════════════════════════════════
       Augmentation progressive de l'unité d'espacement de base sur
       les grands écrans — les espacements grandissent avec l'écran.

       POURQUOI ?
       Sur un écran 4K, un espace de 24px (sm) paraît minuscule.
       En augmentant --prb-space-unit à 1.25rem puis 1.5rem sur les grands
       écrans, tous les espacements calculés (sm, md, lg, xl) augmentent
       proportionnellement sans modifier une seule classe.
       ════════════════════════════════════════════════════════════════════ */

    /* Tablette et desktop (≥ 768px) */
    @media (min-width: 768px) {
      :root {
        /* L'unité de base passe de 1rem × 1.5 = 1.5rem à 1.25rem × 1.5 = 1.875rem */
        --prb-space-unit: calc(1.25rem * var(--prb-line-height)); /* ≈ 30px */
      }
    }

    /* Grands écrans (≥ 1200px) */
    @media (min-width: 1200px) {
      :root {
        /* L'unité de base passe à 1.5rem × 1.5 = 2.25rem */
        --prb-space-unit: calc(1.5rem * var(--prb-line-height));  /* ≈ 36px */
      }
    }
    /* ══════════════════════════════════════════════════════════════════
       FIN BLOC INTÉGRATION PROBALIZE + GLOBALIZE + BASE THEME
       ══════════════════════════════════════════════════════════════════ */


    /* ====================================================================
       MEDIA QUERIES — RESPONSIVE DESIGN
       Adaptation pour chaque catégorie d'écran
       ==================================================================== */

    /* ════════════════════════════════════════════════════════════════════
       ★ NOUVELLE RÈGLE — H1 LINE-HEIGHT À PARTIR DE 1550px
       ════════════════════════════════════════════════════════════════════

       PROBLÈME CIBLÉ :
       Sur les écrans larges (≥ 1550px), le h1 "CONVERGENCE HUMAINE &
       TECHNOLOGIQUE" peut passer sur deux lignes. Quand cela arrive,
       les deux lignes se retrouvent trop proches l'une de l'autre :
       l'œil perçoit un chevauchement ou un texte "collé".

       CAUSE :
       Le h1 n'a pas de line-height explicite dans le code de base.
       Il hérite donc de la valeur du body (180% soit ~1.8) — mais les
       navigateurs appliquent souvent une valeur "condensée" sur les
       titres gras en uppercase, car le moteur de rendu adapte
       automatiquement l'interligne aux polices système.
       Sur les grands écrans, ce comportement automatique est insuffisant.

       SOLUTION :
       On impose un line-height explicite uniquement à partir de 1550px.
       En dessous de 1550px, le comportement existant reste intact.

       VALEUR CHOISIE : line-height: 1.4
       ─ Une valeur sans unité est TOUJOURS préférable à em ou % pour
         line-height, car elle se calcule par rapport à la taille finale
         de la fonte APRÈS application du clamp() et des héritages.
         Exemple : si clamp() donne 2rem (32px), alors :
           line-height: 1.4  →  32px × 1.4 = 44.8px entre les lignes ✓
           line-height: 1.4em → calculé sur la fonte parente, pas finale ✗
       ─ 1.4 = 40% de la taille de fonte entre le bas d'une ligne
         et le haut de la prochaine = espace visible, élégant, non excessif.
       ─ Inférieur à 1.5 (corps de texte) → reste dans le registre "titre".
       ════════════════════════════════════════════════════════════════════ */

    /* ── Écrans larges ≥ 1550px : interligne du h1 augmenté ── */
    @media screen and (min-width: 1550px) {

      h1 {

        /* Augmente l'espacement vertical ENTRE LES LIGNES du h1.          */
        /* Applicable uniquement quand h1 passe sur plusieurs lignes,      */
        /* ce qui arrive sur ces largeurs avec le texte "CONVERGENCE       */
        /* HUMAINE & TECHNOLOGIQUE".                                        */
        /* Valeur sans unité = se calcule sur la fonte finale (pas héritée)*/
        line-height: 1.4;

      } /* fin h1 à ≥ 1550px */

    } /* fin @media min-width: 1550px */


    /* ── Très grands écrans : TV HD 1080p, 1440p ── */
    @media screen and (min-width: 1600px) {
      /* Sur TV et grands écrans, le clamp() a plafonné à 1.75rem.         */
      /* On autorise un peu plus ici : le contenant est large, le texte    */
      /* peut être plus grand sans risque de débordement.                  */
      h1 { font-size: clamp(1.75rem, 2.5vw, 2.4rem); } /* Légèrement plus grand sur TV */
      .global { padding: 60px 50px 70px; }
      .logo-wrapper { width: 340px; height: 340px; } /* Logo légèrement plus grand */
    }

    /* ── Écrans 4K (3840×2160) et 5K (5120×2880) ── */
    @media screen and (min-width: 2560px) {
      /* Sur résolutions ultra-hautes, on augmente la taille de base
         pour que les éléments restent proportionnels à la surface */
      html { font-size: 18px; }    /* 1em = 18px (au lieu de 16px par défaut) */
      /* clamp() sur 4K : 3.2vw = 3.2% × 3840 = 122px → plafonné à 3rem = 54px */
      h1 { font-size: clamp(2rem, 2.2vw, 3rem); } /* Adapté aux très grands écrans */
      .logo-wrapper { width: 420px; height: 420px; }
      nav[role="navigation"] > ul { height: 70px; }
    }

    /* ════════════════════════════════════════════════════════════════════
       ★ NOUVELLE RÈGLE — CENTRAGE DU TEXTE DANS .global À PARTIR DE 740px
       ════════════════════════════════════════════════════════════════════

       PROBLÈME CIBLÉ :
       À partir de 740px de large, le texte dans la div .global
       (Bienvenue, description Convergence, email, Site en construction...)
       apparaît décalé vers la gauche au lieu d'être centré.

       CAUSE :
       À cette largeur d'écran, la div .global a une largeur calculée
       (68% de l'écran) mais ses enfants <p> peuvent se retrouver alignés
       à gauche si leur max-width (660px) est atteinte et que leur
       margin: 0 auto n'est pas recalculé correctement selon le flux.
       L'absence de text-align: center explicite sur certains éléments
       héritiers renforce ce décalage.

       SOLUTION :
       On force explicitement le centrage de TOUS les éléments textuels
       dans .global à partir de 740px. Ces règles sont des sécurités :
       si les valeurs CSS de base fonctionnent déjà, elles sont sans effet.
       Si elles ne fonctionnent pas (cascade, héritage, spécificité), elles
       prennent le relais et garantissent le centrage.

       PROPRIÉTÉS UTILISÉES :

       [A] .global → margin: 0 auto
           Garantit que la div .global elle-même est centrée dans la page.
           margin: 0 auto = marges gauche et droite automatiques et égales
           = centrée horizontalement par rapport à son parent (<main>).

       [B] .global → text-align: center
           Force l'alignement du texte au centre dans la div.
           Cette propriété est héritée par tous les enfants inline
           (texte, spans, liens) qui n'ont pas leur propre text-align.

       [C] .global p → margin-left: auto et margin-right: auto
           Les paragraphes ont max-width: 660px défini dans le code de base.
           Quand un bloc a une largeur fixe/maximale, il faut des marges
           auto sur les côtés pour qu'il se centre dans son conteneur.
           Sans cela, le paragraphe colle à gauche même si text-align est centré
           (car text-align centre le TEXTE dans le bloc, pas le BLOC lui-même).

       [D] .global p → text-align: center
           Renforce le centrage du TEXTE à l'intérieur de chaque paragraphe.
           Complément de [C] : [C] centre le bloc, [D] centre le texte dans le bloc.
       ════════════════════════════════════════════════════════════════════ */

    /* ── Écrans ≥ 740px : centrage forcé du contenu texte dans .global ── */
    @media screen and (min-width: 740px) {

      /* [A] La div .global elle-même se centre dans la page */
      /* margin: 0 auto = marges gauche et droite automatiques et égales    */
      /* Ce sont les marges qui centrent un bloc dans son conteneur.         */
      .global {
        margin-left:  auto;   /* Marge gauche automatique = égale à la droite  */
        margin-right: auto;   /* Marge droite automatique = égale à la gauche  */

        /* [B] Alignement du texte au centre dans toute la div              */
        /* Héritée par h1, p, hr.sep, #auth-buttons et leurs enfants inline */
        text-align: center;
      }

      /* [C] + [D] Centrage des paragraphes et de leur texte */
      /* On cible spécifiquement les <p> ENFANTS DIRECTS de .global         */
      /* (sélecteur .global p = tous les p dans .global, y compris imbriqués)*/
      .global p {
        /* [C] Marge auto gauche/droite pour centrer le bloc <p> lui-même   */
        /* Indispensable car p a max-width: 660px — sans margin auto,        */
        /* un bloc à largeur fixe colle à gauche même si son parent est centré*/
        margin-left:  auto;   /* Centre le bloc paragraphe horizontalement  */
        margin-right: auto;   /* Côté droit = même valeur auto que la gauche */

        /* [D] Aligne le texte au centre DANS le paragraphe */
        /* text-align agit sur le texte inline à l'intérieur du bloc        */
        text-align: center;
      }

    } /* fin @media min-width: 740px */


    /* ── Ordinateurs et tablettes paysage (jusqu'à 1200px) ── */
    @media screen and (max-width: 1200px) {
      .global { width: 78%; }
      .faq-section { width: 78%; }
      /* h1 : clamp(0.85rem, 3.2vw, 1.75rem) gère automatiquement ce cas */
    }

    /* ── Tablettes portrait et petits laptops (jusqu'à 980px) ── */
    @media screen and (max-width: 980px) {
      .global {
        width: 88%;
        padding: 40px 30px 50px;
      }
      .faq-section { width: 88%; }
      /* h1 : à 980px, 3.2vw = 31.4px → dans les limites du clamp — pas d'override nécessaire */
    }

    /* ── Menu mobile + téléphones horizontaux (jusqu'à 768px) ── */
    @media screen and (max-width: 768px) {

      /* Le bouton hamburger devient visible */
      .nav-hamburger-btn {
        display: -webkit-flex;     /* Visible sur mobile */
        display: flex;
      }

      /* La barre nav n'a plus de padding horizontal */
      nav[role="navigation"] {
        padding: 0;
      }

      /* Le menu se referme (max-height: 0) par défaut */
      nav[role="navigation"] > ul {
        -webkit-flex-direction: column;
        flex-direction: column;    /* Items empilés verticalement */
        height: auto;              /* Hauteur automatique */
        max-height: 0;             /* FERMÉ par défaut */
        overflow: hidden;
        -webkit-transition: max-height 0.42s ease;
        transition: max-height 0.42s ease;
        -webkit-align-items: flex-start;
        align-items: flex-start;   /* Liens alignés à gauche */
        background: rgba(1, 12, 30, 0.96); /* Fond quasi opaque sur mobile */
        border-top: 1px solid rgba(77, 212, 240, 0.10);
        padding: 0;
      }

      /* Menu ouvert (classe .nav-open ajoutée par JavaScript) */
      nav[role="navigation"] > ul.nav-open {
        max-height: 380px;         /* Hauteur suffisante pour tous les liens */
        padding: 8px 0;
      }

      /* Chaque item occupe toute la largeur */
      nav[role="navigation"] > ul > li {
        width: 100%;
        height: auto;
      }

      /* Liens pleine largeur avec padding vertical */
      nav[role="navigation"] > ul > li > a {
        width: 100%;
        padding: 15px 24px;
        height: auto;
        border-bottom: none;       /* Pas de soulignement bas (remplacé par gauche) */
        border-left: 2px solid transparent; /* Indicateur gauche pour mobile */
      }

      /* Lien actif et survol sur mobile : indicateur à gauche */
      nav[role="navigation"] > ul > li > a[aria-current="page"],
      nav[role="navigation"] > ul > li > a:hover {
        border-bottom: none;
        border-left-color: #4dd4f0;
        background: rgba(77, 212, 240, 0.05);
      }

      /* Logo légèrement réduit sur mobile */
      .logo-wrapper { width: 260px; height: 260px; }

    } /* fin @media 768px */

    /* ── Téléphones portrait (jusqu'à 600px) ── */
    @media screen and (max-width: 600px) {
      .global {
        width: 94%;
        padding: 30px 18px 40px;
      }
      .faq-section { width: 94%; }
      h1 {
        font-size: 1.8em;
        letter-spacing: 0.07em;
      }
      p { font-size: 0.92em; }
      .logo-wrapper { width: 220px; height: 220px; }
    }

    /* ── Très petits écrans (< 380px) ── */
    @media screen and (max-width: 380px) {
      /* À 380px : clamp(0.85rem, 3.2vw, 1.75rem) → 3.2vw = 12.2px → min 0.85rem = 13.6px */
      /* Le minimum du clamp s'applique — pas besoin d'override, mais on renforce */
      h1 { font-size: 0.9rem; }    /* Force légèrement plus petit que le clamp min sur 320px */
      .logo-wrapper { width: 190px; height: 190px; }
      .faq-question-btn { font-size: 0.88em; }
    }



    /* ====================================================================
       LIEN CONNEXION — MENU DE NAVIGATION
       ====================================================================
       Le lien Connexion (#nav-login-link) dans le menu principal
       s'affiche en blanc pur, conformément à la charte demandée.
       Les autres liens restent à rgba(255,255,255,0.70).
       Hérite de tout le reste du style de navigation (uppercase,
       letter-spacing, hauteur, hover, focus) sans modification.
       ==================================================================== */

    /* Couleur blanche sur le lien Connexion au repos */
    #nav-login-link {
      color: #ffffff !important;     /* Blanc pur — différenciateur visuel Connexion */
    }

    /* Survol et focus : même traitement que les autres liens nav */
    #nav-login-link:hover,
    #nav-login-link:focus {
      color: #7be8ff !important;     /* Cyan clair — cohérence avec le reste du menu */
    }


    /* ====================================================================
       TAGLINE HERO — PARAGRAPHE COURT SOUS LE LOGO
       ====================================================================
       Remplace l'ancien bouton Se connecter de la section hero.
       La connexion est désormais intégrée dans le menu de navigation.
       Texte discret, centré, style Convergence (uppercase, letter-spacing).
       margin-top: 36px conserve le même espacement qu'avait le bouton.
       ==================================================================== */
    .hero-tagline {
      margin-top: 36px !important;           /* Même espace que l'ancien bouton */
      margin-bottom: 0 !important;
      max-width: 340px;                      /* Limite la largeur pour la lisibilité */
      font-size: 0.78em;                     /* Discret — ne rivalise pas avec le logo */
      font-weight: 300;                      /* Fin / léger */
      letter-spacing: 0.16em;               /* Espacement Convergence */
      text-transform: uppercase;             /* Majuscules — style de la charte */
      color: rgba(255, 255, 255, 0.50);      /* Blanc atténué — second plan */
      text-align: center;                    /* Centré sous le logo */
      line-height: 1.9em;                    /* Interligne aéré */
      text-shadow: none;                     /* Pas d'ombre sur fond foncé */
    }
