/* ============================================================
   ARTAWEB -- Components
   Buttons, Navigation, Language Switcher, Dark Mode Toggle, Cards
   ============================================================ */

/* ----------------------------------------------------------
   Buttons
   ---------------------------------------------------------- */
.btn {
    display: inline-flex;
    align-items: center;
    gap: var(--space-sm);
    font-family: var(--font-heading);
    font-size: var(--text-sm);
    font-weight: 500;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding: 0.85em 2em;
    border-radius: var(--radius-sm);
    transition: all var(--transition-base);
    text-decoration: none;
    cursor: pointer;
    border: none;
}

.btn--primary {
    background-color: var(--color-accent);
    color: var(--color-bg);
}

.btn--primary:hover {
    background-color: var(--color-text);
    color: var(--color-bg);
}

.btn--outline {
    background: transparent;
    border: 1px solid var(--color-accent);
    color: var(--color-accent);
}

.btn--outline:hover {
    background-color: var(--color-accent);
    color: var(--color-bg);
}

.btn--ghost {
    background: transparent;
    color: var(--color-accent);
    padding: 0.5em 1em;
}

.btn--ghost:hover {
    color: var(--color-text);
}

/* Bouton COMPACT. Utilisé par l'agenda (billetterie, inscription, itinéraire,
   filtres) : sections/event-single.php, sections/events-list.php et le module
   « voir tout » d'includes/events.php.
   Il n'existait jusqu'ici que sous `body.admin-body` (css/admin.css) : côté
   public la classe ne correspondait à AUCUNE règle, et ces boutons se
   rendaient au gabarit plein. */
.btn--sm {
    font-size: var(--text-xs);
    padding: 0.55em 1.25em;
    gap: var(--space-xs);
    /* Cible tactile conforme (WCAG 2.5.8) malgré le gabarit compact. */
    min-height: 32px;
}

.btn:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 3px;
}

/* ----------------------------------------------------------
   Site Header / Navigation
   ---------------------------------------------------------- */
.site-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 100;
    /* AUCUN padding ici — il appartient aux LIGNES.
       Tant qu'il était posé sur l'en-tête, une ligne à fond coloré (la barre de
       service) commençait quelques pixels sous le haut de l'écran et laissait
       une bande transparente au-dessus d'elle. */
    transition: background-color var(--transition-base), box-shadow var(--transition-base);
}

.site-header.is-scrolled {
    background-color: var(--color-bg);
    box-shadow: var(--shadow-sm);
}

/* ----------------------------------------------------------
   Header — moteur de zones
   L'en-tête est composé dans l'admin : des lignes, contenant des colonnes,
   contenant des éléments. Voir includes/header-layout.php.
   ---------------------------------------------------------- */

/* Une ligne. `data-h` porte sa hauteur : c'est elle qui donne son épaisseur à
   l'en-tête, et elle est reprise côté serveur pour calculer --header-h.
   Le padding vertical est ici, et non sur l'en-tête : c'est ce qui permet à une
   ligne à fond coloré de toucher le haut de l'écran. */
.site-header__row { display: block; padding-block: var(--space-md); }
.site-header__row[data-h="compact"] { padding-block: var(--space-xs); }
.site-header__row[data-h="large"]   { padding-block: var(--space-lg); }
.site-header__row[data-h="compact"] .site-header__inner,
.site-header__row[data-h="compact"] .site-header__cols { min-height: 28px; }
.site-header__row[data-h="normal"] .site-header__inner,
.site-header__row[data-h="normal"] .site-header__cols { min-height: 56px; }
.site-header__row[data-h="large"] .site-header__inner,
.site-header__row[data-h="large"] .site-header__cols { min-height: 80px; }

/* Fonds de ligne. Une ligne opaque au-dessus d'un hero photo doit reprendre
   les couleurs de texte du thème : sans quoi le blanc forcé de
   `body.has-photo-hero` rendrait son contenu illisible. */
.site-header__row--surface { background-color: var(--color-surface); }

/* Fond « accent » : le texte du thème n'y est PAS lisible.
   Mesuré sur la palette de ce site : 2,97:1 entre la couleur de texte et
   l'accent, là où WCAG AA demande 4,5:1. Le blanc atteint 5,09:1. Une ligne à
   fond accent bascule donc tout son contenu en blanc — liens, icônes et
   séparateurs compris, sans quoi seuls certains mots resteraient lisibles. */
