/**
 * En-tête confcardio pour Cassiopeia
 *
 * Reproduit l'en-tête « 5-FullwidthCenter » de Helix Ultimate :
 * pleine largeur, fond blanc, logo à gauche, navigation centrée,
 * hauteur 60px (55px sous 575px).
 *
 * Ce fichier est indépendant de user.css (compilé depuis custom.scss)
 * afin de ne pas être écrasé lors d'une recompilation.
 *
 * @version 1.22.2
 */

/* ------------------------------------------------------------------
   1. Barre d'en-tête : fond blanc, une seule ligne, pleine largeur
   ------------------------------------------------------------------ */

.container-header {
    background-color: #fff;
    background-image: none;
    box-shadow: 0 1px 4px rgb(0 0 0 / 8%);
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    min-height: 60px;
}

/* En-tête fixé au défilement, comme la classe « sticky-header » que Helix
   posait sur <body> en production. Cassiopeia impose lui-même
   « position: relative » (template.css) puis le REPETE en !important sous
   991.98px : le !important ci-dessous n'est donc pas un confort, c'est le seul
   moyen de reprendre la main sur mobile et tablette.
   Le z-index: 10 vient de Cassiopeia ; la règle
   « .container-header:has(.offcanvas.show) { z-index: 10001 } » plus bas
   reste nécessaire pour que le panneau latéral passe devant le voile. */
.container-header {
    position: sticky;
    top: 0;
}

@media (max-width: 991.98px) {
    .container-header {
        position: sticky !important;
    }
}

/* Les blocs de l'en-tête ne sont plus centrés sur 1320px : ils se
   partagent la largeur. Le premier .grid-child porte la marque. */
.container-header > .grid-child {
    width: auto;
    max-width: none;
    padding: 0 .75rem;
}

.container-header > .grid-child:not(.container-nav):not(.container-below-top) {
    flex: 0 0 auto;
}

/* ------------------------------------------------------------------
   2. Logo
   ------------------------------------------------------------------ */

.container-header .navbar-brand {
    margin-inline-end: 0;
    padding-top: 0;
    padding-bottom: 0;
    display: flex;
    align-items: center;
    gap: .5rem;
}

