/* ═══════════════════════════════════════════════════════════════════════════
   FOFBOARD — DESIGN SYSTEM V4
   ---------------------------------------------------------------------------
   SOURCE DE VÉRITÉ UNIQUE : « Figma Etienne/DesignSystem_V4.svg ».
   Rien ici n'est inventé. Chaque valeur est recopiée de la maquette, sans
   arrondi et sans interprétation. Si une valeur manque pour un écran, on
   s'arrête et on la demande à Etienne — on n'en fabrique pas.

   Ce fichier a vocation à remplacer « 1-socle.css » en totalité. Pendant la
   transition les deux cohabitent : aucun nom n'entre en conflit, les jetons de
   l'ancien socle portent tous le préfixe « --fof- », ceux du DS non.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══════════════════════════════════════════════════════════════════════════
   1. LES POLICES
   ---------------------------------------------------------------------------
   Servies depuis ce serveur, plus depuis Google. Trois raisons : aucune adresse
   IP d'utilisateur ne part chez un tiers, deux connexions externes de moins
   avant le premier texte affiché, et l'application ne dépend plus d'un service
   qui peut être lent ou bloqué.

   Les quatre fichiers sont dans « assets/fonts/ », sous-jeu latin — il couvre
   tout le français, accents et « œ » compris. Trois sont des polices variables :
   un seul fichier porte toute la plage de graisses annoncée dans son nom.

   Licence : les quatre sont sous SIL Open Font License, qui autorise
   explicitement l'hébergement et la redistribution.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Les titres. Bebas Neue n'a PAS de minuscules : un titre s'affiche en
   capitales parce que la police est dessinée ainsi, pas parce qu'une règle le
   force. */
@font-face {
  font-family: 'Bebas Neue';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/bebas-neue-400-latin.woff2') format('woff2');
}

/* Le texte courant. Police variable : 400 à 700 dans un seul fichier. */
@font-face {
  font-family: 'League Spartan';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('/assets/fonts/league-spartan-400-700-latin.woff2') format('woff2');
}

/* Les badges et les colonnes de chiffres. Variable : 500 à 800. Le DS demande
   de l'ExtraBold (800) pour style_badge ; les 500 et 600 sont là pour les
   écrans qui n'ont pas encore migré. */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500 800;
  font-display: swap;
  src: url('/assets/fonts/jetbrains-mono-500-800-latin.woff2') format('woff2');
}

/* Les devis et les factures, et eux seuls (voir 5-document.css). Cette police
   n'appartient PAS au design system V4 : elle est ici parce que le document
   imprimé s'en sert, et qu'il n'y avait aucune raison de la laisser chez Google
   pendant qu'on rapatriait les trois autres. */
@font-face {
  font-family: 'Instrument Sans';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('/assets/fonts/instrument-sans-400-700-latin.woff2') format('woff2');
}


/* ═══════════════════════════════════════════════════════════════════════════
   2. L'UNITÉ DU PLAN DE TRAVAIL
   ---------------------------------------------------------------------------
   Le seul élément de ce fichier qui ne soit pas recopié de la maquette. Il
   traduit les unités du plan Figma en pixels.

   Les deux cadres d'Etienne : téléphone 1100 × 2504 (l'écran réel de son
   smartphone), ordinateur 4285 × 2410 (16:9). Le rapport 4285 / 1100 = 3,895
   est le coefficient qu'il a appliqué pour n'avoir qu'UNE taille de composants
   dans le DS, valable sur les deux formats.

   Le plan est dessiné à 3×. Trois valeurs le prouvent, et elles tombent toutes
   les trois sur des nombres ronds :

       bordure de badge      3 unités  ÷ 3 =  1 px
       tuile d'icône        96 unités  ÷ 3 = 32 px
       rayon de cette tuile 24 unités  ÷ 3 =  8 px

   Ce tiers de pixel est la bonne valeur AU TÉLÉPHONE, et on peut le vérifier :
   le cadre fait 1100 unités, soit 366,7 px, la largeur d'un vrai téléphone.

   SUR ORDINATEUR, IL EST TROP PETIT. Mesuré par Etienne le 2026-09-01 : pour
   qu'une capture d'écran de Chrome se superpose à sa maquette, il faut
   l'agrandir de 1,335. Autrement dit les composants sortaient à 75 % de la
   taille voulue. L'unité du bureau est donc le tiers de pixel multiplié par ce
   même 1,335, soit 0,445 px — et le cadre de 4285 unités retombe alors sur
   1907 px, la largeur d'un écran d'ordinateur courant, là où le tiers de pixel
   le ramenait à 1428.

   Deux valeurs, donc, et une seule bascule : celle de l'application, 1101 px.
   Ce n'est PAS un renoncement à la « taille de composants unique » — au
   contraire. Un composant garde la même taille dans tout le format où il vit ;
   c'est le rapport entre les deux formats qui est ici rétabli, celui-là même
   qu'Etienne avait mis dans ses cadres (4285 / 1100 = 3,895). L'unité ne suit
   pas la largeur de la fenêtre : sur un écran plus large il y a plus de place,
   pas des composants plus gros.

   TOUTE longueur du DS s'écrit `calc(N * var(--ds-unite))`, où N est le nombre
   lu tel quel sur la maquette. On ne convertit rien à la main, on ne
   pré-calcule rien : le nombre écrit dans le CSS doit être le nombre lisible
   dans Figma. */
:root {
  --ds-unite: calc(1px / 3);
}
@media (min-width: 1101px) {
  :root {
    --ds-unite: calc(1.335px / 3);
  }
}


/* ═══════════════════════════════════════════════════════════════════════════
   3. LES COULEURS — THÈME CLAIR
   ---------------------------------------------------------------------------
   Sur la maquette, la colonne de GAUCHE est le thème clair, celle de DROITE le
   thème sombre. Le vocabulaire est clos : 53 couleurs, plus 3 qui n'existent
   que dans les dégradés. Pas une de plus, nulle part.
   ═══════════════════════════════════════════════════════════════════════════ */