.site-header__row--accent { background-color: var(--color-accent); }
.site-header__row--accent,
.site-header__row--accent .main-nav__link,
.site-header__row--accent .lang-switcher__link,
.site-header__row--accent .dark-toggle,
.site-header__row--accent .site-header__text,
.site-header__row--accent .site-header__contact-link,
.site-header__row--accent .site-header__social-link { color: #fff; }
.site-header__row--accent .lang-switcher__link:not(.is-active) { color: rgba(255, 255, 255, 0.75); }
.site-header__row--accent .lang-switcher__sep { color: rgba(255, 255, 255, 0.4); }
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__row--surface .main-nav__link,
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__row--surface .lang-switcher__link,
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__row--surface .dark-toggle {
    color: var(--color-text);
}

/* Ligne pleine largeur : pas de conteneur, mais on garde une respiration
   latérale pour que le contenu ne colle pas au bord de l'écran. */
.site-header__full {
    width: 100%;
    padding-inline: var(--space-md);
}

/* Une seule colonne : conteneur flex historique (logo à gauche, reste à
   droite). C'est le rendu de l'en-tête d'origine, préservé tel quel. */
.site-header__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

/* Plusieurs colonnes : grille pilotée par --cols, posée en propriété
   personnalisée et non en grid-template-columns direct — c'est ce qui permet
   aux media queries de reprendre la main sans !important. Même mécanique que
   `.section-cols` pour le contenu (sections.css). */
.site-header__cols {
    display: grid;
    grid-template-columns: var(--cols, 1fr);
    align-items: center;
    gap: var(--space-md);
}

/* Une colonne. Les éléments s'y suivent horizontalement ; la colonne du milieu
   se centre, la dernière se colle à droite — c'est ce qu'on attend d'un
   en-tête, sans avoir à le régler à la main. */
.site-header__col {
    display: flex;
    align-items: center;
    gap: var(--space-md);
    min-width: 0;
}
/* Alignement du contenu dans la colonne, réglé dans l'éditeur d'en-tête.
   Ces classes remplacent les règles de position qui étaient déduites du rang de
   la colonne : la place des éléments se décide maintenant, elle ne se devine
   plus. Les valeurs par défaut reproduisent l'ancien comportement — voir
   headerRowAligns(). */
.site-header__col--left    { justify-content: flex-start; }
.site-header__col--center  { justify-content: center; }
.site-header__col--right   { justify-content: flex-end; }
.site-header__col--between { justify-content: space-between; }

/* Enveloppe d'un élément resté dans la barre. Neutre par défaut : elle ne sert
   qu'à porter les classes de comportement mobile. */
.site-header__item { display: flex; align-items: center; }

/* En-tête non collant : il défile avec la page. Le contenu n'a alors plus
   besoin d'être dégagé. */
.site-header--static { position: static; }
body:has(.site-header--static) { --header-h: 0px; }

/* ----------------------------------------------------------
   Header — éléments
   Ce que produisent les réglages de chaque élément dans l'éditeur d'en-tête.
   Toute option ajoutée à headerItemTypes() a sa règle ICI, sans quoi le
   réglage s'affiche dans l'admin sans rien changer sur le site.
   ---------------------------------------------------------- */

/* Logo : trois tailles. La hauteur au défilement reste proportionnelle. */
.site-header__logo--small img { height: 48px; }
.site-header__logo--large img { height: 92px; }
.site-header.is-scrolled .site-header__logo--small img { height: 40px; }
.site-header.is-scrolled .site-header__logo--large img { height: 68px; }

/* Le menu n'a PAS de réglage d'alignement propre : c'est l'alignement de la
   COLONNE qui le place, comme tous les autres éléments. Deux réglages pour la
   même chose auraient surtout produit des combinaisons qui se contredisent. */

.site-header__logo img {
    height: 70px;
    width: auto;
    /* Thème clair : logo couleur affiché tel quel (pas d'inversion). */
    filter: none;
    transition: filter var(--transition-base), height var(--transition-base);
}

.site-header.is-scrolled .site-header__logo img {
    height: 56px;
    filter: none;
}

/* En dark mode, l'en-tête scrollé reste foncé : le logo (s'il n'a pas de
   variante sombre dédiée) doit donc rester blanc même une fois scrollé. */
[data-theme="dark"] .site-header.is-scrolled .site-header__logo:not(:has(.site-header__logo-img--dark-only)) img {
    filter: brightness(0) invert(1);
}

/* Variantes light/dark du logo (si une version sombre est fournie via la Charte) */
.site-header__logo-img--dark-only { display: none; }

/* Quand une version sombre est fournie : on n'utilise plus le filter hack */
.site-header__logo:has(.site-header__logo-img--dark-only) .site-header__logo-img {
    filter: none;
}

/* Thème clair : on affiche toujours la version couleur (light-only).
   La version blanche (dark-only) n'apparaît qu'en dark mode. */
[data-theme="dark"] .site-header__logo-img--dark-only { display: block; }
[data-theme="dark"] .site-header__logo-img--light-only { display: none; }

/* ----- Logo TEXTE (alternative à l'image) + slogan -----
   Police / couleur / taille pilotées par la Charte (variables --logo-*).
   Le repli texte (nom du site) évite tout logo cassé quand aucune image n'est
   fournie. Le slogan s'affiche sous le logo (image OU texte). */
.site-header__logo--text  { display: inline-flex; align-items: center; }
.site-header__logo--stack { display: inline-flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 1px; }
.site-header__logo-text {
    font-family: var(--logo-text-font, var(--font-display));
    color: var(--logo-text-color, var(--color-accent));
    font-size: var(--logo-text-size, 1.7rem);
    font-weight: 700;
    line-height: 1.02;
    letter-spacing: -0.01em;
    white-space: nowrap;
    transition: font-size var(--transition-base);
}
.site-header.is-scrolled .site-header__logo-text { font-size: calc(var(--logo-text-size, 1.7rem) * 0.86); }
.site-header__logo--small .site-header__logo-text { font-size: calc(var(--logo-text-size, 1.7rem) * 0.8); }
.site-header__logo--large .site-header__logo-text { font-size: calc(var(--logo-text-size, 1.7rem) * 1.25); }
.site-header__slogan {
    font-family: var(--logo-slogan-font, var(--font-body));
    color: var(--logo-slogan-color, var(--color-muted));
    font-size: var(--logo-slogan-size, 0.8rem);
    font-weight: 400;
    line-height: 1.1;
    letter-spacing: 0.01em;
    white-space: nowrap;
}
/* Au-dessus d'un hero photo (en-tête translucide, non scrollé) : logo texte + slogan en blanc. */
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__logo-text,
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__slogan { color: #fff; }

/* Pied de page : logo texte + slogan (mêmes variables de Charte que l'en-tête). */
.site-footer__brand { display: inline-flex; flex-direction: column; gap: 2px; }
.site-footer__brand--text { align-items: flex-start; }
.site-footer__logo-text {
    font-family: var(--logo-text-font, var(--font-display));
    color: var(--logo-text-color, var(--color-accent));
    font-size: var(--logo-text-size, 1.7rem);
    font-weight: 700;
    line-height: 1.05;
    letter-spacing: -0.01em;
}
.site-footer__slogan {
    font-family: var(--logo-slogan-font, var(--font-body));
    color: var(--logo-slogan-color, var(--color-muted));
    font-size: var(--logo-slogan-size, 0.8rem);
    line-height: 1.1;
}

/* ----- En-tête AU-DESSUS d'un hero photo/slider (non scrollé) : tout en blanc -----
   Reproduit l'en-tête transparent de l'ancien site par-dessus la photo. */
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav__link,
body.has-photo-hero .site-header:not(.is-scrolled) .dark-toggle { color: #fff; }
body.has-photo-hero .site-header:not(.is-scrolled) .lang-switcher__link { color: rgba(255, 255, 255, 0.7); }
body.has-photo-hero .site-header:not(.is-scrolled) .lang-switcher__link.is-active,
body.has-photo-hero .site-header:not(.is-scrolled) .lang-switcher__link:hover { color: #fff; }
body.has-photo-hero .site-header:not(.is-scrolled) .lang-switcher__sep { color: rgba(255, 255, 255, 0.35); }
body.has-photo-hero .site-header:not(.is-scrolled) .menu-toggle__bar { background-color: #fff; }

/* ⚠️ EXCEPTION : le VOLET OUVERT n'est plus au-dessus de la photo.
   Les règles ci-dessus peignent en blanc ce qui se détache sur le hero. Mais
   sur téléphone, `#main-nav` est un panneau coulissant avec son PROPRE fond
   opaque (--color-surface) : une fois ouvert, ses liens ne sont plus sur la
   photo, ils sont sur du blanc. Résultat mesuré avant correction : liens
   rgb(255,255,255) sur panneau rgb(255,255,255) — contraste 1:1, menu
   totalement invisible.
   Le bouton burger avait déjà son correctif (« .main-nav.is-open ~ .menu-toggle »,
   plus bas) : c'est le contenu du volet qui avait été oublié. */
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__link,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__sub-link,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .dark-toggle {
    color: var(--color-text);
}
/* La page courante et le survol retrouvent l'accent, comme partout ailleurs :
   la règle « tout en blanc » les écrasait aussi. */
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__link:hover,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__link.is-active,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__sub-link:hover,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .main-nav__sub-link.is-active {
    color: var(--color-accent);
}
/* Le sélecteur de langue, s'il a été posé dans le volet. */
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .lang-switcher__link {
    color: var(--color-muted);
}
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .lang-switcher__link.is-active,
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .lang-switcher__link:hover {
    color: var(--color-accent);
}
body.has-photo-hero .site-header:not(.is-scrolled) .main-nav.is-open .lang-switcher__sep {
    color: var(--color-border);
}
/* Logo blanc par-dessus le hero (non scrollé), logo couleur au scroll. */
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__logo-img--light-only { display: none; }
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__logo-img--dark-only { display: block; }

/* Main nav */
.main-nav {
    display: flex;
    align-items: center;
    gap: var(--space-lg);
}

.main-nav__list {
    display: flex;
    align-items: center;
    gap: var(--space-md);
}

.main-nav__link {
    font-family: var(--font-heading);
    font-size: 0.78rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    /* Thème clair : texte foncé par défaut (header au-dessus d'un hero clair). */
    color: var(--color-text);
    padding: var(--space-xs) var(--space-sm);
    position: relative;
    transition: color var(--transition-fast);
}

.main-nav__link::after {
    content: '';
    position: absolute;
    bottom: -2px;
    left: 50%;
    width: 0;
    height: 1px;
    background-color: var(--color-accent);
    transition: width var(--transition-base), left var(--transition-base);
}

.main-nav__link:hover,
.main-nav__link.is-active {
    color: var(--color-accent);
}

.main-nav__link:hover::after,
.main-nav__link.is-active::after {
    width: 100%;
    left: 0;
}

/* ----- Sous-menus (pages enfants) ----- */
.main-nav__item {
    position: relative;
}

.main-nav__sub {
    display: flex;
    flex-direction: column;
    gap: 2px;
    list-style: none;
    margin: 0;
    padding: var(--space-xs) 0;
}

/* Desktop : sous-menu flottant, affiché au survol / focus clavier.
   901px, comme le burger et le menu latéral : les trois seuils étaient
   auparavant à 769, 768 et 901, si bien qu'entre 769 et 900 le mode « menu
   latéral » retombait sans le dire sur un menu horizontal. */
@media (min-width: 901px) {
    .main-nav__sub {
        position: absolute;
        top: 100%;
        left: 0;
        min-width: 220px;
        background-color: var(--color-bg);
        box-shadow: var(--shadow-lg);
        border-radius: var(--radius-sm, 4px);
        padding: var(--space-sm) 0;
        opacity: 0;
        visibility: hidden;
        transform: translateY(6px);
        transition: opacity var(--transition-fast), transform var(--transition-fast), visibility var(--transition-fast);
        z-index: 95;
    }

    .main-nav__item--has-sub:hover .main-nav__sub,
    .main-nav__item--has-sub:focus-within .main-nav__sub {
        opacity: 1;
        visibility: visible;
        transform: translateY(0);
    }
}

.main-nav__sub-link {
    display: block;
    font-family: var(--font-heading);
    font-size: 0.8rem;
    letter-spacing: 0.04em;
    color: var(--color-text);
    padding: var(--space-xs) var(--space-md);
    white-space: nowrap;
    transition: color var(--transition-fast), background-color var(--transition-fast);
}

.main-nav__sub-link:hover,
.main-nav__sub-link.is-active {
    color: var(--color-accent);
    /* --color-bg-alt n'a jamais été défini : le repli s'appliquait toujours.
       On utilise le token réel de la Charte, avec le même rendu en secours. */
    background-color: var(--color-surface, rgba(0, 0, 0, 0.04));
}

/* ----------------------------------------------------------
   Formulaires (bloc « form »)
   ---------------------------------------------------------- */
.block-form { max-width: 1000px; }

.mp-form {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-md);
}

/* Honeypot anti-spam : hors écran (pas display:none, pour piéger les robots). */
.mp-form__hp {
    position: absolute !important;
    left: -9999px !important;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

.mp-form__field {
    flex: 1 1 100%;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
/* Largeurs de champ : 100% / 75% / 50% / 25% (on soustrait la gouttière pour
   que toutes les combinaisons tiennent sur une ligne). */
.mp-form__field--w75              { flex: 1 1 calc(75% - var(--space-md)); }
.mp-form__field--w50,
.mp-form__field--half             { flex: 1 1 calc(50% - var(--space-md)); }
.mp-form__field--w25              { flex: 1 1 calc(25% - var(--space-md)); }
@media (max-width: 600px) {
    /* Mobile : tous les champs en pleine largeur. */
    .mp-form__field,
    .mp-form__field--w75,
    .mp-form__field--w50,
    .mp-form__field--half,
    .mp-form__field--w25 { flex: 1 1 100%; }
}

.mp-form__label,
.mp-form .mp-form__label {
    font-family: var(--font-heading);
    font-size: var(--text-sm);
    font-weight: 500;
    color: var(--color-text);
}
.mp-form__req { color: var(--color-accent); }

.mp-form__input {
    width: 100%;
    padding: 0.7em 0.9em;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm, 6px);
    background: var(--color-bg);
    color: var(--color-text);
    font: inherit;
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.mp-form__input:focus {
    outline: none;
    border-color: var(--color-accent);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 22%, transparent);
}
textarea.mp-form__input { resize: vertical; min-height: 6rem; }

.mp-form__group {
    flex: 1 1 100%;
    margin: var(--space-md) 0 0;
    padding-bottom: 0.4rem;
    border-bottom: 1px solid var(--color-border);
    font-size: var(--text-sm);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-accent);
}

.mp-form__checks,
.mp-form__radios {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.2rem;
}
.mp-form__field[hidden] { display: none; }
.mp-form__check {
    display: inline-flex;
    align-items: baseline;
    gap: 0.5rem;
    font-size: var(--text-sm);
    cursor: pointer;
}

.mp-form__note {
    flex: 1 1 100%;
    font-size: var(--text-sm);
    color: var(--color-muted);
    background: var(--color-surface);
    padding: var(--space-sm) var(--space-md);
    border-radius: var(--radius-sm, 6px);
}
.mp-form__hint { font-size: var(--text-xs); color: var(--color-muted); }
.mp-form__error { font-size: var(--text-xs); color: #c0392b; }
.mp-form__field.has-error .mp-form__input { border-color: #c0392b; }

.mp-form__submit { flex: 0 0 auto; margin-top: var(--space-sm); }

.mp-form__success,
.mp-form__alert {
    flex: 1 1 100%;
    padding: var(--space-md);
    border-radius: var(--radius-sm, 6px);
    font-weight: 500;
}
.mp-form__success {
    background: color-mix(in srgb, var(--color-accent) 15%, var(--color-bg));
    border: 1px solid var(--color-accent);
    color: var(--color-text);
}
.mp-form__alert {
    background: #fdecea;
    border: 1px solid #e6b0aa;
    color: #922b21;
}

/* Header controls (lang + dark mode) */
.header-controls {
    display: flex;
    align-items: center;
    gap: var(--space-md);
}

/* ----------------------------------------------------------
   Menu latéral (gauche / droite) — ordinateur uniquement.
   Sur mobile (< 901px), le menu reste en haut (toggle existant).
   ---------------------------------------------------------- */
@media (min-width: 901px) {
    [data-menu-position="left"] .site-header,
    [data-menu-position="right"] .site-header {
        top: 0;
        bottom: 0;
        right: auto;
        width: 220px;
        background-color: var(--color-bg);
        box-shadow: var(--shadow-sm);
        padding: var(--space-lg) var(--space-md);
    }
    [data-menu-position="right"] .site-header { left: auto; right: 0; }

    [data-menu-position="left"] .site-header__inner,
    [data-menu-position="right"] .site-header__inner {
        flex-direction: column;
        align-items: flex-start;
        justify-content: flex-start;
        gap: var(--space-xl);
        height: 100%;
    }
    /* La barre latérale a un fond solide → logo et texte foncés en permanence */
    [data-menu-position="left"] .site-header__logo img,
    [data-menu-position="right"] .site-header__logo img { filter: none; height: 44px; }

    [data-menu-position="left"] .main-nav,
    [data-menu-position="right"] .main-nav {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--space-lg);
        width: 100%;
        margin-block: auto;
    }
    [data-menu-position="left"] .main-nav__list,
    [data-menu-position="right"] .main-nav__list {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--space-sm);
    }
    [data-menu-position="left"] .main-nav__link,
    [data-menu-position="right"] .main-nav__link { color: var(--color-text); }

    /* Décale le contenu pour laisser place à la barre */
    [data-menu-position="left"] #main-content,
    [data-menu-position="left"] .site-footer { margin-left: 220px; }
    [data-menu-position="right"] #main-content,
    [data-menu-position="right"] .site-footer { margin-right: 220px; }
}

/* ----------------------------------------------------------
   Mobile Menu Toggle
   ---------------------------------------------------------- */
.menu-toggle {
    display: none;
    flex-direction: column;
    gap: 5px;
    padding: var(--space-sm);
    cursor: pointer;
    z-index: 110;
}

.menu-toggle__bar {
    display: block;
    width: 24px;
    height: 2px;
    /* Light color by default (over dark hero) */
    background-color: #fff;
    transition: transform var(--transition-base), opacity var(--transition-fast), background-color var(--transition-fast);
}

.site-header.is-scrolled .menu-toggle__bar,
.main-nav.is-open ~ .menu-toggle .menu-toggle__bar {
    background-color: var(--color-text);
}

.menu-toggle.is-open .menu-toggle__bar:nth-child(1) {
    transform: translateY(7px) rotate(45deg);
}

.menu-toggle.is-open .menu-toggle__bar:nth-child(2) {
    opacity: 0;
}

.menu-toggle.is-open .menu-toggle__bar:nth-child(3) {
    transform: translateY(-7px) rotate(-45deg);
}

/* Bascule vers le menu déroulant. Le seuil est passé de 768 à 900px pour
   rejoindre celui du menu latéral : sur une tablette en portrait, le menu
   horizontal débordait déjà sur deux lignes. */
@media (max-width: 900px) {
    .menu-toggle {
        display: flex;
    }

    .main-nav {
        position: fixed;
        top: 0;
        right: -100%;
        width: 80%;
        max-width: 360px;
        height: 100vh;
        background-color: var(--color-bg);
        flex-direction: column;
        align-items: flex-start;
        justify-content: center;
        padding: var(--space-xl);
        gap: var(--space-lg);
        transition: right var(--transition-base);
        box-shadow: var(--shadow-lg);
    }

    .main-nav.is-open {
        right: 0;
    }

    .main-nav__list {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--space-lg);
    }

    .main-nav__link {
        font-size: var(--text-lg);
    }

    .header-controls {
        flex-direction: column;
        align-items: flex-start;
        gap: var(--space-md);
    }
}

/* Mobile overlay */
.nav-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background-color: rgba(26, 26, 26, 0.5);
    z-index: 90;
    opacity: 0;
    transition: opacity var(--transition-base);
}

.nav-overlay.is-visible {
    display: block;
    opacity: 1;
}

/* ----------------------------------------------------------
   Language Switcher
   ---------------------------------------------------------- */
.lang-switcher {
    display: flex;
    align-items: center;
    gap: 2px;
    font-family: var(--font-heading);
    font-size: var(--text-xs);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.lang-switcher__link {
    /* Thème clair : couleur atténuée par défaut. */
    color: var(--color-muted);
    padding: var(--space-xs);
    transition: color var(--transition-fast);
}

.lang-switcher__link.is-active {
    color: var(--color-accent);
}

.lang-switcher__link:hover {
    color: var(--color-text);
}

.lang-switcher__sep {
    color: var(--color-border);
    user-select: none;
}

/* Scrolled state */
.site-header.is-scrolled .lang-switcher__link {
    color: var(--color-muted);
}

.site-header.is-scrolled .lang-switcher__link.is-active {
    color: var(--color-accent);
}

.site-header.is-scrolled .lang-switcher__link:hover {
    color: var(--color-text);
}

.site-header.is-scrolled .lang-switcher__sep {
    color: var(--color-border);
}

/* ----------------------------------------------------------
   Dark Mode Toggle
   ---------------------------------------------------------- */
.dark-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    /* Thème clair : icône foncée par défaut. */
    color: var(--color-text);
    transition: background-color var(--transition-fast), color var(--transition-fast);
    cursor: pointer;
}

.dark-toggle:hover {
    background-color: var(--color-surface);
}

/* Scrolled state */
.site-header.is-scrolled .dark-toggle {
    color: var(--color-text);
}

.site-header.is-scrolled .dark-toggle:hover {
    background-color: var(--color-surface);
}

.dark-toggle:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
}

.dark-toggle__icon {
    width: 18px;
    height: 18px;
}

/* Sun icon hidden in light mode, moon hidden in dark mode */
.dark-toggle__sun  { display: none; }
.dark-toggle__moon { display: block; }

[data-theme="dark"] .dark-toggle__sun  { display: block; }
[data-theme="dark"] .dark-toggle__moon { display: none; }

/* ----------------------------------------------------------
   Cards
   ---------------------------------------------------------- */
.card {
    background-color: var(--color-surface);
    border-radius: var(--radius-md);
    overflow: hidden;
    transition: box-shadow var(--transition-base), transform var(--transition-base);
}

.card:hover {
    box-shadow: var(--shadow-md);
    transform: translateY(-2px);
}

.card__image {
    aspect-ratio: 4 / 3;
    overflow: hidden;
}

.card__image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--transition-slow);
}