.container-header .navbar-brand,
.container-header .navbar-brand a {
    color: var(--bleu-fonce, #081c42);
}

.container-header .brand-logo img {
    height: 45px;
    width: auto;
    display: block;
}

.container-header .site-description {
    color: var(--rouge, #a6192e);
    font-size: 18px;
    white-space: nowrap;
}

/* ------------------------------------------------------------------
   3. Navigation centrée
   ------------------------------------------------------------------ */

.container-header .container-nav {
    flex: 1 1 auto;
    flex-wrap: nowrap;
    justify-content: center;
    padding-bottom: 0;
}

/* Repartition horizontale du bureau, reprise de Helix. « center » centrait le
   menu ET le bloc « Connexion / M'abonner » comme un seul groupe : le menu
   partait trop a droite et il restait 155px de vide apres le dernier bouton.
   Helix procede autrement — boutons plaques a droite a 137px du bord (valeur
   constante, relevee a 1440 et a 1920), menu centre dans l'espace restant
   entre le logo et ces boutons. C'est ce que reproduisent les trois regles
   ci-dessous : space-between pousse le bloc de droite, le <nav> prend toute
   la place libre et centre son contenu.
   Bornees a 992px : en dessous, l'en-tete passe au hamburger et le bloc de
   droite n'est plus sur cette ligne. */
@media (min-width: 992px) {
    /* Selecteur en « > .grid-child.container-nav » et non « .container-nav » :
       en mise en page fluide, template.min.css pose « body.wrapper-fluid
       header > .grid-child { padding-right: 2em } », de specificite (0,2,2),
       qui battait la classe seule (0,2,0) — le padding retombait a 35px et les
       boutons quittaient leur alignement. La forme ci-dessous vaut (0,3,0) et
       passe devant, que la page soit en wrapper-fluid ou en wrapper-static. */
    .container-header > .grid-child.container-nav {
        justify-content: space-between;
        padding-right: 137px;
    }

    .container-header .container-nav > nav.navbar {
        flex: 1 1 auto;

        /* Bootstrap pose « justify-content: space-between » sur .navbar. Au-dessus
           de 992px il ne reste qu'UN enfant visible — .cc-nav-inline, le burger et
           l'offcanvas étant en d-lg-none — et « space-between » collait donc le
           menu à gauche. On le centre ici.
           Cette déclaration remplace une règle qui visait « > .navbar-collapse » :
           cet élément n'existe pas dans notre surcharge offcanvas-metismenu.php
           (0 occurrence), le sélecteur ne ciblait donc rien. */
        justify-content: center;
    }
}

/* Blanc de 18px entre l'en-tete et le premier bloc de la page d'accueil : le
   coeur de Cassiopeia pose « .container-component > :first-child {
   margin-top: 1em } » dans template.min.css, et le <main> le prend. La bande
   du hero doit toucher l'en-tete. Limite a la page d'accueil (cc-hp-v2) :
   ailleurs cette gouttiere separe le texte de l'en-tete et doit rester. */
body.cc-hp-v2 .container-component > main {
    margin-top: 0;
}

.container-header nav {
    margin-top: 0;
}

/* Cassiopeia pose `color: #fff` sur l'ul et `flex: 1` au-delà de 992px, ce qui
   colore les liens en blanc (ils héritent via currentColor) et étire le menu
   sur toute la ligne. On reprend la main avec une spécificité supérieure. */
.container-header .mod-menu.metismenu {
    color: var(--bleu-fonce, #081c42);
    display: flex;
    align-items: center;
}

@media (min-width: 992px) {
    .container-header .mod-menu.metismenu {
        flex: 0 1 auto;
        justify-content: center;
    }
}

/* Cassiopeia pose `padding: .5em 1em` sur les <li> (.metismenu-item), qui
   s'ajoute au padding des liens : ~62px entre deux libellés au lieu des 30px
   de Helix. On ne garde que celui du lien, qui porte aussi la pastille. */
.container-header .mod-menu.metismenu > li.metismenu-item {
    padding: 0;
    font-size: inherit;
}

.container-header .mod-menu.metismenu > li > a,
.container-header .mod-menu.metismenu > li > button {
    color: var(--bleu-fonce, #081c42);
    font-size: 15px;
    font-weight: 500;
    line-height: 35px;
    padding: 0 15px;
    border-radius: 7px;
}

.container-header .mod-menu.metismenu > li.active > a,
.container-header .mod-menu.metismenu > li.active > button,
.container-header .mod-menu.metismenu > li > a:hover,
.container-header .mod-menu.metismenu > li > button:hover {
    background: rgb(46 98 176 / 12%);
    font-weight: 600;
    color: var(--bleu-fonce, #081c42);
}

/* Reprise du réglage Helix : dernier item resserré. */
.container-header .mod-menu.metismenu > li:last-child > a {
    padding: 0 10px;
}

/* Cassiopeia souligne l'item actif d'un trait blanc en ::after — invisible sur
   fond blanc, et redondant avec la pastille. */
.container-header .mod-menu.metismenu > li.active:after,
.container-header .mod-menu.metismenu > li:hover:after {
    background: none;
}

/* Modules d'appoint de la position « menu » (connexion, mon compte) */
.container-header .container-nav .mod-custom {
    display: flex;
    align-items: center;
}

/* « Connexion » et « M'abonner » sur une seule ligne. Le <nav> voisin est en
   « flex: 1 1 auto » : il pouvait comprimer ce module jusqu'a ce que ses deux
   <a>, qui sont en flux inline dans .sp-module, se cassent l'un sous l'autre —
   visible des 992px, la largeur ou le menu horizontal apparait.
   Deux verrous complementaires : flex-shrink a 0 pour que le module garde sa
   largeur naturelle, et nowrap pour interdire la coupure si la place venait
   malgre tout a manquer. Les deux &nbsp; du balisage assurent l'ecart. */
.container-header .container-nav .mod-custom {
    flex: 0 0 auto;
}

.container-header .container-nav .mod-custom .sp-module {
    white-space: nowrap;
}

/* Retrait interieur des modules de cette position — restitution du .sp-module
   de Helix, que Cassiopeia ne reproduit pas.
   Mesure comparative a 1100px avant correction :
     prod    : boite du module 161 a 752, lien « Connexion » a 772  → 20px
     recette : boite du module 161 a 820, lien « Connexion » a 820  →  0px
   Les 20px manquants se voyaient surtout pour un visiteur CONNECTE, ou
   « Mon compte » (module 186) et « Deconnexion » (module 185) sont deux
   modules DISTINCTS qui se touchaient exactement — contrairement a
   « Connexion / M'abonner » (module 161), deux liens d'un seul module separes
   par des &nbsp;. Poser le retrait sur .sp-module traite les deux cas d'un
   coup : il ecarte le second module du premier, et le premier du menu.
   Le combinateur « > » exclut le .mod-custom du panneau lateral, qui est
   imbrique plus bas dans .container-nav et n'a pas a etre indente.
   Borne a 992px : en dessous ces liens sont masques (d-lg-inline-block) et
   l'en-tete passe au hamburger. */
@media (min-width: 992px) {
    .container-header > .container-nav > .mod-custom .sp-module {
        padding-left: 20px;
    }
}

/* ------------------------------------------------------------------
   4. Mobile
   ------------------------------------------------------------------ */

@media (max-width: 575.98px) {
    .container-header {
        min-height: 55px;
        padding-right: 5px;
    }

    .container-header > .grid-child {
        padding: 0 5px;
    }

    .container-header .site-description {
        font-size: 13px;
    }
}

/* ------------------------------------------------------------------
   4 bis. Sous 992 px : hamburger + panneau lateral
   Portage de l'offcanvas « 2-LeftBordered » de Helix, valeurs relevees
   sur l'ancien template : panneau 300px depuis la droite, fond blanc,
   voile rgba(0,0,0,.7) floute 10px, items 13px #252525, actif #a6192e,
   barres du hamburger 25x2px noires.
   Le composant est l'offcanvas natif de Bootstrap 5.3 fourni par
   Cassiopeia : ni JavaScript maison, ni jQuery.
   ------------------------------------------------------------------ */

@media (max-width: 991.98px) {

    /* Logo : le large cede la place au petit coeur, comme Helix le faisait
       via .logo-image-phone. L'image reste dans le DOM en 1x1px plutot que
       display:none, sinon le lien perd son nom accessible (porte par alt). */
    .container-header .brand-logo {
        display: inline-block;
        width: 48px;
        height: 45px;
        background: url("/images/logo/logo-confcardio-coeur-144.webp") center / contain no-repeat;
    }

    .container-header .brand-logo img {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
    }

    /* Le reglage « Mise en page » du template pose wrapper-fluid, et Cassiopeia
       applique alors « body.wrapper-fluid header > .grid-child » avec 2em de
       marge laterale. Cette regle (specificite 0-2-2) bat celle de la section 1
       ci-dessus (0-2-0) : le hamburger se retrouvait a 40px du bord, contre 5px
       chez Helix. On reprend la main avec une specificite superieure. */
    body.wrapper-fluid .container-header > .grid-child {
        padding-inline: 10px;
    }

    /* Les blocs de l'en-tete se rangent a droite, le hamburger ferme la
       marche — ordre de Helix : [Cours Annales ECG] [Connexion] [burger]. */
    /* align-items vaut « normal » sur .container-nav : le <nav> du hamburger ne
       s'y centrait pas et retombait 8px sous l'axe de l'en-tete. */
    .container-header .container-nav {
        justify-content: flex-end;
        align-items: center;
        gap: .5rem;
    }

    /* margin:0 est indispensable. Cassiopeia pose « .container-header
       .container-nav nav { margin-top: 1em } » (17.6px ici), et cette regle a
       deux classes bat celle de la section 1 ci-dessus. Comme c'est la boite DE
       MARGE que align-items centre, le hamburger se retrouvait 8px sous l'axe
       de l'en-tete. Ce selecteur a deux classes et deux elements reprend la main.
       Les 12px s'ajoutent aux 8px de gouttiere ci-dessus, soit 20px a gauche du
       hamburger — la valeur de Helix (margin-left sur #offcanvas-toggler). */
    .container-header .container-nav > nav.navbar {
        order: 99;
        padding: 0;
        margin: 0;
        margin-inline-start: 12px;
    }

    /* Hamburger : trois barres, reprises de .burger-icon de Helix. */
    .container-header .cc-burger {
        width: 25px;
        padding: 0;
        background: none;
        border: 0;
        cursor: pointer;
    }

    .container-header .cc-burger > * {
        pointer-events: none;
    }

    .container-header .cc-burger__bars {
        display: block;
    }

    .container-header .cc-burger__bars > span {
        display: block;
        height: 2px;
        margin: 5px 0;
        background-color: #000;
        transition: transform .3s ease-in, opacity .3s ease-in;
    }

    /* Croix de fermeture : les memes barres, pivotees. */
    .cc-burger--close .cc-burger__bars > span:nth-child(1) {
        transform: translate(0, 7px) rotate(-45deg);
    }

    .cc-burger--close .cc-burger__bars > span:nth-child(2) {
        opacity: 0;
    }

    .cc-burger--close .cc-burger__bars > span:nth-child(3) {
        transform: translate(0, -7px) rotate(45deg);
    }

    /* Panneau. */
    .cc-offcanvas {
        --offcanvas-width: 300px;
    }

    /* Le .offcanvas-header de Cassiopeia pose display:flex et align-items mais
       pas justify-content (calcule : « normal ») : sans cette ligne la croix
       se colle au logo au lieu de filer a droite du panneau. */
    .cc-offcanvas__header {
        justify-content: space-between;
        padding: 1.5rem 1rem 1rem;
    }

    .cc-offcanvas__logo {
        display: block;
        width: 48px;
        height: 45px;
        background: url("/images/logo/logo-confcardio-coeur-144.webp") center / contain no-repeat;
    }

    .cc-offcanvas__body {
        padding: 5px 25px 25px;
    }

    /* Le voile de Bootstrap vit sous <body> a z-index 1040, alors que
       .container-header est en position:sticky z-index:10 — donc un contexte
       d'empilement dont le panneau ne peut pas sortir. Sans cette regle le
       panneau passerait DERRIERE le voile. Le bouton retour-haut, pose a
       10000 par Cassiopeia, est ecarte le temps de l'ouverture. */
    .container-header:has(.offcanvas.show) {
        z-index: 10001;
    }

    body:has(.offcanvas.show) .back-to-top-link {
        display: none;
    }

    .offcanvas-backdrop {
        backdrop-filter: blur(10px);
    }

    .offcanvas-backdrop.show {
        opacity: .7;
    }

    /* Recherche (module mod_finder, en tete du panneau). Deux reprises de Helix :
       le corps du champ etait aligne sur celui des entrees du menu — 13px, via
       « .offcanvas-menu .form-control » dans custom.scss — et son conteneur
       portait un mb-3, d'ou la respiration avant le menu. Sans cela le champ
       herite du corps de page (1.1rem) et colle au premier item. */
    .container-header .cc-offcanvas__body .mod-finder {
        margin-bottom: 1rem;
    }

    .container-header .cc-offcanvas__body .mod-finder .form-control {
        font-size: 13px;
    }

    /* Items du panneau. Le module 182 utilise la mise en page par defaut de
       mod_menu : son <ul> porte « mod-menu mod-list nav », sans la classe
       metismenu du menu de bureau — d'ou des selecteurs sur .mod-menu seul. */
    .container-header .cc-offcanvas__body .mod-menu {
        flex-direction: column;
        align-items: stretch;
        width: 100%;
        margin: 0;
        padding: 0;
        list-style: none;
    }

    /* Geometrie reprise a l'identique de Helix (custom.scss l. 42-43, qui
       surchargeait le « border-menu » d'origine) : li en 4px 0, lien en
       4px 30px 4px 10px, 13px/18px — soit 34px par entree. */
    .container-header .cc-offcanvas__body .mod-menu > li {
        border-bottom: 1px solid rgb(32 31 31 / 10%);
        padding: 4px 0;
    }

    .container-header .cc-offcanvas__body .mod-menu > li > a,
    .container-header .cc-offcanvas__body .mod-menu > li > button,
    .container-header .cc-offcanvas__body .mod-menu > li > span {
        display: block;
        width: 100%;
        padding: 4px 30px 4px 10px;
        font-size: 13px;
        line-height: 18px;
        letter-spacing: 1px;
        text-align: start;
        color: #252525;
        opacity: .7;
        border-radius: 0;
    }

    /* Icones des entrees (« <span class="p-2 pt-0 fa-solid ..."> », posees par
       le champ « Classe de l image du lien » de l element de menu). L utilitaire
       .p-2 de Bootstrap pose « padding: .5rem !important » sur les quatre cotes,
       ce qui decale l icone vers la droite et desaligne les libelles. On ne garde
       que la marge de droite, celle qui separe l icone du texte.
       La regle est bornee au panneau : .p-2 est un utilitaire global, le
       surcharger partout casserait les autres gabarits. */
    .container-header .cc-offcanvas__body .mod-menu .p-2 {
        padding: 0 .5rem 0 0 !important;
    }

    .container-header .cc-offcanvas__body .mod-menu > li > a.mnu-sep {
        padding-bottom: 12px;
    }

    .container-header .cc-offcanvas__body .mod-menu > li > a.mnu-sep-top {
        padding-top: 12px;
    }

    .container-header .cc-offcanvas__body .mod-menu > li.current > a,
    .container-header .cc-offcanvas__body .mod-menu > li.active > a,
    .container-header .cc-offcanvas__body .mod-menu > li > a:hover,
    .container-header .cc-offcanvas__body .mod-menu > li > button:hover {
        color: var(--rouge, #a6192e);
        background: none;
    }

    /* Chez Helix, les entrees portant la classe de lien « mnu-sep » (Connexion,
       M'abonner) etaient soulignees d'un trait gris plus marque, qui les
       detachait du reste. La regle d'origine (.offcanvas-menu a.mnu-sep dans
       custom.scss) visait l'ancien panneau ; on la reporte sur le <li> pour ne
       pas superposer deux traits. */
    .container-header .cc-offcanvas__body .mod-menu > li:has(> a.mnu-sep) {
        border-bottom-color: #c0c0c0;
    }

    .container-header .cc-offcanvas__body .mod-menu > li:has(> a.mnu-sep-top) {
        border-top: 1px solid #c0c0c0;
    }

    /* Bloc promotionnel (module 183), sous le menu comme chez Helix.
       display:block est indispensable : la section 3 ci-dessus pose
       « .container-header .container-nav .mod-custom { display:flex } » pour le
       module « Connexion / M'abonner », et le panneau etant lui-meme dans
       .container-nav, ce bloc en heritait — son titre se retrouvait en colonne
       a cote du texte. */
    .container-header .cc-offcanvas__body .mod-custom {
        display: block;
        margin-top: 1.25rem;
        font-size: 13px;
    }

    /* ------------------------------------------------------------------
       Modules d'appoint de la position « menu » (« Cours Annales ECG »).
       Cassiopeia rend cette position avec style="none", dont le gabarit se
       reduit a « echo $module->content » : aucun conteneur, donc le suffixe
       de classe du module (« mnu-header-mobile-wrap d-md-none ») est perdu.
       Helix utilisait sp_xhtml, qui enveloppait chaque module dans un
       <div class="sp-module {moduleclass_sfx}">, d'ou son fonctionnement.
       On rattrape par la structure : le <ul> de ces modules est un enfant
       DIRECT de .container-nav, alors que celui du menu principal est
       imbrique dans nav > .offcanvas > .offcanvas-body.
       ------------------------------------------------------------------ */
    /* Cassiopeia pose « .container-header .mod-menu { color:#fff; flex:1 0 100% } »,
       ecrit pour son en-tete bleu fonce. Deux degats ici : les liens, en
       currentColor, sortaient blancs sur blanc — donc invisibles ; et le flex-basis
       a 100% faisait occuper toute la ligne au <ul>, qui debordait par-dessus le
       logo. La regle de la section 3 ne rattrapait que le menu principal, dont l'ul
       porte la classe metismenu ; celui-ci ne l'a pas. */
    .container-header .container-nav > ul.mod-menu {
        display: flex;
        flex: 0 0 auto;
        flex-direction: row;
        align-items: center;
        margin: 0;
        padding: 0;
        list-style: none;
        color: var(--bleu-fonce, #081c42);
    }

    .container-header .container-nav > ul.mod-menu > li > a {
        color: var(--bleu-fonce, #081c42);
    }

    .container-header .container-nav > ul.mod-menu > li {
        margin-right: 20px;
        font-size: .88rem;
        padding: 0;
    }

    .container-header .container-nav > ul.mod-menu > li:last-child {
        margin-right: 5px;
    }

    .container-header .container-nav > ul.mod-menu > li.current > a {
        font-weight: 600;
    }
}

/* Equivalent de la classe d-lg-none que le suffixe perdu ne pose plus.
   ATTENTION : c'est ICI que se regle la visibilite du module « Cours / Annales
   / ECG » (module 221, reserve aux abonnes), et NULLE PART AILLEURS. Changer
   le suffixe de classe du module dans l'administration n'a aucun effet — la
   position « menu » est rendue par Cassiopeia avec style="none", dont le
   gabarit se reduit a « echo $module->content » : le suffixe n'est jamais
   emis (voir le commentaire detaille plus haut, section du panneau lateral).
   Seuil passe de 768px a 992px le 2026-08-17 : le module doit rester visible
   jusqu'a 991px inclus, et ne disparaitre qu'a partir de 992px, ou le menu
   horizontal complet prend le relais. */
@media (min-width: 992px) {
    .container-header .container-nav > ul.mod-menu {
        display: none;
    }
}

/* ==================================================================
   Polices reprises de Helix (parametres du style de template id 12).
   Cassiopeia ne propose quun seul champ "Preference des polices" et laisse
   --cassiopeia-font-family-headings vide : le detail par balise passe donc
   par le CSS. DM Sans etait appelee par son nom dans custom.scss sans aucun
   @font-face -- Helix la chargeait lui-meme, do les titres retombes en
   sans-serif systeme sous Cassiopeia.
   ================================================================== */

:root {
    --cassiopeia-font-family-body: "DM Sans", sans-serif;
    --cassiopeia-font-family-headings: "Source Serif 4", "Iowan Old Style", Georgia, serif;
    --cassiopeia-font-weight-headings: 500;
}

/* Open Sans (h4, h5, h6 chez Helix) — fichiers locaux, aucune requete externe. */

/* Faces limitees aux graisses reellement utilisees dans les CSS du site.
   Releve fait sur user.css + header.css + home.css, blocs @font-face exclus :
     DM Sans   -> 400, 500, 600, 700 (+ italique 400 pour les <em>)
     Open Sans -> 400 (h4) et 600 (h5, h6)
   Un @font-face non utilise n est pas telecharge par le navigateur, mais
   autant ne declarer que le necessaire. */
@font-face { font-family:"DM Sans"; src:url("../fonts/dm-sans/DMSans-Regular.woff2") format("woff2"),url("../fonts/dm-sans/DMSans-Regular.ttf") format("truetype"); font-weight:400; font-style:normal; font-display:swap; }
@font-face { font-family:"DM Sans"; src:url("../fonts/dm-sans/DMSans-Medium.woff2") format("woff2"),url("../fonts/dm-sans/DMSans-Medium.ttf") format("truetype"); font-weight:500; font-style:normal; font-display:swap; }
@font-face { font-family:"DM Sans"; src:url("../fonts/dm-sans/DMSans-SemiBold.woff2") format("woff2"),url("../fonts/dm-sans/DMSans-SemiBold.ttf") format("truetype"); font-weight:600; font-style:normal; font-display:swap; }
@font-face { font-family:"DM Sans"; src:url("../fonts/dm-sans/DMSans-Bold.woff2") format("woff2"),url("../fonts/dm-sans/DMSans-Bold.ttf") format("truetype"); font-weight:700; font-style:normal; font-display:swap; }
@font-face { font-family:"DM Sans"; src:url("../fonts/dm-sans/DMSans-Italic.woff2") format("woff2"),url("../fonts/dm-sans/DMSans-Italic.ttf") format("truetype"); font-weight:400; font-style:italic; font-display:swap; }

@font-face { font-family:"Open Sans"; src:url("../fonts/open-sans/OpenSans-Regular.woff2") format("woff2"),url("../fonts/open-sans/OpenSans-Regular.ttf") format("truetype"); font-weight:400; font-style:normal; font-display:swap; }
@font-face { font-family:"Open Sans"; src:url("../fonts/open-sans/OpenSans-SemiBold.woff2") format("woff2"),url("../fonts/open-sans/OpenSans-SemiBold.ttf") format("truetype"); font-weight:600; font-style:normal; font-display:swap; }

/* h1 et h2 : Source Serif 4 500 (Helix h1_font / h2_font). */
h1, .h1, h2, .h2 {
    font-family: "Source Serif 4", "Iowan Old Style", Georgia, serif;
    font-weight: 500;
}

/* h3 : DM Sans 400, noir (Helix h3_font). */
h3, .h3 {
    font-family: "DM Sans", sans-serif;
    font-weight: 400;
    color: #000;
}

/* h4, h5, h6 : Open Sans, comme Helix. h5 et h6 en 600. */
h4, .h4, h5, .h5, h6, .h6 {
    font-family: "Open Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
}
/* 400 explicite : Open Sans n a pas de face 500, et h4 heriterait sinon du
   --cassiopeia-font-weight-headings a 500, que le navigateur devrait
   synthetiser. */
h4, .h4 { font-weight: 400; }
h5, .h5, h6, .h6 { font-weight: 600; }

/* Corps de page : DM Sans 400 / 1.1rem (Helix body_font).
   Interligne des paragraphes : Helix (custom_font, selecteur p) et donc la
   production sont a 1.8. Choix assume de Roland le 2026-08-17 : 1.5 sur le
   nouveau template, aligne sur le line-height du <body>, le 1.8 etant juge
   trop aere sur mobile. C'est donc une DIVERGENCE VOLONTAIRE d'avec la prod,
   a ne pas "corriger" en reprenant la valeur Helix. .hero-desc garde son 1.8
   propre (custom.scss). */
body {
    font-family: "DM Sans", sans-serif;
    font-size: 1.1rem;
    font-weight: 400;
}
p { line-height: 1.5; }

/* Navigation : DM Sans 0.88rem, interlettrage 1px (Helix navigation_font). */
.container-header .mod-menu.metismenu > li > a,
.container-header .mod-menu.metismenu > li > button {
    font-family: "DM Sans", sans-serif;
    font-size: 0.88rem;
    letter-spacing: 1px;
}

/* ==================================================================
   Bas de page — portage du module SP Page Builder id=151 « Bas des pages »
   (entree singleceidx_sppagebuilder id=12) vers le module personnalise 230.
   Valeurs reprises une a une des reglages de l addon :
     section  : id=section-bottom, padding 20px 0 0 0,
                background var(--bleu-bg-degrade), colonnes centrees
     colonnes : 33.333333% / 66.666667%, 100% a partir de sm
     logo     : padding-bottom 20px
     nav      : aligne a gauche, 13px, graisse 300, majuscules,
                couleur var(--bleu-pale) (custom CSS de l addon, qui battait
                le global_link_color blanc), survol #fefefe
     social   : titre 13px graisse 500 blanc ; bouton Facebook, icone #fff
                sur #4378f8, rayon 4px, survol #2055d4
   ================================================================== */
/* Bouton « remonter en haut » (Cassiopeia, #back-top) : masque sous 480px.
   Sur les tres petits ecrans il empietait sur le bas de page. Seuil demande
   par Roland le 2026-08-17 ; il sort volontairement de la grille Bootstrap
   utilisee ailleurs dans ce fichier, ne pas le « realigner » sur 576px.
   Le masquage pendant l'ouverture du panneau lateral est gere separement,
   plus haut (body:has(.offcanvas.show)). */
@media (max-width: 479.98px) {
    .back-to-top-link {
        display: none;
    }
}

.cc-bottom {
    background: var(--bleu-bg-degrade);
    padding: 20px 0 0;
    color: #fff;
}

.cc-bottom__inner {
    width: 100%;
    max-width: 1140px;
    margin-inline: auto;
    padding-inline: 1rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
}

.cc-bottom__logo {
    flex: 0 0 33.333333%;
    max-width: 33.333333%;
    padding-bottom: 20px;
}

.cc-bottom__logo img {
    height: auto;
    max-width: 100%;
}

.cc-bottom__aside {
    flex: 0 0 66.666667%;
    max-width: 66.666667%;
}

/* Les 3 entrées restent côte à côte en 3 colonnes et cassent leur texte à
   l'intérieur de leur colonne quand la place manque. Avec « flex-wrap: wrap »
   c'était la LISTE qui se repliait : 2 entrées sur la première ligne, la 3e
   seule en dessous. « min-width: 0 » est indispensable — sans lui un élément
   flex refuse de descendre sous la largeur de son mot le plus long et
   déborderait au lieu de se couper. */
.cc-bottom__nav {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: nowrap;
    justify-content: flex-start;
    gap: 1.5rem;
}

/* Les entrees gardent leur largeur naturelle et se suivent a 1.5rem d'ecart :
   c'est le rendu de production. Le partage en trois colonnes egales ne vaut
   que pour les petites largeurs, ci-dessous — applique partout, il etalait les
   trois liens sur toute la largeur du bas de page. */
.cc-bottom__nav li {
    flex: 0 0 auto;
    min-width: 0;
}

/* Sous 768px les trois entrees ne tiennent plus cote a cote a leur largeur
   naturelle. Elles se partagent alors la ligne en trois colonnes egales et
   cassent leur texte a l'interieur de leur colonne, plutot que de laisser la
   liste se replier avec un lien orphelin sur une seconde ligne.
   « min-width: 0 » est indispensable : sans lui un element flex refuse de
   descendre sous la largeur de son mot le plus long et deborderait. */
@media (max-width: 767.98px) {
    .cc-bottom__nav li {
        flex: 1 1 0;
    }
}

@media (max-width: 575.98px) {
    .cc-bottom__nav {
        gap: 1rem;
    }
}

.cc-bottom__nav a {
    color: var(--bleu-pale);
    font-size: 13px;
    font-weight: 300;
    text-transform: uppercase;
    text-decoration: none;
}

.cc-bottom__nav a:hover,
.cc-bottom__nav a:focus {
    color: #fefefe;
}

.cc-bottom__social {
    margin-top: 1rem;
}

.cc-bottom__social-title {
    font-size: 13px;
    font-weight: 500;
    color: #fff;
    margin-bottom: .5rem;
}

.cc-bottom__social-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 4px;
    background: #4378f8;
    color: #fff;
}

.cc-bottom__social-btn:hover,
.cc-bottom__social-btn:focus {
    background: #2055d4;
    color: #fff;
}

/* Bascule en pleine largeur au point de rupture sm, comme les colonnes SPPB. */
@media (max-width: 767.98px) {
    .cc-bottom__inner {
        flex-wrap: wrap;
    }

    .cc-bottom__logo,
    .cc-bottom__aside {
        flex: 0 0 100%;
        max-width: 100%;
    }
}

/* Le bas de page couvre toute la largeur de l ecran. Cassiopeia range bottom-a
   dans la zone centrale de .site-grid, et .grid-child plafonne a 1320px avec
   margin-inline auto : on repasse sur les lignes nommees full-start/full-end,
   on leve le plafond et on annule le flex du grid-child. */
.site-grid > .container-bottom-a {
    grid-column: full-start / full-end;
    display: block;
    max-width: none;
    margin-inline: 0;
    padding-inline: 0;
}

/* Copyright — sous le logo, sur toute la largeur du bloc.
   Format repris de Helix : .sp-copyright etait en font-size 10px
   (custom.scss ligne 2267). Helix l affichait sur son bandeau clair
   footer1 en #034680 ; ici le bloc est sur le degrade sombre, donc la
   couleur des liens de navigation est reprise pour rester lisible. */
.cc-bottom__copyright {
    flex: 0 0 100%;
    max-width: 100%;
    font-size: 10px;
    color: var(--bleu-pale);
    padding: 10px 0 12px;
}

/* ==================================================================
   Largeur utile — reprise du comportement Helix.
   Helix tournait en « layout-fluid » (container_max_width vide, classe
   layout-fluid sur le body) : le contenu prenait toute la largeur de la
   fenetre moins une marge laterale, sans plafond. Cassiopeia plafonne a
   deux endroits : .grid-child a 1320px, et la zone principale de .site-grid
   a 4 x 19.875rem = 79.5rem.
   Une seule valeur a ajuster : --cc-marge-laterale.
   Les zones full-width (banniere, bas de page) restent en full-start/full-end
   et ne sont donc pas affectees par la marge.
   ================================================================== */
:root {
    --cc-marge-laterale: 4.75%;
}

/* Le reglage « Mise en page » du template pose wrapper-fluid, et Cassiopeia
   applique alors body.wrapper-fluid .site-grid avec repeat(4, minmax(0,25%)),
   soit 100% de largeur sans aucune marge. Cette regle a deux classes battait
   la notre : on la reprend explicitement pour reintroduire la marge laterale. */
body.wrapper-fluid .site-grid,
.site-grid {
    grid-gap: 0 2em;
    grid-template-columns:
        [full-start] minmax(0, var(--cc-marge-laterale))
        [main-start] repeat(4, minmax(0, 1fr))
        [main-end]   minmax(0, var(--cc-marge-laterale)) [full-end];
}

/* ------------------------------------------------------------------
   Au-dessus de 992px, la marge n'est plus un pourcentage mais le conteneur
   a PALIERS de Bootstrap, celui que Helix utilise en production :
   max-width 960px des 992, 1140px des 1200, 1320px des 1400, plus 15px de
   padding de chaque cote. Verifie sur jo.test (Helix), page d'accueil, sur le
   titre « Que contient Confcardio ? » : 24>954 a 992, 78>1188 a 1280,
   68>1358 a 1440.
   La formule redonne exactement ces valeurs : la marge vaut la moitie de ce
   qui reste une fois le palier retire, plus les 15px de padding. Le « min() »
   gere le cas ou la fenetre est plus etroite que le palier — la marge tombe
   alors aux 15px seuls, comme Bootstrap.
   Sous 992px : rien ne change, le 4.75% reste (reglage cale pour le mobile).
   ------------------------------------------------------------------ */
@media (min-width: 992px) {
    body.wrapper-fluid .site-grid,
    .site-grid {
        --cc-marge-laterale: calc((100% - min(100%, 960px) + 30px) / 2);

        /* Les gouttieres de 2em s'ajoutaient a la piste de marge : le contenu
           commencait a 59px au lieu de 23.5px et perdait 70px de large
           (860 mesures contre 930 sous Helix). Elles ne servent a rien ici —
           le composant occupe les quatre colonnes, ces gouttieres sont
           interieures a lui — mais les DEUX gouttieres exterieures, elles,
           decalaient tout. On les supprime : la marge est desormais portee par
           la seule piste de marge, ce que la formule ci-dessus calcule. */
        column-gap: 0;
    }
}

@media (min-width: 1200px) {
    body.wrapper-fluid .site-grid,
    .site-grid {
        --cc-marge-laterale: calc((100% - min(100%, 1140px) + 30px) / 2);
    }
}

@media (min-width: 1400px) {
    body.wrapper-fluid .site-grid,
    .site-grid {
        --cc-marge-laterale: calc((100% - min(100%, 1320px) + 30px) / 2);
    }
}

/* L'exception qui donnait la marge laterale MINIMALE a « Mes cours »,
   « Annales » et « ECG commentes » a ete RETIREE le 2026-08-26, a la demande de
   Roland : ces trois listes rendaient plus large que toutes les autres pages
   (contenu 1175 contre 1110 a 1280 de large), et l'ecart grandissait avec
   l'ecran — bord gauche a 45 px contre 308 px a 1920. Elles suivent desormais
   les paliers communs, comme n'importe quel article.
   Les pages a colonne laterale droite ne sont PAS concernees : leur grille est
   redefinie entierement plus bas et ne passe pas par --cc-marge-laterale. */

/* Fond general de la page. En production il vient de la feuille GENEREE par
   Helix (/cache/com_templates/shaper_helixultimate/<hash>.css), section
   « default.css » : « body,.sp-preloader{background-color:#f2f8ff} » — global,
   sans media query, d'ou un fond qui tient a toutes les largeurs.
   Piege a ne pas refaire : custom.scss porte aussi des regles de fond sur
   « #sp-main-body » (var(--background-defaut) au-dessus de 768px, #fff en
   dessous de 480px). Elles ne sont PAS la source du fond de production, et cet
   identifiant est de toute facon un conteneur HELIX qui n'existe pas sous
   Cassiopeia : ces regles sont mortes ici. Se caler dessus donnait un fond
   limite a 768px et une page blanche en dessous.
   Cassiopeia pose « html { background: #fff } » dans template.min.css : le fond
   du body ne se propage donc pas au canevas, mais son bloc couvre la page
   entiere (min-height 100vh herite du coeur), le rendu est identique. */
body {
    background-color: var(--background-defaut);
}

/* ------------------------------------------------------------------
   Pages a colonne laterale droite (cours, annales) — portage du 8/4 Helix.
   Mesures relevees sur jo.test (Helix), page /mes-cours/syncope-et-ecg :
     a 1280 (utile 1265) : #sp-component col-lg-8 = 843px, #sp-right col-lg-4
                           = 422px, contenu visuel 15>828, panneau 858>1250 ;
     a  992 (utile  977) : 651px et 326px, panneau visuel 666>962.
   Soit dans les deux cas : deux tiers / un tiers, 15px de marge exterieure,
   30px de gouttiere, et un conteneur plafonne a 1320px au-dela.
   La grille du template posait ici 4 colonnes egales — le contenu en occupait
   3 et le panneau 1, d'ou un panneau a 19% au lieu de 33% — et 4.75% de marge
   laterale, soit 95px au lieu de 15px.
   Le « min(100%, 1320px) » reproduit les deux regimes d'un coup : sous 1320 le
   contenu occupe toute la largeur utile et les pistes de marge tombent a 0 ;
   au-dela il se fige a 1320 et le surplus part dans les marges, comme le
   « max-width: 1320px » du conteneur Helix.
   Le bas de page reste pleine largeur : il s'appuie sur full-start/full-end,
   inchanges.
   Le :not() ecarte les rares pages a DEUX colonnes laterales, dont les zones
   nommees ci-dessous ne prevoient pas le cas.
   ------------------------------------------------------------------ */
@media (min-width: 992px) {
    body:has(.container-sidebar-right):not(:has(.container-sidebar-left)) .site-grid {
        column-gap: 0;
        grid-template-columns:
            [full-start] minmax(0, 1fr)
            [main-start] minmax(0, calc(min(100%, 1320px) * 2 / 3))
                         minmax(0, calc(min(100%, 1320px) / 3))
            [main-end]   minmax(0, 1fr) [full-end];
        grid-template-areas:
            ". banner banner ."
            ". top-a  top-a  ."
            ". top-b  top-b  ."
            ". comp   side-r ."
            ". bot-a  bot-a  ."
            ". bot-b  bot-b  .";
    }

    /* Les 15px de padding des colonnes Bootstrap chez Helix : ils forment la
       marge exterieure de 15px ET, additionnes, la gouttiere de 30px entre les
       deux colonnes. C'est pour cela que column-gap est mis a 0 ci-dessus :
       un gap s'ajouterait aussi contre les pistes de marge. */
    body:has(.container-sidebar-right) .container-component,
    body:has(.container-sidebar-right) .container-sidebar-right {
        padding-inline: 15px;
    }
}

/* Colonne laterale droite (module 229 « ConfCardio.com Sidebar », pages de
   cours). Cassiopeia enveloppe chaque module de cette position dans un
   « .card » a fond blanc et bordure grise. Ce cadre exterieur n'existe pas en
   production : il doublait la carte du module (.cc-sidebar, qui porte deja son
   propre fond blanc et sa bordure) et decoupait un rectangle blanc dans le
   fond bleu de la page. On l'efface — fond transparent, donc le fond du body
   traverse — sans toucher a .cc-sidebar. */
.container-sidebar-right > .card {
    background: transparent;
    border: 0;
}

/* Le .card-body de Cassiopeia ajoute 16px de chaque cote, la ou le .sp-module
   de Helix n'avait aucun padding horizontal (« padding: 20px 0 »). Mesure a
   992px avant correction : panneau visuel 682>946 chez nous contre 666>962
   sous Helix, soit 32px perdus. On remet le padding vertical seul. */
.container-sidebar-right > .card > .card-body {
    padding-inline: 0;
}

.grid-child,
.container-header .grid-child,
.footer .grid-child {
    max-width: none;
}

/* Gouttiere laterale de la page a partir de 576px, hors page d'accueil.
   Une seule .site-grid existe par page (verifie sur accueil, FAQ, connexion et
   mes-cours) : enfant direct de <body>, elle contient .container-component et
   .container-bottom-a. Pas besoin de la qualifier.
   L'accueil est exclue par « cc-hp-v2 », la classe de page que portent les
   elements de menu affichant le gabarit accueil — c'est deja le marqueur
   utilise par home.css et par la regle de margin-top plus haut dans ce fichier.
   NOTE : entre 576px et 991.98px ces 30px s'AJOUTENT aux 15px que le bloc
   « max-width: 991.98px » ci-dessous pose sur .container-component et sur la
   colonne laterale droite, soit 45px de retrait total sur cette plage. */
@media (min-width: 576px) {
    body:not(.cc-hp-v2) .site-grid {
        padding-left: 1.875rem;
        padding-right: 1.875rem;
    }
}

/* Sur telephone, ces deux valeurs se cumulent et etranglent le contenu : la
   colonne de marge (4.75% = 19px a 402px) PLUS la gouttiere de 2em (35px) qui
   separe cette colonne de la zone principale, soit 54px de chaque cote — le
   contenu tombait a 293px sur 402.
   Mesure sur la meme page sous Helix : la zone de contenu occupait toute la
   largeur (402px) et la gouttiere de 15px venait du padding de .sppb-row-column.
   On remet donc la grille a plat et on laisse SP Page Builder fournir sa marge,
   sinon les deux s'ajoutent et le contenu reste 30px trop etroit. */
@media (max-width: 991.98px) {
    body.wrapper-fluid .site-grid,
    .site-grid {
        --cc-marge-laterale: 0%;

        grid-gap: 0;
    }

    /* Les pages qui ne passent pas par SP Page Builder (articles, composants)
       n'ont aucune marge propre : on leur donne les memes 15px. */
    body:not(.com_sppagebuilder) .container-component {
        padding-inline: 15px;
    }

    /* Meme traitement pour la colonne laterale droite (cours, annales, ecg).
       Sous 992px elle quitte la grille et s'empile sous l'article, mais les
       15px du bloc « min-width: 992px » plus haut ne s'appliquent plus et
       --cc-marge-laterale vient de passer a 0% : le module se retrouvait colle
       aux deux bords, alors que l'article au-dessus gardait ses 15px.
       Pas de « :not(.com_sppagebuilder) » ici : le module occupe une position
       du template, hors de la mise en page SPPB, il n'herite donc d'aucune
       marge de SP Page Builder quelle que soit la page. */
    .container-sidebar-right {
        padding-inline: 15px;
    }
}

/* h4 : 20px au lieu du 1.5rem (24px) de Cassiopeia. La regle d origine est
   dans media/templates/site/cassiopeia/css/template.min.css, fichier du
   template core auquel on ne touche pas — on la surcharge avec le meme
   point de rupture. */
@media (width >= 1200px) {
    h4, .h4 { font-size: 20px; }
}