:root {

  /* ── Le texte ───────────────────────────────────────────────────────────── */
  --text-color1: #000000;   /* le texte principal                             */
  --text-color2: #6E5B5F;   /* le texte secondaire, et les icônes au repos    */
  --invit-color: #C0B5B8;   /* le texte d'invite d'un champ saisissable       */
  --text-color_basic: #C0B5B8;  /* ⚠ mêmes valeurs qu'--invit-color, cf. plus bas */

  /* Le libellé d'un bouton plein, posé sur un dégradé. Il BASCULE, et à
     l'envers de --text-color1 : blanc dans les deux variantes CLAIRES de la
     planche — le bordeaux et le bleu foncé — et #1A181B dans les deux
     SOMBRES, où le dégradé passe à l'orange et au bleu clair et où le blanc
     ne tenait plus. Arrivé sur la planche le 2026-09-03, avec le seul
     `btn_enregistrer` pour l'employer. */
  --txt-btn: #FFFFFF;

  /* ── Le noir et le blanc qui ne basculent PAS ───────────────────────────
     Ces deux-là sont déclarés ici et nulle part ailleurs : ils ne sont pas
     repris dans le bloc du thème sombre, et c'est tout leur intérêt. Il reste
     UN SEUL emploi de la paire : le libellé du `Btn_clickable` choisi, que la
     planche écrit blanc en clair et `black` — #000000, pas #1A181B — en
     sombre. La carte du carrousel les garde aussi, faute d'être dessinée en
     sombre nulle part.

     Le libellé de `btn_enregistrer` était l'exemple de ce paragraphe jusqu'au
     2026-09-03 ; il a désormais son jeton à lui, --txt-btn, qui bascule. La
     croix d'`icon_add`, la flèche d'`icon_gps`, le crayon d'`icon_modifier` et
     les trois lignes de la `PastilleDATE` d'évènement l'ont rejoint le même
     jour : la planche les écrit tous en #1A181B en sombre, et le CSS disait
     encore le contraire.

     Règle d'emploi (Etienne, 2026-09-01) : dès qu'un texte est franchement
     noir ou franchement blanc SANS dépendre du thème, il prend l'un de ces
     deux jetons. Le texte qui doit suivre le thème garde --text-color1. */
  --text-color_fullWhite: #FFFFFF;
  --text-color-fullBlack: #000000;

  /* ── Les deux couleurs de nature ────────────────────────────────────────── */
  /* --event-color : les dates, les concerts. --repet-color : les répétitions.
     Chacune existe à plat et en dégradé. Les dégradés sont verticaux, à deux
     arrêts, du haut vers le bas. */
  --event-color: #56011E;
  --event-color-degrade: linear-gradient(180deg, #56011E 0%, #2C1A12 100%);
  --repet-color: #1F5FA6;
  --repet-color-degrade: linear-gradient(180deg, #4D88FF 0%, #1F5FA6 100%);

  /* La paire de la RÉPÉTITION POSÉE À PLAT, arrivée sur la planche le
     2026-09-03 : un fond très pâle et un bleu franc dessus. C'est ce que porte
     maintenant la pastille de date d'une répétition, qui n'est plus un dégradé.
     Les deux jetons BASCULENT, et à l'envers l'un de l'autre — le bleu du texte
     en clair est celui du fond en sombre, à peu de chose près. Les noms sont
     ceux de la planche, sans « -color » : elle écrit --repet-txt et
     --repet-background. */
  --repet-txt: #6899FA;
  --repet-background: #E7EEF7;

  /* La couleur d'évènement ATTÉNUÉE. ⚠ PLUS AUCUN COMPOSANT NE L'EMPLOIE
     depuis le 2026-09-03 : son seul usage était le point éteint du carrousel,
     qui est passé au gris neutre ce jour-là. Le jeton reste écrit — la planche
     le déclare toujours, et rien ne se supprime avant le grand ménage. */
  --event-colorSoft: #A27786;

  /* ── Les surfaces ───────────────────────────────────────────────────────── */
  --panel-color: #FFFFFF;       /* un panneau, une carte, une fenêtre          */
  --border-color: #E6E1DF;      /* le trait qui sépare                         */
  --panelsoft-color: #F1ECE9;   /* creusé DANS un panneau : le fond d'un champ */
  --background-color: #F7F6F5;  /* le fond de l'écran, derrière les panneaux   */

  /* ── L'ascenseur ────────────────────────────────────────────────────────── */
  /* Arrivé sur la planche le 2026-09-03 avec le composant `ScrollBar`. Au
     repos, le curseur a EXACTEMENT les valeurs de --border-color dans les deux
     thèmes ; c'est un nom de plus pour la même couleur, et on recopie ce que la
     planche écrit. Survolé, il fonce d'un cran, et cette paire-là est neuve. */
  --scrollBar-normal: #E6E1DF;
  --scrollBar-hovered: #7C6C70;

  /* ── Les badges de statut ───────────────────────────────────────────────── */
  /* Sept statuts, trois rôles chacun : le texte, le fond, la bordure. */
  --badge-concert-txt: #4C3BAF;
  --badge-concert-bg: #EFEBFF;
  --badge-concert-border: #D9D1FB;

  --badge-repetition-txt: #2A5FA8;
  --badge-repetition-bg: #E8F1FE;
  --badge-repetition-border: #CFE0F9;

  --badge-attente-txt: #8A5A0B;
  --badge-attente-bg: #FCF2DF;
  --badge-attente-border: #F3E1BC;

  --badge-annule-txt: #A32C22;
  --badge-annule-bg: #FDEAE8;
  --badge-annule-border: #F7D2CE;

  --badge-signe-txt: #1F6B44;
  --badge-signe-bg: #E6F5EC;
  --badge-signe-border: #C9E7D6;

  --badge-option-txt: #5A6270;
  --badge-option-bg: #F2F3F5;
  --badge-option-border: #C0C5CD;

  --badge-indispo-txt: #9B2C63;
  --badge-indispo-bg: #FBEBF3;
  --badge-indispo-border: #F2D2E2;

  /* Le décompte — « J-24 » — n'a que DEUX rôles là où les sept autres en ont
     trois : il n'a pas de bordure, il se pose en aplat. Et les deux valeurs
     s'échangent d'un thème à l'autre au lieu de changer, ce qui se lit très
     bien sur la planche : le jaune est le fond en clair et l'encre en sombre.
     La pastille « Nom groupe » emprunte cette même paire. */
  --badge-decompte-bckgd: #FFD37A;
  --badge-decompte-txt: #4A1F08;
}


/* ═══════════════════════════════════════════════════════════════════════════
   4. LES COULEURS — THÈME SOMBRE
   ---------------------------------------------------------------------------
   Le sélecteur [data-theme="dark"] est celui que l'application utilise déjà
   (voir 1-socle.css) : on ne change pas la mécanique de bascule, seulement les
   valeurs. Rappel de la règle d'Etienne : aucun fond blanc en thème sombre.
   ═══════════════════════════════════════════════════════════════════════════ */
[data-theme="dark"] {

  --text-color1: #FFFFFF;
  --text-color2: #A59E9F;
  --invit-color: #595758;
  /* ⚠ --text-color_basic est arrivé sur la planche le 2026-09-01 avec
     EXACTEMENT les mêmes deux valeurs qu'--invit-color. Recopié tel quel,
     comme tout le reste : la planche fait foi, on ne corrige pas ce qu'on n'a
     pas dessiné. Il a trouvé son premier composant le 2026-09-03, le point
     éteint du carrousel — c'est un CHOIX entre deux noms interchangeables, et
     `icon_PinCaroussel` dit pourquoi. La question reste posée à Etienne : soit
     l'un des deux doit changer de valeur, soit l'autre est de trop. */
  --text-color_basic: #595758;

  /* ⚠ #1A181B n'est pas --panel-color (#1B181B) : un chiffre les sépare, et la
     planche les écrit tous les deux en toutes lettres sous leur pastille. On
     recopie ce qui est dessiné. */
  --txt-btn: #1A181B;

  --event-color: #FE6332;
  --event-color-degrade: linear-gradient(180deg, #FF973C 0%, #FE6332 100%);
  --repet-color: #679AFF;
  --repet-color-degrade: linear-gradient(180deg, #679AFF 0%, #4D88FF 100%);
  --repet-txt: #1F5FA6;
  --repet-background: #222A37;
  --event-colorSoft: #F6A890;

  --panel-color: #1B181B;
  --border-color: #2C262B;
  --panelsoft-color: #262127;
  --background-color: #100E10;

  --scrollBar-normal: #2C262B;
  --scrollBar-hovered: #8F8589;

  --badge-concert-txt: #BDB2FF;
  --badge-concert-bg: #2A2350;
  --badge-concert-border: #3E3573;

  --badge-repetition-txt: #9FC7F5;
  --badge-repetition-bg: #16304F;
  --badge-repetition-border: #26466B;

  --badge-attente-txt: #F0C46A;
  --badge-attente-bg: #3A2A0A;
  --badge-attente-border: #55401A;

  --badge-annule-txt: #F3A79E;
  --badge-annule-bg: #3D1815;
  --badge-annule-border: #5C2822;

  --badge-signe-txt: #86D6A6;
  --badge-signe-bg: #12321F;
  --badge-signe-border: #1F4A31;

  --badge-option-txt: #A7AFBC;
  --badge-option-bg: #23262B;
  --badge-option-border: #454B54;

  --badge-indispo-txt: #EFA3C8;
  --badge-indispo-bg: #38152A;
  --badge-indispo-border: #55203F;

  --badge-decompte-bckgd: #4A1F08;
  --badge-decompte-txt: #FFD37A;
}

/* ═══════════════════════════════════════════════════════════════════════════
   5. LA TYPOGRAPHIE
   ---------------------------------------------------------------------------
   Les styles nommés sur la planche, transcrits tels quels. Leur nom est celui
   du DS ; il est écrit en minuscules ici, y compris pour ceux que la maquette
   affiche en capitales — ces capitales viennent de Bebas Neue, qui n'a pas de
   minuscules, et non d'un choix de nommage.

       style_badge                 JetBrains Mono   ExtraBold   34 unités
       style_badge30               JetBrains Mono   ExtraBold   30 unités
       style_titre_btn64           Bebas Neue       Regular     64 unités
       style_titre_btn70           Bebas Neue       Regular     70 unités
       style_titre_menu1           Bebas Neue       Regular    100 unités
       style_titre_menu2           Bebas Neue       Regular    120 unités
       style_item_menuSB           League Spartan   SemiBold    50 unités
       style_item_menuB            League Spartan   Bold        50 unités
       style_item_text             League Spartan   Regular     50 unités
       style_item_text44bold       League Spartan   Bold        44 unités
       style_item_text44           League Spartan   Regular     44 unités
       style_soustitre_connection  League Spartan   Regular     50 unités
       style_titre_connection      League Spartan   Bold        60 unités
       style_item_titre_item_agenda  League Spartan  Bold  40 unités, 0,06 em

   `style_item_menu` a disparu le 2026-09-02 : la planche l'a coupé en deux,
   `…SB` en 600 et `…B` en 700. C'est le premier qui habille les intitulés de
   champ et les accroches.

   LE ROGNAGE À LA HAUTEUR DE CAPITALE   (2026-09-02, accord d'Etienne)
   ---------------------------------------------------------------------------
   Figma ne cote plus ses textes de haut de cadratin à bas de cadratin, mais de
   la HAUTEUR DE CAPITALE à la LIGNE DE BASE. Ses écarts ont cessé de se
   traduire : l'accroche de la connexion demandait des marges négatives.

   Chaque style porte donc son propre rognage, et la boîte CSS redevient la
   boîte Figma. Une cote lue sur une maquette s'écrit désormais telle quelle
   dans « 4-ecrans.css », sans arithmétique et sans demi-unités inventées.

   Trois nombres suffisent, et chaque style les déclare :

       --ds-taille     la taille du texte, en unités
       --ds-base       où tombe la ligne de base dans la boîte, interligne 1
       --ds-capitale   où commence le haut des capitales, même échelle

   Un quatrième est facultatif, `--ds-inter` : l'interligne, en cadratins, et
   il vaut 1 partout sauf là où une maquette serre ses lignes — le titre de la
   carte du carrousel, à 100 pour un texte de 120. Un interligne autre que 1
   déplace la ligne de base de la moitié de l'écart, et les deux marges du
   rognage en tiennent compte. Un écran le pose sur l'élément, le style n'a
   rien à savoir.

   `--ds-base` se déduit des métriques de la police, ascendante et descendante
   ramenées à 1 : League Spartan 0,74 ; Bebas Neue 0,80. `--ds-capitale` est la
   hauteur de capitale que FIGMA déclare, 0,66 et 0,697. Elle ne se mesure pas
   dans le navigateur, où l'encre du « H » monte un peu plus haut (0,672 et
   0,703) : ce sont les valeurs de Figma qu'on écrit, puisque c'est de ses
   boîtes que viennent les cotes.

   Ces deux nombres ne sont pas devinés, le DS les contraint : le libellé de
   `Champ_connection` est centré dans une boîte de 127 et sa ligne de base
   tombe à 80 du haut — d'où 0,66 pour League Spartan ; celui de
   `btn_enregistrer` est centré dans 132 et sa ligne de base tombe à 88,3 —
   d'où 0,697 pour Bebas Neue.

   `style_badge` et `style_badge30` ont reçu leur rognage le 2026-09-02, avec
   l'agenda — le premier écran qui pose des badges. La planche les contraint
   maintenant, et de quatre façons qui tombent toutes sur le MÊME nombre :

       badges_big          boîte 73, ligne de base à 48,82, texte 34
       badges_big décompte boîte 70, ligne de base à 47,32, texte 34
       badges_small        boîte 43, ligne de base à 32,40, texte 30
       badges_small décompte boîte 40, ligne de base à 30,90, texte 30

   Les quatre disent : retrait du haut 24 (ou 22,5 / 10,5 / 9) plus la hauteur
   de capitale. En posant 0,73 pour celle-ci, les quatre lignes de base
   retombent au centième près, et les quatre retraits deviennent des nombres
   ronds. C'est aussi la capitale que JetBrains Mono DÉCLARE, et le même
   contrôle qu'ailleurs : l'encre du « H » monte à 0,734 dans le navigateur,
   un peu plus haut que la valeur déclarée, comme pour les deux autres polices.

   `--ds-base` vaut 0,86 : mesuré sur la fonte du dépôt, comme 0,74 pour League
   Spartan et 0,80 pour Bebas Neue.

   `style_titre_btn` a disparu le 2026-09-02 : la planche en portait deux, à 64
   et à 70 unités, et un nom ne pouvait pas donner deux classes. Etienne les a
   distingués — ce sont `…btn64` et `…btn70`. Le 64 est celui qu'emploient les
   boutons des écrans déjà faits.

   ⚠ UN POINT À SIGNALER À ETIENNE : `style_item_text` et
   `style_soustitre_connection` sont RIGOUREUSEMENT identiques, League Spartan
   regular 50 tous les deux. Deux noms pour un seul style. Les deux sont
   écrits, chacun sous le nom que porte la planche — on recopie, on ne tranche
   pas à sa place.
   ═══════════════════════════════════════════════════════════════════════════ */

.style_badge {
  --ds-taille: 34;
  --ds-base: 0.86;
  --ds-capitale: 0.73;
  font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;
  font-weight: 800;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_badge30 {
  --ds-taille: 30;
  --ds-base: 0.86;
  --ds-capitale: 0.73;
  font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;
  font-weight: 800;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_titre_btn64 {
  --ds-taille: 64;
  --ds-base: 0.8;
  --ds-capitale: 0.697;
  font-family: 'Bebas Neue', system-ui, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_titre_btn70 {
  --ds-taille: 70;
  --ds-base: 0.8;
  --ds-capitale: 0.697;
  font-family: 'Bebas Neue', system-ui, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_titre_menu1 {
  --ds-taille: 100;
  --ds-base: 0.8;
  --ds-capitale: 0.697;
  font-family: 'Bebas Neue', system-ui, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_titre_menu2 {
  --ds-taille: 120;
  --ds-base: 0.8;
  --ds-capitale: 0.697;
  font-family: 'Bebas Neue', system-ui, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_item_menuSB {
  --ds-taille: 50;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 600;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_item_menuB {
  --ds-taille: 50;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 700;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_item_text {
  --ds-taille: 50;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_item_text44 {
  --ds-taille: 44;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_item_text44bold {
  --ds-taille: 44;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 700;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_soustitre_connection {
  --ds-taille: 50;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

/* La planche en donne DEUX sous ce nom, à 50 et à 30. Le second habille les
   deux lignes « Créé par… / Modifié par… » au pied d'une fiche. */
.style_soustitre_connection_2 {
  --ds-taille: 30;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 400;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

.style_titre_connection {
  --ds-taille: 60;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 700;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  line-height: var(--ds-inter, 1);
}

/* Le SEUL style de la planche qui porte un interlettrage. C'est la ligne de
   nature d'une date — « CONCERT • 20h30 », « REPETITION • 19h30 » — et elle
   prend la couleur de cette nature, --event-color ou --repet-color, qui se
   pose donc à l'emploi et non ici.

   0,06 em et non 2,4 unités : l'interlettrage suit la taille du texte, pas le
   plan de travail. Écrit en unités il serait juste au téléphone et faux au
   bureau.

   IL PASSE AUSSI EN CAPITALES (2026-09-03). La planche ne le déclare pas dans
   la liste des styles — l'échantillon y est écrit en minuscules — mais les
   QUATRE endroits qui l'emploient sont en capitales sur les cinq maquettes,
   sans exception : les deux lignes de la `PastilleDATE` (« JEU », « OCT »), la
   ligne de nature d'une ligne d'agenda et celle d'une fiche (« CONCERT »,
   « REPETITION »). L'application, elle, tenait ses mots en minuscules — le
   jour vient de `WEEKDAYS`, écrit en toutes lettres et coupé à trois, et le
   mois d'un `MONTHS_SHORT` que le code rabaissait exprès. Le `text-transform`
   est donc écrit ici, sur le style, plutôt que d'aller retoucher chaque
   donnée : la casse est une affaire de forme, la donnée reste lisible telle
   quelle pour un lecteur d'écran.

   ⚠ À SIGNALER : si un écran à venir emploie ce style pour un texte qui n'est
   PAS en capitales, c'est cette ligne qu'il faudra déplacer sur les composants
   — ou Etienne écrira ses libellés en capitales dans les données. */
.style_item_titre_item_agenda {
  text-transform: uppercase;
  --ds-taille: 40;
  --ds-base: 0.74;
  --ds-capitale: 0.66;
  font-family: 'League Spartan', system-ui, -apple-system, sans-serif;
  font-weight: 700;
  font-size: calc(var(--ds-taille) * var(--ds-unite));
  letter-spacing: 0.06em;
  line-height: var(--ds-inter, 1);
}

/* Le rognage lui-même. Deux boîtes vides, hautes de rien, l'une avant le texte
   et l'autre après : leurs marges négatives remontent le haut de la boîte sur
   la ligne des capitales et ramènent le bas sur la ligne de base.

   `display:table` et non `block` : en `block`, ces marges fusionneraient avec
   celles du bloc qui les porte, et la boîte se DÉPLACERAIT au lieu de se
   resserrer. Un texte de plusieurs lignes n'est pas gêné — seuls le haut de la
   première ligne et le bas de la dernière bougent, l'interligne reste entier.

   LES QUATORZE STYLES SONT DANS LA LISTE depuis le 2026-09-02 : les deux
   `style_titre_btn…` et les deux `style_badge…` y sont entrés avec l'agenda,
   où ils habillent des textes ordinaires et non des boutons.

   Un rognage change tout le calcul du placement, et le simplifie : une boîte
   rognée EST la boîte de Figma, donc la centrer dans un composant la met où la
   maquette la met, sans un nombre de plus. C'est ce que font maintenant
   `PastilleDATE`, `Item_Agenda` et les pastilles.

   La contrepartie tient en une phrase : CES DEUX PSEUDO-ÉLÉMENTS NE SUPPORTENT
   PAS D'ÊTRE DANS UNE BOÎTE FLEX, où ils deviendraient deux éléments posés à
   côté du texte. Un composant en flex met donc le style sur un ENFANT, jamais
   sur lui-même. La seule exception est `btn_enregistrer`, qui porte le style
   sur son propre bouton depuis l'écran de connexion : il éteint les deux
   pseudo-éléments et garde son centrage écrit à la main, juste en dessous. */
.style_titre_menu1::before,.style_titre_menu2::before,
.style_item_menuSB::before,.style_item_menuB::before,.style_item_text::before,
.style_item_text44::before,.style_item_text44bold::before,
.style_soustitre_connection::before,.style_soustitre_connection_2::before,.style_titre_connection::before,
.style_item_titre_item_agenda::before,
.style_titre_btn64::before,.style_titre_btn70::before,
.style_badge::before,.style_badge30::before {
  content: '';
  display: table;
  margin-bottom: calc((var(--ds-capitale) - var(--ds-base)
                       + (1 - var(--ds-inter, 1)) / 2) * var(--ds-taille) * var(--ds-unite));
}
.style_titre_menu1::after,.style_titre_menu2::after,
.style_item_menuSB::after,.style_item_menuB::after,.style_item_text::after,
.style_item_text44::after,.style_item_text44bold::after,
.style_soustitre_connection::after,.style_soustitre_connection_2::after,.style_titre_connection::after,
.style_item_titre_item_agenda::after,
.style_titre_btn64::after,.style_titre_btn70::after,
.style_badge::after,.style_badge30::after {
  content: '';
  display: table;
  margin-top: calc((var(--ds-base) - (var(--ds-inter, 1) + 1) / 2)
                   * var(--ds-taille) * var(--ds-unite));
}


/* ═══════════════════════════════════════════════════════════════════════════
   6. LES COMPOSANTS
   ---------------------------------------------------------------------------
   Un composant du DS, une classe qui porte SON nom — comme les styles
   ci-dessus. Le nom écrit dans Figma et le nom écrit ici sont le même mot :
   c'est ce qui permet de retrouver l'un depuis l'autre sans table de
   correspondance, et de voir d'un coup d'œil ce qui vient du DS et ce qui n'en
   vient pas.

   Chaque longueur est le nombre lu sur la maquette, multiplié par l'unité.
   Rien n'est arrondi, rien n'est « à peu près ».

   Ce que ces classes ne font PAS : se placer. Un composant décrit sa forme —
   sa hauteur, son rayon, ses couleurs. Où il tombe dans la page appartient à
   l'écran, et s'écrit avec l'écran (`4-ecrans.css`).
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── RoundedPanel ──────────────────────────────────────────────────────────
   Le panneau blanc posé sur le fond. Deux variantes dans la maquette, Clair et
   Sombre, qui ne diffèrent que par leurs deux couleurs : les jetons s'en
   chargent, une seule règle suffit ici.

   Le trait est passé de 2 à 3 unités le 2026-09-02, dans les DEUX variantes —
   la planche donnait alors 3 en Clair et 2 en Sombre, Etienne a corrigé.

   Le rayon est celui du BORD EXTÉRIEUR : Figma pose son trait à l'intérieur du
   cadre, donc son rectangle est rentré d'une demi-épaisseur et son rayon avec
   lui — 30,5 + 1,5 = 32.

   IL EST PASSÉ DE 40 À 32 LE 2026-09-03, avec l'alignement général des arrondis
   sur 32. Les deux agendas suivent (rx 30,5) ; les deux BLOC_Read… et les deux
   écrans de connexion dessinent encore 38,5, donc 40 — D_AGENDA_Clair porte même
   les deux à la fois, 32 pour le panneau du mois et 40 pour les cartes de la
   fiche qu'il montre à droite. Etienne a tranché : « la règle est pour tout le
   monde ». Une seule classe, un seul rayon, 32. */
.RoundedPanel {
  background: var(--panel-color);
  border: calc(3 * var(--ds-unite)) solid var(--border-color);
  border-radius: calc(32 * var(--ds-unite));
}


/* ── Champ_connection ──────────────────────────────────────────────────────
   Un champ de saisie et son intitulé. Trois parties, et les noms sont ceux du
   calque Figma : « title » l'intitulé au-dessus, « champs » la boîte, « label »
   ce qui est écrit dedans.

   C'est le seul composant du DS livré sans paire Clair/Sombre, et ce n'est pas
   un oubli : toutes ses couleurs sont des jetons qui basculent seuls. Le fond
   de la boîte a rejoint le vocabulaire le 2026-08-31 sous le nom
   « --panelsoft-color ».

   TOUTES LES LONGUEURS SONT CELLES DU BORD EXTÉRIEUR, et SON TRAIT EST CENTRÉ
   comme celui de `SearchBar` : Figma exporte deux rectangles aux MÊMES
   coordonnées, l'un plein l'autre tracé. Le rectangle de la planche est donc
   déjà le bord extérieur — 788 × 124 — et ses cotes s'écrivent telles quelles.
   Le retrait de 34 se lit depuis ce même bord, et le trait rentre en CSS :
   34 − 3 = 31.

   ⚠ RELECTURE DU 2026-09-03. Ce composant était lu à l'envers — trait posé à
   l'intérieur, donc 791 × 127 et un rayon de 21,5. La ligne de base tombait au
   bon endroit (753 sur M_Connection_clair), mais la boîte débordait d'une
   demi-épaisseur de chaque côté. Le rayon de la planche est passé de 20 à 32
   le même jour ; Etienne a demandé de suivre la planche sur les deux points.
   Les écarts de « 4-ecrans.css » qui touchaient un bord de cette boîte ont
   gagné 1,5 en conséquence, et le panneau garde exactement sa hauteur.

   La largeur n'est pas ici : le champ prend celle du panneau qui le porte. */
.Champ_connection > .title {
  display: block;
  color: var(--text-color2);
  /* 28 unités entre la ligne de base de l'intitulé et le haut de la boîte —
     26,5 du temps de l'ancienne lecture. Le nombre se lit tel quel sur la
     planche comme sur les deux écrans, depuis que les textes de Figma sont
     rognés à la hauteur de capitale — et les trois disent 28. */
  margin-bottom: calc(28 * var(--ds-unite));
}
.Champ_connection > .champs {
  display: flex;
  align-items: center;
  gap: calc(34 * var(--ds-unite));
  height: calc(124 * var(--ds-unite));
  padding: 0 calc(31 * var(--ds-unite));
  background: var(--panelsoft-color);
  border: calc(3 * var(--ds-unite)) solid var(--border-color);
  border-radius: calc(32 * var(--ds-unite));
}
/* La saisie elle-même : elle n'a ni fond ni trait, ils appartiennent à la
   boîte qui la contient. Sans « min-width:0 » un champ refuse de descendre
   sous sa largeur par défaut et fait déborder la boîte.

   LE RETRAIT DU HAUT N'EST PAS UN ÉCART, C'EST UN CENTRAGE. Figma centre la
   hauteur de CAPITALE du texte dans la boîte ; le navigateur, lui, centre la
   boîte du cadratin, qui descend plus bas que la ligne de base — le texte
   tomberait 4,5 unités trop bas. Le retrait rattrape le double de cet écart,
   la moitié revenant à chaque côté par le centrage.

   Un `<input>` ne peut pas porter de pseudo-élément : le rognage écrit plus
   haut ne l'atteint pas, d'où ce calcul écrit ici. Il ne dépend d'aucun
   nombre nouveau, seulement des trois que le style déclare déjà. */
.Champ_connection .label {
  flex: 1;
  min-width: 0;
  /* La hauteur est écrite, et ce n'est pas un caprice : livrée à lui-même,
     Chrome donne au champ une hauteur entière en pixels — 16 au lieu de
     16,67 — et le texte descend d'un tiers de pixel. Le nombre est celui que
     le navigateur aurait dû trouver seul : une ligne, plus le retrait. */
  height: calc((2 - 2 * var(--ds-base) + var(--ds-capitale)) * var(--ds-taille) * var(--ds-unite));
  padding: calc((1 - 2 * var(--ds-base) + var(--ds-capitale)) * var(--ds-taille) * var(--ds-unite)) 0 0;
  border: none;
  background: none;
  color: var(--text-color1);
  outline: none;
}
.Champ_connection .label::placeholder {
  color: var(--invit-color);
  opacity: 1;
}
/* Le champ actif. Le DS ne dessine pas cet état, mais il dit comment il marque
   l'élément actif partout ailleurs — « icon_eye_44x44 » et « Btn_clickable »
   ont chacun une variante « selected », et c'est --event-color dans les deux.
   Le trait ne change que de couleur : son épaisseur ne bouge pas, sinon la
   colonne entière sursauterait à chaque tabulation. */
.Champ_connection > .champs:focus-within {
  border-color: var(--event-color);
}
/* … et la saisie elle-même ne montre rien. C'est la BOÎTE qui dit « je suis
   ici », pas ce qu'elle contient.
   Sans cette règle, l'anneau de focus général de l'ancien socle
   (`1-socle.css`, « :focus-visible » sur tout élément atteignable au clavier)
   vient se poser dessus : un halo bordeaux et un rayon de 8 px, appliqués à
   une saisie qui ne fait que 12 px de haut — d'où une pastille collée au
   texte, à l'intérieur du champ (constat d'Etienne, 2026-09-01). Un
   `outline:none` n'y peut rien, cet anneau est une `box-shadow`.
   Ce n'est pas une exception à l'anneau général : le bouton du formulaire et
   celui de l'œil le gardent, eux, et restent donc repérables au clavier. */
.Champ_connection .label:focus-visible {
  box-shadow: none;
  border-radius: 0;
}
/* Le remplissage automatique du navigateur : aucune couleur parasite.
   Chrome repeint de force le fond d'un champ qu'il vient de remplir — un bleu
   pâle, #E8F0FE — et la couleur du texte avec. Ce n'est pas un `background`
   ordinaire : il est posé par une règle interne que ni `background` ni
   `!important` ne peuvent reprendre. La seule prise est une ombre INTERNE, qui
   se dessine par-dessus, et `-webkit-text-fill-color` pour le texte.
   L'étalement vaut la hauteur du champ, 124 : bien plus que les quelques
   pixels de la saisie, donc il la recouvre entièrement.
   Sans ça, le bleu de Chrome s'installe aussi en thème sombre — un fond clair
   au milieu du panneau, exactement ce qu'Etienne ne veut pas. */
.Champ_connection .label:-webkit-autofill,
.Champ_connection .label:-webkit-autofill:hover,
.Champ_connection .label:-webkit-autofill:focus,
.Champ_connection .label:-webkit-autofill:focus-visible {
  box-shadow: 0 0 0 calc(124 * var(--ds-unite)) var(--panelsoft-color) inset;
  -webkit-text-fill-color: var(--text-color1);
  caret-color: var(--text-color1);
}
/* Le même, sous son nom NORMALISÉ. « :autofill » est le sélecteur du standard,
   « :-webkit-autofill » le vieux nom que Chrome garde par compatibilité. Les
   deux désignent le même état, d'où deux règles identiques — et deux règles
   SÉPARÉES, pas une liste : un navigateur qui ne connaîtrait qu'un des deux
   noms jetterait la règle entière si les deux y figuraient ensemble. */
.Champ_connection .label:autofill,
.Champ_connection .label:autofill:hover,
.Champ_connection .label:autofill:focus,
.Champ_connection .label:autofill:focus-visible {
  box-shadow: 0 0 0 calc(124 * var(--ds-unite)) var(--panelsoft-color) inset;
  -webkit-text-fill-color: var(--text-color1);
  caret-color: var(--text-color1);
}


/* ── btn_enregistrer ───────────────────────────────────────────────────────
   Le bouton plein, en dégradé. Quatre variantes dans la maquette : Event et
   Repet, chacune en Clair et en Sombre. Les jetons de dégradé couvrent la
   bascule claire/sombre ; la nature — date ou répétition — se choisit à la
   pose, d'où le dégradé de l'évènement par défaut et la classe « is-repet »
   pour l'autre.

   La LARGEUR n'est pas ici : la maquette du DS le dessine à 397 unités et
   l'écran de connexion à 515. C'est la hauteur qui est le composant, et elle
   est passée de 117 à 132 le 2026-09-02, dans les quatre variantes. L'arrondi
   a suivi le 2026-09-03, de 20 à 32 unités, dans les quatre également.

   Le libellé prend --txt-btn : blanc dans les deux variantes claires de la
   planche, #1A181B dans les deux sombres. Il suit donc le thème, mais à
   l'envers de --text-color1 — le dégradé s'éclaircit quand le thème s'assombrit
   (bordeaux → orange, bleu foncé → bleu clair), et c'est le fond qui commande.
   Jusqu'au 2026-09-03 il était blanc partout, en --text-color_fullWhite ; c'est
   ce jour-là qu'Etienne a ajouté la paire.

   LE RETRAIT DU HAUT N'EST PAS UN ÉCART, C'EST UN CENTRAGE — même calcul que
   la saisie de `Champ_connection`, et pour la même raison : Figma centre la
   hauteur de capitale, le navigateur centre le cadratin, le libellé tomberait
   3,1 unités trop haut. Contrôle de bout en bout : la ligne de base doit
   tomber à 88,3 du haut du bouton, la cote que donnent les quatre variantes
   de la planche ET les deux écrans de connexion. */
.btn_enregistrer {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: calc(132 * var(--ds-unite));
  padding: calc((1 - 2 * var(--ds-base) + var(--ds-capitale)) * var(--ds-taille) * var(--ds-unite)) 0 0;
  border: none;
  border-radius: calc(32 * var(--ds-unite));
  background: var(--event-color-degrade);
  color: var(--txt-btn);
  cursor: pointer;
}
.btn_enregistrer.is-repet {
  background: var(--repet-color-degrade);
}
/* Le rognage s'arrête ici. Le style est posé sur le BOUTON, qui est une boîte
   flex : ses deux pseudo-éléments y deviendraient deux éléments flex encadrant
   le libellé, et le centrage écrit au-dessus ne vaudrait plus rien. Le libellé
   du bouton n'est pas dans un élément à lui, on ne peut donc pas déplacer le
   style dessus — d'où cette extinction, seule du fichier. */
.btn_enregistrer::before,
.btn_enregistrer::after {
  content: none;
}


/* ── icon_eye_44x44 ────────────────────────────────────────────────────────
   L'œil qui montre le mot de passe. Quatre variantes au DS : « defaut » et
   « selected », en clair et en sombre — et le DESSIN est le même dans les
   quatre, seule la couleur du trait change. C'est donc « selected » qui dit
   « le mot de passe est visible » : il n'existe pas d'œil barré dans le DS.

   Le trait est en « currentColor » dans le gabarit, la couleur se règle donc
   ici pour les deux états à la fois.

   La classe va sur le `<svg>` lui-même et non sur ce qui l'entoure : le
   composant du DS est l'icône, pas le bouton qui la rend cliquable. Une icône
   sans classe ni style tirerait d'ailleurs sa taille de ses attributs, que le
   CSS ne peut pas reprendre — `dev/verif/probe_echelle_bureau.js` l'interdit. */
.icon_eye_44x44 {
  display: block;
  flex: none;
  width: calc(44 * var(--ds-unite));
  height: calc(44 * var(--ds-unite));
  color: var(--text-color1);
}
.icon_eye_44x44.is-selected {
  color: var(--event-color);
}


/* ── Composant_Titre_Menu ──────────────────────────────────────────────────
   Le titre d'un écran. Quatre variantes au DS — Event et Repet, en clair et en
   sombre — qui posent une tuile d'icône 30 unités avant le libellé. L'agenda
   n'en pose pas : son titre est le libellé seul. Les deux tuiles viendront
   avec le premier écran qui en montre une.

   `align-items:center` aligne ici des boîtes de CAPITALE et non des cadratins,
   parce que le rognage des styles a ramené la boîte du texte sur sa capitale.
   C'est bien ce que dit la planche : la capitale du libellé et la tuile ont le
   même centre, à 85,5 du haut. */
.Composant_Titre_Menu {
  display: flex;
  align-items: center;
  gap: calc(30 * var(--ds-unite));
  color: var(--text-color1);
}


/* ── icon_add ──────────────────────────────────────────────────────────────
   Le bouton « ajouter ». Deux variantes au DS, clair et sombre, qui diffèrent
   par le dégradé — le jeton s'en charge — ET PAR LA COULEUR DE LA CROIX :
   blanche en clair, #1A181B en sombre. C'est --txt-btn, exactement comme le
   libellé de `btn_enregistrer` et le crayon d'`icon_modifier` : le dégradé
   s'éclaircit quand le thème s'assombrit, et c'est le fond qui commande.

   ⚠ Cette ligne a dit le contraire jusqu'au 2026-09-03 — « la croix reste
   blanche dans les deux » — et la croix disparaissait sur l'orange en thème
   sombre. Le commentaire venait d'un ancien export et n'avait pas été relu sur
   la planche, qui dessine #1A181B depuis au moins le 3 septembre au matin.
   Constat d'Etienne. La leçon vaut pour tout le fichier : une couleur se
   vérifie sur la planche, jamais sur la phrase qui la commente.

   La classe va sur le `<svg>` lui-même : la tuile arrondie est le FOND de
   l'icône, pas un élément de plus autour. Et elle ne peut pas être dessinée
   DANS le SVG — un dégradé écrit en ligne dans `index.html` perdrait ses
   attributs à majuscule interne en passant par le moteur de gabarit
   (`docs/ARCHITECTURE.md`, point 2).

   L'ombre portée est celle de la planche — dy 4, flou 2, noir à 25 % — et elle
   ne touche que la croix. Posée sur le `<svg>`, elle porterait aussi sous la
   tuile, que la planche laisse sans ombre. En CSS le flou vaut le double de
   l'écart-type de Figma : 4. */
.icon_add {
  display: block;
  flex: none;
  width: calc(132 * var(--ds-unite));
  height: calc(132 * var(--ds-unite));
  /* L'arrondi est passé de 24 à 36 puis à 32 dans la même journée, le
     2026-09-03 : la planche a fini par aligner presque tous ses arrondis sur
     32, et les deux agendas le confirment. `icon_modifier`, qui a la même
     tuile de 132, l'a suivi cette fois. */
  border-radius: calc(32 * var(--ds-unite));
  background: var(--event-color-degrade);
  color: var(--txt-btn);
}
.icon_add > g {
  filter: drop-shadow(0 calc(4 * var(--ds-unite)) calc(4 * var(--ds-unite)) rgb(0 0 0 / 0.25));
}


/* ── icon_search ───────────────────────────────────────────────────────────
   La loupe : un cercle de rayon 16 tracé à 4, et sa queue. La boîte de la
   planche fait 42 × 42 et le trait déborde de 2 tout autour — d'où
   `overflow:visible`, qu'un `<svg>` n'a pas par défaut et sans quoi le cercle
   serait rogné d'un demi-trait. */
.icon_search {
  display: block;
  flex: none;
  overflow: visible;
  width: calc(42 * var(--ds-unite));
  height: calc(42 * var(--ds-unite));
  color: var(--text-color2);
}


/* ── SearchBar ─────────────────────────────────────────────────────────────
   Le champ de recherche. Une seule variante au DS : ses quatre couleurs sont
   des jetons qui basculent seuls.

   La LARGEUR n'est pas ici — 800 sur la planche, 1020 au téléphone, 800 au
   bureau : elle appartient à l'écran. La hauteur, elle, est le composant.

   SON TRAIT N'EST PAS POSÉ COMME CELUI DE `RoundedPanel`. Figma exporte ici
   DEUX rectangles aux mêmes coordonnées, l'un plein l'autre tracé : le trait
   est centré sur le bord, pas rentré à l'intérieur. Le rectangle de la planche
   est donc déjà le bord extérieur, et ses 132 de haut s'écrivent tels quels.
   Le retrait de 22 se lit depuis ce même bord, et le trait rentre en CSS :
   22 − 3 = 19. */
.SearchBar {
  display: flex;
  align-items: center;
  gap: calc(20 * var(--ds-unite));
  height: calc(132 * var(--ds-unite));
  padding: 0 calc(19 * var(--ds-unite));
  background: var(--background-color);
  border: calc(3 * var(--ds-unite)) solid var(--border-color);
  /* 20 jusqu'au 2026-09-03, 32 depuis — la planche et les deux agendas. */
  border-radius: calc(32 * var(--ds-unite));
}
/* La saisie : ni fond ni trait, ils appartiennent à la boîte. Le retrait du
   haut et la hauteur écrite sont le centrage de `Champ_connection`, pour la
   même raison — un `<input>` ne porte pas de pseudo-élément, donc pas de
   rognage, et Chrome arrondit sa hauteur au pixel entier. La planche contrôle
   le résultat : la ligne de base doit tomber à 82,5 du haut de la boîte. */
.SearchBar input {
  flex: 1;
  min-width: 0;
  height: calc((2 - 2 * var(--ds-base) + var(--ds-capitale)) * var(--ds-taille) * var(--ds-unite));
  padding: calc((1 - 2 * var(--ds-base) + var(--ds-capitale)) * var(--ds-taille) * var(--ds-unite)) 0 0;
  border: none;
  background: none;
  color: var(--text-color1);
  outline: none;
}
.SearchBar input::placeholder {
  color: var(--invit-color);
  opacity: 1;
}
/* Même partage que `Champ_connection` : c'est la BOÎTE qui dit « je suis ici »,
   pas ce qu'elle contient — et l'anneau général de l'ancien socle, qui est une
   `box-shadow`, ne doit pas venir se poser dans le champ. */
.SearchBar input:focus-visible {
  box-shadow: none;
}
.SearchBar:focus-within {
  border-color: var(--event-color);
}


/* ── RoundedPanel, la variante en dégradé ──────────────────────────────────
   La planche donne quatre variantes à `RoundedPanel` : Clair et Sombre,
   pleines, et deux autres qu'elle nomme « Variante4 » et « Variante5 ». Ces
   deux-là ne sont pas une troisième et une quatrième forme, mais les deux
   moitiés d'une seule : le panneau rempli du dégradé d'évènement, en clair et
   en sombre. --event-color-degrade porte déjà la paire, une règle suffit.

   Elle n'a PAS de trait, et son rectangle mesure 200 pour un rayon de 32 — la
   même boîte extérieure que la variante pleine, sans la demi-épaisseur en
   moins. Le trait reste écrit, en transparent : sans lui la boîte rétrécirait
   de 6 unités là où la planche la veut identique.

   `is-repet` peint le MÊME panneau du dégradé de répétition. La planche ne
   dessine pas cette cinquième variante — ses deux panneaux en dégradé sont
   ceux de l'évènement — mais les deux BLOC_Read… la montrent à l'œuvre : le
   bandeau du titre d'une fiche est bleu quand c'est une répétition. Ajoutée le
   2026-09-03 avec l'accord d'Etienne, et elle n'invente aucune couleur —
   --repet-color-degrade est un jeton de la planche depuis le premier jour. */
.RoundedPanel.is-degrade {
  background: var(--event-color-degrade);
  border-color: transparent;
}
.RoundedPanel.is-degrade.is-repet {
  background: var(--repet-color-degrade);
}


/* ── badges_big et badges_small ────────────────────────────────────────────
   Les pastilles de statut. Huit variantes chacune, et le vocabulaire des
   jetons les couvre toutes : trois rôles par statut — texte, fond, trait — et
   deux pour le décompte, qui se pose en aplat sans trait.

   Le nom du modificateur est celui du JETON et non celui de la variante
   Figma : la planche écrit « confirmé » sur la variante claire et « signé »
   sur la sombre, pour un seul et même jeu de couleurs, `--badge-signe-…`. Un
   seul mot valait mieux que deux, et c'est celui qui est déjà dans le CSS.

   LA LARGEUR N'EST PAS ÉCRITE : elle vient du libellé. Ce sont les retraits
   qui sont le composant, et la planche les donne exactement — JetBrains Mono
   est à chasse fixe, chaque variante retombe donc sur le même nombre :

       badges_big     retrait 26,7   les six largeurs de la planche s'en
                                     déduisent, au dixième près
       badges_small   retrait 15,5   les six tombent juste, sans arrondi

   Comme pour `SearchBar`, le trait de Figma est centré sur le rectangle et non
   rentré : le rectangle est le bord extérieur, et le retrait CSS lui retire
   l'épaisseur du trait — 26,7 − 3 et 15,5 − 3. Le décompte, lui, n'a pas de
   trait à retirer.

   LE RETRAIT DU HAUT EST CELUI DE FIGMA, à l'épaisseur du trait près : 24 et
   10,5 depuis le rectangle, donc 21 et 7,5 depuis le bord intérieur. Il n'y a
   pas de formule de centrage ici, parce qu'il n'y a pas de centrage : le texte
   est rogné, sa boîte EST la boîte de Figma, et le retrait la pose. La boîte
   n'est donc pas en flex, sans quoi le rognage ne marcherait pas. */
.badges_big,
.badges_small {
  display: inline-block;
  flex: none;
  border: calc(3 * var(--ds-unite)) solid;
  white-space: nowrap;
  color: var(--badge-option-txt);
  background: var(--badge-option-bg);
  border-color: var(--badge-option-border);
}
.badges_big {
  height: calc(73 * var(--ds-unite));
  padding: calc(21 * var(--ds-unite)) calc(23.7 * var(--ds-unite)) 0;
  border-radius: calc(17.5 * var(--ds-unite));
}
.badges_small {
  height: calc(43 * var(--ds-unite));
  padding: calc(7.5 * var(--ds-unite)) calc(12.5 * var(--ds-unite)) 0;
  border-radius: calc(11.5 * var(--ds-unite));
}
/* « option » est le seul statut que la planche trace en TIRETS, dans les deux
   thèmes : 12 unités de trait, 12 de vide. */
.badges_big.is-option,
.badges_small.is-option {
  border-style: dashed;
}
.badges_big.is-signe,      .badges_small.is-signe      { color: var(--badge-signe-txt);      background: var(--badge-signe-bg);      border-color: var(--badge-signe-border); }
.badges_big.is-attente,    .badges_small.is-attente    { color: var(--badge-attente-txt);    background: var(--badge-attente-bg);    border-color: var(--badge-attente-border); }
.badges_big.is-annule,     .badges_small.is-annule     { color: var(--badge-annule-txt);     background: var(--badge-annule-bg);     border-color: var(--badge-annule-border); }
.badges_big.is-indispo,    .badges_small.is-indispo    { color: var(--badge-indispo-txt);    background: var(--badge-indispo-bg);    border-color: var(--badge-indispo-border); }
.badges_big.is-concert,    .badges_small.is-concert    { color: var(--badge-concert-txt);    background: var(--badge-concert-bg);    border-color: var(--badge-concert-border); }
.badges_big.is-repetition, .badges_small.is-repetition { color: var(--badge-repetition-txt); background: var(--badge-repetition-bg); border-color: var(--badge-repetition-border); }
/* Le décompte : deux rôles au lieu de trois, pas de trait, une boîte plus
   basse et un rayon plus court — et des retraits à lui, 40,2 et 14, que les
   deux largeurs de la planche donnent exactement. */
.badges_big.is-decompte {
  height: calc(70 * var(--ds-unite));
  padding: calc(22.5 * var(--ds-unite)) calc(40.2 * var(--ds-unite)) 0;
  border: none;
  border-radius: calc(16 * var(--ds-unite));
  color: var(--badge-decompte-txt);
  background: var(--badge-decompte-bckgd);
}
.badges_small.is-decompte {
  height: calc(40 * var(--ds-unite));
  padding: calc(9 * var(--ds-unite)) calc(14 * var(--ds-unite)) 0;
  border: none;
  border-radius: calc(10 * var(--ds-unite));
  color: var(--badge-decompte-txt);
  background: var(--badge-decompte-bckgd);
}


/* ── Nom_groupe ────────────────────────────────────────────────────────────
   La pastille jaune qui porte le nom du groupe. Arrivée sur la planche le
   2026-09-02, à la demande de cet écran. Une seule variante : ses deux
   couleurs sont celles du décompte, `--badge-decompte-…`, qui s'échangent d'un
   thème à l'autre.

   Ce n'est PAS un `badges_big` : 65 de haut au lieu de 73, et League Spartan
   600 à 50 au lieu de JetBrains Mono 800 à 34. Elle n'a pas de trait, ses
   retraits se lisent donc tels quels — 32 sur les côtés, 16 en haut, ce
   dernier étant la ligne de base de Figma moins la hauteur de capitale.
   La largeur vient du nom.

   Le nom de la classe est celui de Figma, l'espace en moins — un espace ne
   peut pas entrer dans un nom de classe. */
.Nom_groupe {
  display: inline-block;
  flex: none;
  height: calc(65 * var(--ds-unite));
  padding: calc(16 * var(--ds-unite)) calc(32 * var(--ds-unite)) 0;
  border-radius: calc(16 * var(--ds-unite));
  color: var(--badge-decompte-txt);
  background: var(--badge-decompte-bckgd);
}


/* ── ScrollBar ─────────────────────────────────────────────────────────────
   L'ascenseur d'une colonne qui défile toute seule. Arrivé sur la planche le
   2026-09-03, deux variantes : au repos et survolé, et deux jetons pour elles.

   ⚠ IL NE SE VOIT PAS. Etienne a demandé le 2026-09-03, quelques heures après
   l'avoir dessiné, de CACHER les ascenseurs dans toute l'application — « elles
   sont gênantes, pas indispensables » — mais de ne rien supprimer : il se garde
   la possibilité de les réafficher. Ce composant est donc écrit en entier et
   éteint ailleurs, par deux lignes de `1-socle.css` qui les masquent partout.
   Le retirer de l'écran ne se fait qu'à cet endroit-là, et le rallumer aussi.
   Tout ce qui suit reste donc exact et à jour : c'est ce qui s'affichera le
   jour où il changera d'avis.

   LE COMPOSANT EST LE CURSEUR, pas la gouttière : la planche dessine un seul
   rectangle de 12 × 24, entièrement arrondi (rayon 6, la moitié de sa
   largeur), et rien derrière lui. La gouttière reste donc transparente.

   Une classe, mais pas comme les autres : un ascenseur ne se pose pas dans le
   gabarit, il appartient à la boîte qui déborde. `.ScrollBar` se met donc SUR
   cette boîte, et ce sont ses pseudo-éléments qui portent la forme.

   ⚠ NE PAS ÉCRIRE `scrollbar-width` NI `scrollbar-color` ICI. Ces deux
   propriétés-là sont les seules que Firefox comprenne, mais dès que Chrome en
   voit une il abandonne les `::-webkit-scrollbar` de l'élément — et avec elles
   partent le rayon, la largeur exacte et la couleur de survol, qu'aucune des
   deux ne sait dire. La planche demande les trois : c'est donc la voie webkit,
   seule. Sous Firefox, l'ascenseur reste celui du système.

   D_AGENDA_Clair place le curseur à 20 du cadre de contenu qui est à sa
   gauche. Ces 20-là ne sont pas ici : c'est un retrait de la boîte qui défile,
   il s'écrit avec l'écran. */
.ScrollBar::-webkit-scrollbar {
  width: calc(12 * var(--ds-unite));
  height: calc(12 * var(--ds-unite));
}
.ScrollBar::-webkit-scrollbar-track {
  background: none;
}
.ScrollBar::-webkit-scrollbar-thumb {
  background: var(--scrollBar-normal);
  border-radius: calc(6 * var(--ds-unite));
  /* L'ancien socle rentre le curseur d'un trait transparent de 3 px pour
     l'amincir (`1-socle.css`). La planche donne ici la largeur du CURSEUR
     lui-même : le curseur remplit la gouttière, et le trait doit sauter. */
  border: none;
}
.ScrollBar::-webkit-scrollbar-thumb:hover {
  background: var(--scrollBar-hovered);
}


/* ── BorderSeparate_horiz ──────────────────────────────────────────────────
   Le trait qui sépare deux lignes dans un panneau. Trois unités, la couleur
   des traits. Sa largeur appartient à l'écran : la planche le dessine à 200,
   l'agenda l'étire sur toute la largeur du panneau. */
.BorderSeparate_horiz {
  height: calc(3 * var(--ds-unite));
  background: var(--border-color);
}


/* ── icon_PinCaroussel ─────────────────────────────────────────────────────
   Le point du carrousel. Quatre variantes : actif et éteint, en clair et en
   sombre — et deux jetons couvrent la bascule, --event-color pour l'actif,
   --text-color_basic pour l'autre. Le point actif est plus GROS : 32 de
   diamètre contre 20.

   LE POINT ÉTEINT A CHANGÉ DE COULEUR le 2026-09-03 : il quitte le bordeaux
   atténué (--event-colorSoft) pour le gris neutre, #C0B5B8 en clair et #595758
   en sombre. La planche et M_AGENDA_clair le disent tous les deux.

   ⚠ CE GRIS PORTE DEUX NOMS sur la planche, --invit-color et
   --text-color_basic, avec exactement les mêmes deux valeurs. C'est le second
   qui est écrit ici : le premier est nommé pour « le texte d'invite d'un champ
   saisissable », et un point de carrousel n'est pas du texte. Le résultat est
   le même à l'octet près, mais si l'un des deux doit changer un jour, c'est ce
   choix-là qu'il faudra revoir. Il répond du même coup à la question posée le
   2026-09-01 : --text-color_basic a maintenant un composant.

   Ce n'est pas une icône du dépôt mais un rond dessiné en CSS, ce qui évite au
   passage le piège des SVG écrits dans le gabarit. Et la cible tactile n'est
   pas ici : le point est ce qu'on voit, ce qu'on touche est le bouton autour,
   que l'écran dimensionne. */
.icon_PinCaroussel {
  display: block;
  flex: none;
  width: calc(20 * var(--ds-unite));
  height: calc(20 * var(--ds-unite));
  border-radius: 50%;
  background: var(--text-color_basic);
}
.icon_PinCaroussel.is-selected {
  width: calc(32 * var(--ds-unite));
  height: calc(32 * var(--ds-unite));
  background: var(--event-color);
}


/* ── Image_ouvert et Image_ferme ───────────────────────────────────────────
   Les deux logos du groupe, que l'utilisateur dépose dans ses réglages. La
   planche les laisse en vert vif : c'est un emplacement, pas une couleur.
   `Image_ouvert` est le logo large, 450 × 200, celui du haut du menu ;
   `Image_ferme` est le carré de 120 que porte chaque ligne d'agenda.

   Le nom est celui de Figma, l'accent en moins — les noms du DS s'écrivent en
   ASCII de ce côté-ci.

   ⚠ `Image_ouvert` EST PASSÉ DE 450 × 200 À 562 × 250 le 2026-09-04. Il ne se
   range plus dans le retrait du menu : il en fait toute la largeur, trait
   compris, et déborde même d'une demi-unité de chaque côté. La planche le
   dessine ainsi dans sa variante « ouvert Clair », et « D_AGENDA_Clair_v2 »
   avec elle. C'est l'écran qui le fait ressortir du retrait (`.fof-menu4-logo`,
   6-adaptatif.css) : ici, seulement sa taille. */
.Image_ouvert {
  display: block;
  flex: none;
  width: calc(562 * var(--ds-unite));
  height: calc(250 * var(--ds-unite));
  object-fit: contain;
}
.Image_ferme {
  display: block;
  flex: none;
  width: calc(120 * var(--ds-unite));
  height: calc(120 * var(--ds-unite));
  object-fit: contain;
}


/* ── Item_Agenda ───────────────────────────────────────────────────────────
   Une ligne de l'agenda : la pastille de date, ce qui est écrit, et le logo du
   groupe au bout. Deux variantes au DS, Event et Repetition, qui ne diffèrent
   que par la couleur de la ligne de nature et par le dégradé de la pastille —
   le badge de statut, lui, ne se pose que sur une date de scène.

   LA LIGNE FAIT 240 DE HAUT depuis le 2026-09-03, et elle porte désormais ses
   propres retraits : 30 au-dessus et au-dessous de la pastille de 180, 34 avant
   elle, 60 après le logo. Jusque-là elle faisait 180 tout ronds et c'était le
   panneau qui écartait — 17 de retrait et des traits à 20. Le panneau n'écarte
   plus rien : les lignes le remplissent d'un bord à l'autre, et les traits de 3
   se glissent entre elles sans marge. Le compte tombe juste sur les deux
   agendas : 6 × 240 + 5 × 3 = 1455, la hauteur exacte du panneau de bureau.

   Le logo est centré sur la hauteur et poussé au bout ; la colonne du milieu
   prend ce qui reste, et l'écart entre elle et la pastille vaut 20.

   ⚠ 60 APRÈS LE LOGO, MAIS 57 SUR UNE RÉPÉTITION — les deux agendas et les deux
   variantes de la planche disent la même chose, et depuis toujours : c'est
   l'ancien écart 20 / 17, qui a suivi la ligne quand elle a grandi. Un seul
   nombre est écrit, 60, celui de la variante Event. À trancher avec Etienne.

   LA LIGNE CHOISIE EST CERNÉE (planche « Info - règles », 2026-09-03) : un
   trait de 6 de la couleur d'évènement, au rayon de la ligne. C'est un
   `outline` et non une bordure, pour la raison même que la planche donne — il
   ne prend AUCUNE place et ne peut donc rien décaler. Son décalage de −3 le
   pose à cheval sur le bord, comme Figma qui centre ses traits.

   Ce cadre ne vaut QUE SUR ORDINATEUR ; c'est déjà vrai du drapeau lui-même,
   que `15-affichage.js` ne pose que si `agWide` (« Le cadre de sélection ne
   vaut que sur ORDINATEUR »), et il n'y a donc rien à écrire ici pour cela.

   Les écarts de cette colonne se lisent d'une boîte de CAPITALE à la suivante,
   ce que le rognage des styles rend possible : la ligne de nature et son
   badge, puis 18,7, le titre, puis 20,2, le lieu.

   Le badge suit la ligne de nature à 60. Figma pose son bord gauche à 424,5 du
   début de la ligne sans exporter sa mesure du texte ; celle du navigateur
   laisse 56,3, l'interlettrage de fin compris. 60 est le pas de la maquette et
   l'écart tient dans le pixel — à confirmer par Etienne.

   Les deux noms de sous-partie, `contenu` et `Frame_19`, sont ceux des calques
   de Figma. Le second ne veut rien dire, et c'est justement pour ça qu'il est
   recopié : c'est le nom sous lequel on le retrouvera dans la maquette. */
.Item_Agenda {
  display: flex;
  align-items: center;
  gap: calc(20 * var(--ds-unite));
  height: calc(240 * var(--ds-unite));
  padding: 0 calc(60 * var(--ds-unite)) 0 calc(34 * var(--ds-unite));
  border-radius: calc(32 * var(--ds-unite));
}
.Item_Agenda.is-selected {
  outline: calc(6 * var(--ds-unite)) solid var(--event-color);
  outline-offset: calc(-3 * var(--ds-unite));
}
/* Et les deux traits qui touchent la ligne choisie s'effacent SANS PARTIR :
   `visibility` et non `display`, sinon la liste sauterait de 3 unités à chaque
   changement de ligne. C'est la règle écrite sur la planche « Info - règles ».
   Elle est ici, entre deux composants du DS, et non dans l'écran : elle vaudra
   telle quelle pour toutes les listes à venir qui gardent les deux colonnes. */
.BorderSeparate_horiz:has(+ .Item_Agenda.is-selected),
.Item_Agenda.is-selected + .BorderSeparate_horiz {
  visibility: hidden;
}
.Item_Agenda > .contenu {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 0;
}
.Item_Agenda > .contenu > .Frame_19 {
  display: flex;
  align-items: center;
  gap: calc(60 * var(--ds-unite));
  margin-bottom: calc(18.7 * var(--ds-unite));
}
.Item_Agenda > .contenu > :last-child {
  margin-top: calc(20.2 * var(--ds-unite));
}
/* La nature de la ligne : elle colore le libellé du type, et LUI SEUL. Le titre
   et le lieu restent en --text-color1 dans les deux variantes.

   Le sélecteur nomme le style, il ne se contente pas du modificateur : `is-repet`
   sert AUSSI à la pastille de date, où il choisit le dégradé bleu. Écrit
   largement, il repeindrait en bleu les trois lignes blanches de la pastille. */
.Item_Agenda .style_item_titre_item_agenda.is-event {
  color: var(--event-color);
}
.Item_Agenda .style_item_titre_item_agenda.is-repet {
  color: var(--repet-color);
}


/* ── Le texte posé sur un dégradé d'action ─────────────────────────────────
   Ce qu'on écrit SUR le dégradé d'évènement ou de répétition est blanc en
   clair et sombre en sombre — le dégradé s'éclaircit quand le thème
   s'assombrit, et c'est le fond qui commande. Mais LE NOIR N'EST PAS LE MÊME
   PARTOUT, et la planche est formelle :

       Btn_clickable choisi        `black`, donc #000000
       PastilleDATE d'évènement    #1A181B
       icon_add, icon_gps          #1A181B
       icon_modifier               #1A181B
       btn_enregistrer             #1A181B

   Tout ce qui vaut #1A181B prend --txt-btn, le jeton qui bascule. Le seul à
   garder la paire --text-color_fullWhite / --text-color-fullBlack est donc le
   libellé du `Btn_clickable` choisi, avec la carte du carrousel — celle-ci
   parce que la planche ne l'écrit nulle part en sombre, et que c'est la règle
   donnée par Etienne le 2026-09-02 qui l'y range.

   ⚠ TROIS COMPOSANTS ÉTAIENT FAUX jusqu'au 2026-09-03 : `icon_add` et
   `icon_gps` en --text-color_fullWhite, et la `PastilleDATE` dans la paire
   ci-dessous. Leur trait disparaissait ou fonçait trop en thème sombre.
   L'erreur n'était pas dans la planche mais dans la lecture : un commentaire
   de ce fichier affirmait que la croix « reste blanche dans les deux », et il
   a été cru sur parole au lieu d'être vérifié sur la pastille de couleur.
   Contrôle qui l'aurait évitée, et qui a servi à trouver les trois : lister
   les couleurs RÉELLEMENT dessinées dans chaque variante sombre de l'export,
   et les mettre face aux jetons du CSS.

   ET UNE PASTILLE DE RÉPÉTITION N'EST PLUS SUR UN DÉGRADÉ depuis le
   2026-09-03 : elle a quitté le dégradé pour un aplat, et son texte a son
   propre jeton. Elle reprend donc la couleur plus bas, après cette règle. */
.Btn_clickable.is-selected,
.RoundedPanel.is-degrade {
  color: var(--text-color_fullWhite);
}
[data-theme="dark"] .Btn_clickable.is-selected,
[data-theme="dark"] .RoundedPanel.is-degrade {
  color: var(--text-color-fullBlack);
}


/* ── Btn_clickable ─────────────────────────────────────────────────────────
   Le bouton d'un groupe à choix unique — « À venir / Passés / Répétitions » en
   haut de l'agenda. Quatre variantes : choisi et au repos, en clair et en
   sombre. Au repos c'est un panneau cerné ; choisi, c'est le dégradé
   d'évènement, sans trait.

   La LARGEUR n'est pas ici : la planche le dessine à 300, et l'agenda répartit
   ses trois boutons sur la largeur du contenu. La hauteur, elle, est le
   composant.

   Le trait de Figma est centré sur le rectangle, comme celui de `SearchBar` :
   les 132 s'écrivent tels quels. Choisi, le trait reste écrit en transparent,
   sinon la boîte rétrécirait de 6 unités et les trois boutons ne seraient plus
   de la même taille.

   AUCUN RETRAIT DU HAUT — et c'est un correctif du 2026-09-03. Un `<button>`
   CENTRE son contenu sur sa hauteur, tout seul et sans qu'on le lui demande :
   c'est une boîte anonyme du navigateur, qu'aucune propriété d'alignement
   n'atteint. Le retrait de 46,5 écrit ici s'AJOUTAIT donc au centrage, et le
   libellé tombait 23,25 unités trop bas — la ligne de base à 105,75 au lieu de
   82,5. Le rognage ramenant la boîte du texte sur sa seule capitale, 33, le
   centrage du bouton la pose exactement où Figma la pose : (132 − 33) / 2 =
   49,5 du haut, ligne de base à 82,5. Il n'y a rien à écrire.

   ⚠ À SIGNALER : la planche pose une opacité de 0,5 sur la variante au repos
   CLAIRE, et pas sur la sombre. Les deux maquettes de l'agenda étant claires,
   c'est 0,5 qui est écrit, dans les deux thèmes. À trancher.

   La planche dessine aussi une petite flèche `icon_ArrowOpenList_22x22` au
   bout du bouton, et pousse alors le libellé à gauche. L'agenda n'en pose
   pas : son libellé est centré. La flèche viendra avec l'écran qui la
   montrera. */
.Btn_clickable {
  display: inline-block;
  height: calc(132 * var(--ds-unite));
  padding: 0;
  text-align: center;
  border: calc(3 * var(--ds-unite)) solid var(--border-color);
  /* Passé de 20 à 32 le 2026-09-03, dans les quatre variantes de la planche —
     comme presque tous les arrondis ce jour-là. */
  border-radius: calc(32 * var(--ds-unite));
  background: var(--panel-color);
  color: var(--text-color2);
  opacity: 0.5;
  cursor: pointer;
}
.Btn_clickable.is-selected {
  border-color: transparent;
  background: var(--event-color-degrade);
  opacity: 1;
}


/* ── PastilleDATE ──────────────────────────────────────────────────────────
   La date d'une ligne d'agenda : le jour, le quantième, le mois, empilés.
   Quatre variantes — Event et Repet, en clair et en sombre.

   ELLE A ÉTÉ REDESSINÉE LE 2026-09-03, et de quatre façons à la fois : le rayon
   descend de 36 à 24, l'ombre portée des trois lignes disparaît, les deux
   lignes de texte passent de League Spartan 600 en 50 à `bold` en 40 avec 0,06
   em d'approche — c'est `style_item_titre_item_agenda`, celui du type de la
   ligne — et le quantième passe de Bebas 64 à Bebas 70, `style_titre_btn70`.

   LA RÉPÉTITION N'EST PLUS UN DÉGRADÉ : c'est un aplat très pâle avec un bleu
   franc dessus, la paire --repet-background / --repet-txt. L'évènement, lui,
   garde son dégradé et son texte blanc — la règle commune écrite plus haut.
   D'où la couleur réécrite ici : elle passe APRÈS cette règle-là dans le
   fichier, et c'est ce qui lui permet de l'emporter pour la seule répétition.

   LES ÉCARTS SE COMPTENT DE CAPITALE À CAPITALE, ce que le rognage des styles
   rend possible, et le compte tombe juste : 26,4 pour « JEU » (0,66 × 40),
   48,8 pour le quantième (0,697 × 70), 26,4 pour « OCT », deux écarts de 15 —
   soit 131,6 en tout, centrés dans 180, donc 24,2 de marge en haut comme en
   bas. La planche dit 24,3, à un dixième d'unité près. */
.PastilleDATE {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  flex: none;
  width: calc(140 * var(--ds-unite));
  height: calc(180 * var(--ds-unite));
  border-radius: calc(24 * var(--ds-unite));
  background: var(--event-color-degrade);
  /* Les trois lignes : blanches en clair, #1A181B en sombre — --txt-btn, le
     même jeton que la croix d'`icon_add` et le crayon d'`icon_modifier`. */
  color: var(--txt-btn);
}
.PastilleDATE.is-repet {
  background: var(--repet-background);
  color: var(--repet-txt);
}
.PastilleDATE > * + * {
  margin-top: calc(15 * var(--ds-unite));
}


/* ── MenuMobile_Footer ─────────────────────────────────────────────────────
   La barre du bas, au téléphone. Arrivée sur la planche le 2026-09-02. Une
   seule variante : ses trois couleurs sont des jetons qui basculent seuls —
   le fond est un panneau, l'icône choisie prend --event-color, les autres
   --text-color2.

   200 de haut, le trait en haut, et la rangée d'icônes de 90 posée à 55 du
   haut — donc 55 du bas aussi, elle est centrée. Cinq emplacements égaux se
   partagent la rangée.

   ⚠ À SIGNALER : la rangée est large de 1000 et commence à 61, dans un cadre
   de 1100 — il reste donc 39 de l'autre côté. C'est recopié tel quel, mais
   c'est 22 unités d'écart, visibles sur un vrai téléphone. Même remarque que
   pour les retraits 20 / 17 d'`Item_Agenda`. */
.MenuMobile_Footer {
  height: calc(200 * var(--ds-unite));
  background: var(--panel-color);
  border-top: calc(3 * var(--ds-unite)) solid var(--border-color);
}
.MenuMobile_Footer > .IconsMenu_M {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  align-items: center;
  justify-items: center;
  height: calc(90 * var(--ds-unite));
  margin: calc(52 * var(--ds-unite)) calc(39 * var(--ds-unite)) 0 calc(61 * var(--ds-unite));
}


/* ── Les icônes de menu, 44 × 44 ───────────────────────────────────────────
   La planche les dessine toutes dans la même boîte de 44, et leur trait est le
   seul à changer : --text-color2 au repos, --event-color quand la page est
   celle-là. La couleur se pose sur le bouton qui les porte, elles la prennent
   en « currentColor ».

   Comme pour `icon_eye_44x44`, la classe va sur le `<svg>` : le composant du
   DS est l'icône, pas le bouton autour. */
.icon_agenda_44x44,
.icon_setlist_44x44,
.icon_metronome_44x44,
.icon_diapason_44x44,
.icon_PlusMenu {
  display: block;
  flex: none;
  overflow: visible;
  width: calc(44 * var(--ds-unite));
  height: calc(44 * var(--ds-unite));
}


/* ── icon_gps ──────────────────────────────────────────────────────────────
   Le bouton d'itinéraire. La planche en donne cinq variantes, et deux formes :
   une tuile PLEINE du dégradé de la nature, celle des panneaux clairs, et une
   tuile en FIL DE FER — un simple cadre — celle qu'on pose sur un fond déjà
   coloré, la carte du carrousel par exemple. Le tracé, lui, ne change pas.

   140 de côté, rayon 32 depuis le 2026-09-03 — 33 auparavant. Le trait de la
   variante en fil de fer prend « currentColor » : sur la carte du carrousel il
   suit donc le texte, blanc en clair et noir en sombre, sans avoir à être
   écrit deux fois.

   Comme `icon_add`, la classe va sur le `<svg>` et la tuile est son fond : un
   dégradé écrit dans le gabarit n'y survivrait pas. */
.icon_gps {
  display: block;
  flex: none;
  width: calc(140 * var(--ds-unite));
  height: calc(140 * var(--ds-unite));
  border-radius: calc(32 * var(--ds-unite));
  background: var(--event-color-degrade);
  /* Blanche en clair, #1A181B en sombre, dans les deux natures : --txt-btn,
     comme la croix d'`icon_add` et le crayon d'`icon_modifier`. Elle était en
     --text-color_fullWhite jusqu'au 2026-09-03, à tort. La variante en fil de
     fer, elle, ne prend pas ce jeton : elle suit le texte qui l'entoure. */
  color: var(--txt-btn);
}
.icon_gps.is-repet {
  background: var(--repet-color-degrade);
}
.icon_gps.is-filaire {
  background: none;
  border: calc(3 * var(--ds-unite)) solid currentColor;
  color: inherit;
}


/* ── icon_modifier ─────────────────────────────────────────────────────────
   Le crayon qui emmène à l'écran de saisie. Quatre variantes au DS — Event et
   Repet, en clair et en sombre — qui ne diffèrent que par le dégradé de la
   tuile et par la couleur du trait.

   LE CRAYON N'EST PAS BLANC PARTOUT : les deux variantes sombres de la
   planche l'écrivent en #1A181B, comme le libellé de `btn_enregistrer`. C'est
   donc --txt-btn qu'il prend, et non --text-color_fullWhite : le dégradé
   s'éclaircit quand le thème s'assombrit, et c'est le fond qui commande. La
   croix d'`icon_add` et la flèche d'`icon_gps` sont dans le même cas — elles
   l'ont rejoint le 2026-09-03, après un relevé complet des variantes sombres.

   Même montage qu'`icon_add` : la classe sur le `<svg>`, la tuile en fond.

   ⚠ UNE CINQUIÈME ET UNE SIXIÈME VARIANTE sont arrivées le 2026-09-04 :
   « Wire clair » et « Wire sombre », le crayon SANS sa tuile — un simple tracé,
   comme `icon_gps.is-filaire` juste au-dessus. C'est celle-là que la fiche
   d'une date emploie depuis « BLOC_ReadEvent=Clair_v2 ». Elle ne se décline pas
   par nature : la planche n'en dessine pas de version répétition, le crayon y
   est le même sur une date et sur une répétition.

   ⚠ SA COULEUR EST LA SEULE DU DS QUI N'AIT PAS DE JETON : la planche l'écrit
   #1A181B en clair et blanc en sombre — exactement l'INVERSE de --txt-btn, et
   pas tout à fait --text-color1 (#000000 en clair). C'est --text-color1 qui est
   écrit ici, faute de mieux : juste en sombre, un cheveu trop noir en clair.
   À demander à Etienne. */
.icon_modifier {
  display: block;
  flex: none;
  width: calc(132 * var(--ds-unite));
  height: calc(132 * var(--ds-unite));
  border-radius: calc(32 * var(--ds-unite));
  background: var(--event-color-degrade);
  color: var(--txt-btn);
}
.icon_modifier.is-repet {
  background: var(--repet-color-degrade);
}
.icon_modifier.is-wire {
  background: none;
  color: var(--text-color1);
}


/* ── icon_modify_70x70 ─────────────────────────────────────────────────────
   Le petit crayon qui coiffe une section de la fiche, arrivé sur les deux
   « BLOC_ReadEvent=…_Event Clair » du 2026-09-04. Quatre variantes au DS —
   choisi et au repos, en clair et en sombre — mais la fiche n'emploie que le
   repos : `--text-color2`, la couleur des icônes qui attendent. La variante
   choisie n'est donc pas écrite, faute d'emploi.

   Il tient dans 70, et son tracé les remplit presque exactement : 69,35 sur
   69,26, centré dans la boîte par la translation du gabarit. */
.icon_modify_70x70 {
  display: block;
  flex: none;
  width: calc(70 * var(--ds-unite));
  height: calc(70 * var(--ds-unite));
  color: var(--text-color2);
}


/* ── icon_phone ────────────────────────────────────────────────────────────
   Le bouton d'appel du contact sur place. Un DISQUE plein, dans lequel le
   combiné est découpé — un seul tracé, pas une icône posée sur une pastille.
   Il n'a donc pas de fond : c'est sa couleur de remplissage qui fait le rond,
   et --event-color la donne dans les deux thèmes. */
.icon_phone {
  display: block;
  flex: none;
  width: calc(132 * var(--ds-unite));
  height: calc(132 * var(--ds-unite));
  color: var(--event-color);
}


/* ── ID ────────────────────────────────────────────────────────────────────
   La photo d'une personne. 132 de côté dans `Item_ContactSurPlace`, 108 dans
   `Item_Lineup_Read` — c'est le seul composant du DS qui change de taille
   selon l'endroit, et la planche le laisse en vert vif : un emplacement. */
.ID {
  display: block;
  flex: none;
  width: calc(132 * var(--ds-unite));
  height: calc(132 * var(--ds-unite));
  border-radius: calc(32 * var(--ds-unite));
  object-fit: cover;
  background: var(--panelsoft-color);
}
.ID.is-lineup {
  width: calc(108 * var(--ds-unite));
  height: calc(108 * var(--ds-unite));
  border-radius: calc(20 * var(--ds-unite));
}


/* ── Read_item_text ────────────────────────────────────────────────────────
   Une ligne d'information en lecture : son intitulé à gauche, sa valeur à
   droite, sur la même ligne de base. Pas de boîte, pas de hauteur : ce sont
   deux textes rognés, et c'est leur hauteur de capitale qui fait la ligne. */
.Read_item_text {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: calc(40 * var(--ds-unite));
}
.Read_item_text > .titre {
  color: var(--text-color2);
}
.Read_item_text > .valeur {
  color: var(--text-color1);
  text-align: right;
}


/* ── Item_Roadmap ──────────────────────────────────────────────────────────
   Une étape de la feuille de route : l'heure, puis ce qui se passe, dans une
   boîte creusée. 97 de haut, et les deux textes à la même ligne de base — 65
   du haut, soit 32 pour la capitale.

   La colonne de l'heure fait 162 : c'est la cote de la maquette, et une
   largeur FIXE est ce qu'il faut ici — une colonne qui suivrait le texte
   ferait danser les boîtes d'une ligne à l'autre. */
.Item_Roadmap {
  display: grid;
  grid-template-columns: calc(162 * var(--ds-unite)) minmax(0, 1fr);
  height: calc(97 * var(--ds-unite));
  padding-top: calc(32 * var(--ds-unite));
  color: var(--event-color);
}
.Item_Roadmap.is-repet {
  color: var(--repet-color);
}
.Item_Roadmap > .action {
  height: calc(97 * var(--ds-unite));
  margin-top: calc(-32 * var(--ds-unite));
  padding: calc(32 * var(--ds-unite)) calc(33.4 * var(--ds-unite)) 0;
  border-radius: calc(20 * var(--ds-unite));
  background: var(--panelsoft-color);
  color: var(--text-color1);
  overflow: hidden;
}


/* ── Item_Note ─────────────────────────────────────────────────────────────
   Le grand pavé de texte d'une fiche — la note, les infos techniques. 397 de
   haut, creusé dans le panneau, 40 de retrait tout autour. En lecture il ne se
   saisit pas : c'est du texte posé.

   La planche le dessine avec son invite en gris, mais c'est l'écran de SAISIE
   qu'elle décrit là : EN LECTURE, UN PAVÉ VIDE NE PARAÎT PAS DU TOUT — décision
   d'Etienne du 2026-08-28, confirmée le 2026-09-02. L'état vide s'écrira donc
   le jour où l'écran de saisie sera refait, et pas avant : une règle que rien
   n'emploie n'a rien à faire ici. */
.Item_Note {
  /* 360 depuis le 2026-09-04 ; c'était 397. Ce n'est pas le composant qui
     fixe cette hauteur — la planche du DS le dessine à 200 et à 214,7 — mais
     l'écran qui l'emploie, et les deux BLOC_ReadEvent l'y posent à 360. */
  height: calc(360 * var(--ds-unite));
  padding: calc(40 * var(--ds-unite));
  border-radius: calc(22 * var(--ds-unite));
  background: var(--panelsoft-color);
  color: var(--text-color1);
  overflow: hidden;
}


/* ── ChampTexte ────────────────────────────────────────────────────────────
   La ligne de texte creusée, plus basse que `Item_Note` : 124, un seul niveau.
   45,5 en haut, 34 sur les côtés — la ligne de base tombe à 78,5, la cote de
   la planche. */
.ChampTexte {
  height: calc(124 * var(--ds-unite));
  padding: calc(45.5 * var(--ds-unite)) calc(34 * var(--ds-unite)) 0;
  border-radius: calc(20 * var(--ds-unite));
  background: var(--panelsoft-color);
  color: var(--text-color1);
  overflow: hidden;
}


/* ── Item_Lineup_progressBar ───────────────────────────────────────────────
   Combien de musiciens ont répondu. Une barre et un compte, dans une boîte
   creusée de 108. La barre fait 15 d'épaisseur, entièrement arrondie ; sa
   piste prend la couleur des traits et son remplissage celle de l'évènement.

   32,5 à gauche, 40 à droite, et l'écart entre la barre et le compte vaut
   49,5 : les trois se lisent sur la maquette et refont ses 1014. */
.Item_Lineup_progressBar {
  display: flex;
  align-items: center;
  height: calc(108 * var(--ds-unite));
  padding: 0 calc(40 * var(--ds-unite)) 0 calc(32.5 * var(--ds-unite));
  border-radius: calc(36 * var(--ds-unite));
  background: var(--panelsoft-color);
}
.Item_Lineup_progressBar > .Grid {
  display: flex;
  align-items: center;
  gap: calc(49.5 * var(--ds-unite));
  width: 100%;
}
.Item_Lineup_progressBar .barre {
  flex: 1;
  height: calc(15 * var(--ds-unite));
  border-radius: calc(7.5 * var(--ds-unite));
  background: var(--border-color);
  overflow: hidden;
}
.Item_Lineup_progressBar .barre > span {
  display: block;
  height: 100%;
  border-radius: calc(7.5 * var(--ds-unite));
  background: var(--event-color);
}
.Item_Lineup_progressBar > .Grid > .compte {
  flex: none;
  color: var(--text-color1);
}


/* ── Item_Lineup_Read ──────────────────────────────────────────────────────
   Un musicien du line up : sa photo, son nom, son poste, et sa réponse en
   badge. 160 de haut, 30 à gauche, 28,5 à droite — c'est là que le badge
   s'arrête. Les deux lignes de texte sont séparées de 20, d'une capitale à
   l'autre, et le bloc est centré sur la hauteur. */
.Item_Lineup_Read {
  display: flex;
  align-items: center;
  gap: calc(40 * var(--ds-unite));
  height: calc(160 * var(--ds-unite));
  padding: 0 calc(28.5 * var(--ds-unite)) 0 calc(30 * var(--ds-unite));
  border-radius: calc(32 * var(--ds-unite));
  background: var(--panelsoft-color);
}
.Item_Lineup_Read > .left {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 0;
}
.Item_Lineup_Read > .left > .nom {
  color: var(--text-color1);
}
.Item_Lineup_Read > .left > .poste {
  margin-top: calc(20 * var(--ds-unite));
  color: var(--text-color2);
}


/* ── Item_ContactSurPlace ──────────────────────────────────────────────────
   Le contact du lieu : sa photo, son nom, sa fonction, et le bouton d'appel
   au bout. 178 de haut, rayon 20, et le même écart de 20 entre les deux
   lignes de texte que le line up. La photo est plus grande, 132, et l'écart
   qui la suit vaut 30. */
.Item_ContactSurPlace {
  display: flex;
  align-items: center;
  gap: calc(30 * var(--ds-unite));
  height: calc(178 * var(--ds-unite));
  padding: 0 calc(40 * var(--ds-unite)) 0 calc(30 * var(--ds-unite));
  border-radius: calc(20 * var(--ds-unite));
  background: var(--panelsoft-color);
}
.Item_ContactSurPlace > .left {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 0;
}
.Item_ContactSurPlace > .left > .nom {
  color: var(--text-color1);
}
.Item_ContactSurPlace > .left > .poste {
  margin-top: calc(20 * var(--ds-unite));
  color: var(--text-color2);
}


/* ── Les icônes de menu du bureau, 44 × 44 ─────────────────────────────────
   Les mêmes boîtes que celles du pied de téléphone, et la même règle : le
   trait prend « currentColor », la couleur se pose sur l'élément qui les
   porte — --text-color2 au repos, --event-color sur la page ouverte. */
.Icon_client_44x44,
.icon_mail_44x44,
.icon_tresorerieEU_44x44,
.icon_devisEU_44x44,
.icon_plan_44x44,
.icon_fiche_technique_44x44,
.icon_settings,
.icon_ArrowOpenClose_44x44 {
  display: block;
  flex: none;
  overflow: visible;
  width: calc(44 * var(--ds-unite));
  height: calc(44 * var(--ds-unite));
}


/* ── MainMenu_desktop ──────────────────────────────────────────────────────
   Le menu de gauche, celui que tous les écrans partagent. Deux variantes sur
   la planche, « ouvert » et « fermé », qui ne diffèrent que par leur largeur
   et par ce qu'elles montrent : 564 unités avec les libellés, 160 sans.

   Le trait de droite est le seul de la colonne : 3 unités, la couleur des
   traits, et il court sur toute la hauteur.

   LES ÉCARTS, lus sur D_AGENDA_Clair (relevé du 2026-09-03, deuxième version
   du soir — le rythme s'est resserré de 100 à 75 en cours de journée) :
       20    du haut au logo, qui fait 450 × 200
       75    du bas du logo à l'entrée « Réduire le menu »
       75    de cette entrée à la première du menu
      100    la hauteur d'une entrée, et elles se touchent
       75    d'un GROUPE au suivant — la planche n'écrit aucun intertitre,
             c'est l'écart seul qui les sépare
       75    du bas de la colonne à la boîte de « Réglages »

   REPLIÉE, la colonne suit le même rythme avec des entrées de 90 et non de
   100, et sa pastille ne fait que 112 de large : la variante « fermé » de la
   planche les donne toutes les deux. Les 75 y sont partout les mêmes, y
   compris sous le trait qui suit le carré du groupe.

   ⚠ La colonne est passée de 500 à 564 le 2026-09-03, son retrait de 25 à 57
   — le panneau reste à 450 et se recentre. DesignSystem_V4 dit encore 500 :
   c'est D_AGENDA_Clair qui fait foi ici, l'écran ayant été redessiné après.

   L'ENTRÉE DE LA PAGE OUVERTE, relevée sur D_AGENDA_Clair et sur la variante
   « Opened_selected » d'`item_menu` : un aplat LARGE COMME LE PANNEAU — 450,
   toute sa largeur — haut comme la ligne, RAYON 32, et de la couleur du FOND
   D'ÉCRAN, pas de celle des traits. Ce que la maquette met dessus n'est pas
   d'une seule couleur : l'ICÔNE prend --event-color ; LE LIBELLÉ, lui, passe
   au noir et au GRAS — `style_item_text44bold` au lieu de `style_item_text44`.
   Rayon 16, aplat --border-color et libellé bordeaux jusqu'au 2026-09-03 :
   c'était faux sur les trois points. Repliée, en revanche, la colonne garde
   l'aplat de la couleur des traits : la planche le dessine ainsi.

   LE PANNEAU EST CENTRÉ DANS LA COLONNE MOINS SON TRAIT depuis le 2026-09-04 :
   55,5 de chaque côté, et non plus 57 à gauche contre 54 à droite. 55,5 + 450 +
   55,5 + 3 = 564, et le panneau retombe sur ses 450. « D_AGENDA_Clair_v2 » et
   la variante « ouvert Clair » de la planche donnent la même cote. */
.MainMenu_desktop {
  display: flex;
  flex-direction: column;
  flex: none;
  width: calc(564 * var(--ds-unite));
  padding: calc(20 * var(--ds-unite)) calc(55.5 * var(--ds-unite))
           calc(75 * var(--ds-unite));
  background: var(--panel-color);
  border-right: calc(3 * var(--ds-unite)) solid var(--border-color);
}
.MainMenu_desktop.is-ferme {
  width: calc(160 * var(--ds-unite));
  padding-right: calc(20 * var(--ds-unite));
  padding-left: calc(20 * var(--ds-unite));
}
/* Le trait sous le logo n'existe QUE dans la variante fermée : c'est lui qui
   sépare le carré du groupe des entrées, là où le libellé ne le fait plus.
   28,5 au-dessus, 75 en dessous — le même 75 que partout ailleurs. */
.MainMenu_desktop.is-ferme > .BorderSeparate_horiz {
  margin: calc(28.5 * var(--ds-unite)) calc(-20 * var(--ds-unite))
          calc(75 * var(--ds-unite));
}
.MainMenu_desktop .item_menu {
  display: flex;
  align-items: center;
  gap: calc(30 * var(--ds-unite));
  /* La largeur est écrite : un `<button>` ne s'étire pas tout seul dans un
     bloc, il se contente de son contenu. Sans elle, l'aplat de l'entrée
     ouverte s'arrête au bout du libellé au lieu de tenir les 450 du panneau. */
  width: 100%;
  height: calc(100 * var(--ds-unite));
  /* 34 avant l'icône : la maquette pose sa boîte de 44 à 91 du bord de la
     colonne, dont 57 appartiennent au retrait du panneau. L'aplat de l'entrée
     ouverte, lui, occupe toute la largeur du panneau — il ne déborde pas. */
  padding: 0 calc(34 * var(--ds-unite));
  border: none;
  border-radius: calc(32 * var(--ds-unite));
  background: none;
  color: var(--text-color2);
  cursor: pointer;
  text-align: left;
}
/* L'aplat, et l'icône avec lui. Le libellé ne suit PAS : il est écrit en noir
   sur la maquette, et c'est son style qui le met en gras. */
.MainMenu_desktop .item_menu.is-selected {
  background: var(--background-color);
  color: var(--event-color);
}
.MainMenu_desktop .item_menu.is-selected > .style_item_text44bold {
  color: var(--text-color1);
}
/* La colonne fermée a sa propre pastille : 112 de large et 90 de haut au lieu
   de la ligne entière, rayon 16 — la variante « closed_selected » de la
   planche, la seule à ne pas être passée à 32 —, et l'aplat de la couleur des
   traits, que la variante ouverte a quitté. */
.MainMenu_desktop.is-ferme .item_menu {
  justify-content: center;
  width: calc(112 * var(--ds-unite));
  height: calc(90 * var(--ds-unite));
  margin: 0 auto;
  padding: 0;
  border-radius: calc(16 * var(--ds-unite));
}
.MainMenu_desktop.is-ferme .item_menu.is-selected {
  background: var(--border-color);
}
/* Une entrée qui ouvre un GROUPE prend 75 de plus, l'écart que la planche met
   entre deux familles — et c'est le même 75 qu'au-dessus de la première
   entrée et au-dessous de la dernière. */
.MainMenu_desktop .item_menu.is-groupe {
  margin-top: calc(75 * var(--ds-unite));
}
/* Le pied du menu : « Réglages », poussé en bas de la colonne. */
.MainMenu_desktop > .footer {
  margin-top: auto;
}


/* ── MainHeader_desktop ────────────────────────────────────────────────────
   La barre du haut, elle aussi commune à tous les écrans : un panneau de 167
   fermé par un trait de 3, et trois emplacements — le titre à gauche, les
   onglets au centre, la recherche et le bouton d'ajout à droite.

   Ce que la barre CONTIENT appartient à l'écran ; ce qu'elle est appartient
   au DS. Les cotes de D_AGENDA_Clair : le titre à 50 du menu et le groupe de
   droite à 60 du bord.

   Ses TROIS EMPLACEMENTS ne sont pas écrits ici — `Frame_left`, `Frame_center`
   et `Frame_right` sur la planche. Chaque écran pose encore le contenu qu'il
   posait avant, et une règle que rien n'emploie n'a pas sa place : ils
   viendront avec le premier écran dont la barre sera refaite. */
.MainHeader_desktop {
  display: flex;
  align-items: center;
  height: calc(170 * var(--ds-unite));
  padding: 0 calc(60 * var(--ds-unite)) calc(3 * var(--ds-unite)) calc(50 * var(--ds-unite));
  background: var(--panel-color);
  border-bottom: calc(3 * var(--ds-unite)) solid var(--border-color);
}


/* ── Frame_left · Frame_center · Frame_right ───────────────────────────────
   Les trois emplacements de la barre, écrits le 2026-09-03 avec le premier
   écran dont la barre passe au DS — l'Agenda. Un écran qui n'en pose pas
   garde la barre en `flex` et son ancien contenu : la grille ne s'arme que
   si `Frame_center` est là.

   ⚠ CE QUI SUIT EST HORS D'EMPLOI DEPUIS LE 2026-09-04, et la phrase qui le
   justifiait était FAUSSE. Elle disait : « sur D_AGENDA_Clair, `Frame_center`
   va de 1926,5 à 2922,5 ». Aucune planche ne dessine de `Frame_center` — ni le
   design system, ni les deux D_AGENDA_Clair. Ce que les écrans dessinent, c'est
   un `Frame_buttons` DANS `Frame_left`, de 1001 à 1981, derrière un titre qui
   commence à 614. Les onglets y sont revenus, et la grille ne s'arme plus.
   Elle reste écrite : rien ne se supprime avant le ménage d'ensemble.

   LES 50 ET LES 60 SONT PORTÉS PAR LES EMPLACEMENTS, pas par la barre.
   `MainHeader_desktop` les déclare aussi, mais `6-adaptatif.css` remet son
   remplissage à zéro pour les écrans non refaits : les cotes seraient perdues.
   Et les poser ici est de toute façon plus juste — un remplissage de 50 à
   gauche contre 60 à droite décalerait le centre de la grille de 5 unités.

   Ce que chaque emplacement CONTIENT appartient à l'écran : la largeur des
   onglets, celle de la recherche et les écarts entre eux s'écrivent en
   `.fof-…`. Ici, seulement où les trois se posent. */
/* Les trois `:has` ne sont pas une coquetterie : la coquille écrit
   `.fof-shell.is-ownhead .fof-header{display:flex}` pour ramener la barre
   au-delà de 1101 px, et trois classes l'emporteraient sur une seule. Une
   barre qui porte ses TROIS emplacements, c'est aussi la condition juste.

   ⚠ ET C'EST POURQUOI CETTE GRILLE EST SOUS MEDIA QUERY — la seule du fichier
   avec celle de l'unité, et elle n'est pas de confort. Trois classes
   l'emportent AUSSI sur le `display:none` que la coquille pose au téléphone
   (`.fof-shell.is-ownhead .fof-header`, 2-mise-en-page.css) : écrite sans
   condition de largeur, la règle RALLUMAIT la barre du bureau sur le téléphone.
   Deux en-têtes se superposaient alors sur l'Agenda, et les trois onglets de
   celui du dessus, privés de leurs cotes de bureau, s'écrasaient les uns sur
   les autres (constat d'Etienne, 2026-09-03). `MainHeader_desktop` porte son
   format dans son nom : sa grille ne s'arme qu'au-delà de 1101 px. */
@media (min-width: 1101px) {
  .MainHeader_desktop:has(> .Frame_left):has(> .Frame_center):has(> .Frame_right) {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    column-gap: 0;
  }
  /* La grille place déjà les trois : une marge automatique — celle que l'ancien
     groupe de droite (`.fof-hd-right`) emploie pour se coller au bord quand la
     barre est en `flex` — ferait ici tout le contraire. Un élément de grille à
     marge automatique cesse de s'étirer, prend la taille de son contenu et
     déborde du bord droit. Ce n'est qu'en grille qu'elle gêne : on la retire ici
     seulement, les barres non refaites en ont toujours besoin. */
  .MainHeader_desktop:has(> .Frame_left):has(> .Frame_center):has(> .Frame_right) > .Frame_right {
    margin-left: 0;
    /* Les 60 du bord ne sont posés QU'ICI : `Frame_right` habille le groupe de
       droite que tous les écrans partagent, et les écrans non refaits tiennent
       leur retrait de `.fof-header`. Deux retraits se cumuleraient. */
    padding-right: calc(60 * var(--ds-unite));
  }
}
/* ⚠ DEPUIS « D_AGENDA_Clair_v2 » (2026-09-04), L'AGENDA NE POSE PLUS QUE DEUX
   EMPLACEMENTS : ses onglets ont rejoint `Frame_left`, derrière le titre, et
   `Frame_center` n'a plus d'emploi. La grille ci-dessus ne s'arme donc plus —
   elle attend les trois — et c'est le `flex` de la barre qui range les deux
   emplacements restants, `Frame_right` se collant à droite par sa propre marge
   automatique. Les 60 du bord, eux, doivent suivre dans les DEUX cas : d'où
   cette règle-ci, qui ne demande que `Frame_left`.

   `Frame_center` reste écrit plus bas : rien ne se supprime avant le ménage
   d'ensemble. Il n'était d'ailleurs sur AUCUNE planche — ni sur le design
   system, ni sur les deux D_AGENDA_Clair, qui mettent tous les onglets dans
   `Frame_left` à 40 les uns des autres. */
@media (min-width: 1101px) {
  .MainHeader_desktop:has(> .Frame_left) > .Frame_right {
    padding-right: calc(60 * var(--ds-unite));
  }
}
.Frame_left {
  display: flex;
  align-items: center;
  min-width: 0;
  padding-left: calc(50 * var(--ds-unite));
}
.Frame_center {
  display: flex;
  align-items: center;
}
/* L'emplacement de droite est COLLÉ au bord : la recherche et le bouton
   d'ajout se rangent depuis la droite, et c'est la recherche qui cède quand
   la barre se resserre — l'ordre de priorité de l'ancienne barre. */
.Frame_right {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  min-width: 0;
}