.card:hover .card__image img {
    transform: scale(1.03);
}

.card__body {
    padding: var(--space-lg);
}

.card__title {
    font-family: var(--font-heading);
    font-size: var(--text-lg);
    font-weight: 500;
    margin-bottom: var(--space-sm);
}

/* ----------------------------------------------------------
   Separator / Divider
   ---------------------------------------------------------- */
.divider {
    width: 60px;
    height: 1px;
    background-color: var(--color-accent);
    margin-inline: auto;
    margin-block: var(--space-lg);
}

.divider--left {
    margin-inline: 0;
}

/* ----------------------------------------------------------
   Tag / Badge
   ---------------------------------------------------------- */
.tag {
    display: inline-block;
    font-family: var(--font-heading);
    font-size: var(--text-xs);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-accent);
    border: 1px solid var(--color-accent);
    padding: 0.25em 0.75em;
    border-radius: var(--radius-sm);
}

/* ============================================================
   BLOCKS — Bibliothèque de composants éditoriaux
   Rendus par includes/blocks.php (switch sur block_type)
   ============================================================ */

/* --- Image simple --- */
.block-image {
    margin: var(--space-lg) 0;
}
.block-image img {
    width: 100%;
    height: auto;
    border-radius: var(--radius-sm);
}
/* Cadre (option « Cadre de l'image ») : coins arrondis + ombre + fin liseré.
   Le liseré s'éclaircit sur fond sombre, où l'ombre ne se voit pas. */
