/* Jetons de design — AM Ministries
   Réf. docs/claude design/docs/handoff-design.md §1 et §2.

   Back-office : figé. Il ne suit jamais l'ambiance d'un événement — un
   organisateur travaille sur plusieurs événements dans la même journée.

   Espace famille : les variables --ef-* portent les valeurs par défaut du thème
   « Registre ». L'ambiance d'un événement les surcharge en style inline sur
   <html> (apps/evenements/ambiance.py). Aucun <style> généré, aucune classe par
   événement, aucune couleur en dur dans un gabarit. */

:root {
  /* ---- Back-office (figé, jamais thémé) ---- */
  --bo-encre:          #0F1C28;
  --bo-accent:         #16324F;
  --bo-gris:           #5B6B7A;
  /* FD1 — un gris se vérifie sur **quatre fonds** : surface blanche, fond
     gris, canevas de revue, encre sombre. Aucun n'est « assez clair » dans
     l'absolu. D'où deux jetons et non un :

       --bo-gris-clair    sur les fonds clairs — 5,05:1 sur blanc
       --bo-gris-sur-encre  sur fond sombre **uniquement** — 6,67:1 sur encre

     Un seul jeton servait les deux rôles (#8894A0) et tombait à 3,09:1 sur
     blanc : le texte tertiaire du back-office était sous le seuil AA. Ce
     défaut est réapparu cinq fois dans ce projet, chaque fois parce qu'un
     nouveau fond avait été introduit sans être porté à cette liste. */
  --bo-gris-clair:     #65707C;
  --bo-gris-sur-encre: #93A3B2;
  --bo-fond:           #F4F6F8;
  --bo-surface:        #FFFFFF;
  --bo-bordure:        #DDE3E8;
  --bo-bordure-fine:   #EEF2F5;
  /* Fond des planches de revue. `--bo-gris-clair` n'y passe pas (4,29:1) :
     ce fond ne porte pas de texte tertiaire. */
  --bo-canevas:        #E9EDF0;
  /* FD1 — la bordure d'un élément inactif. Jamais une couleur de texte :
     1,63:1 sur blanc. Le libellé, lui, reste à --bo-gris-clair. */
  --bo-bordure-inactif: #C3CCD4;
  /* Configuration du front : l'accès hérité d'un statut précédent — un bleu
     très pâle tiré de l'accent, qui dit « vient d'ailleurs, se règle à
     gauche ». Ce n'est pas un statut. Accent dessus : 11,8:1. */
  --bo-herite-fond:    #EEF4FA;
  --bo-herite-bord:    #CFDCEA;
  /* Messages : la catégorie d'un message (maquette « BO Messages »). Elle
     classe, elle ne dit ni « faux » ni « à traiter » : aucune ne reprend un
     statut. Texte sur son fond : 11,5:1, 6,8:1, 7,3:1. */
  --bo-cat-information:      #16324F;
  --bo-cat-information-fond: #EAF1F9;
  --bo-cat-information-bord: #C6D8EC;
  --bo-cat-rappel:           #1D5C58;
  --bo-cat-rappel-fond:      #E7F4F3;
  --bo-cat-rappel-bord:      #BFE0DD;
  --bo-cat-programme:        #5B3F8C;
  --bo-cat-programme-fond:   #F3EEFB;
  --bo-cat-programme-bord:   #D9CCEF;
  /* Le voile sous une fenêtre de confirmation de la fiche d'un membre
     (BO-ANN-07, décision du 10 octobre 2026) : l'encre, à moitié. */
  --bo-voile:                rgba(15, 28, 40, .5);

  /* ---- Statuts : jamais thémables, back-office ET espace famille ----
     Code à trois valeurs, strict : brique = une règle est violée ;
     ambre = un manque à traiter, pas une violation ; vert = conforme.
     Aucune autre couleur de statut n'est autorisée. Un dossier incomplet a
     la même couleur sur tous les événements. */
  --statut-bloquant:       #9A3412;
  --statut-bloquant-fond:  #FDF6F2;
  --statut-bloquant-bord:  #F0CFAE;
  --statut-attention:      #B45309;
  --statut-attention-fond: #FDF1E7;
  --statut-ok:             #15803D;
  --statut-ok-fond:        #ECF6EF;
  --statut-ok-bord:        #C3E2CD;

  /* ---- Espace famille : valeurs par défaut = thème Registre ----
     Un événement sans ambiance rend exactement ceci. C'est un cas normal
     (événements ponctuels), pas une erreur. */
  --ef-encre:        #0F1C28;
  --ef-encre-doux:   #5B6B7A;
  --ef-accent:       #16324F;
  --ef-accent-texte: #FFFFFF;
  --ef-fond:         #FFFFFF;
  --ef-surface:      #FFFFFF;
  --ef-bordure:      #DDE3E8;
  --ef-titre:        "IBM Plex Sans";
  --ef-texte:        "IBM Plex Sans";

  /* ---- Marque ----
     L'or du trait et l'encre de la marque. Comme les couleurs de statut, ils
     ne sont **jamais** thémables : la marque identifie l'association, pas
     l'événement (docs/claude design/marque/README.md). */
  --marque-or:    #C09A55;
  --marque-encre: #0F1C28;
  --marque-gris:  #5B6B7A;

  /* ---- Types de réunion (outil Lives, back-office) ----
     Demandés par l'association (septembre 2026) pour reconnaître d'un coup
     d'œil le mercredi du dimanche matin ; la maquette LV1 les laissait gris.
     Ce ne sont **pas** des couleurs de statut : elles classent, elles ne
     disent ni « faux » ni « à traiter », et aucune ne reprend la brique, l'ambre
     ou le vert. Un type sans teinte ici — « Autre » — reste neutre. Texte sur
     fond : de 6,78:1 (PM) à 11,55:1 (AM). */
  --type-mer:          #713454;
  --type-mer-fond:     #F6EFF3;
  --type-mer-bord:     #E2CDD9;
  --type-am:           #1D314D;
  --type-am-fond:      #EBF1F8;
  --type-am-bord:      #CAD8EA;
  --type-ecodim:       #574088;
  --type-ecodim-fond:  #F2EEFA;
  --type-ecodim-bord:  #D7CDED;
  --type-pm:           #305B58;
  --type-pm-fond:      #EAF4F3;
  --type-pm-bord:      #C6DFDD;

  /* ---- Types de don (outil Offrandes, back-office) ----
     Spécification « Offrandes » §2.3 : l'Offrande et la Dîme ont leur teinte,
     chaque autre don en prend une dans cette palette fermée, choisie à sa
     création (`offrandes.models.Teinte`) — la base ne retient que le nom. Pas
     de vert, pas d'orangé : une collecte n'est ni « conforme » ni « à
     traiter ». Texte sur fond : de 6,43:1 (prune) à 11,51:1 (offrande). */
  --don-offrande:       #16324F;
  --don-offrande-fond:  #EAF1F9;
  --don-offrande-bord:  #C9D8EA;
  --don-dime:           #5B3F8C;
  --don-dime-fond:      #F3EEFB;
  --don-dime-bord:      #DBD0EF;
  --don-eau:            #1D5C58;
  --don-eau-fond:       #E7F2F1;
  --don-eau-bord:       #C3DEDB;
  --don-prune:          #8A3B5C;
  --don-prune-fond:     #F8EDF2;
  --don-prune-bord:     #E8CCD8;
  --don-olive:          #5A4F1E;
  --don-olive-fond:     #F4F1E3;
  --don-olive-bord:     #E0D9B8;
  --don-ardoise:        #3E4C66;
  --don-ardoise-fond:   #EDF0F5;
  --don-ardoise-bord:   #CDD4E1;

  /* ---- Chiffres : identiques partout, dans toutes les ambiances ----
     Montants, dates, rangs d'attente, références. Ne changent jamais de typo :
     c'est ce qui rend les colonnes alignables et les erreurs repérables. */
  --chiffres: "IBM Plex Mono", ui-monospace, monospace;

  /* La colonne de l'espace famille. Assez large pour deux montants alignés,
     assez étroite pour qu'une ligne se lise d'un seul regard. Ce n'est pas un
     jeton d'ambiance : la structure ne se thème jamais. */
  --ef-largeur: 40rem;

  /* ---- Échelle. Non thémable : un événement ne peut pas casser la mise en
     page ni l'ergonomie mobile (ENF-7.6). ---- */
  --t-meta: 11px;  --t-libelle: 12px; --t-secondaire: 13px;
  --t-corps: 14px; --t-titre-s: 16px; --t-titre-m: 19px; --t-compteur: 26px;
  --r-s: 3px; --r-m: 5px; --r-l: 8px;
  --e-1: 4px; --e-2: 8px; --e-3: 12px; --e-4: 16px; --e-5: 20px; --e-6: 28px;

  /* Cible tactile minimale (ENF-7.6) */
  --touche-min: 44px;

  /* ---- Front AM Ministries : la nouvelle direction artistique ----
     Maquettes « Front2 — Fondations », tirées du logo : violet pour l'action,
     magenta pour le don et les non-lus seulement, or pour ce que l'église met
     à part, dégradé en un seul filet. Posés sur :root pour que la barre et
     les menus — qui appartiennent à l'association, jamais à un événement —
     les trouvent aussi sur une page en ambiance. Le back-office ne les lit
     pas. Contrastes vérifiés par tests/test_front_da.py, sur les trois fonds.

     Thème clair. Le foncé suit, sous `body.fm[data-theme]`. */
  --fm-fond:           #F7F5FC;
  --fm-surface:        #FFFFFF;
  --fm-surface-2:      #F0EEF8;
  --fm-bordure:        #DCD8EA;
  --fm-bordure-fine:   #EBE8F3;
  --fm-texte:          #1E1A4D;  /* nuit — 16,0:1 sur blanc */
  --fm-texte-doux:     #5B5875;  /* 5,9:1 sur surface-2, le plus bas */
  /* Deux jetons pour le violet : le fond d'un bouton plein garde sa valeur
     dans les deux thèmes (blanc dessus, 8,2:1), le violet d'un texte ou d'un
     lien s'éclaircit en foncé. Un seul jeton servait les deux rôles, et un
     lien violet sur fond nuit tombait à 2,3:1. */
  --fm-action:         #4A3AB5;
  --fm-action-txt:     #4A3AB5;
  --fm-action-pale:    #EFEDFA;
  --fm-action-bord:    #D6D1F1;
  --fm-sur-plein:      #FFFFFF;  /* le texte d'un bouton plein, violet ou magenta */
  /* Magenta : le don et le badge des non-lus. Une seule action magenta par
     écran, et jamais une erreur — une alerte reste brique. Le bouton et le
     badge gardent #C2185B en foncé : le magenta éclairci ne porte pas de
     blanc (2,6:1). */
  --fm-magenta:        #C2185B;
  --fm-magenta-plein:  #C2185B;
  /* Le filet d'une carte qui signale un non-lu — « Une réponse vous attend »
     (maquette « Front2 - Discussions », FO-DSC-04B). Un filet, jamais un
     texte. */
  --fm-magenta-bord:   #F1C9DA;
  --fm-lagon:          #0E7490;  /* le cyan qui porte du texte */
  --fm-cyan-deco:      #1FB5D2;  /* décor seul : 2,4:1 sur blanc, jamais un texte */
  /* L'or profond de la maquette (#8A6A12) tombait à 4,41:1 sur surface-2 et à
     4,49:1 dans sa propre pastille « Annonces » : assombri d'un cran. */
  --fm-or-txt:         #856610;
  --fm-or-deco:        #D4A73A;  /* filets et icônes — jamais un texte */
  /* Le fond sombre du lecteur et de la carte « Prochain live » : du texte
     blanc dessus, dans les deux thèmes. */
  --fm-nuit:           #1E1A4D;
  --fm-nuit-motif:     #2B2566;
  --fm-degrade: linear-gradient(90deg, #C2185B, #4A3AB5, #1FB5D2);
  /* Le symbole de la barre (maquette « Front2 — Logo », option A) : sans
     cadre en clair ; dans un carré blanc en foncé, le temps que la version
     monochrome existe — le fichier est détouré automatiquement, et son liseré
     clair ne se voit que sur fond sombre. Le cadre est la marge blanche
     autour du symbole. */
  --fm-logo-fond:  transparent;
  --fm-logo-cadre: 0px;
  /* Le symbole en grand (maquette « Front2 — Contact ») : dans un carré blanc
     dans les deux thèmes — le fichier, détouré, garde un liseré clair. Le
     thème foncé ne le redéfinit pas. */
  --fm-symbole-fond: #FFFFFF;
  /* Le QR code de réservation : modules noirs sur blanc, dans les deux
     thèmes. Un code inversé — clair sur foncé — se lit mal ou pas du tout
     selon les lecteurs : le thème foncé ne les redéfinit pas. */
  --fm-qr-encre: #000000;
  --fm-qr-fond:  #FFFFFF;
  /* Le voile sous la feuille « Plus » du téléphone. */
  --fm-voile: rgba(30, 26, 77, .45);
  --fm-titre: "Montserrat", "IBM Plex Sans", sans-serif;
  /* La Bible (FO-BIB-02) : un serif de lecture, plus grand que le reste de
     l'appli — le seul écran où l'on lit longtemps. Un fond légèrement chaud
     en clair ; en foncé, la surface. Trois surlignages, qui classent et ne
     disent rien d'un état : aucun n'est une couleur de statut. */
  --fm-lecture: "Source Serif 4", Georgia, serif;
  --fm-lecture-fond:     #FBFAF7;
  --fm-surligne-jaune:   #FFF1B8;
  --fm-surligne-vert:    #D7F0E3;
  --fm-surligne-violet:  #E3DDFF;
  --fm-r-carte:    10px;
  --fm-r-bouton:   6px;
  --fm-r-pastille: 12px;

  /* Les aperçus du choix de thème (Notifications › Apparence) : chacun
     montre son thème tel qu'il est, quel que soit celui de la page. */
  --fm-apercu-clair-fond:  #F7F5FC;
  --fm-apercu-clair-texte: #1E1A4D;
  --fm-apercu-fonce-fond:  #121027;
  --fm-apercu-fonce-texte: #F2F0FA;

  /* Les pastilles de catégorie d'un message. Elles classent, elles ne disent
     ni « faux » ni « à traiter » : aucune ne reprend un statut. */
  --fm-cat-violet:        #4A3AB5;
  --fm-cat-violet-fond:   #EFEDFA;
  --fm-cat-violet-bord:   #D6D1F1;
  --fm-cat-magenta:       #A0144B;
  --fm-cat-magenta-fond:  #FBEAF1;
  --fm-cat-magenta-bord:  #F1C9DA;
  --fm-cat-lagon:         #0E7490;
  --fm-cat-lagon-fond:    #E6F5F8;
  --fm-cat-lagon-bord:    #BFE3EC;
  --fm-cat-or:            #856610;
  --fm-cat-or-fond:       #F8F1DF;
  --fm-cat-or-bord:       #E8D7AD;
  /* Les six couleurs du texte d'un message (maquette « Front2 — Messages »,
     MS3) : une palette fermée, chacune son jeton (décision du 1er octobre
     2026). Vert et Brique ont la valeur des statuts, pas leur sens : un mot
     en vert dans un message ne dit rien de « conforme ». Le thème foncé
     porte leur version éclaircie, et « Important » garde la brique des
     statuts — aucune de ces couleurs ne le remplace. */
  --fm-couleur-encre:    #1E1A4D;
  --fm-couleur-violet:   #4A3AB5;
  --fm-couleur-magenta:  #B0164F;
  --fm-couleur-lagon:    #0E6F85;
  --fm-couleur-vert:     #15803D;
  --fm-couleur-brique:   #9A3412;
  /* Le suivi des offrandes (maquette « Front2 - Suivi des offrandes », R45) :
     les trois familles de la répartition — la Dîme violette, l'Offrande
     magenta, les autres dons lagon —, en pastille et en barre ; jamais un
     texte. Elles classent : aucune ne reprend la brique, l'ambre ou le vert.
     Puis le fond léger d'un don qui vient d'arriver, une minute. */
  --fm-don-dime:         #4A3AB5;
  --fm-don-offrande:     #C2185B;
  --fm-don-autres:       #0E6F85;
  --fm-don-nouveau-fond: #FCE8F0;
  /* Installer l'appli (maquettes « Front2 - Installation ») : les
     illustrations reproduisent l'écran du téléphone à l'identique — ses gris,
     le bleu de son système —, en clair comme un téléphone en mode clair, en
     foncé comme iOS en mode sombre. Le cerclage violet (--fm-action-txt) y
     reste le seul repère de couleur. Le bleu du système est un repère, pas
     un texte à lire : l'étape le dit en toutes lettres au-dessus. */
  --fm-illu-fond:       #F7F7F9;
  --fm-illu-bord:       #D6D6DB;
  --fm-illu-barre:      #F9F9FB;
  --fm-illu-champ:      #EBEBF0;
  --fm-illu-filet:      #DADCE0;
  --fm-illu-encre:      #3C4043;
  --fm-illu-eteint:     #B4B6BB;  /* un bouton éteint : « suivant », sans page suivante */
  --fm-illu-texte:      #202124;
  --fm-illu-doux:       #5F6368;
  --fm-illu-ios:        #007AFF;
  --fm-illu-android:    #1A73E8;
  --fm-illu-cible-fond: #EEEBFF;
  --fm-illu-app-verte:  #34C759;
  --fm-illu-app-bleue:  #0A84FF;
  /* Les illustrations écrivent dans la police du téléphone, pas dans celle
     de l'association : c'est l'écran du membre qu'elles montrent. */
  --fm-illu-police: -apple-system, "SF Pro Text", "Helvetica Neue", Roboto, Arial, sans-serif;
  /* Le chiffre posé sur un rond --fm-action-txt — les numéros d'étape :
     blanc sur le violet du clair, nuit sur la lavande du foncé. */
  --fm-sur-action-txt:  #FFFFFF;
}

*, *::before, *::after { box-sizing: border-box; }

/* Racines */
body.bo {
  margin: 0;
  background: var(--bo-fond);
  color: var(--bo-encre);
  font-family: "IBM Plex Sans", system-ui, sans-serif;
  font-size: var(--t-corps);
  line-height: 1.5;
}
body.ef {
  margin: 0;
  background: var(--ef-fond);
  color: var(--ef-encre);
  font-family: var(--ef-texte), "IBM Plex Sans", system-ui, sans-serif;
  font-size: 15px;
  line-height: 1.55;
}
body.ef h1, body.ef h2, body.ef h3 {
  font-family: var(--ef-titre), "IBM Plex Sans", sans-serif;
}

/* ---- Front AM Ministries : une page en nouvelle DA ----
   `body.fm` : toute page du front — membre connecté ou visiteur — qui ne porte
   pas l'ambiance d'un événement. Les composants partagés de l'espace famille
   lisent --ef-* : ici, ces jetons prennent les valeurs du front, et le même
   jeu de règles CSS sert les deux directions. Sur une page en ambiance, la
   classe est absente et rien de ce bloc ne s'applique.

   Quelques composants partagés empruntent les neutres du back-office
   (--bo-fond, --bo-bordure…). Ils prennent ici les neutres du front : le
   back-office ne porte jamais `fm`, et ses valeurs ne bougent pas. */
body.fm {
  --ef-encre:        var(--fm-texte);
  --ef-encre-doux:   var(--fm-texte-doux);
  /* Deux rôles pour un même jeton d'ambiance. Le violet d'un texte ou d'un
     lien (--ef-accent) s'éclaircit en foncé ; le fond d'un bouton plein
     (--ef-accent-plein) garde sa valeur, blanc dessus. Hors de `fm`, les
     règles partagées retombent sur --ef-accent : rien ne change ailleurs. */
  --ef-accent:       var(--fm-action-txt);
  --ef-accent-plein: var(--fm-action);
  --ef-accent-texte: var(--fm-sur-plein);
  /* L'encre sert aussi de fond sombre sous du texte blanc (le lecteur du
     live, une bande d'appel) : en foncé, ce fond reste sombre. */
  --ef-encre-plein:  var(--fm-nuit);
  --ef-fond:         var(--fm-fond);
  --ef-surface:      var(--fm-surface);
  --ef-bordure:      var(--fm-bordure);
  --ef-titre:        "Montserrat";
  --ef-texte:        "IBM Plex Sans";
  --bo-encre:          var(--fm-texte);
  --bo-accent:         var(--fm-action-txt);
  --bo-gris:           var(--fm-texte-doux);
  --bo-gris-clair:     var(--fm-texte-doux);
  --bo-fond:           var(--fm-surface-2);
  --bo-surface:        var(--fm-surface);
  --bo-bordure:        var(--fm-bordure);
  --bo-bordure-fine:   var(--fm-bordure-fine);
  --bo-bordure-inactif: var(--fm-bordure);
  /* Lu par cinq composants, jamais déclaré jusqu'ici : leur bordure
     disparaissait. Le front la déclare — la teinte des maquettes, qui est
     celle de la brique pâle. */
  --statut-attention-bord: #F0CFAE;
  /* Le fond plein d'un statut, sous un texte blanc (un compteur, « Signer »,
     « en direct ») : la valeur d'origine, dans les deux thèmes. Le thème
     foncé n'éclaircit que les statuts qui sont du texte ou un repère. */
  --statut-bloquant-plein:  #9A3412;
  --statut-attention-plein: #B45309;
  --statut-ok-plein:        #15803D;
  color-scheme: light;

  /* La taille du texte, réglée par le membre (Mon compte › Réglages et
     sécurité › Affichage, décision du 10 octobre 2026) : le texte seul
     grandit — ni les marges, ni les images, ni la mise en page. Toute taille
     de police du front en est multipliée (`calc(… * var(--fm-echelle, 1))`),
     et l'échelle commune la suit ici. Hors de `fm` — le back-office —, elle
     vaut 1 et rien ne bouge. Un visiteur reste en taille normale. */
  --fm-echelle: 1;
  --t-meta:      calc(11px * var(--fm-echelle));
  --t-libelle:   calc(12px * var(--fm-echelle));
  --t-secondaire: calc(13px * var(--fm-echelle));
  --t-corps:     calc(14px * var(--fm-echelle));
  --t-titre-s:   calc(16px * var(--fm-echelle));
  --t-titre-m:   calc(19px * var(--fm-echelle));
  --t-compteur:  calc(26px * var(--fm-echelle));
  font-size: calc(15px * var(--fm-echelle));
}
body.fm[data-taille="moyen"]      { --fm-echelle: 1.1; }
body.fm[data-taille="grand"]      { --fm-echelle: 1.2; }
body.fm[data-taille="tres_grand"] { --fm-echelle: 1.3; }

/* ---- Front AM Ministries : thème foncé ----
   Réservé au membre connecté qui l'a choisi (Notifications › Apparence), ou
   qui a laissé « Automatique » sur un téléphone en foncé. Un visiteur reste
   en clair : `data-theme="clair"`, toujours.

   Violet nuit, jamais de noir pur. Tout texte coloré s'éclaircit ; les
   boutons pleins gardent leur couleur. Les trois statuts gardent leur sens et
   leur teinte, dans une variante éclaircie **fixe** — la brique d'origine
   tombait à 2,3:1 sur la surface foncée. Aucune ambiance d'événement n'y
   touche : depuis le 3 octobre 2026, l'ambiance n'habille plus le front.

   Deux blocs identiques, l'un forcé, l'autre automatique — un test vérifie
   qu'ils ne divergent pas. */
body.fm[data-theme="fonce"] {
  --fm-fond:           #121027;
  --fm-lecture-fond:     #1C1938;
  --fm-surligne-jaune:   #4A4020;
  --fm-surligne-vert:    #1E3A33;
  --fm-surligne-violet:  #3A3370;
  --fm-surface:        #1C1938;
  --fm-surface-2:      #252148;
  --fm-bordure:        #34305C;
  --fm-bordure-fine:   #2E2A55;
  --fm-texte:          #F2F0FA;
  --fm-texte-doux:     #B9B4D8;
  --fm-action-txt:     #A99CFF;
  --fm-action-pale:    #2A2650;
  --fm-action-bord:    #4A3AB5;
  --fm-magenta:        #F27AAA;
  --fm-magenta-bord:   #6B3450;
  --fm-lagon:          #1FB5D2;
  --fm-or-txt:         #E2BE5E;
  --fm-nuit:           #252148;
  --fm-nuit-motif:     #2F2A5C;
  --fm-voile:          rgba(7, 6, 26, .62);
  --fm-logo-fond:      #FFFFFF;
  --fm-logo-cadre:     4px;
  --fm-cat-violet:        #A99CFF;
  --fm-cat-violet-fond:   #252148;
  --fm-cat-violet-bord:   #34305C;
  --fm-cat-magenta:       #F27AAA;
  --fm-cat-magenta-fond:  #252148;
  --fm-cat-magenta-bord:  #34305C;
  --fm-cat-lagon:         #1FB5D2;
  --fm-cat-lagon-fond:    #252148;
  --fm-cat-lagon-bord:    #34305C;
  --fm-cat-or:            #E2BE5E;
  --fm-cat-or-fond:       #252148;
  --fm-cat-or-bord:       #34305C;
  --fm-couleur-encre:    #F2F0FA;
  --fm-couleur-violet:   #A99CFF;
  --fm-couleur-magenta:  #FF8AB8;
  --fm-couleur-lagon:    #6FD3E8;
  --fm-couleur-vert:     #5FD39A;
  --fm-couleur-brique:   #F59A7A;
  --fm-don-dime:         #A99CFF;
  --fm-don-offrande:     #F27AAA;
  --fm-don-autres:       #1FB5D2;
  --fm-don-nouveau-fond: #3A1E33;
  --fm-illu-fond:       #24223A;
  --fm-illu-bord:       #3A3852;
  --fm-illu-barre:      #1E1C30;
  --fm-illu-champ:      #2E2C45;
  --fm-illu-filet:      #3A3852;
  --fm-illu-encre:      #E3E1EC;
  --fm-illu-eteint:     #5C5A75;
  --fm-illu-texte:      #F2F0FA;
  --fm-illu-doux:       #B9B4D8;
  --fm-illu-ios:        #0A84FF;
  --fm-illu-android:    #8AB4F8;
  --fm-illu-cible-fond: #2E2870;
  --fm-sur-action-txt:  #121027;
  --statut-bloquant:       #F59A7A;
  --statut-bloquant-fond:  #3A1E17;
  --statut-bloquant-bord:  #6B3424;
  --statut-attention:      #F2B25C;
  --statut-attention-fond: #36260F;
  --statut-attention-bord: #6A4A1C;
  --statut-ok:             #6FD39A;
  --statut-ok-fond:        #12301F;
  --statut-ok-bord:        #285C3E;
  color-scheme: dark;
}
@media (prefers-color-scheme: dark) {
  body.fm[data-theme="auto"] {
    --fm-fond:           #121027;
    --fm-lecture-fond:     #1C1938;
    --fm-surligne-jaune:   #4A4020;
    --fm-surligne-vert:    #1E3A33;
    --fm-surligne-violet:  #3A3370;
    --fm-surface:        #1C1938;
    --fm-surface-2:      #252148;
    --fm-bordure:        #34305C;
    --fm-bordure-fine:   #2E2A55;
    --fm-texte:          #F2F0FA;
    --fm-texte-doux:     #B9B4D8;
    --fm-action-txt:     #A99CFF;
    --fm-action-pale:    #2A2650;
    --fm-action-bord:    #4A3AB5;
    --fm-magenta:        #F27AAA;
    --fm-magenta-bord:   #6B3450;
    --fm-lagon:          #1FB5D2;
    --fm-or-txt:         #E2BE5E;
    --fm-nuit:           #252148;
    --fm-nuit-motif:     #2F2A5C;
    --fm-voile:          rgba(7, 6, 26, .62);
    --fm-logo-fond:      #FFFFFF;
    --fm-logo-cadre:     4px;
    --fm-cat-violet:        #A99CFF;
    --fm-cat-violet-fond:   #252148;
    --fm-cat-violet-bord:   #34305C;
    --fm-cat-magenta:       #F27AAA;
    --fm-cat-magenta-fond:  #252148;
    --fm-cat-magenta-bord:  #34305C;
    --fm-cat-lagon:         #1FB5D2;
    --fm-cat-lagon-fond:    #252148;
    --fm-cat-lagon-bord:    #34305C;
    --fm-cat-or:            #E2BE5E;
    --fm-cat-or-fond:       #252148;
    --fm-cat-or-bord:       #34305C;
    --fm-couleur-encre:    #F2F0FA;
    --fm-couleur-violet:   #A99CFF;
    --fm-couleur-magenta:  #FF8AB8;
    --fm-couleur-lagon:    #6FD3E8;
    --fm-couleur-vert:     #5FD39A;
    --fm-couleur-brique:   #F59A7A;
    --fm-don-dime:         #A99CFF;
    --fm-don-offrande:     #F27AAA;
    --fm-don-autres:       #1FB5D2;
    --fm-don-nouveau-fond: #3A1E33;
    --fm-illu-fond:       #24223A;
    --fm-illu-bord:       #3A3852;
    --fm-illu-barre:      #1E1C30;
    --fm-illu-champ:      #2E2C45;
    --fm-illu-filet:      #3A3852;
    --fm-illu-encre:      #E3E1EC;
    --fm-illu-eteint:     #5C5A75;
    --fm-illu-texte:      #F2F0FA;
    --fm-illu-doux:       #B9B4D8;
    --fm-illu-ios:        #0A84FF;
    --fm-illu-android:    #8AB4F8;
    --fm-illu-cible-fond: #2E2870;
    --fm-sur-action-txt:  #121027;
    --statut-bloquant:       #F59A7A;
    --statut-bloquant-fond:  #3A1E17;
    --statut-bloquant-bord:  #6B3424;
    --statut-attention:      #F2B25C;
    --statut-attention-fond: #36260F;
    --statut-attention-bord: #6A4A1C;
    --statut-ok:             #6FD39A;
    --statut-ok-fond:        #12301F;
    --statut-ok-bord:        #285C3E;
    color-scheme: dark;
  }
}

/* Tout chiffre, date, référence, statut technique. Règle absolue (§1). */
.chiffre, time, .reference, .montant {
  font-family: var(--chiffres);
  font-variant-numeric: tabular-nums;
}

a { color: var(--bo-accent); }
a:hover { color: var(--bo-encre); }
body.ef a { color: var(--ef-accent); }
body.ef a:hover { color: var(--ef-encre); }

/* Le focus reste visible partout : il ne dépend d'aucune ambiance. */
a:focus-visible, button:focus-visible, input:focus-visible,
select:focus-visible, textarea:focus-visible, summary:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}