.block-image--frame img {
    border-radius: 12px;
    box-shadow: 0 20px 45px rgba(0, 0, 0, 0.22);
    outline: 1px solid rgba(0, 0, 0, 0.06);
}
.section--dark .block-image--frame img {
    outline-color: rgba(255, 255, 255, 0.12);
}
/* Débordement (option « Pleine largeur (bord à bord) ») : l'image sort de la
   colonne pour occuper toute la largeur de la fenêtre. Le calcul 50% - 50vw se
   fait par rapport au conteneur centré, donc l'image se recentre sur la fenêtre. */
.block-image--bleed {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    border-radius: 0;
    overflow: hidden;
}
.block-image--bleed img {
    border-radius: 0;
}
/* En tête de la 1re section, une image pleine largeur se colle juste SOUS
   l'en-tête : on annule l'espace supplémentaire que la section réserve
   (--space-xl), pas la hauteur de l'en-tête (--header-h). */
#main-content > .section:first-child .section__generic-body > .block-image--bleed:first-child,
#main-content > .section:first-child .section__generic-body > .block-fx:first-child > .block-image--bleed {
    margin-top: calc(-1 * var(--space-xl, 3rem));
    margin-bottom: var(--space-xl, 3rem);
}

/* --- Citation --- */
.block-quote {
    margin: var(--space-xl) auto;
    max-width: 720px;
    text-align: center;
    padding: var(--space-lg) var(--space-md);
    position: relative;
}
.block-quote blockquote {
    font-family: var(--font-body);
    font-size: calc(var(--text-lg) * 1.15);
    font-style: italic;
    line-height: 1.5;
    color: var(--color-text);
    margin: 0;
    padding: 0;
    quotes: "“" "”";
}
.block-quote blockquote::before {
    content: open-quote;
    display: block;
    font-size: 3em;
    line-height: 0.5;
    color: var(--color-accent);
    margin-bottom: var(--space-sm);
}
.block-quote cite {
    display: block;
    margin-top: var(--space-sm);
    font-family: var(--font-heading);
    font-style: normal;
    font-size: var(--text-xs);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--color-muted);
}

/* --- Bouton (wrapper) --- */
.block-button-wrap {
    margin: var(--space-lg) 0;
}

/* --- CTA --- */
.block-cta {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    padding: var(--space-xl);
    margin: var(--space-xl) 0;
    text-align: center;
}
.block-cta__title {
    font-size: var(--text-xl);
    margin-bottom: var(--space-sm);
}
.block-cta__text {
    color: var(--color-muted);
    margin-bottom: var(--space-lg);
    max-width: 560px;
    margin-inline: auto;
}

/* --- Divider --- */
.block-divider {
    width: 80px;
    height: 1px;
    background: var(--color-accent);
    border: 0;
    margin: var(--space-xl) auto;
}

/* --- Spacer --- */
.block-spacer {
    display: block;
    width: 100%;
}

/* --- Vidéo --- */
.block-video {
    margin: var(--space-xl) 0;
}
.block-video__frame {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    border-radius: var(--radius-md);
    background: #000;
}
.block-video__frame iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
}
.block-video video {
    width: 100%;
    height: auto;
    border-radius: var(--radius-md);
    display: block;
}
.block-video figcaption {
    margin-top: var(--space-sm);
    text-align: center;
    font-size: var(--text-xs);
    color: var(--color-muted);
    letter-spacing: 0.05em;
}

/* --- Gallery --- */
.block-gallery {
    display: grid;
    grid-template-columns: repeat(var(--gallery-cols, 3), 1fr);
    gap: var(--space-sm);
    margin: var(--space-lg) 0;
}
@media (max-width: 640px) {
    /* Sur mobile : 2 colonnes max, quel que soit le réglage. */
    .block-gallery { grid-template-columns: repeat(2, 1fr); }
}
.block-gallery__item {
    margin: 0;
    aspect-ratio: 1;
    overflow: hidden;
    border-radius: var(--radius-sm);
    background: var(--color-surface);
}
.block-gallery__item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--transition-slow);
}
.block-gallery__item:hover img {
    transform: scale(1.04);
}

/* --- Card grid --- */
.block-card-grid {
    display: grid;
    gap: var(--space-lg);
    margin: var(--space-lg) 0;
}
.block-card-grid--2cols { grid-template-columns: repeat(2, 1fr); }
.block-card-grid--3cols { grid-template-columns: repeat(3, 1fr); }
.block-card-grid--4cols { grid-template-columns: repeat(4, 1fr); }

@media (max-width: 900px) {
    .block-card-grid--3cols,
    .block-card-grid--4cols { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
    .block-card-grid--2cols,
    .block-card-grid--3cols,
    .block-card-grid--4cols { grid-template-columns: 1fr; }
}

.block-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    overflow: hidden;
    text-decoration: none;
    color: var(--color-text);
    display: flex;
    flex-direction: column;
    transition: box-shadow var(--transition-base), transform var(--transition-base), border-color var(--transition-base);
}
a.block-card:hover {
    box-shadow: var(--shadow-md);
    border-color: var(--color-accent);
    transform: translateY(-2px);
}
.block-card__image {
    /* Image (icône ou photo) centrée dans la colonne.
       - plus petite que la colonne -> taille réelle
       - plus grande -> contrainte à la largeur de la colonne */
    display: flex;
    justify-content: center;
    align-items: center;
    padding: var(--space-md);
}
.block-card__image img {
    max-width: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
}
.block-card__body {
    padding: var(--space-md) var(--space-lg);
    flex: 1;
}
.block-card__title {
    font-size: var(--text-lg);
    margin-bottom: var(--space-xs);
}
.block-card__text {
    font-size: var(--text-sm);
    color: var(--color-muted);
    line-height: 1.5;
    margin: 0;
}

/* --- Stats --- */
.block-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: var(--space-lg);
    margin: var(--space-xl) 0;
    text-align: center;
}
.block-stats__item {
    display: flex;
    flex-direction: column;
    gap: var(--space-xs);
}
.block-stats__value {
    font-family: var(--font-heading);
    font-size: clamp(2rem, 4vw, 3.5rem);
    font-weight: 600;
    color: var(--color-accent);
    line-height: 1;
}
/* Compteur animé (Mise en forme → Animation). Des chiffres de largeurs
   différentes feraient trembler la mise en page à chaque image : les chiffres
   tabulaires occupent tous la même largeur, le bloc reste immobile. */
.block-stats--anim .block-stats__value {
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum";
}
.block-stats__label {
    font-size: var(--text-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-muted);
}

/* --- Horaires (bloc « hours ») --- */
.block-hours {
    margin: var(--space-lg) 0;
    max-width: 34rem;
    display: flex;
    flex-direction: column;
}
.block-hours__row {
    display: grid;
    grid-template-columns: 1fr auto;               /* jour | plage 1 */
    align-items: baseline;
    gap: var(--space-md) var(--space-lg);
    padding: 0.7rem 0.25rem;
    /* Bordure et teinte dérivées de la couleur du texte → s'adapte à un fond
       clair OU foncé (le composant peut vivre dans n'importe quelle section). */
    border-bottom: 1px solid;
    border-color: color-mix(in srgb, currentColor 18%, transparent);
}
.block-hours--two .block-hours__row {
    grid-template-columns: 1fr auto auto;          /* jour | plage 1 | plage 2 */
}
.block-hours__row:last-child { border-bottom: 0; }
.block-hours__day {
    font-weight: 600;                              /* couleur héritée de la section */
}
.block-hours__slot {
    opacity: 0.8;                                  /* léger contraste, relatif au fond */
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    text-align: right;
}
@media (max-width: 480px) {
    /* Sur mobile : jour au-dessus, plages en dessous alignées à gauche. */
    .block-hours__row,
    .block-hours--two .block-hours__row {
        grid-template-columns: 1fr;
        gap: 0.15rem;
        padding: 0.6rem 0.25rem;
    }
    .block-hours__slot { text-align: left; }
}

/* --- Icon list --- */
.block-icon-list {
    list-style: none;
    padding: 0;
    margin: var(--space-lg) 0;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--space-lg);
}
.block-icon-list__item {
    display: flex;
    gap: var(--space-md);
    align-items: flex-start;
}
.block-icon-list__icon {
    font-size: 1.75em;
    line-height: 1;
    flex-shrink: 0;
    color: var(--color-accent);
}
.block-icon-list__body {
    display: flex;
    flex-direction: column;
    gap: var(--space-xs);
}
.block-icon-list__body strong {
    font-family: var(--font-heading);
    font-weight: 500;
    font-size: var(--text-base);
}
.block-icon-list__body span {
    font-size: var(--text-sm);
    color: var(--color-muted);
    line-height: 1.5;
}
/* Icône choisie dans la bibliothèque (SVG) : héritée en couleur d'accent. */
.block-icon-list__svg {
    display: block;
    color: var(--color-accent);
}
/* Badge facultatif accolé au titre (ex. « bientôt »). */
.block-icon-list__badge {
    display: inline-block;
    vertical-align: middle;
    font-family: var(--font-body);
    font-size: 0.62em;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    line-height: 1;
    padding: 0.28em 0.6em;
    border-radius: 99px;
    background: var(--color-accent);
    color: #fff;
    margin-left: 0.4em;
}

/* --- Galerie des modules (bloc « modules-showcase », vitrine) --- */
.block-modgrid {
    display: flex;
    flex-direction: column;
    gap: var(--space-lg);
    margin: var(--space-lg) 0;
}
.block-modgrid__cat-title {
    font-size: var(--text-xs);
    text-transform: uppercase;
    letter-spacing: 0.07em;
    color: var(--color-muted);
    margin: 0 0 var(--space-sm);
    font-weight: 700;
}
.block-modgrid__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: var(--space-sm);
}
.block-modgrid__item {
    display: flex;
    align-items: flex-start;
    gap: var(--space-sm);
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: 12px;
    padding: 0.75rem 0.85rem;
}
.block-modgrid__chip {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    border-radius: 10px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.block-modgrid__txt {
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.block-modgrid__label {
    font-family: var(--font-heading);
    font-weight: 500;
    font-size: var(--text-sm);
    line-height: 1.2;
}
.block-modgrid__desc {
    font-size: var(--text-xs);
    color: var(--color-muted);
    line-height: 1.35;
    margin-top: 0.15rem;
}

/* --- Accordion --- */
.block-accordion {
    margin: var(--space-lg) 0;
    border-top: 1px solid var(--color-border);
}
.block-accordion__item {
    border-bottom: 1px solid var(--color-border);
}
.block-accordion__q {
    cursor: pointer;
    padding: var(--space-md) 0;
    font-family: var(--font-heading);
    font-weight: 500;
    font-size: var(--text-base);
    list-style: none;
    position: relative;
    padding-right: 2em;
    transition: color var(--transition-fast);
}
.block-accordion__q::-webkit-details-marker { display: none; }
.block-accordion__q::after {
    content: "+";
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    font-size: 1.4em;
    color: var(--color-accent);
    transition: transform var(--transition-fast);
}
.block-accordion__item[open] .block-accordion__q::after {
    content: "−";
}
.block-accordion__q:hover {
    color: var(--color-accent);
}
.block-accordion__a {
    padding: 0 0 var(--space-md);
    color: var(--color-muted);
    line-height: 1.6;
}

/* --- Button block alignment --- */
.btn-pdf { margin: var(--space-md) 0; }

/* --- Downloads (kit logo) --- */
.block-downloads {
    margin: var(--space-lg) 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-xl, 3rem);
}
.block-downloads__format {
    margin: 0 0 var(--space-md);
    padding-bottom: var(--space-xs, 0.5rem);
    border-bottom: 1px solid var(--color-border);
    font-size: 1.05rem;
    letter-spacing: 0.02em;
    color: var(--color-muted);
}
.block-downloads__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: var(--space-md);
}
.block-downloads__card {
    margin: 0;
    display: flex;
    flex-direction: column;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    overflow: hidden;
    transition: box-shadow var(--transition-base), transform var(--transition-base);
}
.block-downloads__card:hover {
    box-shadow: var(--shadow-md);
    transform: translateY(-2px);
}
.block-downloads__preview {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-md);
    min-height: 130px;
    /* Damier discret : rend visible la transparence des PNG. */
    background-color: #fff;
    background-image:
        linear-gradient(45deg, rgba(0,0,0,0.05) 25%, transparent 25%, transparent 75%, rgba(0,0,0,0.05) 75%),
        linear-gradient(45deg, rgba(0,0,0,0.05) 25%, transparent 25%, transparent 75%, rgba(0,0,0,0.05) 75%);
    background-size: 18px 18px;
    background-position: 0 0, 9px 9px;
}
/* Variantes à encre blanche : fond sombre pour les rendre lisibles. */
.block-downloads__preview--dark {
    background-color: #1f1f1f;
    background-image:
        linear-gradient(45deg, rgba(255,255,255,0.06) 25%, transparent 25%, transparent 75%, rgba(255,255,255,0.06) 75%),
        linear-gradient(45deg, rgba(255,255,255,0.06) 25%, transparent 25%, transparent 75%, rgba(255,255,255,0.06) 75%);
}
.block-downloads__preview img {
    max-width: 100%;
    max-height: 110px;
    height: auto;
    object-fit: contain;
}
.block-downloads__caption {
    padding: var(--space-sm) var(--space-md) 0;
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--color-text);
}
.block-downloads__btn {
    margin: var(--space-sm) var(--space-md) var(--space-md);
    align-self: flex-start;
}

/* ============================================================
   MISE EN FORME PAR BLOC
   Conteneur .block-fx (align / largeur / espacement) + modificateurs
   par composant. Piloté par blocks.settings — voir includes/block-types.php.
   Le conteneur n'existe dans le DOM que si un réglage transversal est actif :
   sans réglage, le rendu est identique à l'existant.
   ============================================================ */

/* --- Alignement --- */
.block-fx--align-left   { text-align: left; }
.block-fx--align-center { text-align: center; }
.block-fx--align-right  { text-align: right; }

/* --- Largeur de lecture (centrée) --- */
.block-fx--w-narrow { max-width: 640px; }
.block-fx--w-medium { max-width: 820px; }
.block-fx--w-wide   { max-width: 1040px; }
.block-fx--w-narrow,
.block-fx--w-medium,
.block-fx--w-wide { margin-inline: auto; }

/* --- Espacement vertical (échelle partagée, en em via --fx-mt / --fx-mb) ---
   Le conteneur porte la marge extérieure ; on neutralise la marge propre du bloc
   sur le bord concerné pour éviter tout cumul. */
.block-fx--has-mt { margin-top: var(--fx-mt, 0); }
.block-fx--has-mt > :first-child { margin-top: 0 !important; }
.block-fx--has-mb { margin-bottom: var(--fx-mb, 0); }
.block-fx--has-mb > :last-child  { margin-bottom: 0 !important; }

/* --- Image alignée (visible seulement si la taille est contrainte ci-dessous) --- */
.block-fx--align-left   > .block-image { margin-right: auto; margin-left: 0; }
.block-fx--align-center > .block-image { margin-inline: auto; }
.block-fx--align-right  > .block-image { margin-left: auto; margin-right: 0; }

/* --- Image : tailles --- */
.block-image--sm { max-width: 260px; }
.block-image--md { max-width: 460px; }
.block-image--lg { max-width: 720px; }

/* --- Citation : styles --- */
.block-quote--plain {
    text-align: left;
    max-width: none;
    padding-inline: 0 0;
    padding-left: var(--space-lg);
    border-left: 3px solid var(--color-accent);
    margin-inline: 0;
}
.block-quote--plain blockquote::before { display: none; }
.block-quote--boxed {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
}

/* --- Call-to-action : fonds --- */
.block-cta--accent {
    background: var(--color-surface); /* repli si color-mix non supporté */
    background: color-mix(in srgb, var(--color-accent) 12%, var(--color-surface));
    border-color: var(--color-accent);
    border-color: color-mix(in srgb, var(--color-accent) 30%, var(--color-border));
}
.block-cta--plain {
    background: transparent;
    border-color: transparent;
    padding-inline: 0;
}

/* --- Liste à icônes : colonnes fixes --- */
.block-icon-list--cols {
    grid-template-columns: repeat(var(--iconlist-cols, 2), minmax(0, 1fr));
}
@media (max-width: 640px) {
    .block-icon-list--cols { grid-template-columns: 1fr; }
}

/* --- Chiffres clés : colonnes fixes --- */
.block-stats--cols {
    grid-template-columns: repeat(var(--stats-cols, 3), minmax(0, 1fr));
}
@media (max-width: 640px) {
    .block-stats--cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* --- Fil d'ariane (élément global, rendu par includes/pages.php) ---
   Rendu DANS #main-content : il hérite ainsi du décalage du menu latéral
   (voir [data-menu-position]) au lieu de passer dessous. */
.breadcrumb-bar {
    padding-block: var(--space-md, 1.5rem);
    font-size: 0.875rem;
    color: var(--color-muted);
}

/* En premier enfant de #main-content, c'est LUI qui dégage la hauteur de
   l'en-tête fixe (--header-h) : la règle `.section:first-child` de layout.css ne
   s'applique alors plus à la première section, qui reprend son espacement
   normal. Sur une page qui ouvre par un visuel plein cadre, le fil est rendu
   APRÈS ce visuel : il n'est plus :first-child et n'a rien à dégager. */
#main-content > .breadcrumb-bar:first-child {
    padding-top: calc(var(--header-h, 88px) + var(--space-lg, 2rem));
}
/* Variante « barre » : le dégagement passe en MARGE, sinon la bande teintée
   ferait un bandeau de la hauteur de l'en-tête. */
#main-content > .breadcrumb-bar--boxed:first-child {
    margin-top: calc(var(--header-h, 88px) + var(--space-lg, 2rem));
    padding-top: var(--space-md, 1rem);
}
/* La section qui suit n'a plus besoin de son grand espacement de tête. */
.breadcrumb-bar + .section { padding-top: var(--space-xl, 3rem); }

.breadcrumb-bar--boxed {
    background-color: var(--color-surface);
    border-bottom: 1px solid var(--color-border);
}

.breadcrumb-bar .container {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--space-xs, 0.5rem) var(--space-sm, 0.75rem);
}

.breadcrumb__list {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-xs, 0.5rem);
    margin: 0;
    padding: 0;
    list-style: none;
}

.breadcrumb__item {
    display: inline-flex;
    align-items: center;
    gap: var(--space-xs, 0.5rem);
}

/* Séparateur purement décoratif (aria-hidden côté HTML). */
.breadcrumb__sep {
    color: var(--color-muted);
    opacity: 0.6;
}

.breadcrumb__link {
    color: inherit;
    text-decoration: none;
    border-bottom: 1px solid transparent;
    transition: color var(--transition-base), border-color var(--transition-base);
}
.breadcrumb__link:hover,
.breadcrumb__link:focus-visible {
    color: var(--color-link, var(--color-accent));
    border-bottom-color: currentColor;
}

/* Page courante : non cliquable, légèrement appuyée. */
.breadcrumb__current {
    color: var(--color-text);
    font-weight: 600;
}

.breadcrumb__home {
    display: inline-flex;
    align-items: center;
}
.breadcrumb__home svg { display: block; }

@media (max-width: 640px) {
    .breadcrumb-bar { font-size: 0.8125rem; }
}

/* Bouton d'action, coordonnées, réseaux et texte libre de l'en-tête.
   Volontairement discrets : ces éléments cohabitent avec le menu dans une
   bande de quelques dizaines de pixels. */
.site-header__cta { white-space: nowrap; }

.site-header__contact,
.site-header__social {
    display: flex;
    align-items: center;
    gap: var(--space-sm);
}
.site-header__contact-link,
.site-header__social-link {
    display: inline-flex;
    align-items: center;
    font-size: var(--text-xs);
    color: var(--color-text);
    text-decoration: none;
    transition: color var(--transition-fast);
}
.site-header__contact-link:hover,
.site-header__social-link:hover { color: var(--color-accent); }
.site-header__social-link svg { width: 18px; height: 18px; }

.site-header__text {
    font-size: var(--text-sm);
    color: var(--color-muted);
    line-height: 1.3;
}
.site-header__text--small { font-size: var(--text-xs); }

/* Au-dessus d'un hero photo, l'en-tête transparent passe tout en blanc :
   ces éléments doivent suivre, sinon ils disparaissent sur l'image. */
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__contact-link,
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__social-link,
body.has-photo-hero .site-header:not(.is-scrolled) .site-header__text { color: #fff; }

/* ----------------------------------------------------------
   Header — comportement des éléments sur téléphone
   Chaque élément porte l'un de ces trois états, choisi dans l'éditeur
   d'en-tête. Voir headerItemMobileClass() (includes/header-layout.php).
   ---------------------------------------------------------- */
@media (max-width: 900px) {
    /* « Masqué sur téléphone » */
    .site-header .mp-hd-hidden { display: none; }

    /* « Dans la barre » : l'élément reste visible à côté du bouton de menu.
       Il ne doit ni s'étirer ni pousser ce bouton hors de l'écran — un texte
       libre un peu long, ou un bouton d'action au libellé bavard, le feraient
       sans ces deux garde-fous. */
    .site-header .mp-hd-bar {
        flex: 0 1 auto;
        min-width: 0;
    }
    .site-header .mp-hd-bar > * {
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    /* « Dans le menu déroulant », pour un élément qui n'a pas pu être écrit
       DANS le volet — il est dans une autre colonne, et le volet est en
       position fixe : aucune règle CSS ne peut l'y faire entrer. C'est
       main.js qui l'y déplace. Tant qu'il ne l'a pas fait (script désactivé,
       page en cours de chargement), l'élément reste visible dans la barre :
       masqué, il deviendrait inaccessible, ce qui est bien pire que déplacé. */
    .site-header .mp-hd-panel { max-width: 100%; }

    /* Sur téléphone, une ligne redevient une BARRE : logo à gauche, bouton de
       menu à droite. Empiler les colonnes les unes sous les autres mettrait le
       logo et le burger sur deux étages, et l'en-tête mangerait le tiers de
       l'écran. La grille cède donc la place à une simple rangée — ce qui reste
       visible y tient largement, puisque le reste est parti dans le volet. */
    .site-header__cols {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: var(--space-sm);
        min-height: 0;
    }
    .site-header__col { flex: 0 1 auto; justify-content: flex-start; }
    /* La dernière colonne pousse le bouton de menu contre le bord droit. */
    .site-header__cols > .site-header__col:last-child { margin-left: auto; }
    /* Une colonne vidée par le passage en mobile ne doit pas occuper d'espace. */
    .site-header__col:empty { display: none; }

    /* Une ligne dont il ne reste rien de visible ne doit pas occuper de place
       ni afficher son fond — sinon une barre de service entièrement masquée
       laisserait un bandeau vide en haut de chaque page. */
    .site-header__row:not(:has(.site-header__item:not(.mp-hd-hidden))):not(:has(.main-nav)) {
        display: none;
    }
}

/* Éléments déplacés dans le volet par main.js : ils s'y empilent comme le
   reste, sans reprendre la disposition horizontale qu'ils avaient en barre. */
.main-nav > .site-header__item {
    width: 100%;
    justify-content: flex-start;
}

/* ============================================================
   Bandeau d'information « cookies »
   ------------------------------------------------------------
   Sobre et discret : le site ne dépose qu'un cookie technique, le bandeau
   informe, il ne bloque pas la lecture (pas de voile, pas de fenêtre modale).
   Réglé dans l'admin (Réglages → Confidentialité) ; affiché par
   js/cookie-notice.js, jamais avant d'avoir vérifié qu'il n'a pas déjà été
   fermé — d'où l'état masqué par défaut.
   ============================================================ */
.cookie-notice {
    position: fixed;
    z-index: 900;                 /* au-dessus du contenu, sous l'intro (1000+) */
    background: var(--color-surface);
    color: var(--color-text);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-lg);
    /* État d'entrée : le retrait est repris par .is-visible ci-dessous. */
    opacity: 0;
    transform: translateY(1rem);
    transition: opacity var(--transition-base), transform var(--transition-base);
}
.cookie-notice.is-visible {
    opacity: 1;
    transform: translateY(0);
}

/* Variante « carte flottante » (défaut) : en bas à gauche, largeur limitée. */
.cookie-notice--card {
    left: var(--space-md);
    bottom: var(--space-md);
    max-width: 26rem;
}

/* Variante « barre » : pleine largeur, collée au bas de la fenêtre. */
.cookie-notice--bar {
    left: 0;
    right: 0;
    bottom: 0;
    max-width: none;
    border-width: 1px 0 0;
    border-radius: 0;
}

.cookie-notice__inner {
    display: flex;
    align-items: center;
    gap: var(--space-md);
    padding: var(--space-md);
}
/* En barre, le contenu suit la largeur de lecture du site (--site-width,
   pilotée par la Charte graphique — même variable que .container). */
.cookie-notice--bar .cookie-notice__inner {
    max-width: var(--site-width, 1200px);
    margin: 0 auto;
    padding: var(--space-md) var(--space-lg);
}
/* En carte, tout s'empile : la largeur ne permet pas le bouton à côté. */
.cookie-notice--card .cookie-notice__inner {
    flex-direction: column;
    align-items: flex-start;
}

.cookie-notice__text { flex: 1 1 auto; }

.cookie-notice__title {
    font-family: var(--font-heading);
    font-size: var(--text-base);
    font-weight: 600;
    margin: 0 0 0.25em;
}
.cookie-notice__body {
    font-size: var(--text-sm);
    line-height: 1.5;
    color: var(--color-muted);
    margin: 0;
}
/* Titre et message sortent d'un éditeur riche : leur contenu peut arriver
   enveloppé dans des <p> (ou porter des listes). On neutralise les marges
   extérieures pour que le bandeau garde exactement la même allure qu'avec du
   texte nu, et on laisse un petit interligne ENTRE paragraphes. */
.cookie-notice__title > :first-child,
.cookie-notice__body  > :first-child { margin-top: 0; }
.cookie-notice__title > :last-child,
.cookie-notice__body  > :last-child  { margin-bottom: 0; }
.cookie-notice__body p { margin: 0 0 0.5em; }
.cookie-notice__body ul,
.cookie-notice__body ol { margin: 0 0 0.5em; padding-left: 1.25em; }
/* Un lien saisi DANS le message reste discret : c'est le lien « en savoir
   plus » qui porte l'appel à l'action. */
.cookie-notice__body a { color: inherit; text-decoration: underline; }

.cookie-notice__link {
    color: var(--color-link, var(--color-accent));
    text-decoration: underline;
    white-space: nowrap;
}

.cookie-notice__accept {
    flex: 0 0 auto;
    padding: 0.7em 1.6em;
    font-size: var(--text-xs);
}

@media (max-width: 640px) {
    /* Sur téléphone, la carte occupe la largeur disponible : une carte étroite
       dans un coin y devient illisible. */
    .cookie-notice--card {
        left: var(--space-sm);
        right: var(--space-sm);
        bottom: var(--space-sm);
        max-width: none;
    }
    .cookie-notice--bar .cookie-notice__inner { padding: var(--space-md); }
    .cookie-notice__inner { flex-direction: column; align-items: flex-start; }
    .cookie-notice__accept { width: 100%; justify-content: center; }
}

/* Animation d'entrée retirée pour qui la refuse (préférence système). */
@media (prefers-reduced-motion: reduce) {
    .cookie-notice { transition: none; transform: none; }
}


/* ==========================================================================
   TABLEAUX DE CONTENU
   ==========================================================================

   POURQUOI DANS LE CŒUR
   allowedHtmlTags() autorise <table>, <thead>, <tr>, <th scope>, <td colspan>
   et <caption> dans TOUT contenu enrichi. N'importe quel site Artaweb peut
   donc produire un tableau depuis un module Texte — et jusqu'ici il sortait
   sans bordure ni marge. Ce n'était pas un besoin d'un site en particulier,
   c'était un trou du cœur.

   CE QUI EST VISÉ, ET CE QUI NE L'EST PAS
   `table:not([class])` ne touche QUE les tableaux écrits dans du contenu, qui
   n'ont jamais de classe. Les tableaux du CMS portent la leur et gardent leur
   habillage : .events-cal__table (calendrier) et .admin-table (back-office,
   qui vit de toute façon dans admin.css, jamais chargée ici). `.block-table`
   est réservée au futur module « Tableau » : il héritera de tout ceci sans
   qu'une ligne soit à réécrire.

   TOUT VIENT DE LA CHARTE
   Aucune couleur en dur : la teinte des lignes paires alterne --color-bg et
   --color-surface, deux jetons qui diffèrent légèrement dans les deux thèmes.
   Le tableau suit donc la palette du client et bascule seul en mode sombre,
   sans une seule règle @media prefers-color-scheme.

   DÉBORDEMENT SANS CONTENEUR
   Un tableau écrit dans le WYSIWYG n'a pas de div autour de lui : il doit donc
   savoir déborder tout seul. `display: block` + `overflow-x: auto` sur le
   <table> lui-même le rend défilant sans casser la mise en page interne des
   lignes. C'est le corps de la page qui ne doit JAMAIS défiler latéralement.
   ---------------------------------------------------------------------- */

.block-table,
table:not([class]) {
    display: block;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
    width: 100%;
    border-collapse: collapse;
    margin: var(--space-lg) 0;
    font-size: 0.95rem;
    line-height: 1.45;
}

.block-table caption,
table:not([class]) caption {
    caption-side: top;
    text-align: left;
    font-family: var(--font-heading);
    font-weight: 600;
    color: var(--color-heading);
    padding: 0 0 var(--space-sm);
}

.block-table th,
.block-table td,
table:not([class]) th,
table:not([class]) td {
    padding: 0.7rem var(--space-md);
    text-align: left;
    vertical-align: top;
    border: 0;
}

/* En-tête de COLONNE — discret, en capitales, posé sur un filet net. */
.block-table thead th,
table:not([class]) thead th {
    font-family: var(--font-heading);
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.07em;
    text-transform: uppercase;
    color: var(--color-muted);
    white-space: nowrap;
    border-bottom: 2px solid var(--color-border);
    background: var(--color-bg);
}

/* Zébrures — la « légère teinte » : deux jetons de la charte qui ne diffèrent
   que d'un souffle, en clair comme en sombre. Pas de filet entre les lignes :
   l'alternance suffit à guider l'œil, et la page reste épurée. */
.block-table tbody tr:nth-child(odd),
table:not([class]) tbody tr:nth-child(odd)  { background: var(--color-bg); }
.block-table tbody tr:nth-child(even),
table:not([class]) tbody tr:nth-child(even) { background: var(--color-surface); }

/* En-tête de LIGNE — première colonne. Un peu plus affirmée que les cellules,
   sans crier. Collée à gauche pour rester lisible pendant le défilement
   horizontal : sans elle, on ne sait plus de quelle ligne on lit la valeur. */
.block-table th[scope="row"],
table:not([class]) th[scope="row"] {
    font-weight: 600;
    color: var(--color-heading);
    position: sticky;
    left: 0;
    background: inherit;
    min-width: 12rem;
}

/* Pied de tableau : un filet qui referme, rien de plus. */
.block-table tfoot td,
.block-table tfoot th,
table:not([class]) tfoot td,
table:not([class]) tfoot th {
    border-top: 2px solid var(--color-border);
    font-weight: 600;
}

@media (max-width: 40rem) {
    .block-table,
    table:not([class]) { font-size: 0.88rem; }

    .block-table th,
    .block-table td,
    table:not([class]) th,
    table:not([class]) td { padding: 0.6rem 0.7rem; }

    .block-table th[scope="row"],
    table:not([class]) th[scope="row"] { min-width: 10rem; }
}

/* ============================================================================
   BOUTON « HAUT DE PAGE »
   Réglé dans l'admin (Réglages → Navigation), affiché par défaut.

   POURQUOI IL NE MASQUE PAS LE PIED DE PAGE
     Un bouton simplement collé en bas à droite recouvre le pied dès qu'on
     l'atteint — c'est-à-dire exactement au moment où l'on descend y lire une
     adresse ou cliquer un lien. `js/back-to-top.js` mesure la part visible du
     pied et la reporte dans `--btt-offset` : le bouton remonte au-dessus au
     lieu de passer par-dessus.
   ========================================================================== */
.back-to-top {
    position: fixed;
    right: 1.25rem;
    bottom: calc(1.25rem + var(--btt-offset, 0px));
    z-index: 95;                 /* sous l'en-tête collant (100) et le bandeau cookies (1000) */
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.75rem;
    height: 2.75rem;
    padding: 0;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    background: var(--color-surface);
    color: var(--color-heading);
    box-shadow: var(--shadow-md);
    cursor: pointer;
    /* Absent du flux tant qu'on n'a pas défilé : `visibility` retire aussi le
       bouton de l'ordre de tabulation, ce qu'une simple opacité ne fait pas. */
    opacity: 0;
    visibility: hidden;
    transform: translateY(0.5rem);
    transition: opacity .2s ease, transform .2s ease, visibility .2s;
}
.back-to-top.is-visible {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
}
.back-to-top:hover,
.back-to-top:focus-visible {
    background: var(--color-accent);
    color: var(--color-bg);
    border-color: var(--color-accent);
}
.back-to-top svg { width: 1.15rem; height: 1.15rem; display: block; }

@media (max-width: 640px) {
    .back-to-top { right: .85rem; bottom: calc(.85rem + var(--btt-offset, 0px)); }
}
@media (prefers-reduced-motion: reduce) {
    .back-to-top { transition: opacity .2s ease, visibility .2s; transform: none; }
    .back-to-top.is-visible { transform: none; }
}
