/* ============================================================================
   CVG-PATCH183 — PORTRAIT-STANDARD.CSS : le standard commun des portraits.
   ----------------------------------------------------------------------------
   CONTRAT DE SEPARATION COMMUN / PERSONNALISE
   Cette feuille est inseree dans la cascade APRES le <style> de config
   back-office (main.js insere le style config AVANT ce <link>) : a specificite
   egale, ses regles battent les cles CSS par-portrait, y compris leurs flags
   "Important" (dernier !important a specificite egale gagne). Les zones
   verrouillees ici sont donc IDENTIQUES pour les 9 portraits.

   CE QUI RESTE PERSONNALISABLE PAR PORTRAIT (et uniquement cela) :
   1. TEINTES        : variables theme (--s*, --d*, --cryptex-*, etc.), posees
                       inline sur <html> par le layout — jamais verrouillees ici
                       (les regles ci-dessous consomment var(--...) pour toute
                       couleur). Les cles CSS de config qui ne posent QUE des
                       couleurs / fonds / ombres restent egalement gagnantes :
                       cette feuille ne verrouille aucune propriete de couleur.
   2. POLICE DU TITRE: h1.title — font-family/couleur/taille du titre libres
                       (cle CSS config ou variable --title-font). Rien ici ne
                       touche a la typo de h1.title.
   2b. TYPO DES TABLEAUX ET DE LA LISTE D'ARTISTES (PATCH183c puis 183e,
                       retours Maxou) : th h1 MOTEURS/ARTISTES/MOYENS, th small
                       sous-titres, cellules descriptives des tableaux, noms
                       .artist-name et numeros de la colonne centrale restent
                       ENTIEREMENT en typo par-portrait. Le standard des
                       tableaux se limite aux paddings des th (position).
   3. GIFS           : /src/img/{id}/ (nft-*, cryptex-*, title.svg, favicon...)
   4. VIDEO MP4      : /src/vid/{id}/ (intro, cryptex-video)
   5. BORDURE DE SELECTION D'ARTISTE : style/epaisseur/couleur des cadres
                       div#selected.cursor et div.cursor (hover) — via cle CSS
                       config ou variables --selection-cursor-border /
                       --hover-cursor-border (defauts consommes par style.css).
                       La GEOMETRIE (centrage, compensation d'epaisseur) est
                       commune : main.js selected()/hover, formule PATCH176
                       generalisee, auto-adaptative via borderTopWidth.

   Toute cle CSS de config qui touche aux zones verrouillees ici est du legacy
   a supprimer en base (liste par portrait : chantier PATCH183).
   Frontieres responsive reprises du socle : regime desktop exact = media
   composee PATCH175 (tablette portrait 551-1000 = layout mobile) ; le popup
   cryptex garde sa frontiere historique propre a 760px.
   ========================================================================== */

/* ============================== REGIME DESKTOP =============================
   (min 551px hors tablette portrait — meme media composee que style.css:692) */
@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {

    /* CVG-PATCH183e (retour Maxou tester vs prod) : les verrous typo des
       CELLULES descriptives (#motors td / #means td) sont retires a leur tour —
       la typo des tableaux est donc ENTIEREMENT par-portrait (prod 010101 =
       Roboto Mono 500, a conserver). Le standard des tableaux se reduit aux
       paddings des th (position des blocs). */
    /* CVG-PATCH183c (retour Maxou sur capture 010101) : les TITRES de colonnes
       (th h1 MOTEURS/ARTISTES/MOYENS + th small sous-titres) et la LISTE de la
       colonne ARTISTES (noms .artist-name, numeros td:first/last-child) restent
       en police PERSONNALISEE par portrait — leurs verrous typo sont retires du
       standard. Seule la POSITION (paddings des th) reste commune. */
    #motors thead th,
    #means thead th {
        padding: 51px 0 39px !important;
    }

    /* --- Colonne ARTISTES : position de l'en-tete commune ------------------- */
    #artists thead th {
        padding: 53px 0 57px !important;
    }
}

/* --- Cadres de selection et de survol : GEOMETRIE commune -------------------
   CVG-PATCH183e (retour Maxou) : centrage horizontal du PATCH173 generalise et
   verrouille — bat les compensations manuelles left/width/margin des configs
   (ex. Adiaf left:9px!important). Le STYLE de bordure (couleur, epaisseur,
   pointille/plein) reste par-portrait ; le centrage vertical est fait par
   main.js (selected()/hover, inline !important). Hors media query, comme la
   regle de base. */
#artistsScroll > div.cursor {
    left: 0 !important;
    right: 0 !important;
    margin-left: auto !important;
    margin-right: auto !important;
    width: 96% !important;
}

@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {

    /* --- Bloc titre : position commune -------------------------------------
       Typo/couleur du titre = identite (jamais touchees ici). */
    .header-content {
        margin-top: 15px !important;
        margin-bottom: 44px !important;
    }
    .upperTitle {
        font-family: Arial, sans-serif !important;
        font-size: 22px !important;
    }

    /* --- Lien PASSER de l'intro video --------------------------------------- */
    p.videoClick > a {
        font-family: 'Silkscreen', silkscreen, monospace !important;
        font-size: 37px !important;
    }
}

/* ============================== REGIME MOBILE ============================== */
@media (max-width: 550px) {
    p.videoClick > a {
        font-family: 'Silkscreen', silkscreen, monospace !important;
        font-size: 25px !important;
    }
}

/* ============ LIEN PASSER / SKIP : ZONE DE CLIC ET SURVOL =================
   CVG-PATCH225 (retour Maxou, capture prod /Mennour 2026-07-24). Trois demandes :
   (a) zone de clic PLUS GRANDE et entierement cliquable. Jusqu'ici seuls les
       glyphes fermaient l'intro : aucun handler n'existe sur #videoDiv ni sur
       #video1 (main.js ne fait que masquer le bloc, main.js:1808), et style.css
       elargissait la cible par un hack "padding asymetrique + marges negatives"
       (style.css:1460) qui ne debordait que vers la GAUCHE et le HAUT - rien a
       droite ni en bas, d'ou l'impression de cible minuscule.
   (b) FOND GRIS CLAIR au survol, pour que la zone se voie ;
   (c) lien un peu plus ELOIGNE du bord droit.

   Ecrit ici et non dans style.css pour deux raisons : cette feuille est chargee
   APRES le <style> de config back-office (ses regles battent donc les cles
   par-portrait), et son cache-buster n'est pas dispute par le chantier parallele
   en cours sur style.css.

   CVG-PATCH228 (retour Maxou) : TOUT LE BLOC EST REPLIE SOUS LE REGIME DESKTOP.
   La premiere version s'appliquait hors media query ; Maxou ne veut ces trois
   changements QUE sur ordinateur, le smartphone doit retrouver exactement son
   rendu d'avant. La media est la composee du socle (PATCH175), identique a
   celle des lignes 46 et 84 : au-dela de 550px MAIS en excluant la tablette
   portrait, que ce projet traite comme un layout mobile. Consequences voulues :
   - smartphone et tablette portrait = plus de padding elargi, plus de fond de
     survol, plus d'apparition lettre par lettre ; ils retombent sur le hack
     historique de style.css:1460, inchange ;
   - le survol n'existe de toute facon pas au doigt, et la cle animation
     revealDroiteGauche de la config Mennour est elle-meme MD (desktop) : la
     neutraliser hors desktop n'avait aucun objet.
   Le decoupage des lettres en <span> par main.js continue de tourner partout :
   sans les regles ci-dessous un <span> nu ne change strictement rien au rendu
   (verifie), et le conditionner en JS le rendrait aveugle a un redimensionnement.

   Contrat de separation (en-tete de fichier) : la GEOMETRIE est commune aux 9
   portraits, la TEINTE reste personnalisable - le fond de survol passe donc par
   var(--skip-hover-bg), un portrait peut poser sa propre valeur sans toucher
   cette feuille. */
@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {

p.videoClick {
    /* (c) mesure Playwright sur replique fidele de la cascade (1280px, config
       Mennour active) : AVANT, le glyphe s'arretait a 42px du bord ecran (30px
       de marge sur le <p> + 12px de marge de config sur le <a>). Avec 44px ici
       et les 26px de padding du lien ci-dessous, le glyphe passe a 70px et le
       rectangle de survol s'arrete a 44px : les DEUX sont plus loin du bord
       qu'avant, le fond de survol ne vient jamais lecher le bord de l'ecran. */
    margin-right: 44px !important;
}

p.videoClick > a {
    /* (a) la cible devient un vrai bloc : padding symetrique sur les 4 cotes et
       marges negatives du hack precedent neutralisees. */
    display: inline-block !important;
    padding: 18px 26px !important;
    margin: 0 !important;
    line-height: 1 !important;
    background-color: transparent;
    transition: color .18s ease;
    /* CVG-PATCH256 (retour Maxou sur le rendu PATCH225) : le fond de
       survol n'est plus peint par le lien lui-meme - le rectangle net et son
       border-radius sont juges trop delimites - mais par les deux ::before /
       ::after nuageux ci-dessous. position:relative les ancre sur le lien ;
       isolation:isolate cree le contexte d'empilement qui garde leur z-index -1
       DERRIERE les glyphes mais DEVANT la video et le fond noir (sans lui, un
       enfant en z negatif peut passer sous la video quand elle recouvre la zone).
       overflow:visible contre la cle overflow:hidden de la config Mennour (posee
       pour l'ancienne animation revealDroiteGauche, deja neutralisee ci-dessous) :
       le lien est le bloc conteneur des pseudos, sans cela le nuage serait
       retranche au rectangle du lien. */
    position: relative;
    isolation: isolate;
    overflow: visible !important;
    /* (d) NEUTRALISATION DE L'ANIMATION DE CONFIG. Le portrait Mennour pose en
       back-office, sur ce meme selecteur et en desktop uniquement :
           animation: revealDroiteGauche 2s steps(6, end) forwards
       dont les keyframes vont de clip-path: inset(0 100% 0 0) a inset(0 0 0 0).
       Le nom ment : l'encoche part de la DROITE et se resorbe, donc le mot se
       decouvre de GAUCHE A DROITE - S, puis K, puis I, puis P. C'est exactement
       ce que Maxou demande d'inverser. Deux raisons de plus de la couper : le
       steps(6) compte 6 crans pour les 4 lettres de SKIP (saccade et decalage
       visibles sur la capture), et le clip-path rogne AUSSI le fond de survol
       pendant les 2 premieres secondes, ce qui masquerait la demande (b).
       Sans effet sur l'apparition lettre par lettre ci-dessous : elle est portee
       par "> a > span", un selecteur different. */
    animation: none !important;
}

/* (b) survol en NUAGE (CVG-PATCH256). Deux lobes elliptiques floutes
   qui debordent du lien : le grand centre la zone, le petit decale en haut a
   gauche casse la symetrie (rendu cumulus, d'apres le croquis de Maxou), aucun
   bord net nulle part. La teinte reste pilotee par var(--skip-hover-bg)
   (contrat theme : un portrait peut la personnaliser sans toucher ce fichier).
   pointer-events:none : le nuage n'agrandit ni ne deforme la zone de clic,
   qui reste le rectangle de padding du lien. Cotes en top/right/bottom/left
   (pas inset) pour couvrir les moteurs anterieurs a 2021 ; un moteur sans
   filter:blur affiche deux ellipses pleines aux bords arrondis - degrade
   acceptable, jamais un lien invisible.
   Regles :hover et :focus-visible SEPAREES a dessein : dans une liste de
   selecteurs non permissive, un :focus-visible inconnu du navigateur
   invaliderait AUSSI le :hover (meme precaution que PATCH225). */
p.videoClick > a::before,
p.videoClick > a::after {
    content: "";
    position: absolute;
    border-radius: 50%;
    background: var(--skip-hover-bg, rgba(255, 255, 255, .18));
    filter: blur(16px);
    opacity: 0;
    transition: opacity .18s ease;
    pointer-events: none;
    z-index: -1;
}
p.videoClick > a::before {
    top: -16px;
    right: -32px;
    bottom: -16px;
    left: -32px;
}
p.videoClick > a::after {
    width: 60%;
    height: 80%;
    top: -24px;
    left: -36px;
    filter: blur(18px);
}
p.videoClick > a:hover::before,
p.videoClick > a:hover::after {
    opacity: 1;
}
p.videoClick > a:focus-visible::before,
p.videoClick > a:focus-visible::after {
    opacity: 1;
}

/* --- Apparition des lettres de DROITE A GAUCHE (P, puis I, puis K, puis S) ---
   main.js decoupe le libelle en <span> par lettre (fonction skipLetters, fin de
   fichier). nth-last-child = compte depuis la FIN : la derniere lettre part la
   premiere, et la regle vaut telle quelle pour SKIP (4 lettres) comme pour
   PASSER (6 lettres), sans distinguer la langue.
   fill-mode BACKWARDS et non forwards : pendant le seul delai d'attente la
   lettre emprunte l'etat "from" (invisible), puis retombe sur son style normal
   (opaque) une fois l'animation finie. Si le JS ne passe pas, s'il n'y a pas de
   span, ou si les animations sont desactivees, le texte reste VISIBLE et
   cliquable - le lien ne peut pas disparaitre. */
p.videoClick > a > span {
    display: inline-block;
    animation: skipLetterIn .2s ease-out backwards;
}
p.videoClick > a > span:nth-last-child(1) { animation-delay: .15s; }
p.videoClick > a > span:nth-last-child(2) { animation-delay: .29s; }
p.videoClick > a > span:nth-last-child(3) { animation-delay: .43s; }
p.videoClick > a > span:nth-last-child(4) { animation-delay: .57s; }
p.videoClick > a > span:nth-last-child(5) { animation-delay: .71s; }
p.videoClick > a > span:nth-last-child(6) { animation-delay: .85s; }

} /* CVG-PATCH228 : fin du regime desktop - rien de ce qui precede ne s'applique
     au smartphone ni a la tablette portrait */

/* Keyframes laissees au niveau racine : une definition jamais utilisee ne coute
   rien, et cela evite d'imbriquer une @-rule dans une autre. */
@keyframes skipLetterIn {
    from { opacity: 0; transform: translateX(10px); }
    to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    p.videoClick > a > span {
        animation: none;
    }
}

/* ============ INTRO VIDEO : HAUTEUR = VIEWPORT VISIBLE ======================
   CVG-PATCH233 (retour Maxou : sur smartphone le PASSER semble manger l'espace
   du bas, video percue comme basse). #videoDiv est en height:100%
   (style.css:1403, l'ancien 100vh y a deja ete abandonne) : sur mobile cette
   hauteur ne suit pas les barres dynamiques du navigateur (barre d'URL, barre
   de gestes) - le bas du calque, et le lien PASSER qui y est ancre
   (#videoMessage bottom:15px), peuvent tomber sous la zone reellement visible.
   D'ou l'asymetrie percue alors que la video est mathematiquement centree dans
   le calque (mesure live 312px au-dessus / 312px au-dessous).
   100dvh = hauteur VISIBLE dynamique : le calque, la video centree dedans et
   le PASSER se recalent quand les barres apparaissent ou disparaissent.
   Navigateurs sans dvh (iOS < 15.4...) : declaration ignoree, le 100% de
   style.css reste en vigueur - etat d'avant, aucun risque. Hors media query :
   sur ordinateur dvh = vh (pas de barres dynamiques), aucun changement. */
#videoDiv {
    height: 100dvh !important;
}

/* ========================= POPUP CRYPTEX (player-modal) ====================
   Mise en page commune ; toutes les couleurs restent pilotees par les
   variables --cryptex-* et les cles config de couleur. Frontiere mobile
   historique du popup : 760px (style.css:2209), reprise telle quelle. */
#player-modal .model-content {
    height: 75% !important;
    width: 90% !important;
    padding: 10px !important;
    padding-top: 0 !important;
    position: relative !important;
    overflow: hidden !important;
    display: flex !important;
    flex-direction: column !important;
    border-radius: 20px !important;
}

/* CVG-PATCH183d (retour Maxou, capture ?cryptex 010101) : AUCUN verrou display
   ni flex sur les panneaux internes (#description, #yvd, #images, .modal-body).
   Le popup alterne ses etats (video seule / formulaire personnalise) en jouant
   sur leur visibilite, et les proportions (ex. description flex 0.8 de 010101)
   sont reglees par les configs : les forcer cassait la bascule d'etats
   (#images reapparaissait a cote de la video). Le standard se limite au CADRE. */
#player-modal .modal-body {
    padding: 0 !important;
    flex-direction: row-reverse !important;
    flex-grow: 1 !important;
    overflow: hidden !important;
}

#player-modal #description {
    font-size: 14px !important;
}

#player-modal button {
    width: 100% !important;
    margin: 0 !important;
    line-height: 1 !important;
    padding: 5px !important;
}

div#order-buttons {
    margin-top: 10px !important;
    text-align: center !important;
    padding-right: 20px !important;
    padding-left: 10px !important;
}

/* croix de fermeture : placee au meme endroit pour tous. Sa FORME reste
   par-portrait (image videoPopup.cross, ou croix CSS :before/:after avec
   .close img masque — BRM ; ne pas forcer l'affichage de l'img : double
   croix sinon). Billarant/010101 ont une croix CSS au content invalide,
   donc aucune croix visible : a reparer dans leurs configs (nettoyage base). */
#player-modal .modal-header > span.close:first-child {
    position: absolute !important;
    right: 5px !important;
    top: -20px !important;
    z-index: 1111111;
}

@media screen and (max-width: 760px) {
    #player-modal .model-content {
        width: 90% !important;
        top: 0 !important;
        height: 100% !important;
        padding: 0 10px !important;
    }

    /* CVG-PATCH219 : popup cryptex - empilage vertical sur mobile.
       PATCH183 (l.134) pose .modal-body en row-reverse SANS media mobile : la
       popup restait cote-a-cote sur telephone et le volet video #yvd devenait
       une colonne etroite pleine hauteur ou une video large se reduit a un
       filet (Mennour = invisible : config #yvd 56.25vw + video 8:3 ; Adiaf idem,
       #yvd=110px). On empile en colonne : video/image pleine largeur en haut,
       description/formulaire dessous. Regle APRES l.134 dans le fichier charge
       en dernier -> a specificite et !important egaux, l'ordre source gagne.
       Valide Playwright (webkit iPhone) sur Mennour/Adiaf/Boros/Stoschek, etats
       video ET formulaire personnalise (#yvd cache, #images pleine largeur :
       pas de regression "#images a cote de la video" de PATCH183d). */
    #player-modal .modal-body {
        flex-direction: column !important;
    }

    #player-modal #yvd,
    #player-modal #images {
        width: 100% !important;
    }

    #player-modal #yvd {
        flex: 0 0 auto !important;
        max-height: 42vh !important;
    }

    #player-modal #yvd iframe,
    #player-modal #yvd video {
        width: 100% !important;
        height: 100% !important;
    }
}

/* CVG-PATCH246 : popup Cryptex Mennour (desktop) - descriptif
   aligne a gauche et corps de texte harmonise (retour Maxou, capture tester du
   2026-08-01). Etat en base (cles MD) : .comments p = 18.9px / graisse 700 /
   interligne 40px, et style.css:2571 pose text-align:justify sur .comments ->
   colonne ~335px justifiee pleine de rivieres (l'affichage___du___code), et
   paragraphe entierement gras qui annule les <b> d'emphase (les cles config
   b:nth-child 700 deviennent invisibles) avec un corps presque aussi fort que
   le titre (26px). Corps repasse a 16px / 500 / 26px : echelle 13.3 (boutons)
   - 15 (payment) - 16 (corps) - 26 (titre), l'emphase <em> rouge #e03e2d et le
   Cryptex souligne ressortent a nouveau. Media min-width 551px = frontiere de
   l'injecteur de config (bloc min551) : le regime SM (14px/700/20px, cles IsSM)
   reste strictement intact. Scope body.P-Mennour : les 8 autres portraits
   inchanges. Specificite + !important + ordre (fichier charge apres style.css
   et le style de config injecte) : bat style.css:2571 et les cles config. */
@media (min-width: 551px) {
    body.P-Mennour #player-modal .comments {
        text-align: left !important;
    }

    body.P-Mennour #player-modal .comments p {
        font-size: 16px !important;
        font-weight: 500 !important;
        line-height: 26px !important;
    }
}

/* CVG-PATCH235 : Mennour - cadre de selection de la colonne ARTISTES en
   6px dotted noir sur fond rgb(215 207 194) (teinte et bordure pipettees par
   Maxou dans DevTools, capture localhost du 2026-08-01). La config MD en base
   pose sur #artistsScroll > div#selected.cursor : border none + outline
   1.5px solid #1a1a1a + fond #fffbf4 (blanc casse) ; on remplace le paquet
   complet, outline coupee sous peine de double cadre. box-sizing BORDER-BOX
   = la bordure est dessinee A L'INTERIEUR de la bande de la ligne :
   l'encombrement du cadre (96% de large, hauteur de la ligne) reste
   exactement celui du fond actuel - c'est le "faire la bonne height et
   width" du retour Maxou, son essai DevTools en content-box debordait de
   6px sur les lignes voisines. main.js (selected / mirrorSelectionCursor /
   retrait du survol, PATCH235) ne decale plus top d'une epaisseur de trait
   quand le cadre est en border-box. Media min-width 551px = frontiere de
   l'injecteur de config (bloc min551) : le regime SM (outline rouge 4px,
   largeur 1596px, cles IsSM) reste strictement intact. Specificite
   body.P-Mennour... + !important + ordre (fichier charge APRES le style de
   config injecte) : bat les cles config a tous les etages. Ligne jumelle de
   la boucle PATCH231 : rien a poser sur #selectedTwin, le miroir recopie le
   rendu CALCULE de #selected (bordure et fond compris - l'outline config,
   elle, n'etait jamais recopiee sur la jumelle : defaut resorbe par le
   passage en bordure vraie). */
@media (min-width: 551px) {
    body.P-Mennour #artistsScroll > div#selected.cursor {
        background-color: rgb(255, 250, 242) !important; /* CVG-PATCH236 : re-pipette Maxou (etait rgb(215 207 194) au PATCH235) */
        border: 6px dotted #000 !important;
        outline: none !important;
        box-sizing: border-box !important;
    }
}

/* CVG-PATCH236 : Mennour - inversion des couleurs des cellules MOTEURS/MOYENS
   entre etat selectionne et non selectionne (retour Maxou 2026-08-01, 2e
   capture DevTools) : les cellules de l'artiste SELECTIONNE prennent le blanc
   chaud rgb(255 250 242) du cadre de selection (re-pipette ci-dessus), les
   cellules NON selectionnees prennent le beige #e5e1d2 = rgb(229 225 210) que
   les selectionnees portaient. Mecanique en place : les lignes moteur/moyen de
   l'artiste selectionne recoivent la classe .hover (leurs td cteg/scteg/sscteg
   a rowspan aussi, directement sur le td) ; style.css les peint par
   "#motors tr.hover td => var(--d2)" et "#means tr.hover td => var(--d1)",
   toutes deux #e5e1d2 dans le theme Mennour ; les cellules des lignes non
   selectionnees sont voilees par la cle config "#motorsDialog/#meansDialog
   tr:not(.hover):not(:hover) td.cteg/scteg/sscteg/libelle:not(.hover) =>
   #fffce9" (IsMD, non-important). On inverse les DEUX etages, listes de
   selecteurs recopiees a l'identique (garde :not(.overlay) comprise) avec
   prefixe body.P-Mennour : specificite + ordre battent style.css et la cle
   config. Meme media min551 que la cle config : le mobile garde son regime.
   Le survol souris d'une ligne non selectionnee (exclue par :not(:hover))
   continue de reveler le parchemin degrade --d3, comportement inchange ; les
   spans .short-text/.long-text survolees a la souris suivent le blanc comme
   elles suivaient le beige. Les cellules-numeros (.bg-pink/.bg-light-green =
   var(--d2)/var(--d1)) restent beiges hors selection : deja la couleur cible.
   Vars --d1/--d2 volontairement intactes : elles peignent aussi les colonnes
   de numeros de la table ARTISTES. */
@media (min-width: 551px) {
    body.P-Mennour:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Mennour #motors td.hover:not(.overlay),
    body.P-Mennour #motors tr.hover td,
    body.P-Mennour #motors tr.hover .short-text,
    body.P-Mennour #motors tr.hover .long-text,
    body.P-Mennour #motors tr:hover .short-text,
    body.P-Mennour #motors tr:hover .long-text,
    body.P-Mennour:not(.selected) #means tr:hover td:not(.overlay),
    body.P-Mennour #means td.hover:not(.overlay),
    body.P-Mennour #means tr.hover td,
    body.P-Mennour #means tr.hover .short-text,
    body.P-Mennour #means tr.hover .long-text,
    body.P-Mennour #means tr:hover .short-text,
    body.P-Mennour #means tr:hover .long-text {
        background: rgb(255, 250, 242) !important;
    }

    body.P-Mennour #motorsDialog tr:not(.hover):not(:hover) td.cteg:not(.hover),
    body.P-Mennour #motorsDialog tr:not(.hover):not(:hover) td.scteg:not(.hover),
    body.P-Mennour #motorsDialog tr:not(.hover):not(:hover) td.sscteg:not(.hover),
    body.P-Mennour #motorsDialog tr:not(.hover):not(:hover) td.libelle:not(.hover),
    body.P-Mennour #meansDialog tr:not(.hover):not(:hover) td.cteg:not(.hover),
    body.P-Mennour #meansDialog tr:not(.hover):not(:hover) td.scteg:not(.hover),
    body.P-Mennour #meansDialog tr:not(.hover):not(:hover) td.sscteg:not(.hover),
    body.P-Mennour #meansDialog tr:not(.hover):not(:hover) td.libelle:not(.hover) {
        background: rgb(229, 225, 210) !important;
    }
}

/* CVG-PATCH239 : Safari/WebKit mobile - le bandeau d'onglets MOTORS/ARTISTS/MEANS
   (table.border-gold, regime SM de tous les portraits) etait invisible : WebKit ne
   peint pas le radial-gradient pose par les configs sur le thead ni le fond
   semi-transparent du th (bug de peinture des sections de table ; les libelles
   blancs devenaient blanc-sur-creme). Constate sur BUNKER_1-4, MAVI_2024,
   Boros-Collection (audit Playwright mobile 3 moteurs, 2026-08-01). translateZ(0)
   force une couche de composition et retablit la peinture SANS toucher aux valeurs
   des configs - verifie au pixel sur BUNKER_3 et MAVI_2024 (geometrie strictement
   identique, bandeau conforme a Chromium) ; corrige au passage la rangee de liste
   peinte PAR-DESSUS le footer de MAVI_2024 (meme bug de compositing). Les 3 autres
   contournements testes (display:block, position:relative, will-change) sont
   inoperants. Scope : media mobile composite identique au regime SM de style.css +
   @supports WebKit seul (-webkit-nbsp-mode, cf. CVG-PATCH216) - Chromium et Firefox
   strictement inchanges, desktop inchange. */
@media screen and (max-width: 550px), (max-width: 1000px) and (min-height: 1000px) and (orientation: portrait) {
    @supports (-webkit-nbsp-mode: space) {
        .border-gold thead,
        .border-gold thead th {
            transform: translateZ(0);
        }
    }
}

/* CVG-PATCH240 : colonnes de numeros de la table ARTISTES - "n/a" se coupait en
   "n/" + "a" sur deux lignes en Firefox (colonne ~1px plus etroite que Chromium/WebKit,
   arrondis de table auto), d'ou des rangees d'artistes sans score plus hautes que les
   autres (constate sur /010101, audit 2026-08-01). nowrap : ces cellules ne contiennent
   que des nombres ou n/a, aucun retour a la ligne legitime, tous moteurs. */
#artists td.artist-motor,
#artists td.artist-mean {
    white-space: nowrap;
}

/* ============================================================================
   CVG-PATCH250 : popup Cryptex - volet PERSONALIZED CRYPTEX
   (retour Maxou, capture tester /mennour?cryptex du 2026-08-02).
   (1) FLECHE RETOUR SIMPLE, CALEE A GAUCHE - correctif du STANDARD (9 portraits).
       Le verrou l.283 (#player-modal button width:100% !important, pense pour
       les boutons d'action du popup) ecrase le width:45px inline de la fleche
       retour du header (button.back, modal.js modalHeader) : la fleche devenait
       une barre pleine largeur, habillee par le skin bouton generique du site
       (fond --btn creme + bordure) - le "grand bouton" de la capture, fleche
       centree dedans. Retour a une geometrie d'icone : chrome de bouton eteint,
       glyphe agrandi (26px), cale a gauche (premier enfant du flex
       .modal-header ; chez Mennour le titre span est "&nbsp;", la croix est en
       absolu : rien d'autre ne bouge). La COULEUR du glyphe n'est pas touchee -
       le style inline color:black!important reste seul maitre, comme avant.
       Le survol rouge sombre pose par la cle config MD (#player-modal
       button:hover background #8f2317) est neutralise sur la fleche : simple
       baisse d'opacite. Regles hover/focus-visible SEPAREES (piege PATCH225 :
       un :focus-visible inconnu invaliderait la liste entiere).
   (2) VOLET #payment "PRO" - scope body.P-Mennour (precedent PATCH246), les 8
       autres portraits inchanges. Le pave uniformement gras venait de
       style.css:2743 (#payment>div font-weight:700, herite par tout le volet)
       + cles config MD (15px, li 26px). Hierarchie retablie : intitules de
       section en capitales espacees discretes (p.pd-heading pose par modal.js,
       deux-points masques via span.pd-colon - conserve tel quel chez les
       autres portraits), corps en 400, puces aerees a marqueur attenue,
       "Step N:" en 600 (strong pose par modal.js - sans effet visible la ou
       tout le volet reste en 700), ligne de prix en 16px avec valeur en 600
       soulignee d'un filet. Palette = tokens Mennour existants (encre #33302a,
       filets #c4bcab, cf. PATCH192). Echelle PATCH246 respectee : 13.3
       (boutons) - 15 (volet) - 16 (corps) - 26 (titre popup).
       Le "Price : undefined" de la capture = cle Price-upon-request absente de
       la config : repli ajoute dans modal.js (commun, sans effet ou la cle
       existe). Media min-width:551px = frontiere de l'injecteur de config
       (PATCH246/235/236) : le regime SM (cles IsSM) reste strictement intact.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) fleche retour : geometrie d'icone, commune aux 9 portraits */
    #player-modal .modal-header button.back {
        width: auto !important;
        min-width: 0 !important;
        background: none !important;
        border: none !important;
        border-radius: 0 !important;
        box-shadow: none !important;
        margin: 0 !important;
        padding: 0 14px 4px 8px !important;
        font-size: 26px !important;
        line-height: 1 !important;
        cursor: pointer;
    }

    #player-modal .modal-header button.back:hover {
        background: none !important;
        opacity: .55;
    }

    #player-modal .modal-header button.back:focus-visible {
        background: none !important;
        opacity: .55;
    }

    /* (2) volet #payment Mennour : hierarchie typographique */
    body.P-Mennour #player-modal #payment > div {
        font-weight: 400 !important;
        font-size: 15px !important;
        margin-top: 16px !important;
    }

    body.P-Mennour #player-modal #payment .pd-heading {
        font-weight: 700 !important;
        font-size: 12px !important;
        letter-spacing: .14em !important;
        text-transform: uppercase !important;
        color: #33302a !important;
        margin: 0 0 8px !important;
    }

    body.P-Mennour #player-modal #payment .pd-colon {
        display: none !important;
    }

    body.P-Mennour #player-modal #payment ul {
        margin: 0 !important;
        padding-left: 18px !important;
    }

    body.P-Mennour #player-modal #payment li {
        font-weight: 400 !important;
        line-height: 22px !important;
        margin: 0 0 7px !important;
    }

    body.P-Mennour #player-modal #payment li:last-child {
        margin-bottom: 0 !important;
    }

    body.P-Mennour #player-modal #payment li::marker {
        color: #c4bcab;
    }

    body.P-Mennour #player-modal #payment li strong {
        font-weight: 600 !important;
    }

    body.P-Mennour #player-modal #payment .pay-price {
        font-size: 16px !important;
        font-weight: 400 !important;
        border-bottom: 1px solid #c4bcab;
        padding-bottom: 12px !important;
    }

    body.P-Mennour #player-modal #payment .pay-price > span {
        font-weight: 600 !important;
    }
}

/* ============================================================================
   CVG-PATCH252 : Mennour SM - lisibilite de la liste et
   barre du bas (retour Maxou, capture tester mobile 375px du 2026-08-02).
   A l'echelle mobile la page vit dans un repere local de 1600px reduit par
   transform scale(vw/1600) (checkWidth, difPMD.js) : a 375px tout est ~x0.23
   et les traits de 4px de la config (bordures de cellules, outline de
   selection) tombent a ~0.9px visuel - hairlines qui s'evanouissent sur
   telephone (meme famille que le trait 1px non peint de style.css:357).
   Scope body.P-Mennour partout : les 8 autres portraits strictement
   inchanges. Media composite = regime SM du socle (identique PATCH239).
   Verifie sur harnais Playwright (iPhone 375px, page reelle tester, config
   en base active) : captures avant/apres, ecarts mesures au dixieme.
   (1) COLONNES DE NUMEROS : bordure INTERIEURE (droite du numero de moteur,
       gauche du numero de moyen) epaissie 4->8px locaux (~1.9px visuel),
       meme couleur #4e4c1f et meme style solid que les traits existants
       (option "faire pareil qu'ailleurs" du retour) - la separation
       numeros/noms devient lisible. Les 3 autres cotes restent a 4px ;
       la variante "teinte sombre" = 1 ligne de background a la place.
   (2) CADRE DE SELECTION : option "tout simplement une bordure plus
       epaisse" - l'outline rouge de la config (4px solid, offset -2) passe
       a 12px locaux offset -12 (~2.8px visuel, anneau en plein retrait
       interieur) : meme poids visuel que le 6px dotted du regime desktop
       (PATCH235). Mecanisme outline conserve : zero impact de layout, et
       main.js lit borderTopWidth, jamais l'outline (_sbw main.js:655
       reste 0 - verifie).
   (3) BARRE DU BAS : 5 ecarts VISUELS egaux entre la boule NFT et la
       maison, qui ne bougent pas. Avant : 30.4 / 17.3 / 7.7 / 15.3 /
       17.4 px - offsets manuels des cles IsSM empiles (partage ml 307,
       img cryptex ml 62, Profil ml 12/mr 52, drapeau ml 13/mr 62, NFT
       absolu left 0 + ml 93), meme tableau qu'ADIAF PATCH175. Traitement
       structurel plutot que rustines chiffrees : .language-switcher et
       #btn-group-right passent en display:contents, leurs enfants
       deviennent des items directs du flex row-reverse space-between de
       #bottom-bar (style.css:1485) qui egalise les ecarts TOUT SEUL -
       auto-entretenu si une largeur change (Profile EN plus large...).
       Ordre visuel fige par order (row-reverse : order eleve = a gauche),
       marges de config remises a zero, bord visuel = bord de boite (img
       cryptex ml 62 -> 0, .st-btn sharethis ml -24 -> 0). ANCRES : la
       maison garde son margin-right 120 de style.css ; la boule NFT
       redevient statique (son ancre absolue #btn-group-right disparait
       avec display:contents) avec height 111px = sa hauteur d'origine (le
       disque svg se dimensionne dessus), ml 93 = reprise de l'offset
       config (bord gauche du disque inchange, ~1px pres), mr 74 = debord
       du disque PEINT au-dela de sa boite de bouton (lecon PATCH196 :
       ecarts de flux vs ecarts visuels ; le bord peint est la boite du
       svg, pas la bbox du cercle qui deborde du clip). Resultat mesure :
       5 ecarts peints a 13.5-13.6px. Bouton edit (vue Max connecte) :
       order 4, il s'insere entre le cryptex et Profil et le space-between
       resserre les ecarts en restant egaux.
   ========================================================================== */
@media screen and (max-width: 550px), (max-width: 1000px) and (min-height: 1000px) and (orientation: portrait) {

    /* (1) colonnes de numeros : bordure interieure lisible */
    body.P-Mennour #artists td.artist-motor {
        border-right-width: 8px !important;
    }

    body.P-Mennour #artists td.artist-mean {
        border-left-width: 8px !important;
    }

    /* (2) cadre de selection : epaississement simple, meme mecanisme.
       Offset -12 = anneau ENTIEREMENT a l'interieur du div (retour Maxou
       2026-08-03 : a -6, la moitie exterieure de la bande droite sortait de
       la fenetre — #selected finit a ~375.3px pour un ecran de 375 — et le
       cote droit paraissait rogne ; en plein retrait l'anneau ne depend
       plus d'aucun espace exterieur, sur aucun cote).
       Recalage horizontal (retour Maxou 2026-08-03, "a gauche un chouia
       decale") : la config pose margin-left 24px et width 1596px, mais le
       conteneur #artistsScroll a un padding-left de 19px et le tableau
       fait 1600px — le div etait donc 5px locaux trop a droite (liseret
       clair a gauche du cadre) et 4px trop court. margin-left 19 = le
       padding du scroll, donc l'origine exacte du tableau ; width 1600 =
       la largeur du tableau. Mesure harnais : div a x=0.00/375.00 =
       bords du tableau au centieme, anneau plein aux 4 cotes. */
    body.P-Mennour #artistsScroll > div#selected.cursor {
        outline-width: 12px !important;
        outline-offset: -12px !important;
        margin-left: 19px !important;
        width: 1600px !important;
    }

    /* (3) barre du bas : 5 ecarts egaux entre boule NFT et maison */
    body.P-Mennour #bottom-bar div.language-switcher,
    body.P-Mennour #bottom-bar #btn-group-right {
        display: contents !important;
    }

    body.P-Mennour #bottom-bar a.btn-home { order: 1; }

    body.P-Mennour #bottom-bar div.language-switcher > a.en,
    body.P-Mennour #bottom-bar div.language-switcher > a.fr {
        order: 2;
        margin: 0 !important;
    }

    body.P-Mennour #bottom-bar a.portrait-profile-link {
        order: 3;
        margin: 0 !important;
    }

    body.P-Mennour #bottom-bar button.edit { order: 4; }

    body.P-Mennour #bottom-bar button#dwnld-dtn {
        order: 4;
        margin: 0 !important;
    }

    body.P-Mennour #bottom-bar button#dwnld-dtn img {
        margin-left: 0 !important;
    }

    body.P-Mennour #bottom-bar div.sharethis-inline-share-buttons {
        order: 5;
        margin: 0 !important;
        width: auto !important;
    }

    body.P-Mennour #bottom-bar div.sharethis-inline-share-buttons .st-btn {
        margin-left: 0 !important;
    }

    body.P-Mennour #bottom-bar button#NFT-btn {
        order: 6;
        position: static !important;
        height: 111px !important;
        margin: 0 74px 0 93px !important;
    }
}

/* ============ HEADER DESKTOP : DRAPEAU / CRYPTEX / SHARE / SIGNATURE ========
   CVG-PATCH253 (retours Maxou, capture tester /Mennour
   2026-08-01). Quatre retouches du bandeau, DESKTOP uniquement. Etat des lieux
   mesure par Playwright (tester, 1280px, les 9 portraits, 2026-08-01).

   (1) DRAPEAU = HAUTEUR DU BOUTON PROFIL. Le drapeau etait plus petit que le
   bouton (img width:45px, style.css:667 : Union Jack 26.75px de haut, tricolore
   33px - les deux svg n'ont pas le meme ratio). On pilote desormais la HAUTEUR
   (width:auto = chaque drapeau garde son ratio), calee sur la hauteur rendue du
   bouton Profil de chaque portrait qui AFFICHE le drapeau en desktop
   (line-height + paddings + bordures, valeurs mesurees) : Mennour 34,
   Adiaf 38, BRM 39.5, Billarant 42, MAVI_2024 45.5. Les 4 autres (Boros,
   010101, BUNKER_3, Stoschek) masquent le drapeau en desktop : le defaut 34px
   n'y est pas visible. Si un bouton Profil change en base, la valeur jumelle
   est a rejouer ici. La bordure 3px transparente de style.css:669 est
   conservee (reservee a l'etat .active, jamais atteint sur ces pages) :
   le centrage flex du conteneur absorbe l'encombrement, comme avant. */
@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {
    .language-switcher img {
        height: 34px !important;
        width: auto !important;
    }
    body.P-Adiaf .language-switcher img { height: 38px !important; }
    body.P-BRM .language-switcher img { height: 39.5px !important; }
    body.P-Billarant .language-switcher img { height: 42px !important; }
    body.P-MAVI_2024 .language-switcher img { height: 45.5px !important; }
}

/* (2) CRYPTEX MENNOUR : milieu vertical aligne sur la boule NFT. La config MD
   Mennour pose margin-top:-9px sur #dwnld-dtn>img (les 8 autres portraits :
   aucun margin-top) ; valeur prescrite par Maxou : -6px. Media min551 =
   frontiere exacte de l'injecteur de config (meme choix que PATCH235/236),
   le regime SM garde ses cles. */
@media (min-width: 551px) {
    body.P-Mennour #dwnld-dtn > img {
        margin-top: -6px !important;
    }
}

/* (3) GLYPHE SHARE : correction OPTIQUE de centrage. Mesure gBCR : l'img est
   centree dans le disque au 1/10 de pixel pres - mais le pictogramme
   (feather share-2, share_icon.svg) porte 2 pastilles a DROITE (cx=18) pour
   une seule a gauche (cx=6) : centroide d'encre a 13.56 pour un viewBox
   centre a 12, soit ~2.3px de masse deportee a droite dans l'icone rendue en
   36px - c'est ce que l'oeil percoit comme un decentrage. Valeur et levier
   arretes par Maxou dans DevTools (2026-08-02) : left -3px sur l'img, deja en
   position:relative (style.css:976) - rien d'autre a faire, sinon le porter
   ICI et non dans style.css (fichier partage) : cette feuille, chargee en
   dernier, bat le left:0 !important de style.css:978 a l'ordre, a specificite
   egale. Remplace le translateX(-2px) initial du chantier (calcul centroide)
   par la valeur validee a l'oeil. Le svg lui-meme n'est pas touche : il sert
   aussi au bouton offline des layouts et l'URL d'icone cote ShareThis pointe
   le fichier deploye sans buster (cache navigateur long). */
@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {
    #st-1 .st-btn > img {
        left: -3px !important;
    }
}

/* (4) SIGNATURE "par Maxime Chanson" : couleur de lien dediee pour Mennour.
   Retour Maxou 2026-08-02 : PAS de souligne - le signal de clicabilite passe
   par la couleur seule. Les configs posent deja des couleurs de lien
   par-portrait (Adiaf bleu, BUNKER/MAVI teal, 010101 rose deja souligne par sa
   config...), toutes conservees telles quelles (contrat d'en-tete : aucune
   couleur verrouillee pour les 8 autres). Mennour seul etait illisible (lien
   #33302a sur tagline #000) : taupe #756b5c du bouton Profil (PATCH214),
   survol rouge #d23520 (convention CTA Mennour, PATCH212/217) - demande
   "couleur elegante et dans le theme, qui explicite qu'il est cliquable".
   La DESTINATION du lien est unifiee par blocks.js (meme marqueur). */
@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {
    body.P-Mennour .upperTitle > a,
    body.P-Mennour .upperTitle > a:visited {
        color: #756b5c !important;
        transition: color .15s ease;
    }
    body.P-Mennour .upperTitle > a:hover {
        color: #d23520 !important;
    }
}

/* (5) BOULE NFT MENNOUR : lettres un peu plus contrastees (retour Maxou
   2026-08-02, "couleur un peu plus forte legerement"). La config MD peint les
   9 paths des lettres en #8f8a82 !important (cle .lettersNFT path) sur une
   boule dont le degrade va du blanc au #9b958a (cle #gradientColorChange) :
   lettres et bord de boule quasi au meme ton, lettres delavees. Un cran plus
   fort avec le taupe du theme #756b5c (celui du bouton Profil PATCH214 et de
   la signature - couleur deja pipettee par Maxou) : meme famille chaude, pas
   de rupture. Une piste brightness(0.5) dort d'ailleurs, desactivee, dans la
   cle config. Scope Mennour : seul portrait a boule svg animee (les autres
   affichent le gif nft-desktop), et leurs configs restent maitresses si l'un
   y revenait. Media min551 = frontiere de la cle config MD ; le regime SM
   (lettres blanches sur boule rouge #d23520) reste strictement intact. */
@media (min-width: 551px) {
    body.P-Mennour .lettersNFT path {
        fill: #756b5c !important;
    }
}


/* CVG-PATCH255 (ramasse de claude/typo-libelles-verticaux) : libelles
   verticaux des tableaux - corps -6%,
   tracking .05em, graisse 500. Retour Maxou du 2026-08-02 : apres le retrait
   de la graisse par PATCH234 le rendu est "revenu a la version originale,
   trop faible" ; demande = "typo un chouia plus petite, lettres mieux
   espacees, un chouia plus grasses". Pose ICI et pas dans le bloc
   PATCH232+234 de style.css : style.css est un fichier partage interdit aux
   taches de fond ; cette feuille charge APRES style.css (contrat PATCH183),
   donc a specificite egale ces declarations remplacent le tracking .03em, et
   le !important de largeur sscteg bat celui de style.css par l'ordre. A
   fusionner dans le bloc de style.css au ramassage si souhaite.
   font-size RELATIVE (.94em) : multiplie les tailles heritees et preserve la
   hierarchie (niveaux 1-2 a 1.7rem via body, sscteg a .8em via la regle
   #motorsDialog/#meansDialog de style.css, libelle a .7em).
   La graisse 500 se resout en Segoe UI Semibold (~+10% de chasse) : les
   largeurs de conteneurs de PATCH234 (227/336/235) doivent remonter a
   238/353/247 (margin-left = -(largeur-214|317|222)/2 pour garder le
   centrage apres rotate(-90), meme technique que PATCH234) - sans quoi
   METAPHYSICAL PROJECT, WORK-ENVIRONMENT RELATIONSHIP, ASSOCIATING AN
   ACTION, ASSOCIANT UNE ACTION, UTILISATION VISCERALE gagnent une ligne.
   Zero retour a la ligne supplementaire verifie sur prod FR et EN sur les
   ~87 libelles par injection (2026-08-02). L'encre #302f2e de Mennour
   (PATCH234, style.css) est une propriete disjointe, inchangee. Media
   min-width 551px : meme frontiere que l'injecteur de config (PATCH235/236),
   le regime SM reste hors perimetre ; a 375px la table verticale n'est pas
   generee. */
@media (min-width: 551px) {
    .vertical-textw {
        font-size: .94em;
        letter-spacing: .05em;
        font-weight: 500;
    }

    .wra div {
        width: 238px;
        margin-left: -12px;
    }

    .wraB div {
        width: 353px;
        margin-left: -18px;
    }

    td.sscteg div.vertical-textw {
        width: 247px !important;
        margin-left: -12px;
    }
}

/* CVG-PATCH257 : Mennour SM - trois retours Maxou (capture smartphone du
   2026-08-03, ligne DANIEL BUREN selectionnee sur tester, buster 03b donc
   PATCH252 mobile deja en place - toutes les mesures ci-dessous incluent son
   etat). Ramassage de claude/mennour-sm-cadre-bulle (8d823ae), bloc reajuste
   au ramassage : cause du (1) re-attribuee au bloc PATCH252 ci-dessus (et non
   a la seule cle config), et correctif du cadre repasse dans le MEME media
   composite que la regle qu'il corrige.
   (1) CADRE ROUGE decale d'un pixel a droite : le bloc PATCH252 pose
   margin-left 19px !important + width 1600px !important sur #selected (et la
   cle config SM margin-left 24px !important en dessous) pendant que
   margin-right se resout seul -> marges calculees 19/29.7px, tout le cadre
   glisse de ~5px locaux vers la gauche (mesure : bord droit du cadre 1.26px
   ecran EN RETRAIT du bord droit de la table, bord gauche debordant
   d'autant). Marges auto des deux cotes, posees APRES le bloc 252 dans le
   meme media composite : a selecteur identique et !important egal, le
   dernier gagne ; deltas mesures 0.000px des deux cotes apres injection sur
   tester. La geometrie inline de main.js (top/height) est intacte, les
   outline-width/offset 12px du 252 aussi. */
@media screen and (max-width: 550px), (max-width: 1000px) and (min-height: 1000px) and (orientation: portrait) {
    body.P-Mennour #artistsScroll > div#selected.cursor {
        margin-left: auto !important;
        margin-right: auto !important;
    }
}

/* CVG-PATCH257 (suite) : regime SM strict (max-550 = frontiere des cles IsSM
   de l'injecteur, seul regime ou vivent les noms Bebas Neue majuscules et la
   bulle 52px mesures ici ; le MD - noms Segoe casse mixte, cadre 6px dotted
   PATCH235 - et les 8 autres portraits restent strictement intacts).
   (2) NOMS optiquement trop hauts dans leur cellule : la boite de ligne est
   centree (4.92px d'ecart de part et d'autre) mais l'ENCRE de Bebas Neue ne
   l'est pas - descente de fonte 22/64e quasi vide sous des capitales collees
   a l'ascendante (mesure canvas actualBoundingBox : encre 8.67px ecran
   au-dessus vs 9.84 en dessous). Descente de 2.5px locaux par marges
   compensees (PAS de position:relative : le div deviendrait le bloc
   contenant de la bulle absolue et fausserait left/top). Apres correctif :
   9.26/9.49, residu sous le demi-pixel ecran.
   (3) BULLE Visitez sa page plus petite et centree sur le nom : etait
   52px/min-width 326px/padding 7px 28px (bloc mobile style.css), pilule de
   22px ecran sur des lignes de 29px. Reduite a 40px sans largeur minimale,
   padding 5px 24px -> 17px ecran (-23%). Le centrage VERTICAL est deja fait
   par centerArtistBubble (top inline !important au milieu de la ligne,
   PATCH196) + translateY(-50%) : une fois l'encre du nom recentree par (2),
   centre de ligne = centre optique du nom (delta mesure 0.59px).
   L'uppercase herite des noms (VISITEZ SA PAGE) est conserve. min-width 0 et
   font-size en !important : battent les !important du bloc mobile de
   style.css (min-width 326px l.1704, 52px l.1715) par specificite et ordre.
   Verification : injection du bloc a chaud sur tester (sonde playwright,
   viewport 375), mesures et captures avant/apres, rendu valide par Maxou le
   2026-08-03. */
@media (max-width: 550px) {
    body.P-Mennour #artists td.artistName div.artist-name {
        margin-top: 2.5px;
        margin-bottom: -2.5px;
    }

    body.P-Mennour #artists td.artistName div.tooltip2 {
        min-width: 0 !important;
        padding: 5px 24px !important;
    }

    body.P-Mennour #artists td.artistName div.artist-name div.tooltip2 a {
        font-size: 40px !important;
    }
}

/* ============================================================================
   CVG-PATCH274 (+274b +274c, retours Maxou 2026-08-06) : STOSCHEK - reskin
   "NOIR / BLEU ELECTRIQUE" (combinaison n°8 de la charte 2027 "noir dominant
   + un accent"), DESKTOP UNIQUEMENT.
   274c : la surbrillance de la selection passe des aplats colores aux
   BORDURES bleu electrique sur nuances de gris, encre renforcee (mockup
   DevTools de Maxou) - details au bloc surbrillance ci-dessous.
   274d (retours Maxou 2026-08-06 soir) : davantage de noir et fin des trois
   entetes monochromes ("trop lourd") - premiere reponse : ailes noires,
   centre bleu. ANNULEE par 274e.
   274e (Protocoles C1C2 v6 + assignation v1, fournis par Maxou) : le couple
   n8 Noir/Bleu electrique est du registre ACCENT UNIQUE (le noir
   typographique occupe le role de C1, hors jeu de l'assignation des zones).
   Le montage 274d violait R1 (centre bleu plein non domine par les ailes =
   cas d'ecart A-01 "centre plein") et R6 (ailes noires = faire porter a
   MOTORS le noir typographique). Assignation conforme retenue = A-05
   "ailes jumelles" : MOTEURS = MOYENS = bleu electrique plein (Z9 : titres
   blancs sur aplat plein, K 8,4 >= 4,5), ARTISTES = BLANC + FILET (Z2
   strictement domine, discernable par filet, R2c, delta = 0). Le
   "davantage de noir" passe par la typographie (Z8, graisses 700 de 274c),
   seule voie du registre. Bordures du chemin selectionne 3px -> 4px
   ("plus epais, peut-etre 4px" ; en border-collapse le 4px bat toujours
   les filets, y compris les 2px forces par les gardes PATCH213/216).
   274f (arbitrage Maxou 2026-08-06 : "en aucun cas le gris ne peut compter
   comme C1 [...] on est dans le cas C1 noir, alors il faut du C1, et le C2
   soit les liseres epais") : le C1 NOIR prend les zones - ailes jumelles
   MOTEURS = MOYENS en NOIR PLEIN, titres blancs (Z9, K 18,9), ARTISTES
   inchange (blanc + filet, titre noir ; R1/R2c tiennent a l'identique) -
   et le C2 BLEU se replie sur les LISERES EPAIS uniquement (cadre de
   selection 11px, bordures du chemin 4px), sur le modele de la tuile 32
   "Carbone / Lisere rouge" ("le rouge n'apparait qu'en filets"). Les
   aplats bleus 100% restants sont convertis en noir : bulle artiste,
   boutons du popup cryptex, bandeau titre de modale, cellules actives du
   schema. Restent bleus : les liseres, la boule NFT et le lien signature
   (mentions Z10), et les PALIERS palés Z4 (colonnes de numeros,
   clignotement) qui sont des dilutions, pas des aplats.
   Palette : blanc #ffffff (la reserve), noir #111111 = C1 (typographie ET
   zones : ailes MOTEURS/MOYENS, bulle artiste, boutons - arbitrage 274f),
   bleu electrique #1E40EB = C2 en LISERES EPAIS (cadre de selection 11px,
   bordures du chemin 4px, lisere du bouton cryptex) et mentions (boule
   NFT, lien signature - retour 274b : "a aucun endroit je ne vois le
   bleu"), et deux degrades -
   274g (retour Maxou : "la couleur ne peut descendre sous un certain seuil
   de presence, ici pas encore atteint - meilleur equilibre") : plancher de
   presence C2 - le 274f etait tombe a un ratio noir/bleu de 10,8. Deux
   remontees, sans recreer d'aplat : LISERE BLEU EPAIS 8px sous les deux
   ailes noires (le dispositif de la charte : bande couleur sous le bloc
   titre noir des tuiles), et colonne de numeros cote MOYENS passee du gris
   au BLEU PALE (palier 22% de C2, symetrique du cote moteurs - le gris
   redevient pur neutre de grille). Ratio noir/bleu mesure au harnais :
   10,8 -> voir commit. -
   gris clair #c7c7c7 (degrade du noir) et bleu pale #c9d1fa (degrade du
   bleu) - pour la surbrillance des lignes MOTEURS (bleu pale) / MOYENS
   (gris) quand un artiste est selectionne, et les colonnes de numeros.
   Mecanique : variables du theme (--d2 = moteurs, --d1 = moyens, cf.
   style.css:412/427 et .bg-pink/.bg-light-green) redeclarees sur
   body.P-Stoschek - la config les pose inline sur <html>, tout descendant
   resout la valeur la plus proche ; les cles CSS de config qui posent des
   couleurs EN DUR (gradients violets/verts, cadre rose #ff8686, theads
   grises, popup mauve...) sont battues une a une par des regles scopees
   body.P-Stoschek : ce fichier charge APRES le style de config injecte
   (contrat PATCH183), specificite + ordre gagnent.
   PERIMETRE (retours 274b) : TOUT est enferme dans la media min-551 - le
   regime SMARTPHONE reste STRICTEMENT d'origine (les cles de config non
   flaguees, qui s'appliquent aussi en SM, ne sont battues qu'en desktop),
   et les ASSETS sont intouchables : gif du bouton cryptex (le hue-rotate
   CSS du premier jet est RETIRE - interdit d'y toucher), video d'intro
   (jamais touchee, son filtre de config conserve), gifs nft. La meta
   theme-color (cle browser-color en base) reste en base. DOCTRINE 310
   (Maxou 2026-08-10) : la valeur de browser-color = la couleur LA PLUS
   SOMBRE du fond du header du portrait, pour que le chrome du navigateur
   mobile prolonge le header (Stoschek : #30126A, pose par SQL en base -
   la regle vaut pour tous les portraits, alignement des autres a faire
   portrait par portrait en base, pas dans ce fichier).
   Typographie, geometrie et animations strictement intactes ; les 8 autres
   portraits strictement inchanges (scope partout).
   ========================================================================== */

/* --- Tokens + variables de theme, DESKTOP SEULEMENT (274b : les variables
   sont aussi consommees par le regime SM - s'ils etaient poses hors media,
   bg-pink/bg-light-green, --btn, --anime-*, --selected-border... changeraient
   le smartphone ; dans la media, le SM resout les valeurs d'origine posees
   inline sur <html> par la config) ------------------------------------------ */
@media (min-width: 551px) {
    body.P-Stoschek {
        --stk-noir: #111111;
        --stk-bleu: #002AFF; /* 276 : plus d'intensite (etait 1E40EB, bleu ADIAF) - retour Maxou */
        --stk-gris: #c7c7c7;
        --stk-bleu-pale: #c9d1fa;

        /* surbrillance selection + colonnes de numeros : moteurs / moyens */
        --d2: var(--stk-bleu-pale);
        --d2-t: var(--stk-noir);
        --d2-t-highlighted: var(--stk-noir);
        --d1: var(--stk-bleu-pale); /* 274g : gris -> palier bleu (seuil C2) */
        --d1-t: var(--stk-noir);
        --d1-t-highlighted: var(--stk-noir);

        /* cellules categories des tableaux lateraux : blanc, encre noire */
        --d3: #ffffff;
        --d3-t: var(--stk-noir);

        /* entetes MOTEURS (--d4) / MOYENS (--d5) : ailes jumelles NOIRES,
           titres blancs (274f - C1 = noir prend les zones ; ARTISTES en
           blanc + filet, voir bloc entetes) */
        --d4: var(--stk-noir);
        --d4-t: #ffffff;
        --d4-t2: #ffffff;
        --d5: var(--stk-noir);
        --d5-t: #ffffff;
        --d5-t2: #ffffff;

        --upper-title-color-d: var(--stk-noir);

        /* boutons, cadres, bulles, modales */
        --btn: #ffffff;
        --btn-t: var(--stk-noir);
        --hover-cursor-border: 3px dashed var(--stk-bleu);
        --info-badge-bg: var(--stk-noir);
        --info-badge-fg: #ffffff;
        --anime-bg: var(--stk-noir);
        --anime-text: #ffffff;
        --anime-title-bg: var(--stk-noir); /* 274f : aplat bleu -> noir */
        --anime-link-t: var(--stk-bleu-pale);
        --see-motor: var(--stk-bleu-pale);
        --see-mean: var(--stk-bleu-pale);
        --cryptex-title-color: var(--stk-noir);
        /* 274f : bouton commande cryptex - aplat noir, lisere bleu epais,
           survol bleu (le bleu n'est plus un fond au repos) */
        --cryptex-order-btn-bg: var(--stk-noir);
        --cryptex-order-btn-border: 2px solid var(--stk-bleu);
        --cryptex-order-btn-hover: var(--stk-bleu);
        --skip-hover-bg: rgba(0, 42, 255, .22); /* 276 : suit --stk-bleu */

        background: #ffffff !important;
    }

    /* schema.js lit --motor/--means-cell-active-* par getComputedStyle sur
       <html>, ou la config les pose en style inline : seul un !important
       d'auteur sur html les bat. :has requis pour scoper html par le
       portrait ; navigateur sans :has = degradation douce (cellule active du
       schema orange/verte d'origine). Dans la media : le schema du regime SM
       garde ses couleurs d'origine (274b). */
    html:has(body.P-Stoschek) {
        /* 274f : cellules actives du schema en noir (aplat bleu supprime) */
        --motor-cell-active-color: #111111 !important;
        --motor-cell-active-text-color: #ffffff !important;
        --means-cell-active-color: #111111 !important;
        --means-cell-active-text-color: #ffffff !important;
    }
}

/* --- Cles de config NON flaguees (injectees hors media, donc actives aussi
   en SM) : battues dans la media desktop UNIQUEMENT - en dessous de 551px
   elles continuent de s'appliquer telles quelles (274b : smartphone intact).
   Le gif du bouton cryptex et la video d'intro ne sont PAS touches (le
   hue-rotate du premier jet sur #dwnld-dtn > img est retire, assets
   interdits - consigne Maxou 2026-08-06). ---------------------------------- */
@media (min-width: 551px) {
    body.P-Stoschek #artists table {
        background-color: #ffffff !important;
    }

    body.P-Stoschek #artistsScroll > div.col.col-mean {
        background: var(--stk-bleu-pale) !important; /* 274g : gris -> palier bleu */
    }

    /* 274c (mockup DevTools Maxou 2026-08-06) : la surbrillance de l'artiste
       selectionne joue sur les BORDURES bleu electrique, des NUANCES DE GRIS
       et une encre renforcee - plus d'aplats colores (les cles config
       posaient des gradients violet/vert sur ces memes selecteurs, listes
       recopiees a l'identique). Proprete des traits demandee ("bordure egale
       partout, pas de doubles") : bordures posees UNIQUEMENT sur les td -
       jamais sur les spans .short-text/.long-text, source des doubles traits
       du mockup - et tables en border-collapse (style.css:331) : les aretes
       partagees fusionnent, le 2px bleu bat le 1px gris voisin, epaisseur
       unique partout. */

    /* grille de fond des deux tableaux : 274i (precision Maxou) - traits
       NOIRS et 2px PARTOUT (le gris 1px du socle etait invisible ; >1px
       demande, 2px maxi ; la largeur n'est plus laissee au socle, les
       gardes sous-pixel PATCH213/216 forcaient deja 2px sous
       Firefox/WebKit, Chrome restait a 1px). Le chemin selectionne garde
       ses 4px bleus : selecteurs plus specifiques, et en border-collapse
       le 4px gagne les aretes partagees. */
    body.P-Stoschek #motors td,
    body.P-Stoschek #means td {
        border-color: var(--stk-noir) !important;
        border-width: 2px !important;
    }

    /* aplats du chemin selectionne : gris clair sur les lignes de texte */
    body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Stoschek #motors td.hover:not(.overlay),
    body.P-Stoschek #motors tr.hover,
    body.P-Stoschek #motors tr.hover td,
    body.P-Stoschek:not(.selected) #means tr:hover td:not(.overlay),
    body.P-Stoschek #means td.hover:not(.overlay),
    body.P-Stoschek #means tr.hover,
    body.P-Stoschek #means tr.hover td {
        background: #e9e9e9 !important;
    }

    /* gris plus soutenu sur les cellules de hierarchie du chemin */
    body.P-Stoschek #motors td.cteg.hover,
    body.P-Stoschek #motors td.scteg.hover,
    body.P-Stoschek #motors td.sscteg.hover,
    body.P-Stoschek #means td.cteg.hover,
    body.P-Stoschek #means td.scteg.hover,
    body.P-Stoschek #means td.sscteg.hover {
        background: var(--stk-gris) !important;
    }

    /* (274k, fond bleu + chiffre blanc sur les paves de numeros du chemin :
       RETIRE par 274l apres essai sur tester - "pas beau" ; le relais
       visuel est repris par le POURTOUR 6px ci-dessous, cf. Z13 v2) */

    /* spans de texte du chemin : style.css les repeint via --d2/--d1 (chez
       Stoschek = teintes des colonnes de numeros) - recopie de ses listes de
       selecteurs pour les caler sur le gris clair et l'encre noire */
    body.P-Stoschek #motors tr.hover .short-text,
    body.P-Stoschek #motors tr.hover .long-text,
    body.P-Stoschek #motors tr:hover .short-text,
    body.P-Stoschek #motors tr:hover .long-text,
    body.P-Stoschek #means tr.hover .short-text,
    body.P-Stoschek #means tr.hover .long-text,
    body.P-Stoschek #means tr:hover .short-text,
    body.P-Stoschek #means tr:hover .long-text {
        background: #e9e9e9 !important;
        color: var(--stk-noir) !important;
    }

    /* noir plus prononce en police : titres de blocs du chemin en 700 */
    body.P-Stoschek #motors tr.hover .short-text,
    body.P-Stoschek #means tr.hover .short-text {
        font-weight: 700 !important;
    }

    /* POURTOUR de la zone selectionnee - 281 (retour Maxou, soulignes
       verts : "border l'exterieur de la zone grise, pas l'interieur des
       cellules"). Les bordures CSS par cellule des 274l/276/280 sont
       RETIREES pour l'etat selectionne : une bordure CSS couvre toujours
       tout le cote d'une cellule, elle ne peut pas suivre le contour en
       escalier de l'union (cteg 8 lignes, scteg 4, sscteg 2, bande 1).
       Le pourtour est desormais TRACE par le module 281 de blocks.js :
       un SVG en overlay dans #motors-scroll / #means-scroll, chemin
       calcule sur la geometrie reelle des cellules .hover, trait 6px
       entierement a l'interieur de la zone, redessine sur changement de
       classes (MutationObserver), resize et load. L'interieur retombe
       partout sur la grille noire 2px. Ne reste en CSS que le SURVOL de
       pre-selection : la hierarchie n'y est pas encore surlignee, la zone
       est un simple rectangle (la ligne), donc quatre cotes suffisent. */
    body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:not(.overlay) {
        border-top: 6px solid var(--stk-bleu) !important;
        border-bottom: 6px solid var(--stk-bleu) !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:first-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:first-child:not(.overlay) {
        border-left: 6px solid var(--stk-bleu) !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:last-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:last-child:not(.overlay) {
        border-right: 6px solid var(--stk-bleu) !important;
    }

    /* support de l'overlay 281 : conteneurs positionnes (le socle ne les
       positionne pas), trace au-dessus des cellules, transparent aux
       clics ; scrolle avec le contenu (enfant absolu du conteneur
       scrollable) */
    body.P-Stoschek #motors-scroll,
    body.P-Stoschek #means-scroll {
        position: relative;
    }

    body.P-Stoschek svg.stk-outline {
        position: absolute;
        pointer-events: none;
        z-index: 2;
        overflow: visible;
    }

    /* clignotement d'attention (lien "voir le moteur/moyen") : rose du socle
       (#ffd9d6, style.css:552) -> bleu pale */
    body.P-Stoschek #motors tr.clinotte td,
    body.P-Stoschek #means tr.clinotte td,
    body.P-Stoschek #artists tr.clinotte td.artistName {
        background-color: var(--stk-bleu-pale) !important;
    }

    body.P-Stoschek #artists tr.with-data td.artistName:hover {
        background-color: var(--stk-bleu-pale) !important;
    }

    /* filets des colonnes de numeros : 280 - seules les aretes VERTICALES
       sont bleues. Le border-color global du 274h teintait les quatre
       cotes du "border: 2px solid transparent" du socle (style.css:1256),
       d'ou un trait bleu horizontal entre chaque artiste - et une DOUBLE
       ligne partout ou le gabarit difPMD intercale une ligne vide
       (generateArtistBlockDesktop ouvre chaque bloc par un <tr> a trois
       <td> vides : ses bords haut et bas se retrouvaient cote a cote).
       Haut et bas rendus transparents : les deux liseres verticaux
       courent sans interruption, aucun trait horizontal. */
    body.P-Stoschek #artists tbody tr td:first-child,
    body.P-Stoschek #artists tbody tr td:last-child {
        border-left-color: var(--stk-bleu) !important;
        border-right-color: var(--stk-bleu) !important;
        border-top-color: transparent !important;
        border-bottom-color: transparent !important;
    }

    /* 280 : ligne de l'artiste selectionne - aucun LISERE BLANC dans la
       bande bleu pale (retour Maxou). Le "border: 2px solid transparent"
       du socle laissait passer le blanc de la table autour des cellules
       de numeros ; on peint la bande de fond ET les 2px de bordure de la
       meme teinte, cellule de nom comprise : le fond est continu d'un
       bord a l'autre de la ligne. */
    body.P-Stoschek #artists tbody tr.artist-row.hover td,
    body.P-Stoschek #artists tbody tr.artist-row td.artistName.hover,
    body.P-Stoschek #artists tbody tr.artist-row:has(td.artistName.hover) td {
        background-color: var(--stk-bleu-pale) !important;
        border-top-color: var(--stk-bleu-pale) !important;
        border-bottom-color: var(--stk-bleu-pale) !important;
    }

    /* boule NFT (svg, pas un asset gif) : degrade recentre sur le bleu
       electrique ; la config posait un hue-rotate(62deg) IsMD sur le
       conteneur qui aurait fausse la teinte. En SM la boule garde son
       #158CFF d'origine (rien ne s'applique sous 551px). */
    body.P-Stoschek .main_animation_conteiner {
        filter: none !important;
    }

    body.P-Stoschek #gradientColorChange {
        stop-color: #002AFF !important; /* 276 : suit --stk-bleu */
    }

    body.P-Stoschek a.btn-home svg {
        background-color: var(--stk-noir) !important;
    }

    /* emphase rouge du descriptif cryptex (posee dans le CONTENU en base,
       hors palette) : ramenee a l'accent bleu */
    body.P-Stoschek #player-modal em,
    body.P-Stoschek #player-modal em span {
        color: var(--stk-bleu) !important;
    }
}

/* --- Regime desktop (frontiere des cles IsMD de l'injecteur) --------------- */
@media (min-width: 551px) {
    /* titre et signature : encre noire plate, lien = accent. 274c : graisse
       700 (config : 500 !important) - "noir plus prononce en police" */
    body.P-Stoschek h1.title {
        color: var(--stk-noir) !important;
        text-shadow: none !important;
        font-weight: 700 !important;
    }

    /* 274h : le mot COLLECTION du titre porte l'accent C2 (span pose par
       blocks.js, Stoschek uniquement ; hors media = smartphone intact) */
    body.P-Stoschek .title .stk-c2 {
        color: var(--stk-bleu) !important;
    }

    /* 276 : le sous-titre WELT AM DRAHT en italique sobre - graisse
       normale contre le 700 du titre, chasse legerement aeree ; span pose
       par blocks.js comme stk-c2, sans style hors Stoschek/desktop */
    body.P-Stoschek .title .stk-sub {
        font-style: italic;
        font-weight: 400 !important;
        letter-spacing: .04em;
    }

    body.P-Stoschek .upperTitle {
        color: var(--stk-noir) !important;
    }

    body.P-Stoschek .upperTitle > a,
    body.P-Stoschek .upperTitle > a:visited {
        color: var(--stk-bleu) !important;
        transition: color .15s ease;
    }

    body.P-Stoschek .upperTitle > a:hover {
        color: var(--stk-noir) !important;
    }

    /* entetes des trois colonnes (274f - arbitrage Maxou : C1 = noir prend
       les zones) : MOTEURS = MOYENS = NOIR PLEIN (Z1 = Z3 = C1, ailes
       jumelles, delta = 0, R2c), titres blancs (Z9 : blanc sur aplat plein
       uniquement, K 18,9 >= 4,5) ; ARTISTES = BLANC + FILET gris (Z2
       strictement domine par les deux ailes - R1 - et discernable par
       filet - R2/D2 -, titre en noir typographique Z8). Ni centre plein
       (ecart A-01/R1, montage 274d annule), ni trois barres uniformes
       (ecart A-02, montage 274b), ni gris jouant le role de C1. */
    body.P-Stoschek #motors thead th,
    body.P-Stoschek #means thead th {
        background: var(--stk-noir) !important;
        /* 274j (retour Maxou sur tester) : le lisere bleu epais des 274g/h
           (8 puis 10px) est SUPPRIME - "je ne veux pas la grosse barre bleue
           en haut" : pose en border-bottom du thead, il se lisait comme une
           barre en tete de chaque colonne. Le C2 reste porte par les
           liseres verticaux des colonnes de numeros, le cadre de selection,
           les bordures 4px du chemin et le mot COLLECTION. */
        border-bottom: none !important;
    }

    body.P-Stoschek #artists thead th {
        background: #ffffff !important;
        /* 274j : le filet gris 1px etait "quasi invisible" (retour Maxou) -
           cadre NOIR 2px, meme regle que la grille des tableaux (noir,
           superieur a 1px, 2px maxi). C'est lui qui porte D2 pour le centre
           blanc : le filet est l'operateur de discernabilite, il doit se
           voir. Barre bleue du 274h supprimee ici aussi. */
        border: 2px solid var(--stk-noir) !important;
    }

    body.P-Stoschek div#motors thead th h1,
    body.P-Stoschek div#means thead th h1 {
        color: #ffffff !important;
        text-shadow: none !important;
    }

    body.P-Stoschek #artists thead th h1 {
        color: var(--stk-noir) !important;
        text-shadow: none !important;
    }

    body.P-Stoschek div#motors thead th small,
    body.P-Stoschek div#means thead th small {
        color: #ffffff !important;
    }

    body.P-Stoschek #artists thead th small {
        color: var(--stk-noir) !important;
    }

    /* encre des tableaux */
    body.P-Stoschek #motors a,
    body.P-Stoschek #means a,
    body.P-Stoschek #artists a,
    body.P-Stoschek #artists td.artist-motor,
    body.P-Stoschek #artists td.artist-mean {
        color: var(--stk-noir) !important;
    }

    body.P-Stoschek .artist-name {
        color: var(--stk-noir) !important;
    }

    /* colonnes de numeros : la bande bleu pale (moteurs) / grise (moyens)
       reprend la barre d'echantillons de la charte (cle config #e1e1e1) */
    body.P-Stoschek #artists tbody tr td:first-child {
        background: var(--stk-bleu-pale) !important;
        color: var(--stk-noir) !important;
    }

    body.P-Stoschek #artists tbody tr td:last-child {
        background: var(--stk-bleu-pale) !important; /* 274g : gris -> palier bleu */
        color: var(--stk-noir) !important;
    }

    /* fonds des textes descriptifs (cle config #fbfbfb) : blanc du fond ;
       en ligne surlignee, style.css les repeint deja via --d2/--d1 */
    body.P-Stoschek .short-text,
    body.P-Stoschek .long-text {
        background: #ffffff !important;
    }

    /* cadre de selection de l'artiste : 276 - MEME epaisseur que le
       pourtour du chemin (6px ; la config posait 11px, juge trop gros).
       main.js lit borderTopWidth a chaque positionnement : la geometrie
       se recale toute seule. */
    body.P-Stoschek #artistsScroll > div#selected.cursor {
        border: 6px solid var(--stk-bleu) !important;
    }

    /* 276 : separateurs d'artistes - la config en pose (pointilles) mais
       certains disparaissent sous la ligne selectionnee (constat tester ;
       cause cote config/DOM, non reproductible au harnais hors-ligne).
       Reassertion defensive : meme trace pour TOUTES les lignes. */
    body.P-Stoschek #artists tbody tr.artist-row td.artistName {
        border-bottom: 1px dashed var(--stk-noir) !important;
    }

    /* bouton Profil : pilule blanche a lisere BLEU (274h ; cle config
       #727274, filet noir en 274-274g) ; 276 : coins arrondis 8px */
    body.P-Stoschek a.portrait-profile-link {
        border-color: var(--stk-bleu) !important;
        border-radius: 8px !important;
    }

    /* bulle "Visitez sa page" : NOIR plein, texte blanc (274f - le bleu
       n'existe plus en aplat) ; la cle config posait un fond mauve + un
       filtre hue-rotate.
       280 (retour Maxou : bulle noire vide) : la cle config habille cette
       bulle en IMAGE (Visite-page-FR.svg, texte encre sombre) et pousse le
       texte reel hors champ par un text-indent - sur fond noir, le SVG
       sombre disparaissait et il ne restait qu'une pastille noire. On
       retire l'image, on ramene le texte dans la boite (text-indent 0,
       centre) : le libelle affiche est celui de la config
       (titleConfig.artistBubble), donc bilingue sans intervention. */
    body.P-Stoschek div.artist-name div.tooltip2 {
        background-color: var(--stk-noir) !important;
        background-image: none !important;
        filter: none !important;
        text-indent: 0 !important;
        text-align: center !important;
    }

    body.P-Stoschek div.artist-name div.tooltip2 a {
        color: #ffffff !important;
        text-indent: 0 !important;
        visibility: visible !important;
        opacity: 1 !important;
    }

    /* popup cryptex : cadre blanc borde noir (cle config = gradient mauve),
       boutons = accent, en-tete du descriptif = bleu pale sans ombres */
    body.P-Stoschek #player-modal .model-content {
        background: #ffffff !important;
        border-color: var(--stk-noir) !important;
    }

    /* 274f : boutons noirs au repos, bleu reserve a l'etat survole */
    body.P-Stoschek #player-modal button {
        background: var(--stk-noir) !important;
        color: #ffffff !important;
        box-shadow: none !important;
        text-shadow: none !important;
    }

    body.P-Stoschek #player-modal button:hover {
        background: var(--stk-bleu) !important;
    }

    body.P-Stoschek #description > div.heading > div:nth-child(1) > div.heading-title {
        background: var(--stk-bleu-pale) !important;
        box-shadow: none !important;
        text-shadow: none !important;
        color: var(--stk-noir) !important;
    }
}

/* Pas de bloc SM : le regime smartphone de Stoschek reste STRICTEMENT
   d'origine pour l'instant (retour Maxou 2026-08-06, 274b - le premier jet
   274 reskinnait aussi le SM, entierement retire). */

/* CVG-PATCH275 : deux retours Maxou du 2026-08-06 sur les niveaux de
   hierarchie des tableaux (niveau 1 = td.cteg rowspan 8, niveau 2 =
   td.scteg rowspan 4, niveau 3 = td.sscteg rowspan 2, niveau 4 =
   td.libelle).
   (1) Libelle toujours visible : les libelles verticaux sont ancres pres
   du haut de leur cellule (style.css .wra : rotate(-90deg)
   translateX(-108%)) - des que le haut d'une cellule rowspan sort de la
   fenetre de #motors-scroll / #means-scroll, son libelle sort avec
   (constat : niveau 1 des moyens invisible sur la capture). Le module 275
   de blocks.js (gate P-Stoschek) pose sur chaque div.wra une variable
   --stk-lvl-shift en px LOCAUX (avant le scale du #container) qui glisse
   le libelle le long de sa cellule pour le garder dans la fenetre du
   conteneur, clampe aux bords de la cellule. Le translateY est PREPEND au
   transform du socle : a 0px (defaut), rendu strictement identique au
   socle - aucun effet tant que blocks.js n'a rien mesure.
   (2) Chouias typo : niveau 4 graisse 500 (PATCH255) -> 700, car sous
   Segoe UI 500 et 600 se resolvent sur la MEME face Semibold (mesure
   canvas au harnais : chasses 385.71 = 385.71, puis 398.83 en 700) - le
   seul cran au-dessus est Bold, +3.4% de chasse ; FORMAT TRANSPOSITION
   regagnait une ligne, d'ou conteneur niveau 4 elargi 238 -> 247px avec
   recentrage margin-left = -(247-214)/2 (formule PATCH234/255). Niveau 2
   corps .94em -> .90em avec line-height recale en px sur l'ancienne
   hauteur de boite (27.2px herites x .94 x 1.5 = 38.352px) : la boite du
   libelle ne change pas, donc le centre de rotation du .wra ne bouge pas
   et le libelle ne derive pas lateralement dans sa colonne de 67px
   (derive mesuree 0.00px au harnais).
   Scope body.P-Stoschek + min-551 : 8 autres portraits et SM intacts. */
@media (min-width: 551px) {
    body.P-Stoschek .wra {
        transform: translateY(var(--stk-lvl-shift, 0px)) rotate(-90deg) translateX(-108%);
    }

    body.P-Stoschek td.libelle .vertical-textw {
        font-weight: 700;
        width: 247px;
        margin-left: -16.5px;
    }

    body.P-Stoschek td.scteg .vertical-textw {
        font-size: .90em;
        line-height: 38.352px;
    }
}

/* CVG-PATCH287 - FOUT smartphone (retour Maxou : pas de latence avant
   chargement des polices) : difPMD leve le voile du body (opacity 1 en
   style inline) sans attendre les fontes de la config, chargees par
   main.js APRES blocks.js - le texte flashait en fonte de repli avant
   l'arrivee des fontes du skin. blocks.js pose html.stk-fonts-pending au
   premier instant (gate P-Stoschek + SM) et la retire quand
   document.fonts est au repos, attendu apres window.load ; garde-fous
   2.5s apres load et 6s absolu, une fonte en echec ne laisse jamais la
   page blanche. Le !important bat le style inline de difPMD : la page
   apparait directement composee. NB : correction volontairement limitee a
   ce point - les retours SM espacement/entetes sont portes par la session
   locale (PATCH282/285/285b), qui calibre sur la config reelle. */
@media (max-width: 550px) {
    html.stk-fonts-pending body.P-Stoschek {
        opacity: 0 !important;
    }
}

/* CVG-PATCH298 : Stoschek SM - fonte du sous-titre WELT AM DRAHT sobrifiee.
   Cru Jones - Demo (config, cle SM '.title') a des debordements de brosse
   extremes que Maxou veut attenues SANS changer de police : sous-ensemble de
   11 glyphes (WELT AM DRAHT) retravaille hors ligne par fontTools + pathops,
   variante B "moyenne" retenue sur comparatif du 2026-08-09. Traitements
   (unites/2048, capitale 1516) : sommets/patte du M 1739 -> 1555 et -319 ->
   -60, fin du W 1651 -> 1532, pointe du L raccourcie ET recollee au fut
   (eclat de brosse nativement disjoint, il flottait entre L et T), jambe du
   H -109 -> -44, barre du T coupee en biseau de brosse a xMax 1720 (la lame
   fine de ~400 unites qui depassait en fanion apres le H est retiree).
   Raccourcissements par translation le long de l'axe de chaque trait, pointes
   rigides (forme conservee), largeurs de trait jamais modifiees. Avances
   inchangees : memes cesures, meme rythme. @font-face au niveau racine
   (pas dans un media : lazy-load navigateur, ne pese que si le texte SM
   Stoschek est rendu) ; unicode-range = strictement les 10 caracteres du
   sous-ensemble, tout autre caractere retombe sur la fonte config d'origine
   (chaine de repli dans la regle .stk-sub ci-dessous, media max-550). */
@font-face {
    font-family: 'cru_jones_sobre';
    src: url('../fonts/cru-jones-sobre-webfont.woff2?v=20260809b') format('woff2');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
    unicode-range: U+20, U+41, U+44-45, U+48, U+4C-4D, U+52, U+54, U+57;
}

/* ==========================================================================
   CVG-PATCH282 : Stoschek SMARTPHONE - premiers retours Maxou 2026-08-07.
   (numerote 282 : la session parallele du jour a consomme 280 et 281
   pendant ce chantier, marqueur renumerote au rebase.)
   CVG-PATCH285 : deuxieme vague de retours (annotations vertes sur capture
   tester) - details dans les sous-commentaires marques 285 ci-dessous.
   Ouverture assumee du perimetre SM pour CE portrait (le contrat 274b
   "SM strictement d'origine" tombe ici sur demande) ; scope body.P-Stoschek
   partout, 8 autres portraits et desktop intacts. Media max-550 : la meme
   frontiere que celle ou main.js emet les cles IsSM de la config - les
   regles ci-dessous battent la config par specificite (body.P-Stoschek) et
   !important, memes armes que le bloc desktop.
   Rappel echelle : le portrait est rendu dans un #container scale ~0.23 en
   375px de large - tous les px ci-dessous sont des px LOCAUX (~4.3 px
   locaux = 1 px visuel).
   (1) Noms d'artistes moins etires : la config posait scaleY 2.565 (x2.7
   via matrice puis x0.95) sur .artist-name, et la ligne 6 montait a
   scaleY 3 via une regle nth-child. Ramene a 1.8 avec cisaille reduite au
   prorata (pente conservee : c/d constant) et scaleX 1.15 -> 1.2 pour
   compenser l'amincissement optique. Le !important neutralise aussi la
   regle nth-child(6) (scaleY 3), ce qui homogeneise les lignes ; les
   skews PAR LIGNE poses sur les td (nth-child 2/3/4/8) survivent, l'effet
   "ransom note" reste.
   (2) Titres MOTORS / ARTISTS / MEANS homogenes : ARTISTS portait une
   ombre floue violette (-8px, halo mauve 15px) la ou MOTORS/MEANS ont une
   ombre dure + liseret rose en +8px. Recette unique pour les trois :
   offset dur violet, liseret rose, halo sombre - meme direction partout.
   La geometrie config conservee (font 93px quantico, scaleY 2.9, calages
   bottom/height du h1).
   (3) Bandeau reduit, contenu remonte : le titre etait pousse par un
   margin-top 56.2vh (config) et le bandeau lestte par un padding-bottom
   143px - ramenes a 18vh / 48px. Le rayon blanc du degrade (--s6 pose en
   fond par la config) n'est pas touche : il suit la nouvelle hauteur.
   (4) Mention "Un portrait analytique par Maxime Chanson" integree : fini
   le pave Arial sur fond plein (--s7) ; ligne discrete en Quantico
   majuscules espacees, blanc attenue, nom en blanc plein souligne fin.
   ========================================================================== */
@media (max-width: 550px) {
    /* (1) noms d'artistes. 285 : police 146 -> 126px, le plus long nom
       (LORETTA FAHRENHOLZ, 315px visuels mesures) debordait de 16px sur
       chaque colonne de chiffres (cellule 289px) ; a 126px il tient avec
       ~8px de marge. Taille posee en dur (la config tester = locale ici,
       mais on fige). Le centrage vertical avec les chiffres est automatique
       (boites centrees dans la ligne des deux cotes). */
    body.P-Stoschek .artist-name {
        font-size: 126px !important;
        transform: matrix(1.2, 0, 0.32, 1.8, 0, 16) !important; /* 285c puis 293 : ty +16px locaux - l'encre chiller est haute dans son em-box (mesure 292 : 7.9px visuels au-dessus du nom, 14.7 en dessous), nom redescendu pour egaliser les espaces dans le cadre de selection, converge par crops */
    }

    /* (2) entetes homogenes. 285 : geometrie du h1 ARTISTS entierement
       verrouillee - la config TESTER pose bottom:112px la ou la base
       locale dit 185px (d'ou l'ARTISTS plus bas constate sur tester,
       PATCH282 n'ecrasait pas cette cle) ; toutes les proprietes de calage
       sont desormais forcees, meme rendu quelle que soit la base. Ombre
       revue (retour Maxou : le rose/mauve floute est moche) : double
       extrusion dure violette, sans rose ni rouge ni flou. */
    /* 289 (maquette DevTools de Maxou, captures 2026-08-07) : bandeau
       PLEIN #360b75 et alignement PARFAIT des trois termes - fini les
       calages empiriques du h1 (285b/288, bottom mesure puis modelise) :
       les trois termes utilisent desormais le MEME mecanisme, un centrage
       flex dans une boite absolue qui couvre tout le bandeau. 55px
       Quantico 700 blanc, AUCUNE transformation (matrix retiree, demande
       explicite), images de fond des spans retirees (url(null) de la
       maquette), ombre unique et propre : un seul offset dur violet, meme
       angle partout (l'angle du rose semblait aleatoire), plus un leger
       voile sombre. */
    /* 292 : variante B de la simulation retenue par Maxou (2026-08-08) -
       la bande est reduite a la hauteur des lettres plus une
       micro-respiration (~3px visuels au-dessus et en dessous des
       capitales). Capitales Quantico 55px ~= 40px locaux, + 2 x 13px
       locaux (~3px visuels a l'echelle SM ~0.23) : hauteur fixe 72px,
       fini le padding 111/12 du bandeau epais. Les trois termes restent
       centres par le mecanisme absolu du 289 (top 0 / bottom 0 / flex
       center), insensible a la hauteur de la bande. La respiration
       av. la liste reste portee par le padding-top 55px de artistsScroll
       (291), comme dans la simulation. */
    /* 294 (maquette annotee de Maxou, capture tester du 09 13h09) : bande
       NOIRE (le C1 Stoschek #111111, coherent avec les entetes desktop),
       height 51px et police 51px (demande chiffree), texte en lowercase.
       Le box-shadow -4px recouvre le lisere clair de jonction hero/bande
       (sous-pixel visible sur tester, pas en local) sans toucher au rayon
       du degrade ; border-top ET border-bottom du socle retires (le
       border-bottom 3px solid 7d7d7d etait le "lisere gris" sous la
       bande, mesure 172,172,170 au scan pixel). */
    body.P-Stoschek #artists thead th {
        height: 51px !important;
        padding: 0 !important;
        background: #111111 !important;
        position: relative !important;
        margin-bottom: 0 !important;
        border-top: 0 !important;
        border-bottom: 0 !important;
        box-shadow: 0 -4px 0 0 #111111, 48px 0 0 0 #111111 !important; /* 295 : + extension noire a droite du th (la bande s'arrete a 1600px locaux, le conteneur va a 1644 - "pas de lisere ou d'espace blanc a droite") */
    }

    body.P-Stoschek .mobile-motor,
    body.P-Stoschek .mobile-mean,
    body.P-Stoschek #artists thead th h1 {
        font-size: 51px !important; /* 294 : 55 -> 51 (demande chiffree) */
        font-family: 'Quantico', sans-serif !important;
        font-weight: 700 !important;
        letter-spacing: 0 !important; /* 295 : .03em -> 0, motors doit tenir dans sa colonne sans changer le corps */
        line-height: 1 !important; /* 295 : centrage vertical maitrise (les spans heritaient ~1.7) */
        text-transform: lowercase !important; /* 294 : motors artists means (le socle posait uppercase) */
        color: #ffffff !important;
        transform: none !important;
        background: none !important;
        text-shadow: none !important; /* 295 : pas d'ombre violette sur les mots (retour Maxou) */
        position: absolute !important;
        top: 0 !important;
        bottom: 0 !important;
        height: auto !important;
        margin: 0 !important;
        display: flex !important;
        align-items: center !important;
    }

    /* 294 : fleches entre les termes (maquette Maxou : motors <-- artists
       --> means), dessin = le SVG fourni "hampe allongee, branches
       incurvees" (courbes et linecap round conserves, hampe etiree dans
       la viewBox pour garder la tete intacte au ratio cible, trait 20
       unites pour ~1px visuel, encre blanche). Longueur reprise de la
       maquette : la fleche court d'un terme a l'autre. Geometrie posee en
       px LOCAUX apres mesure au harnais des boites de texte a 51px
       lowercase ; pointes vers l'exterieur (gauche = scaleX(-1)). */
    body.P-Stoschek #artists thead th::before,
    body.P-Stoschek #artists thead th::after {
        content: '' !important;
        position: absolute !important;
        top: 50% !important;
        height: 34px !important; /* 295 : 56 -> 34, les branches restent a distance des bords du bandeau de 51px (retour Maxou) */
        /* 295 : viewBox recalculee au ratio exact de la boite (470x34 ->
           3312x240) + preserveAspectRatio none - sans quoi le SVG en
           background refuse l'etirement (xMidYMid meet par defaut) et le
           dessin se recroquevillait a la moitie de la boite ; tete de
           fleche aux proportions d'origine, trait 28 unites (~1px visuel). */
        background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3312 240' preserveAspectRatio='none'%3E%3Cg fill='none' stroke='%23ffffff' stroke-width='28' stroke-linecap='round'%3E%3Cpath d='M30 120 L3282 120'/%3E%3Cpath d='M3182 40 C3194 74 3226 106 3282 120'/%3E%3Cpath d='M3182 200 C3194 166 3226 134 3282 120'/%3E%3C/g%3E%3C/svg%3E") no-repeat center / 100% 100% !important;
        pointer-events: none !important;
    }

    body.P-Stoschek #artists thead th::before {
        left: 205px !important; /* 295 : fleches plus allongees (retour Maxou) - de la frontiere de colonne motors (163) au bord d'artists (716), marges ~40px */
        width: 470px !important;
        transform: translateY(-50%) scaleX(-1) !important; /* pointe vers motors */
    }

    body.P-Stoschek #artists thead th::after {
        right: 210px !important; /* d'artists (884) a la frontiere de colonne means (1428), meme longueur que la fleche gauche */
        width: 470px !important;
        transform: translateY(-50%) !important; /* pointe vers means */
    }

    /* 295 : motors et means INSCRITS dans leur colonne de chiffres (retour
       Maxou), corps inchange : letter-spacing 0 + condensation scaleX 0.9
       (mesures a 51px : motors 170px locaux pour 163 de colonne -> 153,
       means 155 -> 140). Marge noire conservee au bord ("liserai noir a
       gauche"), origin cote bord : la condensation tire vers l'interieur. */
    body.P-Stoschek .mobile-motor {
        left: 0 !important;
        justify-content: flex-start !important;
        padding: 0 0 0 10px !important;
        transform: scaleX(.9) !important;
        transform-origin: left center !important;
    }

    body.P-Stoschek .mobile-mean {
        right: 0 !important;
        justify-content: flex-end !important;
        padding: 0 10px 0 0 !important;
        transform: scaleX(.9) !important;
        transform-origin: right center !important;
    }

    body.P-Stoschek #artists thead th h1 {
        left: 0 !important;
        right: 0 !important;
        justify-content: center !important;
        padding: 0 !important;
        line-height: 1 !important;
    }

    /* (293 : la neutralisation du border-top du socle est montee dans la
       regle du th ci-dessus, avec le border-bottom - 294.) */

    /* (3) bandeau. 285 : plus d'air sous la mention (retour Maxou),
       48 -> 96px locaux (~11 -> 22px visuels). */
    body.P-Stoschek #title-ADIAF {
        padding-bottom: 140px !important; /* 295 : encore un peu plus d'air entre la mention et le sous-bandeau noir (retour Maxou, etait 96) */
    }

    /* (4) cadre de selection : la tentative margin-top de la v285 etait un
       NO-OP - selected() de main.js pose top/height/margin-top en INLINE
       !important a chaque selection (main.js:1846), l'inline important bat
       la feuille. Le desequilibre (plus d'espace sous le nom que dessus,
       bord haut = reference) se corrige par la geometrie des LIGNES
       elles-memes ci-dessous : lignes resserrees par le bas, le cadre suit
       (height = clientHeight de la ligne). */

    /* (5) 285b : lignes resserrees (retour Maxou) + encre recentree. La
       hauteur de ligne venait du line-height herite 1.7 des cellules de
       chiffres (1.7 x 146px = 248px locaux) ; pose en dur plus court. Le
       padding inline 17px du td des noms est reduit de meme. L'encre de
       chillerregular est HAUTE dans son em-box (descentes rarement
       encrees) : l'exces d'espace apparait sous le nom - c'est lui qu'on
       retire. */
    /* 291 - WELT AM DRAHT : retour a la fonte d'ORIGINE de la config (la
       Grenze Gotisch du 289 est retiree, ainsi que son lien Google Fonts
       dans les layouts - retour Maxou : garder la meme police). Sobriete
       legere, meme police : ombre ramenee a une seule ombre douce sombre
       et corps baisse d'un cran (92%). Deux molettes faciles a ajuster ou
       a retirer si le resultat ne convainc pas sur tester. */
    body.P-Stoschek .title.mobile .stk-sub {
        /* 298 : fonte sobrifiee (voir @font-face hors media) - repli sur la
           fonte config d'origine pour tout caractere hors sous-ensemble ou
           si le woff2 ne charge pas ; metriques identiques, aucun recalage */
        font-family: 'cru_jones_sobre', 'cru_jones_-_demoregular' !important;
        font-size: .92em !important;
        letter-spacing: .01em !important;
        text-shadow: rgba(0, 0, 0, .45) 3px 4px 9px !important;
    }

    /* 291 : un espacement juste avant la premiere ligne de noms d'artistes
       (retour Maxou) - respiration entre le bandeau MOTORS/ARTISTS/MEANS
       et la liste, ~13px visuels. Le cadre de selection suit : main.js
       positionne par offsets, insensibles au padding du conteneur. */
    body.P-Stoschek #artistsScroll {
        padding-top: 55px !important;
    }

    /* 293 : consequence mesuree du padding 291 ci-dessus - les cadres de
       selection et de survol sont positionnes par main.js via offsetTop,
       qui ne voit PAS ce padding (contrairement a l'hypothese du 291) :
       cadre 55px locaux trop haut, a cheval sur la ligne du dessus
       (mesure : bord haut a 16.6px visuels au-dessus de la ligne).
       Compensation par transform, la seule propriete de position que
       selected() ne reecrit pas en inline !important (main.js:1846). */
    body.P-Stoschek #artistsScroll div#selected.cursor,
    body.P-Stoschek #artistsScroll div#hover.cursor {
        transform: translateY(55px) !important;
    }

    /* 288 (retour Maxou : "un peu plus d'espace entre les artistes, je ne
       veux pas des chiffres rognes") : le 285b avait resserre de 66 a 54px
       visuels, un cran trop loin - les chiffres graffiti, dont l'encre
       depasse largement la boite de ligne, se faisaient couper par la
       ligne voisine. On revient a mi-chemin, 196 -> 226px locaux (~54 ->
       62px visuels), padding du nom 10 -> 16px, et overflow visible en
       garde pour que rien ne rogne l'encre. Le cadre de selection suit
       automatiquement (height = clientHeight de la ligne). */
    /* 293 : chiffres MOTEURS = chiffres MOYENS (retour Maxou, capture du
       09) - la config TESTER pose 194px sur td:first-child (moteurs) et
       146px sur td:last-child (moyens), difference invisible en local (146
       des deux cotes en base locale) et jamais ecrasee jusqu'ici. Taille,
       fonte et transform figes identiques des deux cotes, quelle que soit
       la base ; le 194 des moteurs expliquait aussi la part la plus
       visible des bas rognes (encre debordante peinte par-dessus par le
       fond de la ligne suivante). */
    body.P-Stoschek #artists tbody td:first-child,
    body.P-Stoschek #artists tbody td:last-child {
        line-height: 250px !important; /* 289 : le 20 restait rogne, un cran de plus (226 -> 250, ~62 -> 68px visuels) */
        overflow: visible !important;
        font-size: 146px !important;
        font-family: 'chillerregular' !important;
        transform: matrix(1, 0, 0, 1.5, 0, 0) !important; /* 293 : ty laisse a 0 - les fonds des cellules etant eux-memes scales 1.5, tout decalage vertical fait peindre une cellule sur sa voisine (le mecanisme meme du rognage) */
        /* 294 : "retirer le liserai en bas de chaque chiffre" - l'outline
           1px solid blanc pose par la config cernait chaque cellule (seul
           le bas se voyait, blanc sur le gris de la cellule suivante) ;
           border-color transparent en prime : la base tester peut teinter
           le border-top 4px du socle (canal invisible en local). */
        outline: none !important;
        border-color: transparent !important;
    }

    /* 294 : "border manquante" (maquette Maxou, MOTORS et MEANS) - trait
       vertical CONTINU au bord interieur de chaque colonne de chiffres.
       Peint en background-image sur les cellules : contrairement aux
       border-color, le fond n'est PAS efface par le mecanisme _frame-off
       de main.js sur la ligne selectionnee (inline important, PATCH183e),
       ni par les cles de la config. Le segment manquant dans la
       respiration 291 (padding-top de artistsScroll, aucune cellule) est
       peint sur le conteneur en background-attachment local (suit le
       scroll du contenu). Positions en px LOCAUX, calees au harnais. */
    body.P-Stoschek #artists tbody td:first-child {
        background-image: linear-gradient(#9f9f9f, #9f9f9f) !important;
        background-repeat: no-repeat !important;
        background-size: 5px 100% !important;
        background-position: right 0 top 0 !important;
    }

    /* 295 : la table (1600px locaux) depasse de 4px sa derniere cellule
       (1596) - son fond beige faisait un lisere au bord droit, par-dessus
       la colonne grise peinte sur le conteneur. Bande grise peinte sur la
       table elle-meme, bord droit, pleine hauteur. */
    body.P-Stoschek #artists table,
    body.P-Stoschek #artists tbody tr {
        background-image: linear-gradient(#e0e0e0, #e0e0e0) !important;
        background-repeat: no-repeat !important;
        background-size: 20px 100% !important;
        background-position: right -6px top 0 !important; /* 295 : depasse le bord de 6px - l'arrondi du scale (container 1600px locaux = 360.0 css pile) laissait le dernier pixel device au background-color de la table */
        background-origin: border-box !important; /* 295 : sinon la position right s'ancre sur la padding-box et la zone de padding droite de la table reste au background-color beige */
        background-clip: border-box !important;
    }

    body.P-Stoschek #artists tbody td:last-child {
        background-image: linear-gradient(#9f9f9f, #9f9f9f) !important;
        background-repeat: no-repeat !important;
        background-size: 5px 100% !important;
        background-position: left 0 top 0 !important;
    }

    /* 295 en plus des segments de trait 294 : (a) fond du conteneur =
       beige de la table (245,244,240) et non blanc - la respiration sous
       la bande prend "la meme couleur que le reste en dessous" (retour
       Maxou) ; (b) deux colonnes grises pleine hauteur peintes SOUS les
       cellules (22-190 et 1450-1648 locaux) : elles prolongent les
       colonnes de chiffres dans la respiration ET couvrent le petit
       espace blanc au bord droit (la table fait 1600px locaux mais ses
       cellules s'arretent a 1596, et le conteneur continue jusqu'a 1644).
       Ordre des couches : traits au-dessus des colonnes. */
    body.P-Stoschek #artistsScroll {
        background-color: #e0e0e0 !important; /* 295 : repli gris colonne - avale le pixel d'arrondi au bord droit ; le beige du centre est une couche peinte ci-dessous */
        background-image: linear-gradient(#9f9f9f, #9f9f9f), linear-gradient(#9f9f9f, #9f9f9f), linear-gradient(#e0e0e0, #e0e0e0), linear-gradient(#e0e0e0, #e0e0e0), linear-gradient(rgb(245, 244, 240), rgb(245, 244, 240)) !important;
        background-repeat: no-repeat !important;
        background-size: 5px 55px, 5px 55px, 168px 100%, 198px 100%, 1260px 100% !important;
        background-position: 185px 0, 1450px 0, 22px 0, 1450px 0, 190px 0 !important; /* 294/295 : frontieres 163/1428 table-relatives + offset table de 22px dans le conteneur, cales au harnais ; derniere couche = beige central (couleur du fond de table, retour Maxou "pas blanc") */
        background-attachment: local !important;
        scrollbar-width: none !important; /* 295 : la gouttiere du scrollbar vertical peignait le dernier liseret beige au bord droit (zone non hit-testable au diagnostic) ; defilement tactile en SM, pas de scrollbar visuel */
    }

    body.P-Stoschek #artistsScroll::-webkit-scrollbar {
        display: none !important; /* 295 : pendant WebKit de scrollbar-width none */
    }

    body.P-Stoschek #artists tbody td.artistName {
        padding: 20px 0 !important; /* 289 : 16 -> 20 */
    }

    body.P-Stoschek #title-ADIAF .title.mobile {
        margin-top: 25vh !important;
    }

    /* (4) mention */
    body.P-Stoschek .upperTitle {
        background: none !important;
        color: rgba(255, 255, 255, .88) !important;
        font-family: 'Quantico', sans-serif !important;
        font-size: 38px !important;
        font-weight: 400 !important;
        letter-spacing: .16em !important;
        text-transform: uppercase !important;
        width: auto !important;
        padding: 0 !important;
        margin: 14px 0 0 !important;
    }

    body.P-Stoschek .upperTitle > a {
        color: #ffffff !important;
        font-weight: 700 !important;
        text-decoration: none !important;
        border-bottom: 2px solid rgba(255, 255, 255, .65) !important;
    }
}

/* ==========================================================================
   CVG-PATCH286 : BRM - retour Maxou sur la tuile 44 (PATCH284) : il prefere
   la version D'ORIGINE - la tension entre le rouge-rose et le vert acidule -
   mais il lui manquait une couleur ASSISE qui calme le jeu et apporte
   rigueur, serieux et autorite. Le reskin complet de 284 est donc RETIRE
   (bandeau conique or/noir, titre rouge cd3529, signature, colonnes de
   numeros d1e09a / f2fdb5, bouton Profil menthe 42ffb0, curseur bleu,
   cadre de selection rouge de la config, popups, boule NFT, sharethis,
   schema, pastille : tout revient a la config d'origine). Ne RESTE de la
   tuile 44 que le vert bouteille #1C3F35, en couleur d'assise, la ou il
   CADRE la page sans eteindre les couleurs vives :
   - les deux ailes MOTEURS / MOYENS (config : vert gazon 1f701f / jaune
     pale dcdd9a) deviennent vert bouteille plein, jumelles - l'autorite
     qui encadre le portrait ; l'aile moyens reprend les encres pales que
     la config donnait a l'aile moteurs (d1cfaf / b7b57c), ses encres
     d'origine (8e8917 / 817f63) etant pensees pour un fond clair ;
   - la grille des tableaux lateraux et les filets verticaux qui encadrent
     la liste d'artistes passent de l'olive du socle (4e4c1f) au vert
     bouteille ;
   - l'entete ARTISTES prend un filet vert bouteille 2px (son fond degrade
     rose d'origine et son titre rouge du socle reviennent).
   Scope body.P-BRM + min-551 : SMARTPHONE et 8 autres portraits intacts.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-BRM {
        --brm-assise: #1C3F35; /* vert bouteille, seul survivant de la tuile 44 */

        /* ailes jumelles : zones = assise, encres pales de l'aile moteurs
           reprises des deux cotes */
        --d4: var(--brm-assise);
        --d5: var(--brm-assise);
        --d5-t: #d1cfaf;
        --d5-t2: #b7b57c;
    }

    /* grille des tableaux lateraux : olive du socle -> assise */
    body.P-BRM #motors td,
    body.P-BRM #means td {
        border-color: var(--brm-assise) !important;
    }

    /* filet de l'entete centrale ARTISTES (fond et titre d'origine) */
    body.P-BRM #artists thead th {
        border: 2px solid var(--brm-assise) !important;
    }

    /* filets verticaux des colonnes de numeros : olive -> assise ; les
       separateurs horizontaux sombres d'origine ne bougent pas */
    body.P-BRM #artists tbody tr td:first-child,
    body.P-BRM #artists tbody tr td:last-child {
        border-left-color: var(--brm-assise) !important;
        border-right-color: var(--brm-assise) !important;
    }
}

/* ==========================================================================
   CVG-PATCH296 : deux retours Maxou du 2026-08-09 (test telephone reel).
   (1) REGLE TYPOGRAPHIQUE GENERALE DES PORTRAITS : un pave justifie ne doit
   jamais etirer sa DERNIERE ligne (la popup moteur ecartelait
   "(Douglas GORDON;  Maurizio CATTELAN)" sur toute la largeur).
   text-align-last: left sur les paves justifies par style.css
   (.long-text :2975, #player-modal .comments :2575) - tous portraits,
   toutes largeurs (ce fichier n'est charge que sur les portraits).
   (2) Stoschek SM : le conteneur de la liste (1644px locaux) est plus
   large que la table (1600) et overflow scroll - un glissement lateral
   decalait la liste et "elargissait" la colonne des chiffres (les
   colonnes de fond peintes au 295 devenaient visibles). Scroll horizontal
   verrouille, le vertical reste.
   ========================================================================== */
.long-text,
#player-modal .comments,
#player-modal .comments p {
    text-align-last: left !important;
}

@media (max-width: 550px) {
    body.P-Stoschek #artistsScroll {
        overflow-x: hidden !important;
    }
}

/* ==========================================================================
   CVG-PATCH297 : footer #bottom-bar ABSENT des portraits _layout2 (Stoschek)
   en smartphone - retour Maxou 2026-08-09. Cause racine : difBoros.js posait
   un "top" inline sur #bottom-bar dans ses branches smartphone ; top prime
   sur le bottom:0 du socle (style.css media max-550) et, la boite etant
   scalee origin bottom center, le footer partait SOUS le viewport (mesure au
   harnais : top inline 773px, boite visuelle a 937px pour un ecran de 740).
   difPMD.js (_layout1 : Adiaf...) a ces memes lignes neutralisees, d'ou des
   footers sains sur les autres portraits. Le JS est corrige ; la regle
   ci-dessous est la ceinture TOUS PORTRAITS : en smartphone le footer est
   ancre bottom:0, aucun script ni cle de config ne doit le deplacer par top
   (un !important d'auteur bat un style inline non-important). Le maintien a
   l'ecran pendant le scroll de la liste est deja garanti par main.js
   (PATCH271 : fadeOut du bas de liste desactive en portraitMode).
   ========================================================================== */
@media (max-width: 550px) {
    #bottom-bar {
        top: auto !important;
    }
}

/* ==========================================================================
   CVG-PATCH299 : Stoschek SM - footer homogene avec la bande
   motors/artists/means + bulle "Visit their page" recentree (retours Maxou
   2026-08-09, capture tester 16h33 ; arbitrages valides : bande noire C1,
   sphere NFT passee en gris, bouton Profile au choix de la session).
   (Numerote 299 : 298 consomme par la session parallele fonte du
   sous-titre.) Px LOCAUX (k about 0.225 a 360px de large).
   (1) Bande : noir C1 #111111 plein comme la bande motors/artists/means
   (294), fini le vert clair --s3 #ceff8f de la config et son border-top
   vert fonce 11px.
   (2) Espacement regulier : le footer etait 3 groupes imbriques
   (language-switcher qui contient le bouton Profile, btn-group-right en
   row-reverse avec la sphere NFT en position:absolute left:0 du socle
   style.css:1517) - les elements du milieu se tassaient a gauche.
   display:contents sur les deux groupes (precedent Mennour MD, bloc :740)
   + order explicites + space-between du socle : home | Profile | sphere |
   partage | gif cryptex a ecarts egaux, home ancre a gauche et gif a
   droite (les deux "bien positionnes" de Maxou, inchanges dans leur role).
   (3) Home : icone blanche nue (paths deja fill white, style.css:2940) -
   le cartouche bleu ciel #2c7ba1 borde noir de la config disparait.
   (4) Profile : cadre fin blanc, encre blanche, Quantico 700 - coherent
   avec les termes de la bande ; l'aplat lilas #ebe8ff + border 8px noire
   de la config disparait. width:auto bat le width:265px que la config pose
   via .language-switcher>:nth-child(1).
   (5) Sphere NFT : grayscale (arbitrage "blanche ou grise") + leger
   brightness pour rester lisible sur noir ; l'asset n'est pas touche,
   filtre seulement. Recalages config (right:197px sur l'img, margins
   negatifs du svg) neutralises.
   (6) Partage : glyphe sharethis noir -> blanc par invert, lisible sur la
   bande noire.
   (7) Bulle tooltip2 des noms ("Visit their page") : la config la pose
   left:-22px top:24px height:93px, radius asymetrique 42/14 + hue-rotate -
   collee au nom, et ROGNEE au bord droit depuis le verrou overflow-x
   hidden de artistsScroll (296) des que le nom est long (capture IAN
   CHENG). Recentree SOUS le nom (left 50% + translateX, top 100%), largeur
   au contenu bornee a la colonne centrale (1100px locaux < 1265) donc plus
   jamais coupee, pilule blanche nette : radius symetrique, filet noir C1,
   hue-rotate retire, encre #111111 Quantico. Scope body.P-Stoschek : les
   bulles des 8 autres portraits et les bulles d'entetes
   (.tooltip2.left-align/right-align, dans le thead) sont intactes.
   ========================================================================== */
@media (max-width: 550px) {
    /* (1) bande noire C1, sans lisere */
    body.P-Stoschek #bottom-bar {
        background: #111111 !important;
        border-top: 0 !important;
        padding: 0 44px !important;
        align-items: center !important;
        justify-content: space-between !important;
    }

    /* (2) groupes mis a plat : les enfants deviennent freres directs du
       flex #bottom-bar, space-between repartit a ecarts egaux */
    body.P-Stoschek #bottom-bar div.language-switcher,
    body.P-Stoschek #bottom-bar #btn-group-right {
        display: contents !important;
    }

    body.P-Stoschek #bottom-bar a.btn-home {
        order: 1 !important;
        margin: 0 !important;
        top: 0 !important;
        height: auto !important;
    }

    body.P-Stoschek #bottom-bar a.portrait-profile-link { order: 2 !important; }
    body.P-Stoschek #bottom-bar button#NFT-btn { order: 3 !important; }
    body.P-Stoschek #bottom-bar div.sharethis-inline-share-buttons { order: 4 !important; }

    body.P-Stoschek #bottom-bar button#dwnld-dtn {
        order: 5 !important;
        margin: 0 !important;
    }

    /* (3) home : icone blanche nue, sans cartouche */
    body.P-Stoschek a.btn-home svg {
        background: none !important;
        border: 0 !important;
        border-radius: 0 !important;
        padding: 0 !important;
        margin: 0 !important;
        width: 96px !important;
        height: 80px !important;
    }

    /* (4) profile : cadre blanc fin, Quantico, fond transparent */
    body.P-Stoschek a.portrait-profile-link {
        background: none !important;
        color: #ffffff !important;
        font-family: 'Quantico', sans-serif !important;
        font-weight: 700 !important;
        font-size: 48px !important;
        border: 0 !important; /* 302 : cadre blanc retire (retour Maxou sur l'etat 301) - le mot nu sur la bande, la boite tactile invisible reste genereuse */
        border-radius: 0 !important;
        padding: 10px 26px !important;
        width: auto !important;
        text-align: center !important;
        margin: 0 !important; /* la config pose margin-left -18px via .language-switcher a : fausse l'ecart a gauche du bouton */
    }

    /* (5) sphere NFT : hors du positionnement absolu du socle
       (style.css:1517 left:0 !important - meme arme, ce fichier passe
       apres), asset filtre en gris */
    body.P-Stoschek button#NFT-btn {
        position: static !important;
        left: auto !important;
    }

    body.P-Stoschek .main_animation_conteiner {
        filter: grayscale(1) brightness(1.15) !important;
        width: 110px !important; /* le socle fige le conteneur a 60px : le svg 110 debordait, bouton tasse */
    }

    body.P-Stoschek .main_animation_conteiner svg {
        width: 110px !important;
        margin: 0 !important;
    }

    body.P-Stoschek button#NFT-btn img {
        position: static !important;
        right: auto !important;
        margin: 0 !important;
    }

    /* (6) partage : glyphe blanc sur bande noire */
    body.P-Stoschek #bottom-bar .st-btn img {
        filter: invert(1) !important;
    }

    body.P-Stoschek #bottom-bar div.sharethis-inline-share-buttons {
        margin: 0 !important;
    }

    /* (7) bulle des noms : pilule nette sous la fin du nom, jamais coupee.
       Geometrie contrainte par le mecanisme (main.js) : la bulle est creee
       DANS le <a> de fin de nom - c'est LUI le bloc contenant (piege
       documente PATCH226) et centerArtistBubble pose top en INLINE
       !important d'apres lui : l'ancre <a> doit rester intacte, on ne pilote
       que right + transform. La bulle herite en outre la matrice du nom
       (matrix(1.2, 0, 0.32, 1.8, 0, 16) posee plus haut) qui l'etirait et la
       penchait : contre-matrice inverse exacte (1/1.2, -0.32/(1.2*1.8),
       1/1.8) puis translate en unites redevenues saines (1px = 1px local).
       right -160px + translate cale la pilule sous la fin du nom, bord
       droit <= conteneur meme pour le nom le plus long (FAHRENHOLZ), donc
       plus de rognage par l'overflow-x hidden du 296. */
    body.P-Stoschek div.artist-name div.tooltip2 {
        left: auto !important;
        right: -49px !important; /* 311 : pastille ::before sortie du flux (bloc 308 plus bas) - le bord droit de l'ancre recule d'~31px locaux, compensation mesuree : bord droit de la bulle a 0.02px (FF) / +0.4px (chromium) du calage 308 (qui etait -18px) */
        transform: matrix(0.83333, 0, -0.14815, 0.55556, 0, 0) translate(0, -369px) !important; /* 308 : remontee de ~10px visuels, la bordure basse ne croise plus le cadre pointille de selection (etait -330px) */
        height: auto !important;
        width: max-content !important;
        max-width: 1100px !important;
        padding: 16px 48px !important;
        background: #ffffff !important;
        border: 4px solid #111111 !important;
        border-radius: 70px !important;
        filter: none !important;
        box-shadow: 0 10px 30px rgba(0, 0, 0, .25) !important;
    }

    body.P-Stoschek div.artist-name div.tooltip2 a {
        color: #111111 !important;
        font-family: 'Quantico', sans-serif !important;
        font-weight: 700 !important;
        font-size: 44px !important;
        white-space: nowrap !important;
    }

    /* 311 (retour Maxou "bordure basse encore rognee") : la bulle est enfermee
       dans le contexte d'empilement z-auto de .artist-name (transformee) - son
       z-index 30 ne compte pas face au cadre de selection #selected (z-index 1)
       qui peignait AU-DESSUS d'elle au moindre chevauchement (la rognure des
       captures 305/308). Au harnais post-308 la marge est de 9.52px et la
       bordure complete (les deux moteurs) mais la geometrie du telephone reel
       (dpr 2.625, fontes) peut recreer le chevauchement : on verrouille l'ordre
       de peinture - le cadre ne peut PLUS manger la bulle. Le td est deja
       position:relative et son fond transparent : cadre pointille intact
       (crops avant/apres pixel-identiques au harnais). */
    body.P-Stoschek #artists tbody tr.selected td.artistName {
        position: relative !important;
        z-index: 3 !important;
    }
}

/* ==========================================================================
   CVG-PATCH300 : Stoschek SM - popup moteur/moyen reskinnee, variante C3
   EXTINCTION choisie par Maxou (2026-08-09) apres trois planches de
   maquettes : les cases INACTIVES s'eteignent (gris fondu, encre grise),
   le chemin actif est la seule lumiere (cases blanc pur, lueur lavande),
   zero bordure - l'etat est porte par le FOND des cases. Typos de la page
   d'accueil (Bebas Neue pour le nom, IBM Plex Mono partout ailleurs -
   fontes chargees par les layouts, PATCH300 ; woff2 telecharges seulement
   la ou des regles les utilisent). CONSERVES : inclinaison de la carte
   (transform matrix3d de la config, cle Important, intouchee), halo
   violet (drop-shadow, recolore), fond sombre violace.
   Mecanique : le diagramme est un SVG genere par schema.js avec styles
   INLINE (fill/stroke) - la feuille les bat en !important ; cases actives
   = .active-item (+ logements id activeBlockLvlN, case-titre #main),
   chemin actif = id drawLineN, connecteurs inactifs = id lineXLvlN,
   carte = rect#bgSchem. L'animation relit la couleur CALCULEE des
   .active-item (schema.js:327 jQuery css fill) : elle suit ce skin.
   Scope body.P-Stoschek + max-550 : desktop et autres portraits intacts.
   ========================================================================== */
@media (max-width: 550px) {
    /* fond de la popup */
    body.P-Stoschek #modal .modal-content {
        background: #45424f !important;
    }

    /* bandeau nom : fini le motif rouge/jaune - encre C1, nom Bebas Neue */
    body.P-Stoschek #modal .modal-header {
        background: #111111 !important;
        border-bottom: 3px solid #7a5fd0 !important;
    }

    body.P-Stoschek #modal .modal-header__name {
        background: #111111 !important;
        background-image: none !important;
        color: #efedf6 !important;
        font-family: 'Bebas Neue', 'Quantico', sans-serif !important;
        font-size: 34px !important;
        font-weight: 400 !important;
        letter-spacing: .04em !important;
        text-shadow: none !important;
        padding: 12px 18px 8px !important;
    }

    body.P-Stoschek #modal #closeBtn img.modal-header__cross {
        filter: opacity(.85) !important; /* 300b : la croix d'origine est deja blanche - l'invert du premier jet la rendait noire sur noir */
    }

    body.P-Stoschek #modal #closeBtn {
        transform: translateY(-9px) !important; /* 303 : centre de la croix aligne sur le centre du nom (mesure 48.5 vs 40) */
    }

    /* carte du diagramme + halo violet (le transform matrix3d de la config,
       cle Important, n'est pas touche : l'inclinaison reste) */
    body.P-Stoschek #schemSVG #bgSchem,
    body.P-Stoschek #schemSVG1 #bgSchem {
        fill: #393645 !important;
    }

    body.P-Stoschek #schemSVG,
    body.P-Stoschek #schemSVG1 {
        filter: drop-shadow(0 0 12px rgba(150, 118, 224, .55)) drop-shadow(0 0 34px rgba(150, 118, 224, .3)) !important;
    }

    /* cases INACTIVES : eteintes dans la carte. 303 : contraste releve
       (retour Maxou, texte peu lisible) - fond legerement fonce et encre
       eclaircie (ratio ~2.4:1 -> ~5.6:1), toujours en retrait du blanc
       pur des actives. */
    body.P-Stoschek #modal svg #blocks g path:not(.active-item):not([id^="activeBlock"]):not(#main) {
        fill: #4a4754 !important;
    }

    body.P-Stoschek #modal svg #blocks g:not(:has(.active-item)):not(#level1Block) text {
        fill: #ffffff !important; /* 304 : blanc pur (retour Maxou, le d9d6e4 du 303 restait trop faible) */
    }

    /* 304 : TOUS les textes du diagramme portaient un contour stroke 2px
       brun-noir (30,18,0) - c'est lui qui rendait l'encre claire des
       inactives illisible (et empatait les actives). Retire partout. */
    body.P-Stoschek #modal svg text {
        stroke: none !important;
    }

    /* 304 : libelles longs du niveau 4 (WORK-ENVIRONMENT RELATIONSHIPS...)
       debordaient de leur case sur la voisine (38px visuels mesures).
       306 : la reduction n'est plus SYSTEMATIQUE (retour Maxou : ne
       diminuer que quand strictement necessaire, pas pour tous les
       artistes) - schema.js pose des classes de gabarit par longueur
       (lbl-tight au-dela de 25 lettres, lbl-snug au-dela de 20) ; les
       libelles courts (PERSONAL MYTH...) restent au corps plein 1.8em de
       la config, comme les autres niveaux. Budget : case utile ~490
       unites, Roboto Mono ~0.6em/caractere -> 20 lettres passent plein
       corps, 25 passent en 31, au-dela 26. */
    body.P-Stoschek #modal svg #level4Block text.lbl-snug {
        font-size: 31px !important;
    }

    body.P-Stoschek #modal svg #level4Block text.lbl-tight {
        font-size: 26px !important;
    }

    body.P-Stoschek #modal svg #blocks g:not(:has(.active-item)):not(#level1Block) path {
        filter: drop-shadow(0 2px 5px rgba(0, 0, 0, .35)); /* 300b : sur le path, pas le g - un filter sur le g fait baver le texte */
    }

    /* cases ACTIVES : blanc pur, seule lumiere du diagramme */
    body.P-Stoschek #modal svg .active-item,
    body.P-Stoschek #modal svg [id^="activeBlock"],
    body.P-Stoschek #modal svg #main {
        fill: #ffffff !important;
    }

    body.P-Stoschek #modal svg #blocks g:has(.active-item) text,
    body.P-Stoschek #modal svg #level1Block text {
        fill: #16151d !important;
    }

    body.P-Stoschek #modal svg .active-item,
    body.P-Stoschek #modal svg #main {
        filter: drop-shadow(0 0 9px rgba(150, 118, 224, .9)) drop-shadow(0 0 22px rgba(150, 118, 224, .4)); /* 300b : lueur sur les paths actifs seulement, le texte reste net */
    }

    /* connecteurs : chemin actif lavande claire, ossature assombrie */
    body.P-Stoschek #modal svg [id^="drawLine"] {
        stroke: #d9cff7 !important;
    }

    body.P-Stoschek #modal svg [id^="lineR"],
    body.P-Stoschek #modal svg [id^="lineL"],
    body.P-Stoschek #modal svg [id^="lineD"] {
        stroke: #26232e !important;
    }

    /* 300b : la famille des textes SVG n'est PAS touchee - le moteur
       d'animation (GSAP, positions mesurees sur la fonte au chargement)
       rendait Plex en bouillie ; ils restent en roboto mono heritee de la
       config, tres proche de l'IBM Plex Mono du reste. Seules les encres
       (fill) sont reskinnees ci-dessus. */

    /* titre du chemin + description */
    body.P-Stoschek #modal .short-text {
        font-family: 'IBM Plex Mono', 'Roboto Mono', monospace !important;
        font-weight: 600 !important;
        font-size: 19px !important;
        line-height: 1.35 !important; /* 303 : trois lignes tiennent dans les 80px avant la description (titre rogne constate sur les chemins longs) */
        height: auto !important;
        overflow: visible !important;
        color: #efedf6 !important;
        text-shadow: none !important;
        text-align: left !important; /* 304 : la config tester centre le titre (n'importe quoi sur les chemins longs) - aligne a gauche, les termes composes cassent naturellement a leur trait d'union */
        overflow-wrap: break-word !important;
    }

    body.P-Stoschek #modal .long-text {
        font-family: 'IBM Plex Mono', 'Roboto Mono', monospace !important;
        font-weight: 300 !important;
        font-size: 13px !important;
        line-height: 1.75 !important;
        color: #c9c4da !important;
        text-shadow: none !important;
    }

    body.P-Stoschek #modal .long-text a {
        color: #efedf6 !important;
        text-decoration: none !important;
        border-bottom: 1px solid #b3a1f0 !important;
    }

    body.P-Stoschek #modal .long-text {
        overflow: auto !important; /* 300b : le socle pose overflow scroll - gouttieres fantomes sous le texte court */
        scrollbar-width: none !important;
    }

    /* 303 : la DERNIERE LIGNE DESCRIPTIVE s'etirait encore (retour Maxou) -
       le pave est un seul paragraphe inline, la phrase descriptive et le
       bloc des artistes-exemples coulent ensemble : text-align-last ne
       traite que la toute derniere ligne du bloc. Le span des exemples
       (inline-block pose par main.js) passe en block : la fin du texte
       descriptif devient une vraie fin de ligne (jamais justifiee) et les
       exemples ont leur propre ligne. */
    body.P-Stoschek #modal .long-text > span {
        display: block !important;
        margin-top: 10px !important;
        border-bottom: 0 !important; /* 304 : le span portait un border-bottom 2px gris (socle/config) - devenu une ligne pleine largeur avec le display block du 303 ; les soulignements lavande des liens suffisent */
    }

    body.P-Stoschek #modal .long-text::-webkit-scrollbar {
        display: none !important;
    }

    /* lien "see the Means/Motors" : fini l'aliceblue a ombre verte et le
       surlignage jaune a ombre violette - barre encre pleine largeur */
    body.P-Stoschek #modal .modal-header__link {
        width: 100% !important;
        box-sizing: border-box !important; /* 300b : le lien est en position relative dans le flux - width 100% + padding debordait en content-box */
        left: 0 !important; /* 300b : le socle le decale de 13px en relative */
        right: auto !important;
        margin: 0 !important;
        background: #111111 !important;
        box-shadow: none !important;
        border-top: 2px solid #7a5fd0 !important;
        border-radius: 0 !important;
        color: #ffffff !important;
        font-family: 'IBM Plex Mono', 'Roboto Mono', monospace !important;
        font-size: 13.5px !important;
        padding: 16px 22px !important;
        text-align: left !important;
        text-shadow: none !important;
    }

    body.P-Stoschek #modal .modal-header__link span {
        background: none !important;
        box-shadow: none !important;
        color: #b3a1f0 !important;
        font-weight: 600 !important;
        padding: 0 !important;
        text-shadow: none !important;
    }
}

/* ==========================================================================
   CVG-PATCH301 : Stoschek SM - footer variante A2 retenue par Maxou
   (comparatif A/B/C du 2026-08-09 soir) : bande noire ETROITE a la hauteur
   exacte du bandeau motors/artists/means (51px locaux) traversant le MILIEU
   des icones, et gif cryptex CENTRE pour equilibrer les violets avec le hero,
   icones reparties de part et d'autre. Remplace la bande pleine hauteur du
   299 (ses autres volets - icones blanches, Profile cadre, sphere grise,
   partage invert, bulle - restent actifs) ; ce bloc vient APRES le 299 :
   memes selecteurs + !important, l'ordre tranche.
   Geometrie (px LOCAUX, scene = le bar de 1600px, valides au harnais) :
   gif 513px centre exact (513 via cle config #dwnld-dtn > img) ; home ancre
   a gauche (44), partage ancre a droite (44), Profile et sphere centres dans
   leur demi-espace restant - ecarts reguliers par cote (mesures 22/22 et
   30/31 px visuels). Tous les objets centres verticalement sur la bande
   (top 50% + translateY), le gif la deborde haut et bas : c'est l'objet-
   signature. Ombre portee fine sur les parties d'icones qui sortent de la
   bande (elles passent sur la liste claire). PAS de regle display sur l'img
   du gif : en prod src/img est gele (404) et le masquage d'erreur existant
   doit continuer d'operer - le centre reste alors vide, degrade propre.
   ========================================================================== */
@media (max-width: 550px) {
    /* 308 : fond du footer OPAQUE pleine hauteur (retour Maxou : plus de
       contenu visible derriere les icones, seulement le fond des colonnes
       gris-blanc-gris). Deuxieme calque de background sous la bande noire :
       les trois colonnes de la liste, aux frontieres mesurees (colonnes de
       chiffres 167px locaux de large sur une scene de 1600, gris #e0e0e0 ;
       centre = le blanc casse #f5f4f0 de la table). Le footer est deja
       ancre bottom:0 (297) : opaque sur toute sa hauteur (180px locaux),
       il touche la barre du navigateur sans rien laisser passer. */
    /* 310 : CONTINUATION des lignes de colonnes (retour Maxou, capture
       annotee du 2026-08-10 12h17) - la liste dessine une ligne grise au
       bord interieur de chaque colonne de numeros et elle s'arretait net
       au footer. Mesure au harnais (pixel-sonde 412x915 DSF2) : gris
       rgb(159,159,159) = #9f9f9f, ~5px locaux, plaque cote colonne grise
       contre la frontiere (167 / 1433). Calque insere entre la bande noire
       (dessus) et le fond des colonnes (dessous) : la ligne court sur toute
       la hauteur du footer et ressort sous la bande. */
    /* 317 : la bande claire ne doit pas monter plus haut ni descendre plus
       bas que L'ANNEAU VIOLET DEPLOYE du gif cryptex (retour Maxou
       2026-08-11). Le gif est une boite de 180px locaux (= toute la hauteur
       du footer, 310) mais son ENCRE n'occupe pas toute la boite : mesure
       image par image sur la boucle complete (150 echantillons, canvas,
       seuil alpha>24 - bornes constantes sur toute l'animation), fichier
       150x56, encre des lignes 10 a 43 incluses = 34/56 de la hauteur.
       Rapporte aux 180px locaux : haut 32, hauteur 109 (bas 141). Les deux
       calques clairs (lignes de colonnes du 310 ET fond gris-blanc-gris du
       308) sont ramenes a cette fenetre ; la bande noire (51px centree,
       64.5 a 115.5) reste dedans. Au-dessus et au-dessous, la liste
       reapparait telle quelle - avec SES propres lignes de colonnes aux
       memes abscisses, la continuite du 310 est donc preservee, et les
       extremites d'icones qui depassent gardent l'ombre portee du 302. */
    /* 319 : le BAS n'est plus borne (retour Maxou 2026-08-11 : "le bord haut
       du cryptex c'est pas mal, mais en bas il y a encore une grosse partie
       grise"). Sonde pixel du rendu (412x915, DSF1, gif reel injecte) : sous
       la fenetre du 317 la LISTE reapparaissait sur 10px visuels et ce sont
       ses colonnes GRISES qui se voyaient (releve a y=909 : #e0e0e0 de 0 a
       41, filet #9f9f9f 41-43, creme jusqu'a 369, filet, #e0e0e0 jusqu'au
       bord) - pas un gris du gif, dont l'encre est violette de bout en bout
       (analyse ligne par ligne : violet des la ligne 10 jusqu'a la 43).
       La fenetre claire garde donc son bord HAUT sur l'anneau (32px locaux)
       et court desormais jusqu'au bas du footer : hauteur 148 = 180 - 32.
       Le bas du gif, lui, reste a 141 : les 39px locaux (10 visuels) qui le
       suivent sont couverts par le fond, plus aucun gris de liste. */
    /* 321 : retour Maxou 2026-08-11 - PAS de fondu (le bord franc du 319 est
       retabli tel quel, l'essai de degrade du 320 est annule), et deux
       reglages precis :
       (a) BARRE NOIRE DESCENDUE d'un cran : sa position passe de 50 pour
           cent a calc(50% + 10px), soit 74.5 a 125.5 en px locaux au lieu de
           64.5 a 115.5 - elle reste entierement dans la fenetre claire
           (32 a 180) et les icones, elles, ne bougent pas.
       (b) COLONNE DE DROITE realignee sur celle de la liste. Sonde pixel a
           la definition reelle du telephone (396 CSS px, dpr 2.625, soit une
           image de 1039px) : le creme de la LISTE court jusqu'au pixel
           physique 931, celui du FOOTER s'arretait a 930 - un pixel d'ecart,
           donc un liseré gris d'un pixel le long de la colonne des moyens
           (le bord gauche, lui, tombait deja pile : 108 des deux cotes).
           La frontiere droite passe de 1433 a 1435px locaux (+2 locaux =
           +1.3 pixel physique) : le creme du footer atteint desormais le
           meme pixel que celui de la liste, et le filet gris du 310 suit au
           meme endroit (1435 a 1440). Les 5px du filet et le bord gauche
           (162/167) sont inchanges. */
    body.P-Stoschek #bottom-bar {
        background: none !important;
        background-image:
            linear-gradient(#111111, #111111),
            linear-gradient(to right, transparent 0 172px, #aeaeae 172px 184px, transparent 184px 1418px, #aeaeae 1418px 1427px, transparent 1427px 100%),
            linear-gradient(to right, #e0e0e0 0 185px, #f5f4f0 185px 1424px, #e0e0e0 1424px 100%) !important;
        background-repeat: no-repeat !important;
        background-size: 100% 51px, 100% 148px, 100% 148px !important;
        background-position: 0 calc(50% + 22px), 0 32px, 0 32px !important;
        border-top: 0 !important;
        padding: 0 !important;
    }

    body.P-Stoschek #bottom-bar a.btn-home,
    body.P-Stoschek #bottom-bar a.portrait-profile-link,
    body.P-Stoschek #bottom-bar button#NFT-btn,
    body.P-Stoschek #bottom-bar .sharethis-inline-share-buttons,
    body.P-Stoschek #bottom-bar button#dwnld-dtn {
        position: absolute !important;
        top: 50% !important;
        margin: 0 !important;
    }

    /* 310 : le BAS du gif touche le bord bas du footer (retour Maxou, capture
       annotee) et sa hauteur est ramenee a celle du footer (180px locaux) :
       la bande noire etant centree (64.5px de footer de part et d'autre),
       les depassements haut et bas du gif deviennent EGAUX - la "partie au
       dessus" est reduite d'autant. Largeur en auto (ratio du gif 150x56
       conserve : ~482px locaux au lieu des 513 de la cle config, ecart
       imperceptible). Remplace le centrage vertical du 301. Toujours PAS de
       regle display sur l'img : le masquage d'erreur (gif 404) doit operer. */
    body.P-Stoschek #bottom-bar button#dwnld-dtn {
        top: auto !important;
        bottom: 0 !important;
        left: 50% !important;
        transform: translateX(-50%) !important;
        height: 180px !important;
        padding: 0 !important;
        line-height: 0 !important; /* pas de fuite de baseline sous l'img inline */
    }

    /* 324 : calage du gif retenu par Maxou dans son inspecteur sous la forme
       margin: 37px 10px -14px -15px. Meme resultat, sans marges negatives ni
       effet sur la boite : le decalage est porte par un transform. Equivalence
       calculee puis VERIFIEE au pixel (rendus compares image par image) - le
       bouton est centre par translateX(-50%) sur SA largeur, qui vaut la
       largeur de l'image plus la somme des marges laterales (-15 + 10 = -5) :
       l'image se retrouve a -15 + 5/2 = -12.5px du centre. VERTICALEMENT la
       marge ne vaut pas 37 : l'image est inline dans un bouton en
       line-height:0, et la marge basse negative remonte la boite de ligne -
       mesure identique dans les DEUX moteurs, 25.5px sous le haut du footer
       (et non 37). C'est donc 25.5 qu'il faut translater. Rendus compares
       image par image a 396x860 en dpr 2.625 : le transform et la marge de
       Maxou donnent la meme boite au centieme de pixel. */
    body.P-Stoschek #bottom-bar button#dwnld-dtn > img {
        width: auto !important;
        height: 180px !important;
        margin: 0 !important;
        transform: translate(-12.5px, 25.5px) !important;
    }

    /* 323 : les icones SUIVENT la bande noire (retour Maxou 2026-08-11 : le
       321/322 avait descendu la bande seule, "Profile" n'etait plus centre
       verticalement dessus). Meme decalage que la bande - +22px locaux, le
       calc(50% + 22px) de son background-position - applique au top de
       chacune : leur centre reste donc exactement celui de la bande.
       Le gif cryptex n'est PAS concerne : il est ancre bottom:0 et sa
       hauteur cale la fenetre claire sur l'anneau (317/319). */
    body.P-Stoschek #bottom-bar a.btn-home,
    body.P-Stoschek #bottom-bar a.portrait-profile-link,
    body.P-Stoschek #bottom-bar button#NFT-btn,
    body.P-Stoschek #bottom-bar .sharethis-inline-share-buttons {
        top: calc(50% + 22px) !important;
    }

    body.P-Stoschek #bottom-bar a.btn-home { left: 44px !important; transform: translateY(-50%) !important; }
    body.P-Stoschek #bottom-bar a.portrait-profile-link { left: 238px !important; transform: translateY(-50%) !important; }
    body.P-Stoschek #bottom-bar button#NFT-btn { left: 1195px !important; transform: translateY(-50%) !important; }
    body.P-Stoschek #bottom-bar .sharethis-inline-share-buttons { right: 44px !important; left: auto !important; transform: translateY(-50%) !important; }

    /* lisibilite des parties hors bande, sur la liste claire. 302 : ombre
       renforcee en deux couches (retour Maxou : "un peu d'ombre en plus") -
       lisere serre quasi opaque qui dessine le bord du glyphe + halo doux ;
       comparatif S1/S2/S3 au harnais, la S3 plus forte enfumait la liste.
       La sphere NFT garde son ombre d'origine (jugee bien). */
    body.P-Stoschek #bottom-bar a.btn-home,
    body.P-Stoschek #bottom-bar a.portrait-profile-link,
    body.P-Stoschek #bottom-bar .sharethis-inline-share-buttons {
        filter: drop-shadow(0 0 3px rgba(0, 0, 0, .9)) drop-shadow(0 0 10px rgba(0, 0, 0, .55)) !important;
    }

    body.P-Stoschek .main_animation_conteiner {
        filter: grayscale(1) brightness(1.15) drop-shadow(0 0 7px rgba(0, 0, 0, .6)) !important;
    }
}

/* ==========================================================================
   CVG-PATCH305 : Stoschek SM - intro video (retours Maxou 2026-08-09,
   captures telephone reel).
   (1) Video d'intro remontee d'un chouia : #video1 est centre par le
   margin:auto du flex #videoDiv (mesure harnais : objet a y 302.5 pour
   740 de haut) - translateY le remonte sans toucher au centrage ni au
   fond noir uniforme. Cible = le cadre rouge de la capture Maxou
   (environ 25px plus haut).
   (2) Lien SKIP : la config posait trois text-shadow roses dont un
   DECALE de -20px - la copie floutee du mot atterrissait sur les lettres
   voisines (le "nuage par-dessus les lettres" de la capture). Remplace
   par une EMANATION : halos concentriques sans decalage lateral (rien ne
   se pose sur les glyphes voisins), du rose serre pres des lettres vers
   un lavande large qui monte legerement (offsets y negatifs sur les
   couches larges seulement - une fumee qui s'eleve, coherente avec les
   violets de la video). Lettres blanches nettes au premier plan, et une
   respiration lente du halo (keyframes en racine, coupee si
   prefers-reduced-motion : l'etat pose reste le halo de base).
   La matrix(1.6,0,0,5.7) de la config sur p.videoClick ne s'applique pas
   en pratique (transform calcule "none", verifie harnais + capture
   reelle) : on ne s'y adosse pas, on ne la reactive pas.
   Le sens du rideau (chute au lieu du glissement lateral) est dans
   closeIntro(), _layout2.cshtml - pas de CSS ici.
   ========================================================================== */
@media (max-width: 550px) {
    body.P-Stoschek #video1 {
        transform: translateY(-26px) !important;
    }

    body.P-Stoschek p.videoClick,
    body.P-Stoschek p.videoClick > a {
        color: #ffffff !important;
        text-shadow:
            0 0 6px rgba(255, 147, 231, .95),
            0 0 14px rgba(255, 147, 231, .55),
            0 -7px 26px rgba(196, 160, 246, .45),
            0 -16px 44px rgba(196, 160, 246, .28) !important;
        animation: stkSkipBreath 3.2s ease-in-out infinite alternate;
    }
}

@keyframes stkSkipBreath {
    from {
        text-shadow:
            0 0 6px rgba(255, 147, 231, .95),
            0 0 13px rgba(255, 147, 231, .5),
            0 -6px 22px rgba(196, 160, 246, .4),
            0 -14px 38px rgba(196, 160, 246, .22);
    }

    to {
        text-shadow:
            0 0 7px rgba(255, 147, 231, 1),
            0 0 18px rgba(255, 147, 231, .65),
            0 -9px 30px rgba(196, 160, 246, .55),
            0 -20px 52px rgba(196, 160, 246, .34);
    }
}

@media (prefers-reduced-motion: reduce) {
    body.P-Stoschek p.videoClick,
    body.P-Stoschek p.videoClick > a {
        animation: none !important;
    }
}

/* ==========================================================================
   CVG-PATCH306 : Stoschek SM - retours Maxou du 2026-08-09 soir (capture
   Gilligan moyens N1, 21h59).
   (1) TITRE DU CHEMIN : lignes du milieu centrees et derniere ligne posee
   SUR la description. Deux causes socle mesurees au harnais :
   - style.css:2012 (.upper span) rend chaque segment du titre (spans poses
     par main.js:1037) en inline-block width:100% text-align:center - le
     segment long (WORK-ENVIRONMENT RELATIONSHIP) wrappe DANS sa boite et
     s'y centre, d'ou les lignes 2-3 flottantes ; retour a l'inline nu, le
     texte coule a gauche et casse au trait d'union. border-bottom:0 :
     la meme regle socle porte le filet gris 2px (deja retire du span des
     artistes-exemples au 304), qui soulignerait chaque segment en inline.
   - div.upper (style.css:1164) est un flex column de hauteur FIGEE en
     overflow hidden : le flex-shrink par defaut COMPRIMAIT le titre (66.7px
     mesures pour 4 lignes de contenu, height:auto du 303 sans effet) et la
     4e ligne debordait sur la description (meme famille de piege que le
     compresseur #content de la page login). flex-shrink:0 : le titre prend
     sa hauteur, c'est la description - deja scrollable (300b) - qui absorbe.
   Corps 19px conserve : la remise en flux suffit (3 lignes mesurees sur le
   pire chemin), pas besoin de reduire la police.
   (2) SKIP : trainee d'etoile filante TRES legere en plus de l'emanation
   305 - un fuseau degrade rose->lavande->transparent, flou, incline, qui
   s'etire vers le haut-gauche DERRIERE les lettres (z-index -1 + isolation
   sur le lien, precedent PATCH256 : sans contexte d'empilement le pseudo
   passerait sous la video). Aucun decalage de copie du mot : c'est un
   gradient, pas une ombre du texte - rien ne se pose sur les glyphes.
   ========================================================================== */
@media (max-width: 550px) {
    body.P-Stoschek #modal .short-text {
        flex-shrink: 0 !important;
    }

    body.P-Stoschek #modal .short-text > span {
        display: inline !important;
        width: auto !important;
        text-align: inherit !important;
        border-bottom: 0 !important;
    }

    body.P-Stoschek p.videoClick > a {
        position: relative !important;
        isolation: isolate !important;
    }

    /* 307 : la trainee doit TOUCHER le mot (retour Maxou) - la tete du
       fuseau glisse sous les glyphes (right 58%, tete plus dense) et
       s'etire au-dela ; l'emanation du 305 (text-shadow + respiration)
       reste posee telle quelle, la trainee S'AJOUTE. */
    body.P-Stoschek p.videoClick > a::before {
        content: "";
        position: absolute;
        top: 42%;
        right: 58%;
        width: 165%;
        height: 0.9em;
        transform: rotate(9deg); /* sens ecran : +9deg REMONTE le bras gauche (y vers le bas), verifie au crop */
        transform-origin: 100% 50%;
        background: linear-gradient(to left,
            rgba(255, 180, 238, .38),
            rgba(196, 160, 246, .16) 45%,
            rgba(196, 160, 246, 0) 82%);
        filter: blur(6px);
        border-radius: 999px;
        pointer-events: none;
        z-index: -1;
    }
}

/* ==========================================================================
   CVG-PATCH307 : Stoschek SM - popup : le titre du chemin s'adapte a la
   HAUTEUR d'ecran et la description garde un plancher (captures Maxou
   23h07 Edge / 23h10 Firefox). Sur Edge Android le chrome du navigateur
   (barre URL + barre basse) mange ~100px de viewport : div.upper (87%
   d'une modale elle-meme en pourcentage de hauteur) raccourcit, et depuis
   le flex-shrink:0 du 306 le titre a 19px fixes prenait sa pleine hauteur
   - la description longue n'avait plus que ~2 lignes visibles. Deux
   garde-fous, memes selecteurs que 300/306, ce bloc vient APRES :
   - titre en min(19px, 2.6vh) : identique a 19px des 731px de hauteur
     (Chrome/Firefox du telephone reel), retrecit progressivement sur les
     viewports courts (Edge ~640px -> ~16.6px) ; ligne 19px seule en repli
     des navigateurs sans min().
   - plancher min-height sur la description : le div du schema (seul
     enfant compressible restant du flex .upper) absorbe, le SVG en
     pourcentages suit - le diagramme perd quelques px plutot que la
     description ses lignes.
   ========================================================================== */
@media (max-width: 550px) {
    body.P-Stoschek #modal .short-text {
        font-size: 19px !important;
        font-size: min(19px, 2.6vh) !important;
    }

    body.P-Stoschek #modal .long-text {
        min-height: 110px !important;
    }

    /* le wrapper du schema (1er enfant du flex .upper) porte le min-height
       auto des enfants flex : il refusait de se comprimer sous la hauteur
       de son contenu et le plancher de la description passait sous le bord
       de la popup (mesure a 640 : svg 349px, description coupee a ~55px
       visibles). min-height 0 le libere - le SVG en pourcentages suit,
       preserveAspectRatio garde le diagramme homothetique. */
    body.P-Stoschek #modal .upper > div:first-child {
        min-height: 0 !important;
    }
}

/* ==========================================================================
   CVG-PATCH308 : Stoschek SM - retours Maxou du 2026-08-09 23h46 (deux
   captures annotees). Complements JS dans main.js (voile de fondu) et
   valeurs 308 dans les blocs 299 (bulle) et 301 (footer) ci-dessus.
   (1) STABILITE DE LA LISTE au retour du diagramme : l'ancre <a> de fin de
   nom (porte-bulle, PATCH226) contient un ESPACE au corps du nom (~21px
   visuels) ; masquee par hideILinks apres l'intro puis RE-AFFICHEE a la
   fermeture de la popup pour porter la bulle, elle refaisait couler le nom
   (Firefox : LORETTA FAHRENHOLZ wrappait meme sur 2 lignes au chargement,
   div mesure 425.9px puis 408.2px apres fermeture - c'est le "contenu
   decale" constate). font-size:0 sur l'ancre : plus aucune emprise en flux,
   avant = apres. L'icone info (img, largeur en %) et la bulle (corps 44px
   poses par le 299) ont leurs tailles propres, rien d'autre ne bouge.
   (2) VOILE DE FONDU de la description (div.upper:after, pilote par
   --long-fade-bottom au scroll, main.js) : ceinture cote CSS en plus de la
   garde JS - bottom borne dans [-10%, 0%], le voile ne peut plus se
   projeter sur le diagramme.
   ========================================================================== */
@media (max-width: 550px) {
    body.P-Stoschek #artists div.artist-name > a {
        font-size: 0 !important;
    }

    /* 311 (retour Maxou "les noms se decalent") : la pastille 'i' ::before de
       l'ancre (style.css:2143 - inline-flex 20px + margin-left 4px, tailles
       FIXES que le font-size:0 du 308 ne reduit pas) restait DANS LE FLUX (le
       visibility:hidden de style.css:2180 garde l'emprise) quand main.js
       re-affiche l'ancre au reveal de la bulle (AnimationModalClosed) : ~24px
       locaux, PLUS l'espace au corps 126px du template (difBoros:250, situe
       AVANT l'ancre dans le noeud texte du nom, hors de portee du font-size:0)
       qui cessait d'etre traite comme fin de ligne. Total ~66px locaux sur une
       ligne centree = saut des glyphes de ~10px visuels mesure (FF -10.18 /
       chromium -9.77). ::before hors flux : l'espace redevient traînant et se
       trimme aussi - saut residuel mesure 0.61px. La pastille n'est de toute
       facon jamais visible en Stoschek SM (ancres masquees au chargement). */
    body.P-Stoschek #artists td.artistName div.artist-name > a::before {
        display: none !important;
    }

    body.P-Stoschek #modal div.upper::after {
        bottom: clamp(-10%, var(--long-fade-bottom, 0%), 0%) !important;
        /* 309 : le voile degradait vers le gris du theme d'origine
           (rgb(74,73,79), var --anime-gradient-blur) - sur le fond violace
           C3 (#45424f) il se lisait comme un PAVE GRIS pose sous les
           artistes-exemples (constat 305, cotes identiques : 80 pour cent
           de large, inset 10 pour cent). Il fond desormais vers la couleur
           reelle du fond de la popup : redevenu un fondu invisible. */
        background: linear-gradient(rgba(69, 66, 79, 0), #45424f 80%) !important;
    }
}

/* ==========================================================================
   CVG-PATCH315+316+320+323+325 (RETIRES PAR CVG-PATCH414) : la brume
   violette d'intro de Stoschek (markup .fog du livrable Claude design,
   chute 13s, nuages, lisere, voile residuel) est ABANDONNEE - consigne
   Maxou du 2026-08-20 : meme geste que Mennour, un rideau qui SE LEVE,
   sans fumee. Le geste commun (noir de video teinte, remontee du calque,
   scroll auto en fin d'ouverture) est porte par closeIntro() des deux
   layouts et par le bloc teinte PATCH413/414 en fin de ce fichier ; le
   markup .fog est retire des deux layouts par le meme patch. L'integralite
   du bloc est recuperable au commit du PATCH412 si la brume revenait.
   ========================================================================== */

/* ==========================================================================
   CVG-PATCH336 : BRM desktop - couleurs et bordures de la maquette de design
   (livrable "BRM COLLECTION 2012 - desktop_V2.html", Maxou 2026-08-13).
   PERIMETRE, consigne Maxou : de cette maquette on ne retient QUE les
   bordures et les couleurs. La geometrie et la TYPOGRAPHIE sont laissees de
   cote - voir la note "ecarte" en fin de commentaire.
   ORIGINE. La maquette est le portrait BRM de tester augmente de 447 lignes
   en fin de ce fichier, ecrites hors depot par une session de design. Elle ne
   touche ni style.css, ni le style de config injecte, ni les variables du
   theme posees en base (diff integral mesure : les seuls autres ecarts sont
   des URL reecrites en absolu par l'outil d'export). Ces 447 lignes forment
   HUIT blocs marques "CVG-PATCH312" a "319" - numeros FICTIFS : dans ce depot
   312 a 319 sont deja pris par les chantiers Stoschek et le verrou des
   portraits. D'ou la renumerotation en un seul 336.
   POURQUOI UN SEUL BLOC. Les huit se neutralisent en cascade : le premier
   pose une surbrillance #bfd47a/#e4f58f, le troisieme y ajoute un degrade a
   trois marches, le cinquieme unifie les deux ailes, le sixieme les re-separe,
   le septieme unifie chaque aile, et le dernier ecrase tout en posant sur le
   chemin entier la teinte EXACTE de la colonne de chiffres correspondante.
   Recopier l'empilement embarquerait une dizaine de declarations mortes. Les
   regles ci-dessous sont donc l'etat final effectif, verifie EQUIVALENT au
   rendu de la maquette par mesure des styles calcules (harnais : config +
   style.css + ce fichier, sondes sur 40 elements) - 0 ecart de couleur et de
   bordure a 1920, 1440, 1024 et 551px, 0 ecart a 550 et 375px.
   (1) FILETS DE STRUCTURE A 2px. Lexique du Protocole d'assignation v3 : le
       filet est un trait de STRUCTURE, "strictement superieur a 1px et
       inferieur ou egal a 2px", et l'Art. 5 le donne comme regle non soumise
       a calibration - "poser 2px explicitement, les gardes sous-pixel
       navigateur faussent le 1px". Mesure : la grille des tableaux tombait
       bien a 1px sous Chrome, les blocs @supports de PATCH213/216 ne forcant
       le 2px que sous Firefox et WebKit. La couleur des bordures des thead
       MOTEURS/MOYENS rejoint au passage l'assise : elles etaient restees a
       l'olive #4e4c1f du socle, PATCH286 n'ayant traite que le centre - le
       cadre des trois colonnes devient continu.
       L'entete ARTISTES n'est PAS repris ici : PATCH286 (l.2045) lui pose
       deja border:2px solid var(--brm-assise) !important, meme selecteur.
   (2) ENCRES DES DEUX AILES. Le titre passe du beige pale #d1cfaf herite de
       la config au BLANC - ce qui rapproche la page de Z9 ("blanc sur C1/C2
       plein uniquement") et porte le contraste sur l'assise de K 7,3 a
       K 11,6 ; le sous-titre recupere le #d1cfaf que le titre libere, donc il
       gagne lui aussi en presence tout en restant sous le titre.
       Le prefixe "div" de div#motors/div#means est necessaire : il bat
       style.css:265/255 qui pose ces couleurs via --d4-t / --d5-t.
   (3) CHEMIN SELECTIONNE, UN SEUL TON PAR AILE, egal a la teinte de sa
       colonne de chiffres du tableau central : chartreuse #d1e09a (--d2) a
       gauche, citron #f2fdb5 (--d1) a droite. Deux acquis de la serie de
       retours : le chemin est UN objet - categorie, sous-niveaux et texte
       developpe designent le meme moteur - donc pas de degrade interne ; et
       le lien entre le chiffre du centre et son developpement lateral est une
       EGALITE de teinte, pas une parente. Les 11 selecteurs d'une aile
       doivent rester dans UNE seule regle : le premier vaut (1,4,3) et les
       quatre derniers (1,3,2), c'est l'egalite de valeur qui rend l'ordre
       indifferent. Listes recopiees a l'identique de style.css, garde
       :not(.overlay) comprise. Les libelles verticaux HORS chemin gardent
       leur parchemin #dcd8c1 (--d3, acquis du portrait).
   (4) PAVE DU CHIFFRE SELECTIONNE (Z13). Zone reglee par rectificatif du
       2026-08-06 - C2 plein, chiffre blanc - et non realisee ici : le pave
       portait la couleur de la colonne au repos, donc aucun relais visuel
       entre la ligne artiste et les deux chemins lateraux. Sous R8 il n'y a
       pas de C2 ; le role revient a la couleur d'etat. Le rouge pur #ff0000
       du cadre de selection ne tient pas le plancher Z9 (K 4,0 en blanc sur
       rouge, sous le 4,5 herite du v6) : on prend le rouge du titre #cd3529,
       deja dans la palette du portrait, K 5,08. Le cadre de selection reste
       en #ff0000 - le pave est le meme geste, un cran plus sombre pour porter
       du texte. background-color et non background : style.css:493/503 pose
       aussi un background-color, un raccourci reinitialiserait
       background-image. Le chiffre est un noeud texte NU dans le td
       (difPMD.js:327/336, difBRM.js:107/116) : il herite du blanc, aucune
       regle sur un span ou un a n'est necessaire - la maquette en posait une,
       elle est sans effet et n'est pas reprise.
       A savoir : sur la ligne selectionnee, main.js:1909 pose inline
       border-color:transparent !important sur tous les td (PATCH183e, pour ne
       jamais cumuler deux cadres de selection). Les fonds ne sont pas
       concernes, le pave rouge s'affiche ; seules les COULEURS de bordure de
       cette ligne sont neutralisees, par construction.
   (5) CADRE DE SURVOL DES NOMS. Il etait en 4px dashed BLEU PUR #0000ff, une
       couleur etrangere a la palette : elle vient du repli du socle
       (--hover-cursor-border, 3px dashed blue) repris tel quel par une cle de
       config. Il passe a l'assise, celle de la grille, des filets et des deux
       ailes, et son epaisseur descend sous celle du cadre de selection : le
       survol est une invitation, la selection est un etat, et le rouge reste
       le seul rouge de la colonne. Z11 (etats) est declaree non reglee par le
       protocole - le choix se fait sous R8, ou l'assise prend les zones
       jumelles ET les traits. Seul div#hover est vise ; div#selected garde
       son cadre rouge. main.js lit borderTopWidth au runtime, le passage de
       4 a 3px se recale de lui-meme.
   ECARTE (consigne de perimetre) : les declarations purement typographiques
   de la maquette - font-weight 500 sur les h1 des deux ailes, font-size 46px
   sur le h1 ARTISTES, et letter-spacing .02em sur les trois bandeaux. Ce sont
   les seuls ecarts subsistant entre ce bloc et la maquette, avec la graisse
   du h1 ARTISTES, ramenee a 500 au lieu du 600 de la maquette par arbitrage
   Maxou - voir la section (6), CVG-PATCH337, seule exception typographique
   retenue.
   Scope body.P-BRM + min-551 : les 8 autres portraits et le regime smartphone
   sont strictement inchanges. Ce fichier charge APRES le style de config
   injecte (contrat PATCH183) : a !important egal, specificite et ordre
   gagnent.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1) filets de structure a 2px, en assise --------------------------
       L'entete ARTISTES n'est pas repris : PATCH286 (l.2045) pose deja
       border:2px solid var(--brm-assise) !important sur le meme selecteur. */
    body.P-BRM #motors td,
    body.P-BRM #means td,
    body.P-BRM #motors th,
    body.P-BRM #means th {
        border-width: 2px !important;
    }

    body.P-BRM #motors thead th,
    body.P-BRM #means thead th {
        border-color: var(--brm-assise) !important;
    }

    body.P-BRM #artists tbody tr td:first-child,
    body.P-BRM #artists tbody tr td:last-child {
        border-left-width: 2px !important;
        border-right-width: 2px !important;
    }

    /* --- (2) encres des deux ailes : titre blanc, sous-titre au beige que le
       titre libere. Le prefixe div est necessaire (bat style.css:255/265). */
    body.P-BRM div#motors thead th h1,
    body.P-BRM div#means thead th h1 {
        color: #ffffff !important;
    }

    body.P-BRM div#motors thead th small,
    body.P-BRM div#means thead th small {
        color: #d1cfaf !important;
    }

    /* --- (3) chemin selectionne : un seul ton par aile, exactement la teinte
       de sa colonne de chiffres. Garder les 11 selecteurs dans UNE regle. */
    body.P-BRM:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-BRM #motors td.hover:not(.overlay),
    body.P-BRM #motors tr.hover td,
    body.P-BRM #motors tr.hover .short-text,
    body.P-BRM #motors tr.hover .long-text,
    body.P-BRM #motors tr:hover .short-text,
    body.P-BRM #motors tr:hover .long-text,
    body.P-BRM #motors td.cteg.hover,
    body.P-BRM #motors td.scteg.hover,
    body.P-BRM #motors td.sscteg.hover,
    body.P-BRM #motors td.libelle.hover {
        background: #d1e09a !important;
    }

    body.P-BRM:not(.selected) #means tr:hover td:not(.overlay),
    body.P-BRM #means td.hover:not(.overlay),
    body.P-BRM #means tr.hover td,
    body.P-BRM #means tr.hover .short-text,
    body.P-BRM #means tr.hover .long-text,
    body.P-BRM #means tr:hover .short-text,
    body.P-BRM #means tr:hover .long-text,
    body.P-BRM #means td.cteg.hover,
    body.P-BRM #means td.scteg.hover,
    body.P-BRM #means td.sscteg.hover,
    body.P-BRM #means td.libelle.hover {
        background: #f2fdb5 !important;
    }

    /* --- (4) Z13 : pave du chiffre selectionne, rouge d'etat, chiffre blanc
       (le chiffre est un noeud texte nu, il herite de la couleur du td) */
    body.P-BRM #artists tbody tr.selected td.artist-motor,
    body.P-BRM #artists tbody tr.selected td.artist-mean {
        background-color: #cd3529 !important;
        color: #ffffff !important;
    }

    /* --- (5) cadre de survol des noms : assise au lieu du bleu du socle,
       et sous l'epaisseur du cadre de selection. div#selected non touche. */
    body.P-BRM #artistsScroll > div#hover.cursor {
        border: 3px dashed var(--brm-assise) !important;
    }

    /* --- (6) CVG-PATCH337 : SEULE exception typographique, arbitrage Maxou
       du 2026-08-13. Le titre ARTISTES prend la graisse 500 - un cran
       au-dessus du 400 que "h1 { font-weight: 400 !important }"
       (style.css:251) impose partout, un cran sous le 600 du titre du
       portrait. C'est un ECART VOULU a la maquette, qui posait 600 avec un
       corps a 46px : la demande est la presence, pas le changement d'echelle.
       Le centre gagne donc en presence sans passer devant le titre de la
       page, et sans toucher a la hauteur du bandeau - le corps reste celui du
       socle, donc le subHeaderHeight que difPMD lit au chargement pour
       calculer la hauteur de la zone de liste ne bouge pas.
       Les deux ailes ne sont PAS touchees (la maquette les montait a 500) :
       elles gardent la graisse du socle et continuent de se distinguer par le
       fond - blanc sur assise contre rouge sur creme.
       Specificite (1,1,5) + !important : bat le h1 du socle. */
    body.P-BRM #artists thead th h1 {
        font-weight: 500 !important;
    }
}

/* ==========================================================================
   CVG-PATCH341 : BRM smartphone - cinq retours Maxou du 2026-08-13 sur le
   PATCH340. Ce bloc le REMPLACE (il ne s'y ajoute pas) ; le FOOTER et le
   SURLIGNEUR ROSE restent hors de portee, aucune regle ne les vise.
   (1) "cadre de selection artiste trop fin" : 4 -> 7px. Toujours en
       box-shadow inset, pour la raison du 340 - main.js:1909 force inline
       border-color:transparent sur les td de la ligne selectionnee
       (PATCH183e), une bordure y serait effacee.
   (2) "le header doit etre sombre et texte clair" : le 340 l'avait mis en
       CLAIR pour le distinguer de la barre d'onglets - mauvaise reponse a un
       vrai probleme. Le header revient donc a l'assise avec titre et mention
       en blanc, et la distinction avec la barre est obtenue autrement : un
       filet clair qui ferme le header, et surtout le bloc ARTISTES clair
       pose au centre de la barre (3) - celle-ci n'est plus une bande sombre
       continue, les deux zones ne peuvent plus se lire comme une seule.
   (3) "le titre ARTISTS ne se detache pas" : le rouge #cd3529 sur l'assise
       ne portait pas (K 2,1). Plutot que de changer cette couleur, qui est
       celle du portrait, ARTISTES reprend le dispositif du DESKTOP - un bloc
       CLAIR entre deux libelles sur fond sombre. Le contraste devient celui
       du rouge sur creme, et le triptyque du desktop se retrouve tel quel :
       le centre est l'objet, les ailes sont les axes.
   (4) "les termes dans le diagramme anime sont empates" : REGRESSION du 340.
       La config posait stroke 2px sur les cinq groupes de niveau ; le 340 en
       a change la couleur au lieu de le retirer. Or un stroke pose sur un
       groupe SVG s'applique AUSSI aux <text> qu'il contient - chaque terme
       etait donc double d'un contour de 2px. Le stroke est desormais annule
       sur les textes, et sur eux seuls.
   (5) "le degrade en bas des descriptions longues masque bizarrement le bas"
       : REGRESSION du 340 egalement. Le fondu de bas de texte
       (div.upper:after, style.css:1177) est peint par --anime-gradient-blur,
       que la config laisse en gris-bleu OPAQUE #608597 ; le 340 avait change
       le fond de la popup sans toucher a ce degrade, qui masquait donc le
       texte au lieu de l'estomper. Les deux sont desormais accordes : le
       fondu part de l'assise et va vers le transparent. Pose en variables
       (--anime-bg et --anime-gradient-blur) et non sur .modal-content, ce
       qui couvre tous les consommateurs du socle d'un coup.
   Les acquis non contestes du 340 sont repris tels quels : suppression des
   six ombres brunes/rouges de la config, mention sans fond, colonnes
   chartreuse et citron a encre d'assise, info-bulle en aplat.
   VERIFIE au rendu mobile (396x860, Android, cadre affiche) pour 1, 2, 3.
   NON VERIFIABLE hors ligne, A REGARDER SUR TELEPHONE : les points 4 et 5 -
   le schema et la popup ne s'affichent qu'au clic, et le JS de la maquette
   hors-ligne est partiel ; les deux corrections sont faites sur pieces
   (selecteurs et variables lus dans la config et dans style.css).
   Scope body.P-BRM + max-550 : le DESKTOP et les 8 autres portraits sont
   strictement inchanges.
   ========================================================================== */
@media (max-width: 550px) {

    body.P-BRM {
        --brm-assise: #1C3F35;
        /* popup moteur/moyen : le fond ET son fondu de bas de texte doivent
           partir de la MEME couleur, sinon le degrade masque le bas de la
           description au lieu de l'estomper (la config laissait un gris-bleu
           opaque #608597 sur un fond devenu vert). */
        --anime-bg: #1C3F35;
        --anime-gradient-blur: linear-gradient(0deg, #1C3F35 0%, rgba(28, 63, 53, 0) 100%);
    }

    /* ---- (1) PLUS AUCUNE OMBRE PORTEE BRUNE / ROUGE / ROSE --------------- */
    body.P-BRM #title-ADIAF .mobile,
    body.P-BRM .mobile-motor,
    body.P-BRM .mobile-mean,
    body.P-BRM #artists thead th h1,
    body.P-BRM #artists tbody tr td:first-child,
    body.P-BRM #artists tbody tr td:last-child,
    body.P-BRM .artist-name,
    body.P-BRM .modal-header__name,
    body.P-BRM #player-modal button {
        text-shadow: none !important;
    }

    /* ---- (2) HEADER SOMBRE, TEXTE CLAIR ---------------------------------
       Il reste distinct de la barre d'onglets par deux choses : un filet
       clair qui le ferme, et le bloc ARTISTES clair pose au centre de la
       barre (voir 3) - la barre n'est plus une bande sombre continue. */
    body.P-BRM #title-ADIAF {
        background: var(--brm-assise) !important;
        border-bottom: 2px solid rgba(255, 255, 255, .38) !important;
    }

    body.P-BRM #title-ADIAF .mobile,
    body.P-BRM h1.title {
        color: #ffffff !important;
    }

    /* la mention : plus AUCUN fond (la config posait --s7 #ffffff2b) */
    body.P-BRM .upperTitle {
        background: none !important;
        background-color: transparent !important;
        color: rgba(255, 255, 255, .82) !important;
    }

    body.P-BRM .upperTitle > a,
    body.P-BRM .upperTitle > a:visited {
        color: #ffffff !important;
        text-decoration: underline !important;
        text-underline-offset: 3px !important;
    }

    /* ---- (3) barre des onglets, et ARTISTES QUI SE DETACHE ---------------
       Le rouge sur l'assise ne portait pas. ARTISTES reprend le dispositif
       du desktop : un bloc CLAIR encadre, entre deux libelles sur fond
       sombre - le centre est l'objet, les ailes sont les axes. */
    body.P-BRM #artists thead th {
        background: var(--brm-assise) !important;
    }

    body.P-BRM .mobile-motor,
    body.P-BRM .mobile-mean {
        color: #ffffff !important;
    }

    body.P-BRM #artists thead th h1 {
        display: inline-block !important;
        background: #fffdf2 !important;
        border: 3px solid #fffdf2 !important;
        border-radius: 2px !important;
        padding: 4px 26px !important;
        color: #cd3529 !important;
    }

    /* ---- (4) colonnes de chiffres : teintes du desktop, encre d'assise --- */
    body.P-BRM #artists tbody tr td:first-child {
        background: #d1e09a !important;
    }

    body.P-BRM #artists tbody tr td:last-child {
        background: #f2fdb5 !important;
    }

    body.P-BRM #artists tbody tr td:first-child,
    body.P-BRM #artists tbody tr td:last-child {
        color: var(--brm-assise) !important;
        -webkit-text-stroke-width: 0 !important;
        border-color: var(--brm-assise) !important;
    }

    /* ---- (5) CADRE PRONONCE de la ligne selectionnee : 7px ---------------
       Il englobe les TROIS cellules : chiffre moteur, nom, chiffre moyen.
       En box-shadow inset et non en border : main.js:1909 force inline
       border-color:transparent sur les td de la ligne selectionnee
       (PATCH183e) - une bordure y serait effacee, le box-shadow passe. */
    body.P-BRM #artists tbody tr.selected td {
        box-shadow: inset 0 7px 0 0 var(--brm-assise),
                    inset 0 -7px 0 0 var(--brm-assise) !important;
        border-color: var(--brm-assise) !important;
    }

    body.P-BRM #artists tbody tr.selected td:first-child {
        box-shadow: inset 7px 0 0 0 var(--brm-assise),
                    inset 0 7px 0 0 var(--brm-assise),
                    inset 0 -7px 0 0 var(--brm-assise) !important;
    }

    body.P-BRM #artists tbody tr.selected td:last-child {
        box-shadow: inset -7px 0 0 0 var(--brm-assise),
                    inset 0 7px 0 0 var(--brm-assise),
                    inset 0 -7px 0 0 var(--brm-assise) !important;
    }

    /* ---- (6) INFO-BULLE VISIBLE ----------------------------------------- */
    body.P-BRM div.artist-name div.tooltip2,
    body.P-BRM div.tooltip2.right-align,
    body.P-BRM div.tooltip2.left-align {
        background-image: none !important;
        background-color: var(--brm-assise) !important;
        filter: none !important;
        border-color: var(--brm-assise) !important;
        text-indent: 0 !important;
        text-align: center !important;
    }

    body.P-BRM div.artist-name div.tooltip2 a,
    body.P-BRM div.tooltip2.right-align a,
    body.P-BRM div.tooltip2.left-align a {
        color: #ffffff !important;
        text-indent: 0 !important;
        visibility: visible !important;
        opacity: 1 !important;
    }

    /* ---- (7) SOBRIETE DU SCHEMA ANIME -----------------------------------
       Fond violet, halo violet et drop-shadow vert menthe de la config :
       retires. Les TERMES ne portent plus aucun contour : la config posait
       stroke 2px sur les groupes de niveau, et un stroke sur un groupe SVG
       s'applique aussi aux <text> qu'il contient - c'est ce qui les
       empatait. Le trait reste sur les formes, jamais sur le texte. */
    body.P-BRM rect#bgSchem {
        fill: #fffdf2 !important;
        background: #fffdf2 !important;
    }

    body.P-BRM #schemSVG,
    body.P-BRM #schemSVG1 {
        filter: none !important;
    }

    body.P-BRM g#level1Block,
    body.P-BRM g#level2Block,
    body.P-BRM g#level3Block,
    body.P-BRM g#level4Block,
    body.P-BRM g#leve5Block {
        filter: none !important;
    }

    body.P-BRM #schemaWrapper text,
    body.P-BRM #schemSVG text,
    body.P-BRM #schemSVG1 text,
    body.P-BRM g#level1Block text,
    body.P-BRM g#level2Block text,
    body.P-BRM g#level3Block text,
    body.P-BRM g#level4Block text,
    body.P-BRM g#leve5Block text {
        stroke: none !important;
        stroke-width: 0 !important;
        paint-order: normal !important;
    }
}
/* ============================================================================
   CVG-PATCH342 : Mennour desktop - pourtour du chemin selectionne dans MOTEURS
   et MOYENS. Ce bloc a ete EMPORTE DEUX FOIS par la session parallele BRM, qui
   reecrit ce fichier en entier au lieu de l'editer : une premiere fois par le
   PATCH340 (187 ajouts / 120 suppressions - il a fait disparaitre les 68 lignes
   du PATCH338, deja poussees), une seconde par le PATCH341 BRM (103 ajouts /
   186 suppressions - il a fait disparaitre le bloc du PATCH341 Mennour, lui
   aussi deja pousse, et a repris au passage le numero 341). A CHAQUE FOIS la
   moitie JS, elle, restait dans blocks.js : le module tracait donc toujours ses
   6 SVG chez Mennour mais SANS support ni skin - conteneurs en position:static,
   SVG dans le FLUX, scrollHeight de l'aile a 64138px au lieu de 16027 et trait
   bleu de repli. Un demi-patch orphelin, pas un simple retour en arriere. Le
   bloc est repose EN FIN DE FICHIER, apres celui de la session BRM, dont
   aucune ligne n'est touchee, et renumerote en 342 puisque 341 lui revient.
   Il porte les reglages demandes par Maxou apres le rendu du 338, ombre
   comprise (voir plus bas : "un chouia plus marquee" du 2026-08-13).

   POURQUOI UN SVG ET PAS UNE BORDURE. La zone selectionnee n'est pas un
   rectangle : c'est l'UNION de cellules a rowspans emboites (chez l'artiste
   sonde, Neil BELOUFA : COMPRENDRE 2008px locaux, SOCIETE-CODES 1151,
   CONDITIONNANT 608, MIMETISME/chiffre/description 304). Une bordure CSS
   couvre toujours tout le cote d'une cellule : elle ne peut pas suivre ce
   contour en escalier sans tracer aussi des segments INTERNES a la zone. Le
   pourtour est donc trace par le module PATCH281/282 de blocks.js - un SVG en
   overlay dans #motors-scroll / #means-scroll, chemin calcule sur la geometrie
   reelle des cellules .hover, redessine sur MutationObserver, resize et load.
   Le 338 n'a fait que l'OUVRIR a Mennour (gate par liste) et sortir son skin
   en variables ; l'algorithme du trace n'est pas touche, Stoschek rend comme
   avant.

   LES DEUX GESTES DU 341, decides par Maxou au vu du rendu du 338.

   (1) LE TRAIT PASSE DE 6px NOIR A 2px BRUN FONCE #452102. On quitte le
       registre du cadre - 6px noir, c'etait la graphie du cadre de selection
       de la colonne ARTISTES (PATCH235), un trait qui DESIGNE - pour celui du
       contour : 2px, c'est deux fois le filet de grille, la zone est cernee
       sans etre encadree. Le brun sort de la famille terre du portrait au lieu
       du noir pur, et reste tres sombre. Ce sont des px LOCAUX (le trace vit
       dans le #container mis a l'echelle, comme le cadre ARTISTES) : a 1600px
       de large, ou le portrait est rendu a environ 0,58, le trait pese un peu
       plus d'un pixel a l'ecran - une arete fine et nette.

   (2) L'OMBRE PORTEE REPREND LE TRAVAIL QUE LE TRAIT EPAIS FAISAIT : c'est
       elle qui donne desormais sa presence a la selection, la zone se souleve
       de la page au lieu d'etre entouree. Brune (le meme #452102 en rgba),
       portee vers le BAS, floue - "assez foncee mais douce". Le module ne peut
       pas la poser en feDropShadow sur le trait (l'ombre suivrait aussi les
       aretes hautes et retomberait DANS la zone) : il decale et floute une
       copie PLEINE du contour, puis la decoupe en evenodd pour ne la garder
       qu'a l'EXTERIEUR - detail dans le commentaire du 341 cote JS.

   PERIMETRE. Media min-width:551px = frontiere de l'injecteur de config : le
   regime smartphone reste strictement intact - et le module JS se retire de
   lui-meme en dessous de 551px. Scope body.P-Mennour partout. L'ombre n'existe
   que si --sel-shadow-color est posee : Stoschek et les sept autres portraits
   ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-outline-color: #452102; /* 342 : etait #000 au 338, 452102 pose au 341 */
        --sel-outline-width: 2px; /* 342 : etait 6 au 338 (px LOCAUX) */
        /* trait plein. Pour la graphie pointillee du cadre ARTISTES :
           --sel-outline-dash: 0 14;  (pastilles rondes tous les 14px locaux) */

        /* 342 : ombre portee de la zone. dy et blur en px LOCAUX.
           Reglage "un chouia plus marquee" (retour Maxou 2026-08-13, sur la
           planche des quatre intensites) : un cran au-dessus du dy 5 / flou 6
           / alpha .45 du 341, et un cran sous la variante marquee qui avait
           ete jugee trop forte. Voisins rendus, pour memoire :
             discrete : dy 3, blur 3, alpha .32
             precedent: dy 5, blur 6, alpha .45
             marquee  : dy 8, blur 9, alpha .55 */
        --sel-shadow-color: rgba(69, 33, 2, 0.52);
        --sel-shadow-dy: 6;
        --sel-shadow-blur: 7;
    }

    /* support de l'overlay : conteneurs positionnes (le socle ne les
       positionne pas, sans cela le SVG absolu se calerait sur un ancetre
       lointain), trace au-dessus des cellules, transparent aux clics,
       solidaire du defilement puisqu'enfant du conteneur scrollable */
    body.P-Mennour #motors-scroll,
    body.P-Mennour #means-scroll {
        position: relative;
    }

    body.P-Mennour svg.stk-outline {
        position: absolute;
        pointer-events: none;
        z-index: 2;
        overflow: visible;
    }
}

/* ============================================================================
   CVG-PATCH343 : Mennour desktop - mise en conformite des TRAITS avec le
   Protocole d'assignation C1C2 v4 (PDF joint par Maxou le 2026-08-13), plus
   deux reglages qu'il a poses dans le meme message.

   CE QUE DIT LE PROTOCOLE, article 1 (lexique) et article 3 (zone Z7) :
     FILET   - trait de STRUCTURE, "epaisseur fixee a 2px (le 1px etant avere
               illisible et endommage par l'anti-aliasing)", operateur de la
               discernabilite D2 ;
     LISERE  - trait d'ACCENT, "epaisseurs constatees et calibrees : 4px
               (bordure chemin) a 11px (selection)".
   Les deux objets sont donc distincts, et l'ecart d'epaisseur EST le signal :
   un accent au meme poids que la structure ne se lit plus comme un accent.

   (1) LES FILETS PASSENT DE 1px A 2px. Mesure au harnais avant patch : les
       trois panneaux quadrillaient a 1px - 273 cellules par aile en
       1px solid #33302a, la liste ARTISTES en 1px #c4bcab (haut/bas) et
       #4e4c1f (cotes), l'entete ARTISTES en 1px #33302a. C'est exactement le
       cas que le protocole declare illisible. Seule l'EPAISSEUR change ici,
       les couleurs de chaque filet sont conservees : la demande de Maxou porte
       sur l'epaisseur ("cf sur filet epaisseur"), et recolorer tous les filets
       en noir pur serait un autre chantier, a arbitrer separement.
       On pose border-width et NON les quatre cotes un a un : une side dont le
       border-style vaut none garde une largeur calculee de 0 (regle CSS), donc
       aucune ligne nouvelle n'apparait la ou le gabarit n'en voulait pas - les
       6 cellules par aile qui ouvrent une copie de table sans filet haut
       restent sans filet haut. Le tableau etant en border-collapse, les
       bordures mitoyennes fusionnent : la grille ne double pas, elle epaissit.

   (2) LA BORDURE DU CHEMIN SELECTIONNE PASSE DE 2px A 4px - la valeur que le
       protocole nomme pour cet objet precis ("4px, bordure chemin"). Le 2px du
       PATCH342 avait ete regle quand la grille etait a 1px : le trait pesait
       alors le double du filet et se detachait. A grille 2px il aurait pese
       EXACTEMENT le meme poids que la structure, et se serait fondu dedans -
       d'autant que son brun #452102 et l'encre #33302a de la grille sont
       voisins. L'ombre portee du 342 n'est pas touchee : elle reste le second
       registre de la selection.

   (3) CADRE DE SELECTION DE LA COLONNE ARTISTES : 3px solid #4b2511, valeur
       DONNEE par Maxou. Il remplace le 6px dotted noir du PATCH235/236 - on
       quitte le pointille pour un trait plein, et le noir pur pour le meme
       brun de terre que le reste du portrait. A SIGNALER : le protocole range
       ce cadre parmi les liseres de SELECTION, qu'il calibre a 11px ; 3px est
       donc un ecart assume a la table de calibration, et c'est l'instruction
       explicite qui prime. box-sizing:border-box conserve (PATCH235) : le
       cadre est dessine A L'INTERIEUR de la bande de la ligne, l'encombrement
       ne bouge pas et main.js n'a rien a recalculer.

   (4) NOMS D'ARTISTES DONNES EN EXEMPLE dans les descriptions longues des deux
       ailes : #673a20 et graisse 500 (demande Maxou). Ce sont les <a> que la
       base pose en fin de description, dans un span parenthese ; ils etaient
       en olive #7b6813 graisse 400, herite du socle. Le brun les raccorde a la
       famille terre du portrait, et la graisse 500 les detache du corps de
       texte en 400 sans les faire passer pour des titres. La ponctuation du
       span (parentheses et virgule) garde l'encre du corps, comme aujourd'hui.

   PERIMETRE. Media min-width:551px = frontiere de l'injecteur de config : le
   regime smartphone reste strictement intact. Scope body.P-Mennour partout :
   les huit autres portraits ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {
    /* (2) la bordure du chemin selectionne repasse au calibre du protocole */
    body.P-Mennour {
        --sel-outline-width: 4px; /* 343 : etait 2px au 342 */
    }

    /* (1) filets de structure : 2px, couleurs inchangees */
    body.P-Mennour #motors td,
    body.P-Mennour #means td,
    body.P-Mennour #artists tbody td,
    body.P-Mennour #artists thead th {
        border-width: 2px !important;
    }

    /* (3) cadre de selection de la colonne ARTISTES */
    body.P-Mennour #artistsScroll > div#selected.cursor {
        border: 3px solid #4b2511 !important;
        outline: none !important;
        box-sizing: border-box !important;
    }

    /* (4) noms d'artistes en exemple, descriptions longues des deux ailes */
    body.P-Mennour #motors .long-text a,
    body.P-Mennour #means .long-text a {
        color: #673a20 !important;
        font-weight: 500 !important;
    }
}

/* ============================================================================
   CVG-PATCH344 : LIBELLES DE HIERARCHIE TOUJOURS VISIBLES - generalisation du
   PATCH275 aux NEUF portraits (demande Maxou 2026-08-13, capture Mennour et
   Stoschek cote a cote : le libelle du niveau 1 des MOYENS, "SET", se lit chez
   Stoschek et pas chez Mennour).

   LE DEFAUT N'EST PAS PROPRE A MENNOUR. Il vient du socle : style.css ancre le
   libelle vertical (div.wra > div.vertical-textw) pres du HAUT de sa cellule,
   par rotate(-90deg) translateX(-108%). Or une cellule de niveau 1 (td.cteg,
   rowspan 8) est beaucoup plus haute que la fenetre de #motors-scroll /
   #means-scroll : des que son haut sort par le haut, le libelle sort avec, et
   la colonne de gauche parait vide alors qu'on est en plein dedans. Cela vaut
   pour les neuf portraits ; seul Stoschek avait ete corrige, au PATCH275.

   CE QUI CHANGE. (1) Cote blocks.js, la gate P-Stoschek du module 275 est
   retiree : il mesure desormais, sur chaque conteneur et a chaque scroll, la
   position naturelle du libelle, et pose sur le div.wra une variable
   --stk-lvl-shift (px LOCAUX) qui le fait glisser le long de sa cellule pour
   le ramener dans la fenetre - clampe aux deux bords de la cellule, remis a 0
   des que la position naturelle suffit, et sans effet sur une cellule hors
   fenetre ou plus courte que son libelle (la plupart des sscteg).

   (2) Cote CSS, ici, la consommation de cette variable devient generique. Et
   elle NE PASSE PAS par transform, contrairement au 275 : le transform du
   .wra est une zone que les configs par-portrait peuvent redefinir en base
   (angle, translateX, origine), et une regle generique qui le reecrirait
   ecraserait ces reglages sans qu'on le voie. On passe donc par la propriete
   TRANSLATE, individuelle : le moteur applique translate PUIS rotate PUIS
   scale PUIS transform, donc "translate: 0 Ypx" compose exactement comme le
   translateY prepend du 275 - meme matrice finale - sans toucher a une seule
   declaration existante. A 0px (defaut), la matrice est celle du socle : tant
   que blocks.js n'a rien mesure, le rendu est strictement celui d'avant.

   Stoschek est EXCLU de cette regle : son PATCH275 prepend deja le translateY
   dans son propre transform, les deux se cumuleraient et le libelle glisserait
   du double. Son rendu reste donc au pixel celui du 275.

   PERIMETRE. Media min-width:551px, et le module JS vit dans la gate
   innerWidth > 550 : le smartphone ne voit rien. Aucun selecteur par-portrait
   ici - c'est le but : le comportement devient celui du socle.
   ========================================================================== */
@media (min-width: 551px) {
    body:not(.P-Stoschek) .wra {
        translate: 0 var(--stk-lvl-shift, 0px);
    }
}

/* ============================================================================
   CVG-PATCH345 : Mennour desktop - le CURSEUR DE SURVOL de la colonne ARTISTES
   passe au brun (demande Maxou 2026-08-13). Il etait le dernier element
   franchement hors palette du portrait : 3px dashed BLEU PUR, herite du socle
   (style.css --hover-cursor-border), sur un portrait entierement en terres.

   Il prend le meme brun #4b2511 que le cadre de selection du PATCH343, et
   GARDE son pointille : c'est lui, desormais, qui porte toute la difference
   entre les deux etats. Le rapport reste lisible - plein = selectionne,
   tirete = simplement survole - et l'epaisseur identique dit qu'il s'agit du
   meme objet a deux moments. Meme geste que chez BRM (PATCH341 BRM : cadre de
   survol ramene a l'assise du portrait, selection non touchee).

   div#hover.cursor et non div.cursor : les deux curseurs partagent la classe,
   une regle sur .cursor toucherait AUSSI #selected et ecraserait le 343.

   ARBITRAGE MAXOU DU 2026-08-13 SUR LE PROTOCOLE C1C2, a reporter dans le PDF
   (article 1, lexique du LISERE, et table de calibration de l'article 5) : la
   calibration a 11px vaut pour un cadre de selection POINTILLE ou TIRETE, ou
   l'oeil ne recoit qu'une fraction du trait et a besoin d'epaisseur pour le
   reconstituer ; un cadre PLEIN peut rester fin - 3px, la valeur du 343 chez
   Mennour, est validee sur piece. Le 4px de la bordure de chemin est
   inchange. Les FILETS a 2px sont valides eux aussi (PATCH343), y compris sur
   la liste ARTISTES.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour : smartphone et huit
   autres portraits intacts.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour #artistsScroll > div#hover.cursor {
        border: 3px dashed #4b2511 !important;
    }
}

/* ============================================================================
   CVG-PATCH346 : Mennour desktop - QUATRE TAILLES DE POLICE INDEPENDANTES pour
   les libelles verticaux des cellules du diagramme (demande Maxou 2026-08-13 :
   "diminuer le niveau 2 pour qu'il passe un chouia sous le niveau 1, augmenter
   un chouia le niveau 4", valeurs proposees 1.08 / 0.88 / 0.87 / 0.77, et
   surtout : "en aucun cas modifier l'un ne devrait modifier l'autre").

   LE DEFAUT VENAIT DE LA MECANIQUE, PAS D'UN REGLAGE. Les quatre niveaux
   n'avaient qu'UNE SEULE declaration de taille pour eux quatre - le .94em de
   .vertical-textw pose au PATCH255 - et se distinguaient uniquement par le em
   HERITE de leur cellule : rien sur td.cteg et td.scteg, .8em sur td.sscteg
   (#motorsDialog/#meansDialog, style.css:1280), .7em sur .libelle
   (style.css:1276). Deux consequences, toutes deux constatees au harnais :
     - les niveaux 1 et 2 sortaient a la MEME taille (25.57px locaux tous les
       deux), ce qui est exactement le grief ;
     - toucher au .94em deplacait les quatre d'un coup, et toucher au .8em ou
       au .7em deplacait aussi tout ce qui, ailleurs dans le site, porte ces
       classes. Aucun des quatre n'etait reglable seul.

   LA FORMULE RETENUE : un SOCLE COMMUN et QUATRE COEFFICIENTS. --vt-base vaut
   1.7rem, la taille du body dont ces cellules heritaient deja ; chaque niveau
   vaut calc(--vt-base * son coefficient). Comme le socle est en rem (donc
   ancre a la racine) et non en em, la chaine d'heritage des cellules est
   NEUTRALISEE : le .8em de sscteg et le .7em de libelle ne multiplient plus
   rien. Les quatre coefficients sont donc strictement independants - modifier
   --vt-n2 ne bouge que le niveau 2 - et ils se lisent tels que Maxou les a
   ecrits. Rien n'est retire de style.css ni du PATCH255 : leurs declarations
   restent en place et servent de repli si ce bloc saute.

   TAILLES MESUREES (px locaux, harnais 1920x1080, k=0.7) :
     niveau 1  25.57 -> 29.38   (1.08)
     niveau 2  25.57 -> 23.94   (0.88)  <- passe enfin sous le niveau 1
     niveau 3  20.45 -> 23.66   (0.87)
     niveau 4  17.90 -> 20.94   (0.77)

   LES CONTENEURS SUIVENT TOUT SEULS. Le piege des PATCH232/234/255 est qu'un
   libelle plus gros deborde de la largeur fixe de sa boite et GAGNE UNE LIGNE
   (238 / 353 / 247px, poses au 255). Plutot que de figer quatre nouvelles
   largeurs qu'il faudrait re-regler a chaque retouche, la largeur est
   DERIVEE du meme coefficient : largeur = largeur_255 * coefficient /
   coefficient_actuel_du_niveau (0.94 pour les niveaux 1-2, 0.8*0.94=0.752
   pour le 3, 0.7*0.94=0.658 pour le 4). Texte et boite grandissent alors du
   meme facteur et le nombre de lignes est invariant - verifie : ZERO ligne
   gagnee sur les 90 libelles distincts, en FR comme en EN. Le margin-left
   reprend la formule de recentrage du PATCH234, -(largeur - largeur_socle)/2,
   avec les largeurs de socle 317 (wraB), 222 (sscteg), 214 (wra) ; ecart de
   centrage mesure avant/apres : 0.5px local au maximum sur les 90 libelles.
   !important sur la seule largeur du niveau 3 : c'est le seul des quatre a
   affronter un !important en face (td.sscteg div.vertical-textw, PATCH255).

   INTERLIGNE 1.3 AU LIEU DE 1.5 (--vt-lh) : ce n'est pas un reglage de gout,
   c'est la contrepartie geometrique de l'agrandissement. La hauteur du div
   AVANT rotation devient la LARGEUR de la bande apres rotate(-90deg), et
   cette bande doit tenir dans les 71px de la colonne. A interligne 1.5, les
   libelles de niveau 3 deja sur deux lignes (RAPPORT OEUVRE ENVIRONNEMENT,
   WORK-ENVIRONMENT RELATIONSHIP...) passaient de 61 a 71px : exactement la
   largeur de la cellule, filets compris. A 1.3 ils font 62px et TOUTES les
   bandes retrouvent leur epaisseur d'aujourd'hui (38 / 31 / 31-62 / 27-54),
   alors meme que les lettres ont grossi. L'interligne ne deplace pas les
   glyphes, il ne fait que serrer la boite : le centrage mesure ne bouge pas.

   LE DEBORD DU NIVEAU 4 EST TRAITE DANS blocks.js, PAS ICI. Les libelles de
   niveau 4 etaient deja, avant ce patch, plus longs que leur cellule
   (INCONSCIENT INDIVIDUEL : 238px dans une cellule de 207) et mordaient sur
   leurs voisins du dessus et du dessous ; a 0.77 le debord grandissait avec
   eux et la paire INCONSCIENT COLLECTIF / INCONSCIENT INDIVIDUEL serait
   passee de -8 a -48px locaux de recouvrement, lettres franchement
   superposees. Arbitrage Maxou du 2026-08-13 : "quand tu vois que ca deborde
   tu mets sur deux lignes". Ce n'est pas realisable en CSS - la place
   disponible est la HAUTEUR de la cellule, dictee par les donnees et variable
   du simple au double (142 a 305px locaux), et aucune largeur fixe ne convient
   aux deux bouts de la plage. La moitie JS du 346 mesure donc chaque libelle
   et ne bride la boite QUE de ceux qui depassent. Consequence a connaitre pour
   qui reglera --vt-n4 plus tard : monter cette valeur ne fabrique plus de
   chevauchement, elle fait basculer un libelle de plus sur deux lignes.

   PERIMETRE. Media min-width:551px (meme frontiere que le PATCH255 et que
   l'injecteur de config) et scope body.P-Mennour : le smartphone, ou la table
   verticale n'est meme pas generee, et les huit autres portraits sont hors
   d'atteinte. Cote blocks.js, deux modules cohabitent sans se gener : celui du
   PATCH344 pose --stk-lvl-shift sur div.wra (position du libelle dans sa
   cellule), celui du 346 pose width et margin-left sur div.vertical-textw
   (coupure en deux lignes) ; proprietes disjointes, elements differents, et
   le 344 remesure a chaque defilement donc il absorbe seul le changement
   d'epaisseur des bandes.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --vt-base: 1.7rem; /* socle commun : ne pas toucher pour regler un niveau */
        --vt-n1: 1.02; /* CVG-PATCH353 : etait 1.08 depuis le 346. Retour Maxou : presence excessive. La GRAISSE n'y est pour rien - les quatre niveaux sont a 500 depuis le PATCH255, mesure identique sur les quatre ; ce qui pesait, c'est le pas 1->2, seul a 25% quand les suivants font 4.9 et 7.8. A 1.02 le pas tombe a 20.6% : -5.5% sur le niveau 1, soit un cran perceptible et un seul. */
        --vt-n2: .88;
        --vt-n3: .77; /* CVG-PATCH352 : etait .80 au 350, .87 au 346. L'ecart 2->3 etait de 1.2%, soit 0.27px : invisible. A .77 il passe a 4.9% (1.09px), le premier pas qui se voit a cette taille sans casser le plateau 2-3 voulu au 346. */
        --vt-n4: .71; /* CVG-PATCH350 : etait .77 - meme descente, l'ecart 3->4 du 346 est conserve */
        --vt-lh: 1.3;
    }

    body.P-Mennour td.cteg > div.wra > div.vertical-textw {
        font-size: calc(var(--vt-base) * var(--vt-n1));
        line-height: var(--vt-lh);
        width: calc(353px * var(--vt-n1) / .94);
        margin-left: calc((317px - (353px * var(--vt-n1) / .94)) / 2);
    }

    body.P-Mennour td.scteg > div.wra > div.vertical-textw {
        font-size: calc(var(--vt-base) * var(--vt-n2));
        line-height: var(--vt-lh);
        width: calc(353px * var(--vt-n2) / .94);
        margin-left: calc((317px - (353px * var(--vt-n2) / .94)) / 2);
    }

    body.P-Mennour td.sscteg > div.wra > div.vertical-textw {
        font-size: calc(var(--vt-base) * var(--vt-n3));
        line-height: var(--vt-lh);
        width: calc(247px * var(--vt-n3) / .752) !important;
        margin-left: calc((222px - (247px * var(--vt-n3) / .752)) / 2);
    }

    body.P-Mennour td.libelle > div.wra > div.vertical-textw {
        font-size: calc(var(--vt-base) * var(--vt-n4));
        line-height: var(--vt-lh);
        width: calc(238px * var(--vt-n4) / .658);
        margin-left: calc((214px - (238px * var(--vt-n4) / .658)) / 2);
    }
}
/* ============================================================================
   CVG-PATCH347 : Mennour desktop - le POURTOUR du chemin selectionne s'allege
   et son OMBRE s'etale (arbitrage Maxou 2026-08-13, variante 2 sur trois
   simulations rendues au harnais ; "pour l'instant", donc reglage revisable).

   CE QUE MAXOU A DESSINE. Sur une capture de tester, un trait de marqueur
   epais et flou pose SOUS le contour du chemin selectionne et suivant ses
   marches, dans les deux ailes : l'ombre ne doit pas serrer le trait, elle
   doit deborder vers le BAS et vers l'EXTERIEUR, comme si le bloc etait
   souleve de la page.

   DEUX VALEURS CHANGENT, rien d'autre.
   (1) LE TRAIT PASSE DE 4px #452102 A 2px #6b4423. Il cesse d'etre l'objet
       principal : c'est l'ombre qui porte desormais la presence de la
       selection, le trait ne fait plus que fermer le contour. Le brun
       s'eclaircit d'autant (#6b4423 contre #452102) pour ne pas peser a cote
       d'une ombre large. A SIGNALER : le protocole C1C2 v4 calibre la bordure
       de chemin a 4px ; ce 2px est un ecart assume, comme le 3px du cadre de
       selection au PATCH343 - et il appelle la meme question, celle de savoir
       si un lisere double d'une ombre peut etre plus fin qu'un lisere seul.
   (2) L'OMBRE PASSE DE dy 6 / flou 7 A dy 20 / flou 30, alpha .45 (etait .52).
       Ce sont des px LOCAUX : a 1600px de large, ou le portrait est rendu a
       environ 0,58, cela fait un decalage d'une douzaine de pixels a l'ecran
       et un fondu deux fois plus long - l'epaisseur du trait de marqueur.
       L'alpha baisse parce qu'une ombre etalee a la meme densite deviendrait
       une tache : c'est l'etalement qui doit se voir, pas la charge.

   RIEN A CHANGER COTE blocks.js : le module des PATCH281/282/341 lit ces
   quatre variables a chaque trace, et sa mecanique d'ombre (copie pleine du
   contour, decalee, floutee, decoupee en evenodd pour ne subsister qu'a
   l'EXTERIEUR du contour) est exactement ce qui produit le debordement le
   long des marches.

   PERIMETRE. Les valeurs sont posees sur body.P-Mennour dans la media
   min-551 : smartphone et huit autres portraits intacts. Elles ECRASENT par
   l'ordre du fichier celles des PATCH342 et 343, qui restent en place et
   documentent l'historique du reglage.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-outline-width: 2px; /* 347 : etait 4px au 343 */
        --sel-outline-color: #6b4423; /* 347 : etait #452102 depuis le 341 */
        --sel-shadow-color: rgba(69, 33, 2, 0.45); /* 347 : alpha .52 au 342 */
        --sel-shadow-dy: 20; /* 347 : etait 6 */
        --sel-shadow-blur: 30; /* 347 : etait 7 */
    }
}
/* ============================================================================
   CVG-PATCH348 : Mennour desktop - trois retours Maxou du 2026-08-13 sur le
   PATCH347.

   (1) L'OMBRE NE DOIT EXISTER QUE SOUS LES ARETES BASSES, ET TREMBLER.
       Constat : au 347 une frange reapparaissait AU-DESSUS des aretes hautes.
       Ce n'etait pas un reglage rate mais la limite du procede - le 341
       remplissait une copie du contour ENTIER, decalee de dy puis floutee ;
       des que le flou (30) depasse le decalage (20), la copie redeborde par le
       haut et le decoupage evenodd ne peut plus rien, ce debord etant bien a
       l'EXTERIEUR de la zone. Aucun couple dy/flou ne s'en sort : il faut que
       le flou reste inferieur au decalage, ce qui interdit precisement l'ombre
       large et douce demandee.
       LE PROCEDE CHANGE DONC, cote blocks.js : l'ombre n'est plus une copie
       pleine du contour mais un TRAIT EPAIS pose sur le seul parcours du BAS -
       de l'angle bas-droit vers la gauche, decrochements verticaux compris,
       exactement la ligne que Maxou a soulignee au marqueur. Il ne peut alors
       plus rien y avoir ailleurs, quels que soient le flou et le tremble.
       --sel-shadow-spread donne son epaisseur a cette bande (px LOCAUX,
       centree sur l'arete : la moitie interieure est mangee par le decoupage,
       la moitie exterieure est l'ombre visible, que --sel-shadow-dy pousse
       ensuite vers le bas). --sel-shadow-wobble ajoute un bruit fractal qui
       DEPLACE le trace avant le flou : c'est ce qui donne l'epaisseur inegale
       d'un trait de marqueur, qu'un flou seul ne produit jamais - il reste
       rigoureusement parallele au chemin. La graine du bruit varie d'un
       exemplaire a l'autre : les six ombres de la page ne tremblent pas a
       l'identique. Les deux variables a 0 (defaut) redonnent le procede du
       341 : les autres portraits n'en posent aucune, ils ne voient rien.

   (2) LES NOMS D'ARTISTES DONNES EN EXEMPLE REVIENNENT A L'ENCRE DU CORPS.
       Le #673a20 du PATCH343 les faisait lire comme des liens colores au
       milieu d'un texte noir. color:inherit plutot qu'une valeur en dur : ils
       suivront desormais l'encre de la description, quoi qu'il lui arrive.
       LA GRAISSE 500 EST CONSERVEE - c'est un reglage demande separement au
       343, et le retour ne porte que sur la couleur ; une ligne suffira a la
       rendre au 400 du corps si Maxou le veut aussi.

   (3) NIVEAU 2 DES LIBELLES VERTICAUX A 0.81. La demande "sans que cela
       n'affecte en aucun cas les autres colonnes" est deja resolue par la
       mecanique du PATCH346 (socle --vt-base en rem + un coefficient par
       niveau, largeur du conteneur derivee du meme coefficient) : il n'y a
       donc qu'UNE valeur a poser, et le reste suit tout seul. On ne modifie
       pas le bloc 346 lui-meme - il appartient a une autre session et n'est
       pas encore commite - on redefinit la variable ici, en fin de fichier,
       ou l'ordre du CSS nous donne le dernier mot. Tant que le 346 n'est pas
       en place, cette declaration ne consomme rien et ne fait rien.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour : smartphone et huit
   autres portraits intacts.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        /* (1) ombre : arete basse seule, epaisse, floue, tremblee */
        --sel-shadow-spread: 30; /* 348 : > 0 = bascule en mode arete basse */
        --sel-shadow-wobble: 12; /* 348 : amplitude du tremble, 0 = bord lisse */
        --sel-shadow-dy: 8; /* 348 : etait 20 au 347 - la bande fait desormais l'epaisseur */
        --sel-shadow-blur: 10; /* 348 : etait 30 - le tremble prend le relais du flou */

        /* (3) niveau 2 des libelles verticaux (mecanique du PATCH346) */
        --vt-n2: .81; /* 348 : etait .88 */
    }

    /* (2) noms d'artistes en exemple : encre du corps, comme le reste du
       texte des tableaux. Annule la couleur du PATCH343, garde sa graisse. */
    body.P-Mennour #motors .long-text a,
    body.P-Mennour #means .long-text a {
        color: inherit !important; /* 348 : etait #673a20 au 343 */
    }
}
/* ============================================================================
   CVG-PATCH349 : Mennour desktop - deux retouches de l'ombre du chemin
   selectionne (retours Maxou 2026-08-14 sur le PATCH348).

   (1) PLUS DENSE PRES DU TRAIT. Le halo du 348 est une bande floue de 30px :
       son maximum de densite est au MILIEU de la bande, donc a une quinzaine
       de pixels sous l'arete, et le contact avec le trait est la partie la
       plus pale. Augmenter l'alpha du halo ne reglerait pas ca - tout
       s'assombrirait, y compris le bord exterieur qui doit rester un fondu.
       On ajoute donc une SECONDE passe : un trait plus etroit
       (--sel-shadow-core), moins floute, colle a l'arete, qui s'additionne au
       halo la ou il faut. Le degrade devient dense au contact et long en
       s'eloignant - le comportement d'une vraie ombre de contact.

   (2) UNE LIGNE D'OMBRE FINE SUR L'ARETE HAUTE. Au 348 le haut du bloc etait
       nu, par correction d'un defaut inverse (le 347 y laissait une frange).
       Maxou en redemande, mais fine et sombre : ce n'est pas une ombre portee,
       c'est un lisere d'ombre. --sel-shadow-top lui donne son epaisseur et
       --sel-shadow-top-color sa couleur (repli : celle de l'ombre). Il est
       pose sur le parcours du HAUT, sans decalage : le decoupage n'en laisse
       que la moitie exterieure, juste au-dessus du contour, et rien ne peut
       redescendre dans la zone.

   Les deux passes ont chacune leur filtre - flous differents - et heritent du
   tremble du 348, avec une graine distincte pour ne pas se superposer
   exactement. A 0 (defaut) elles n'existent pas : le rendu du 348 est
   conserve, et les autres portraits, qui ne posent aucune de ces variables,
   ne voient rien.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-shadow-core: 12; /* 349 : trait dense au contact de l'arete basse */
        --sel-shadow-top: 4; /* 349 : lisere d'ombre sur l'arete haute */
        --sel-shadow-top-color: rgba(69, 33, 2, 0.55);
    }
}
/* ============================================================================
   CVG-PATCH351 : Mennour desktop - trois retours Maxou du 2026-08-14.

   (1) LE CADRE DE SURVOL PREND L'EMPRISE EXACTE DE LA LIGNE, comme le cadre de
       selection, et recouvre les filets qui separent les artistes. Il etait
       retracte de 5px en haut et en bas - plancher pose par le PATCH193 pour
       qu'un cadre de survol ne puisse jamais se superposer au cadre de
       SELECTION d'une ligne voisine, celui-ci debordant d'une epaisseur de
       trait chez certains portraits. Chez Mennour ce debord n'existe pas : le
       cadre de selection est en box-sizing:border-box depuis le PATCH235, il
       est dessine A L'INTERIEUR de sa bande. Le plancher n'y protege donc rien
       et ne fait que laisser voir, dans le cadre, les filets de la liste.
       main.js le lit desormais dans --hover-cursor-gap (repli 5px = valeur du
       193, les huit autres portraits ne bougent pas), et la garde du 193 est
       conservee telle quelle : le retrait reste au moins egal au debord reel
       du cadre de selection, mesure au runtime.

   (2) LE LISERE D'OMBRE DE L'ARETE HAUTE NE TREMBLE PLUS. Le tremble du 348
       est fait pour une ombre portee, dont le bord exterieur est diffus ; sur
       un lisere fin il se lisait comme un defaut de trace. La passe du haut
       demande donc explicitement a blocks.js de sauter le bruit fractal - le
       halo et le noyau du bas le gardent.

   (3) LA BANDE VIDE EN TETE DE CHAQUE EXEMPLAIRE DE LA LISTE DISPARAIT EN
       DESKTOP. Precision de Maxou : la "ligne vide pour que ca respire" de
       juillet valait pour le SMARTPHONE, en guise de premiere ligne - pas pour
       le desktop, ou elle produit, a la couture des deux exemplaires, une
       bande vide et une double ligne (capture jointe a la demande).
       CE QU'IL Y A A LA COUTURE, mesure au harnais : chaque exemplaire s'ouvre
       par DEUX rangees - un intercalaire nu de 4px (tr.s1 / tr.s2 sans autre
       classe) puis la bande d'annee de 46px (tr.yearrow, vide chez Mennour, le
       champ Year n'y est pas renseigne). Les filets de 2px de ces deux rangees
       s'ajoutent a celui de la derniere ligne de l'exemplaire precedent : d'ou
       la double ligne dans les colonnes de chiffres.
       LES DEUX EXEMPLAIRES DOIVENT RESTER DES COPIES EXACTES - c'est ce qui
       rend le raccord invisible, la periode de la boucle etant mesuree entre
       eux au chargement. On ne touche donc pas a l'un sans l'autre : tr.yearrow
       les vise tous les deux.
       ATTENTION : L'INTERCALAIRE, LUI, NE PEUT PAS ETRE MASQUE. tr.s1 et tr.s2 sont les
       ANCRES que main.js mesure pour calculer la periode (main.js:393-394,
       querySelector, donc la premiere de chaque serie : justement ces deux
       rangees nues). En display:none leur getBoundingClientRect vaut zero, la
       periode tombe a 0 et la boucle se desactive. On les APLATIT donc a
       hauteur nulle - elles restent dans le flux et restent mesurables.
       Le selecteur exclut .artist-row et .yearrow : les classes s1 et s2
       marquent AUSSI toutes les lignes d'artistes de leur exemplaire, une
       regle sur tr.s1 seul aplatirait la liste entiere.
       Media min-551 : le smartphone garde sa premiere ligne vide.

   PERIMETRE. Scope body.P-Mennour partout : les huit autres portraits ne
   voient rien, y compris pour le retrait du cadre de survol, qui reste a son
   repli de 5px partout ailleurs.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --hover-cursor-gap: 0; /* 351 : cadre de survol a l'emprise de la ligne */
    }

    /* (3) bande d'annee vide : masquee dans les DEUX exemplaires */
    body.P-Mennour #artistsContainer tr.yearrow {
        display: none !important;
    }

    /* (3) intercalaire : aplati, JAMAIS masque (ancre de la boucle) */
    body.P-Mennour #artistsContainer tr.s1:not(.artist-row):not(.yearrow) > td,
    body.P-Mennour #artistsContainer tr.s2:not(.artist-row):not(.yearrow) > td {
        height: 0 !important;
        padding: 0 !important;
        line-height: 0 !important;
        font-size: 0 !important;
        border-width: 0 !important;
    }
}
/* ============================================================================
   CVG-PATCH354 : Mennour desktop - le cadre de selection de la colonne
   ARTISTES recoit la MEME ombre que le chemin selectionne des deux ailes
   (demande Maxou 2026-08-14, dessin sur capture : la meme trainee sombre sous
   la ligne de Hicham BERRADA). Les trois panneaux designent la selection du
   meme geste depuis le PATCH343 - meme brun, meme epaisseur ; il ne manquait
   que le relief.

   POURQUOI EN box-shadow ET NON EN SVG. Dans les ailes, l'ombre doit suivre un
   contour en ESCALIER : aucune propriete CSS ne sait le faire, d'ou l'overlay
   SVG des PATCH341/348. Ici l'objet est un simple rectangle - le cadre est un
   div absolu pose sur la bande de la ligne - et box-shadow fait exactement le
   travail, sans un noeud de plus dans le DOM ni un redessin a chaque scroll.

   LES DEUX OMBRES REPRENNENT LA STRUCTURE DU 349 : une premiere serree et
   dense au contact du trait, une seconde large et diluee qui s'etale sous
   elle. L'etalement negatif (le quatrieme nombre) retracte la boite de
   l'ombre avant de la decaler vers le bas : elle ne deborde donc pas sur les
   cotes et n'existe QUE sous l'arete basse, comme dans les ailes. Valeurs en
   px LOCAUX, comme tout ce qui vit dans le #container mis a l'echelle.
   L'ombre des ailes est tremblee, celle-ci ne peut pas l'etre - box-shadow ne
   sait pas onduler ; a cette largeur de trainee la difference ne se lit pas.

   #selectedTwin est vise en meme temps : c'est le miroir que main.js clone
   pour la ligne jumelle quand la boucle est active (il reprend la className de
   #selected mais pas son id). Chez Mennour la boucle n'a pas de periode et il
   n'apparait pas, mais la regle est posee pour le jour ou elle en aura une.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour : smartphone et huit
   autres portraits intacts.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        box-shadow:
            0 6px 8px -4px rgba(69, 33, 2, 0.55),
            0 16px 26px -10px rgba(69, 33, 2, 0.42) !important;
    }
}
/* ============================================================================
   CVG-PATCH355 : Mennour desktop - le cadre de SURVOL cesse d'etre plus LARGE
   que le cadre de selection (retour Maxou 2026-08-14, capture : le pointille
   de Neil BELOUFA deborde a gauche et a droite du trait plein de Hicham
   BERRADA).

   LES DEUX CADRES RECOIVENT POURTANT LA MEME LARGEUR - width:96% pose sur
   div.cursor par le PATCH183e, avec left/right/margin auto pour le centrage.
   L'ecart ne vient pas de la largeur mais du MODELE DE BOITE : le cadre de
   SELECTION est en box-sizing:border-box depuis le PATCH235 - ses 3px de trait
   sont pris DANS les 96% - tandis que le cadre de survol est reste en
   content-box, ou les 3px s'AJOUTENT de chaque cote. D'ou 6px locaux d'ecart,
   soit environ 3,5px a l'ecran a 1600px de large : exactement le debord que
   Maxou entoure. Le passage en border-box aligne les deux emprises au pixel,
   sans toucher a la largeur ni au centrage, et complete le PATCH351 qui avait
   deja donne au survol la hauteur exacte de la ligne.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour, selecteur d'ID
   div#hover.cursor : le cadre de selection n'est pas atteint (meme classe,
   une regle sur .cursor le toucherait aussi), et les huit autres portraits
   gardent leur content-box.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour #artistsScroll > div#hover.cursor {
        box-sizing: border-box !important;
    }
}
/* ============================================================================
   CVG-PATCH356 : Mennour desktop - le defilement de la colonne ARTISTES se
   CALE SUR LES FRONTIERES DE LIGNES (arbitrage Maxou 2026-08-14 : "defilement
   cale sur les lignes", contre l'autre option qui etait de restaurer une marge
   haute). Constat : la liste s'arretait ou elle voulait, et la premiere ligne
   visible etait coupee en deux - jusqu'a 17,6px locaux de rognage mesures au
   harnais sur trois positions de defilement.

   MECANIQUE : scroll-snap du navigateur, aucune ligne de JS. Le conteneur
   declare un axe d'accrochage vertical et chaque ligne d'artiste devient un
   point d'accrochage par son BORD HAUT. Mesure sur les memes trois positions :
   coupure ramenee a 0,3px au maximum, c'est-a-dire l'arrondi de rendu.

   POURQUOI proximity ET NON mandatory. En mandatory le navigateur accroche
   TOUJOURS, y compris pendant un defilement pilote par du script : l'autoscroll
   d'ouverture (jQuery animate sur scrollTop) et, le jour ou la boucle infinie
   aura une periode chez Mennour, le saut de raccord (scrollTop = reste de la
   division) seraient l'un et l'autre repris en main par l'accrochage a chaque
   image. En proximity l'accrochage n'a lieu qu'a l'arret et seulement si on est
   deja pres d'une frontiere - ce qui suffit, la mesure le montre - et le
   defilement programme n'est pas contrarie.

   L'ACCROCHAGE EST POSE SUR LA LIGNE, pas sur ses cellules : les deux
   fonctionnent (verifie), mais c'est la ligne qui est l'unite que Maxou veut
   voir entiere, et une regle sur les td accrocherait aussi les colonnes de
   chiffres, qui n'ont pas a se comporter comme des reperes independants.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour : smartphone et huit
   autres portraits intacts.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour #artistsScroll {
        scroll-snap-type: y proximity;
    }

    body.P-Mennour #artistsContainer tr.artist-row {
        scroll-snap-align: start;
    }
}
/* ============================================================================
   CVG-PATCH358 : Mennour desktop - l'ombre du chemin selectionne devient
   DESINVOLTE (demande Maxou 2026-08-14, maquette dessinee a la main : un trait
   large et lache, d'epaisseur inegale, qui ondule paresseusement et DEPASSE
   les coins au lieu de s'y arreter).

   CE QUI MANQUAIT AU 348/349. Le tremble existait deja, mais a une frequence
   de bruit elevee : le trait vibrait finement le long du chemin sans jamais
   s'en ecarter, ce qui se lit comme un trait tremblant, pas comme un trait
   jete. Et il commencait et finissait exactement aux deux coins du contour -
   or un geste large ne s'arrete pas pile a l'angle, il le double.

   DEUX LEVIERS AJOUTES AU MODULE (blocks.js, 358), tous deux inertes par
   defaut, donc sans effet sur les portraits qui ne les posent pas :
     --sel-shadow-grain      frequence du bruit fractal. Plus elle est BASSE,
                             plus l'ondulation est longue et paresseuse. On
                             passe de 0.008 0.022 a 0.0015 0.006, soit des
                             ondes cinq fois plus longues : le trait s'ecarte
                             franchement du chemin au lieu de le suivre.
     --sel-shadow-overshoot  depassement des deux extremites du parcours du
                             bas, en px locaux. A 60, la trainee sort de la
                             zone des deux cotes, comme sur la maquette.

   LE RESTE SUIT LE MEME MOUVEMENT : bande 46 au lieu de 30, noyau 18 au lieu
   de 12, flou 16, decalage 12 - un geste plus large a besoin de plus de
   matiere. Et la couleur quitte le brun pur pour un BRUN GRIS (82 64 44) :
   sur la maquette la trainee est celle d'un crayon gras, pas d'une encre.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour. Le lisere de
   l'arete haute n'est pas touche : il reste fin et net (PATCH351).
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-shadow-color: rgba(82, 64, 44, 0.5); /* 358 : etait rgba(69,33,2,.45) */
        --sel-shadow-spread: 46; /* 358 : etait 30 */
        --sel-shadow-core: 18; /* 358 : etait 12 */
        --sel-shadow-blur: 16; /* 358 : etait 10 */
        --sel-shadow-dy: 12; /* 358 : etait 8 */
        --sel-shadow-wobble: 52; /* 358 : etait 12 */
        --sel-shadow-grain: 0.0015 0.006; /* 358 : ondulation longue */
        --sel-shadow-overshoot: 60; /* 358 : la trainee double les coins */
    }
}
/* ============================================================================
   CVG-PATCH359 : Mennour desktop - deux demandes Maxou du 2026-08-14.

   (1) L'OMBRE DU CADRE ARTISTES SE REMET AU REGISTRE DES DEUX AILES. Elle
       n'avait pas bouge depuis le PATCH354, quand le chemin selectionne, lui,
       a triple d'ampleur au PATCH358 (bande 30 -> 46, flou 10 -> 16, brun pur
       -> brun gris). A cote, la trainee du cadre d'artiste ne se voyait plus :
       ce n'est pas qu'elle manquait, c'est qu'elle etait restee a l'echelle
       d'avant. Les deux ombres sont remises au meme poids et a la MEME
       COULEUR que celle des ailes - le brun gris rgba(82,64,44).

   (2) LE POURTOUR SE TRACE EN 3 SECONDES au lieu d'apparaitre d'un bloc
       (fleches dessinees par Maxou sur capture : le trait part et fait le tour
       de la zone). --sel-outline-draw donne la duree ; a 0, apparition
       immediate, ce qui est le cas de tous les autres portraits.
       COMMENT, cote blocks.js : le trait est mis en pointille dont le tiret
       vaut TOUTE la longueur du chemin, puis on fait glisser le decalage de
       cette longueur a zero - le trait se remplit de son point de depart vers
       son point d'arrivee. L'ombre suit en fondu sur la meme duree, pour que
       le relief arrive avec le trait et non avant lui. La courbe de vitesse
       est celle des sorties douces (demarrage franc, arrivee amortie) : un
       trace lineaire ferait machine.
       LE TRACE NE REJOUE QUE SUR UN CHANGEMENT DE SELECTION. Le module
       redessine aussi au scroll et au resize, ou une animation serait
       insupportable : une signature des bandes surlignees (leurs positions et
       hauteurs, en px locaux, donc insensibles au defilement) est comparee a
       la precedente, et le trace n'est rejoue que si elle a change.

   PERIMETRE. Media min-width:551px, scope body.P-Mennour ; --sel-outline-draw
   n'etant posee nulle part ailleurs, les huit autres portraits gardent
   l'apparition immediate.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-outline-draw: 3; /* 359 : secondes ; 0 = apparition immediate */
    }

    /* (1) ombre du cadre de selection ARTISTES, au registre du PATCH358 */
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        box-shadow:
            0 10px 14px -6px rgba(82, 64, 44, 0.55),
            0 26px 40px -14px rgba(82, 64, 44, 0.45) !important;
    }
}
/* ============================================================================
   CVG-PATCH361 : Mennour desktop - le trace du pourtour devient UNE SEULE
   CIRCULATION en deux temps, et passe PROVISOIREMENT au vert fluo pour que
   Maxou puisse le valider (demande du 2026-08-14).

   CE QUE MAXOU DECRIT : "elle commence cote moyen et continue cote moteur, et
   se termine cote vertical gauche". Les chiffres 1, 2, 3 de son dessin ne sont
   pas un ordre de segments mais des REPERES DE TEMPS - ou en est le trait a
   une, deux et trois secondes.
   CE QUI CHANGE, cote blocks.js : les deux ailes ne partent plus ensemble.
   L'aile des MOYENS occupe la premiere moitie de la duree, celle des MOTEURS
   la seconde ; le trait des moteurs reste invisible pendant l'attente. A
   l'interieur d'une aile, le parcours part de l'angle haut-gauche et tourne
   dans le sens des aiguilles, donc il finit sur l'arete verticale gauche.

   MALENTENDU A LEVER : le pointille dont je parlais n'est qu'un MECANISME de
   revelation - un tiret aussi long que le chemin entier, dont on fait glisser
   le decalage. A l'ecran le trait est PLEIN et s'allonge ; il n'est jamais
   tirete.

   ATTENTION : LE VERT FLUO EST PROVISOIRE. Il ne sert qu'a rendre le trace indiscutable
   pendant la validation. Une fois le mouvement valide, cette declaration saute
   et le trait reprend le brun 6b4423 du PATCH347, qui reste pose juste
   au-dessus dans ce meme fichier.
   ========================================================================== */
/* CVG-PATCH365 : le vert fluo provisoire du 361 EST RETIRE ICI, exactement
   comme ce bloc l'annoncait - la validation a eu lieu (Maxou a vu le mouvement
   en ligne) et il demande desormais la couleur du cadre d'artiste. La regle du
   361 ne posait que cette seule declaration : elle disparait donc entierement
   plutot que de laisser une valeur morte et trompeuse dans la feuille. C'est
   le bloc PATCH365, en fin de fichier, qui fixe la couleur desormais. */
/* ============================================================================
   CVG-PATCH363 : Mennour desktop - LE VER DE TERRE (demande Maxou 2026-08-14 :
   "la ligne verte qui fait le pourtour ne circule pas ; je veux voir
   par-dessus ca un ver de terre qui avance a vive allure selon le trajet
   indique").

   CE QUI MANQUAIT : le trace du 359/361 s'arrete une fois le pourtour
   dessine - au bout des 3 secondes, plus rien ne bouge. Le ver est un court
   segment superpose au trait, qui parcourt le circuit en boucle SANS FIN tant
   que l'artiste reste selectionne : aile des MOYENS pendant la premiere
   moitie de la periode, aile des MOTEURS pendant la seconde, chacune de son
   angle haut-gauche et dans le sens des aiguilles - le meme trajet que le
   trace. Il ne part qu'une fois le trace des 3 secondes fini.

   REGLAGES (px LOCAUX comme tout le module) :
     --sel-worm         longueur du ver ; 0 ou absente = pas de ver
     --sel-worm-period  duree d'un tour complet DES DEUX AILES, en secondes
     --sel-worm-width   epaisseur du ver (repli : trait + 2)
     --sel-worm-color   couleur (repli : celle du trait) - brun profond ici,
                        pour qu'il se detache du vert fluo provisoire du 361 ;
                        a rearbitrer quand le trait reprendra le brun 6b4423

   PERIMETRE. Media min-width:551px, scope body.P-Mennour ; --sel-worm n'etant
   posee nulle part ailleurs, les huit autres portraits restent sans ver.

   CVG-PATCH364 (retour Maxou 2026-08-14 : "je veux le ver de terre qui
   circule, deux fois plus etendu en longueur, et couleur caramel") : deux
   valeurs revisees dans le bloc ci-dessous, aucun changement de mecanique et
   aucune ligne de blocks.js touchee.
     --sel-worm        120 -> 240 (px locaux). Le ver occupe donc environ 4
                       pour cent du parcours d'une aile (chemin mesure a
                       ~5600 px locaux) au lieu de 2. La vitesse ne change
                       PAS : la periode reste 2.6 s, le ver est plus long,
                       pas plus lent.
     --sel-worm-color  452102 (brun profond) -> c68642 (CARAMEL). Le module
                       garde sa gate de securite (le ver n'est trace que si
                       le chemin est plus long que le segment), donc une
                       selection minuscule reste sans ver plutot que d'avoir
                       un ver plus long que son circuit.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-worm: 240; /* 364 : etait 120 au 363 - Maxou le veut deux fois plus etendu */
        --sel-worm-period: 2.6; /* 363 : secondes pour les deux ailes - vive allure */
        --sel-worm-width: 6; /* 363 : plus epais que le trait (2), il se lit par-dessus */
        --sel-worm-color: #c68642; /* 364 : CARAMEL - etait le brun profond 452102 au 363 */
    }
}
/* ============================================================================
   CVG-PATCH365 : Mennour desktop - trois demandes Maxou du 2026-08-14, toutes
   sur le meme dispositif (pourtour + ver de terre).

   (1) LE VER RALENTIT DE 30 POUR CENT. "je veux que le ver de terre aille 30%
       plus lentement" : sa VITESSE est reduite de 30 pour cent, donc le tour
       dure 2.6 / 0.7 = 3.7 s au lieu de 2.6. (L'autre lecture possible - un
       tour 30 pour cent plus long, soit 3.4 s - se rattrape en changeant cette
       seule valeur.) La longueur du ver ne bouge pas : il reste a 240.

   (2) LE POURTOUR PREND LA COULEUR DU CADRE D'ARTISTE, et le vert fluo
       provisoire du 361 disparait (sa declaration est retiree plus haut dans
       ce fichier). Le cadre de la colonne ARTISTES est en 3px solid #4b2511 -
       un marron fonce - pose au PATCH340 ; c'est la couleur demandee.
       LE MODULE LA LIT SUR LE CADRE, il ne la recopie pas : --sel-outline-
       follow-cursor a 1 lui fait prendre la border-color calculee de
       div#selected.cursor a chaque trace. Ainsi la valeur reste juste meme si
       la config du portrait - qui vit EN BASE, donc potentiellement
       differente entre local, tester et prod - habille ce cadre autrement, et
       le pourtour suivra tout seul le jour ou Maxou repique la couleur.
       --sel-outline-color reste pose : c'est le repli si le cadre est absent
       ou sans bordure.
       A NOTER : le ver reste CARAMEL (c68642). Il se detachait du vert fluo ;
       il doit maintenant se detacher d'un marron fonce - plus clair que lui,
       le contraste tient, mais c'est a valider a l'oeil.

   (3) UN REPOS DE 10 SECONDES ENTRE DEUX TOURS, et le ver n'existe QUE pour un
       artiste selectionne. "lorsque le ver a termine son tour, il ne recommence
       que 10 secondes apres et uniquement sur le moteur/moyen de l'artiste en
       cours selectionne". Cote mecanique (blocks.js) : le cycle de l'animation
       ne vaut plus la duree du tour mais TOUR + REPOS, le tour occupant le
       debut du cycle et le repos la fin, ver invisible. Cote perimetre : le ver
       n'est cree que si le body porte la classe "selected", posee par main.js a
       la selection d'un artiste - c'est le seul signal qui separe une zone
       SELECTIONNEE d'une zone simplement surlignee. Le pourtour, lui, ne change
       pas : il continue de se tracer partout ou il y a des bandes surlignees.
       Le compte a rebours du cycle repart a chaque changement d'artiste.

   PERIMETRE inchange : media min-width:551px, scope body.P-Mennour. Les huit
   autres portraits ne posent aucune de ces variables - pas de ver, pas de
   repos, et --sel-outline-follow-cursor absente laisse la couleur du trait
   telle quelle (Stoschek garde son 002AFF).
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-worm-period: 3.7; /* 365 : etait 2.6 - vitesse reduite de 30 pour cent */
        --sel-worm-pause: 10; /* 365 : secondes de repos entre deux tours ; 0 = boucle continue */
        --sel-outline-color: #4b2511; /* 365 : marron du cadre d'artiste - REPLI, cf. follow-cursor */
        --sel-outline-follow-cursor: 1; /* 365 : la couleur est LUE sur div#selected.cursor */
    }
}
/* ============================================================================
   CVG-PATCH366 : Mennour desktop - six retouches demandees par Maxou le
   2026-08-14. Aucune ne touche a blocks.js : tout passe par la feuille.

   (1) LE VER DEUX FOIS PLUS FREQUENT ET DEUX FOIS PLUS VOYANT.
       Frequence : un tour toutes les 13,7 s (3,7 de parcours + 10 de repos)
       devient un tour toutes les 6,9 s - le repos tombe donc a 3,2 s, ce qui
       DOUBLE la frequence au sens strict. Si Maxou voulait seulement "moitie
       moins d'attente", la valeur serait 5 : une seule ligne a changer.
       La VITESSE ne bouge pas : le tour dure toujours 3,7 s (PATCH365).
       Voyant : l'epaisseur passe de 6 a 12 px locaux - le double, comme
       demande - et le caramel gagne en intensite, de c68642 (rgb 198,134,66,
       sature a moitie) a d2760a (sature a 91 pour cent). Il faut ce gain :
       le ver ne se detache plus d'un vert fluo mais du marron du pourtour.

   (2) OMBRE DU CADRE D'ARTISTE AUGMENTEE. Elle datait du PATCH359 (0 10px
       14px -6px et 0 26px 40px -14px). Les deux passes sont creusees d'environ
       moitie et leur opacite montee de .55/.45 a .70/.60 : le cadre se
       decolle plus franchement de la colonne.

   (3) LA DOUBLE LIGNE SOUS MIRCEA SUCIU. Ce n'est pas une bordure a part :
       c'est LA COUTURE DU DEFILEMENT INFINI. Mircea SUCIU est le dernier
       artiste dans l'ordre alphabetique ; juste apres lui la liste reprend a
       Georges ADEAGBO, et la table intercale a cet endroit une ligne vide -
       <tr class="s2"> avec trois cellules vides - haute de 1,2 px. Cette
       ligne vide EMPECHE les deux bordures voisines de fusionner (la table
       est en border-collapse) : on voit donc le trait bas de SUCIU, 1,2 px de
       vide, puis le trait haut de la ligne suivante - soit deux traits
       paralleles la ou il n'y en a qu'un partout ailleurs. On ne supprime pas
       la ligne, qui appartient au mecanisme de defilement : on la ramene a
       une hauteur nulle, et les deux bordures se rejoignent alors en un seul
       trait. La regle ne vise que les cellules VIDES de la colonne ARTISTES ;
       les lignes d'artistes portent toutes un texte (un nombre ou "n/a") et
       ne sont donc jamais concernees.

   (4) LE MOT ARTISTES ETAIT BIEN TROP GRAND - de peu, mais mesurablement :
       42 px contre 40,8 px pour MOTEURS et MOYENS, soit 3 pour cent de plus.
       Il est aligne sur les deux ailes. D'OU VENAIT L'ECART : les tailles sont
       relatives et les bases different. style.css pose "thead th h1" a 1.5em,
       ce qui donne 40,8 px sur les th des ailes (27,2 px) ; et "#artists thead
       th h1" a 2.65em, ce qui donne 42 px sur le th de la colonne ARTISTES
       (15 px). Les deux valeurs ne pouvaient donc pas coincider par
       construction. On fige ici la valeur absolue des ailes - si un jour la
       taille des th des ailes change, c'est cette ligne qu'il faudra suivre.

   (5) BOUTON PROFIL PLUS CHOCOLAT. Il etait dans un brun grisatre eteint
       (rgb 117,107,92). Il passe a un chocolat franc (5a3419), gagne un
       arrondi discret de 4 px - le "chouia" demande - et une ombre courte qui
       lui donne du corps.

   (6) GROSSE OMBRE SOUS L'ICONE HOME. Le bouton du coin bas-droit avait deja
       une ombre, mais courte et grise (5px 4px 12px). Elle est remplacee par
       deux passes brunes bien plus larges, dans le registre des ombres du
       reste de la page. La cible est le <svg> lui-meme : c'est lui qui porte
       le fond creme et l'arrondi du bouton.

   PERIMETRE : media min-width 551px, scope body.P-Mennour. Les huit autres
   portraits gardent leur bouton PROFIL, leur icone home et leurs titres.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-worm-pause: 3.2; /* 366 : etait 10 - un tour toutes les 6,9 s au lieu de 13,7 */
        --sel-worm-width: 12; /* 366 : etait 6 - deux fois plus voyant */
        --sel-worm-color: #d2760a; /* 366 : caramel intense - etait c68642 */
    }

    /* (2) ombre du cadre de selection ARTISTES, augmentee */
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        box-shadow:
            0 16px 22px -7px rgba(82, 64, 44, 0.7),
            0 40px 60px -16px rgba(82, 64, 44, 0.6) !important;
    }

    /* (3) couture du defilement infini. Deux regles, dans cet ordre.
       (a) la ligne vide ne porte plus ni hauteur ni bordure propre ;
       (b) la ligne qui la PRECEDE perd sa bordure basse, faute de quoi il
           reste deux traits : celui qui ferme la derniere ligne et celui qui
           ouvre la premiere de la reprise. Un seul suffit - c'est celui de la
           ligne suivante qu'on garde, comme partout ailleurs dans la table.
       Le :not(.divider) protege la vraie FIN de liste : apres le dernier
       exemplaire vient un pave de 176px, et la derniere ligne doit y garder
       son trait de fermeture. */
    body.P-Mennour #artistsScroll tr > td:empty {
        height: 0 !important;
        padding: 0 !important;
        line-height: 0 !important;
        font-size: 0 !important;
        border-top: 0 none !important;
        border-bottom: 0 none !important;
    }

    body.P-Mennour #artistsScroll tr:has(+ tr:not(.divider) > td:empty) > td {
        border-bottom: 0 none !important;
    }

    /* (4) titre ARTISTES a la taille exacte de MOTEURS et MOYENS */
    body.P-Mennour #artists > table > thead th h1 {
        font-size: 40.8px !important;
    }

    /* (5) bouton PROFIL : chocolat, arrondi discret, un peu de corps.
       LE SELECTEUR DOIT PASSER PAR #container. Le bouton est tenu dans
       style.css par "body:has(#portrait-id[value=Mennour]) a.portrait-profile-
       link", qui pose fond, arrondi et ombre en !important ; le :has y compte
       pour un ID, donc un simple body.P-Mennour ne fait pas le poids (mesure :
       la regle restait sans effet, le bouton gardait son taupe). En passant
       par l'ID du conteneur et la classe du bandeau, on repasse devant. */
    body.P-Mennour #container .language-switcher a.portrait-profile-link {
        background-color: #5a3419 !important;
        border-radius: 4px !important;
        box-shadow: 0 2px 6px rgba(50, 30, 12, 0.45) !important;
    }

    /* LE SURVOL DOIT ETRE REPOSE. En gagnant en specificite, la regle ci-dessus
       passait aussi devant le :hover de style.css (l.1403) et le bouton ne
       virait plus au rouge Mennour au passage de la souris - defaut mesure au
       harnais, pas suppose. On le remet, un cran au-dessus. Le regime mobile
       n'est pas concerne : style.css y pose le rouge en permanence, hors de ce
       media desktop. */
    body.P-Mennour #container .language-switcher a.portrait-profile-link:hover {
        background-color: #d23520 !important;
    }

    /* (6) icone home du coin bas-droit : grosse ombre */
    body.P-Mennour #bottom-bar .btn-home svg {
        box-shadow:
            0 10px 18px -2px rgba(60, 45, 30, 0.6),
            0 22px 40px -8px rgba(60, 45, 30, 0.45) !important;
    }
}
/* ============================================================================
   CVG-PATCH367 : Mennour desktop - cinq retouches du 2026-08-14 (la sixieme
   demande, le SENS DU PARCOURS du ver, n'est pas dans ce patch : elle attend
   que Maxou renumerote les segments sur un schema, l'annotation manuscrite ne
   permettant pas de trancher entre deux lectures opposees).

   (1) OMBRE DU CADRE D'ARTISTE FRANCHEMENT ACCENTUEE. "toujours trop faible,
       accentue largement" : au 366 elle etait a deux passes de .70/.60
       d'opacite en brun gris. Elle passe a TROIS passes, en brun fonce
       (50,30,12) et jusqu'a .85 d'opacite, avec des retraits nettement moins
       creux - le -7px et le -16px du 366 rongeaient la moitie du flou. Elle
       est aussi decalee vers la droite pour suivre la nouvelle direction de
       lumiere (point 3 ci-dessous).

   (2) BOUTON PROFIL PLUS SOMBRE ET PLUS ARRONDI : le chocolat 5a3419 du 366
       fonce en 3a2109, l'arrondi passe de 4 a 8 px, et l'ombre du bouton
       s'oriente elle aussi au sud-est. Le survol rouge Mennour est conserve
       (regle jumelle du 366, toujours au-dessus).

   (3) OMBRES ORIENTEES SUD-EST, ET PLUS INTENSES. "plutot vers sud-est que
       sud, et ceci est valable aussi pour celle des diagrammes". Jusqu'ici
       l'ombre des zones selectionnees ne pouvait que DESCENDRE : le module ne
       connaissait qu'un decalage vertical, soit une lumiere pile au-dessus.
       Le PATCH367 ajoute --sel-shadow-dx cote blocks.js ; a 16 px locaux
       l'ombre part vers la droite en meme temps qu'elle descend (dy 12), soit
       une lumiere en haut a gauche. Sa couleur passe du brun gris rgba(82,
       64,44,.5) a un brun plus dense et plus chaud rgba(69,45,20,.72).
       Absente ou nulle, la variable laisse le plein sud : les huit autres
       portraits ne bougent pas.

   (4) LES TROIS TITRES A LA MEME TAILLE EN PIXELS. Maxou : "ne faut-il pas
       pour tous 1.45em ou une valeur en px ?". EN EM, CA NE PEUT PAS MARCHER :
       les trois h1 n'ont pas la meme base - les th des ailes sont a 27,2 px,
       celui de la colonne ARTISTES a 15 px. Une meme valeur en em y donnerait
       39,4 px d'un cote et 21,8 de l'autre, soit un ecart bien pire qu'avant.
       Seule une valeur ABSOLUE les rend egaux par construction : 40,5 px pour
       les trois, la valeur proposee par Maxou (les ailes etaient a 40,8).

   (5) ICONE HOME : ombre plus intense et sud-est, comme celle des diagrammes.

   PERIMETRE : media min-width 551px, scope body.P-Mennour, plus une variable
   inerte par defaut cote blocks.js.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-shadow-dx: 16; /* 367 : nouveau - l'ombre des zones part vers le sud-EST */
        --sel-shadow-color: rgba(69, 45, 20, 0.72); /* 367 : etait rgba(82,64,44,.5) - plus dense, plus chaude */
        --sel-shadow-top-color: rgba(60, 30, 5, 0.62); /* 367 : etait rgba(69,33,2,.55) */
    }

    /* (1) ombre du cadre de selection ARTISTES : trois passes, sud-est */
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        box-shadow:
            8px 12px 16px -3px rgba(50, 30, 12, 0.85),
            20px 30px 40px -8px rgba(50, 30, 12, 0.7),
            36px 54px 72px -18px rgba(50, 30, 12, 0.5) !important;
    }

    /* (2) bouton PROFIL : plus sombre, plus arrondi, ombre sud-est */
    body.P-Mennour #container .language-switcher a.portrait-profile-link {
        background-color: #3a2109 !important;
        border-radius: 8px !important;
        box-shadow: 3px 4px 9px rgba(40, 22, 6, 0.55) !important;
    }

    /* (4) les TROIS titres a la meme taille absolue */
    body.P-Mennour #motors thead th h1,
    body.P-Mennour #means thead th h1,
    body.P-Mennour #artists > table > thead th h1 {
        font-size: 40.5px !important;
    }

    /* (5) icone home : ombre plus intense, orientee sud-est */
    body.P-Mennour #bottom-bar .btn-home svg {
        box-shadow:
            6px 9px 14px -1px rgba(45, 26, 8, 0.8),
            14px 22px 30px -5px rgba(45, 26, 8, 0.6) !important;
    }
}
/* ============================================================================
   CVG-PATCH368 : Mennour desktop - le PARCOURS du ver prend sa forme
   definitive, et l'ombre du bas est reprise (deux retours Maxou du
   2026-08-14, dont un provoque par le PATCH367 lui-meme).

   (1) LE TOUR EN TROIS TEMPS. Arbitrage de Maxou, mot pour mot : "moyens
       (mais sans la remontee) puis moteurs puis la remontee de la premiere
       cellule verticale du moyen (la seule qui n'avait pas ete parcourue)",
       le sens restant celui des aiguilles d'une montre. Le ver part donc de
       l'angle haut-gauche des MOYENS, en fait le tour par le haut, la droite
       et le bas, s'arrete au pied du bord gauche, passe aux MOTEURS dont il
       fait le tour complet, puis revient FERMER les MOYENS en remontant leur
       bord gauche. Cote blocks.js, le segment reporte est celui de fermeture
       du chemin - exactement le bord gauche - et la position d'arret est
       prise sur la GEOMETRIE, donc juste quelle que soit la selection.
       --sel-worm-close-share donne la part du tour reservee a cette remontee.

   (2) L'OMBRE NE DOIT PLUS ETRE DECOLLEE NI ONDULER AUTANT, et LES LIGNES
       VERTICALES DECALEES DISPARAISSENT. Les deux constats ont la meme cause,
       le decalage horizontal introduit au 367 : l'ombre du bas n'est pas une
       simple bande horizontale, c'est le trace du bas de la zone AVEC ses
       decrochements verticaux (l'escalier des rowspans). La pousser de 16 px
       vers la droite pousse aussi ces decrochements, qui cessent alors d'etre
       caches derriere le trait du pourtour et se lisent comme des lignes
       verticales en double. LE SUD-EST N'EST DONC PAS TENABLE SUR LES
       DIAGRAMMES tant que l'ombre suit un contour en escalier ; il reste en
       place sur les trois ombres qui sont de vraies boites - cadre d'artiste,
       bouton PROFIL, icone home - ou il ne produit aucun artefact.
       --sel-shadow-dx revient donc a 0 ici (la variable, elle, reste : elle
       est utile pour un portrait dont la zone serait rectangulaire).
       Le "decollement" et la "vague" viennent du tremble : a 52 d'amplitude,
       le bruit ecarte par endroits la bande de plus de 20 px du bord, ce qui
       ouvre des trous et donne cette ondulation trop marquee. Il retombe a
       16, et le decalage vertical de 12 a 6 : la bande revient au contact.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-worm-defer-close: 1; /* 368 : la remontee des MOYENS est jouee en dernier */
        --sel-worm-close-share: 0.16; /* 368 : part du tour reservee a la remontee - MESUREE : le bord gauche vaut 31 a 32 pourcent du chemin chez tous les artistes, et l aile a la moitie du tour, donc 0.16 rend la vitesse constante */
        --sel-shadow-dx: 0; /* 368 : etait 16 au 367 - le sud-est decalait les decrochements verticaux */
        --sel-shadow-dy: 6; /* 368 : etait 12 - l'ombre revient au contact du bord */
        --sel-shadow-wobble: 16; /* 368 : etait 52 - moins de vague, plus de trous */
    }
}
/* ============================================================================
   CVG-PATCH369 : Mennour desktop - trois demandes Maxou du 2026-08-14.

   (1) LE FOND DES COLONNES DE HIERARCHIE HORS SELECTION passe de
       rgb(229,225,210) a rgb(227,217,207) - un gris un rien plus chaud et plus
       fonce. C'est le voile que le PATCH233 avait pose sur les cellules
       cteg/scteg/sscteg/libelle des lignes NI selectionnees NI survolees.
       ET LE SELECTEUR EST SIMPLIFIE : les huit lignes du 233 (deux tables x
       quatre classes de cellule, chacune avec la meme garde) se replient en UN
       seul selecteur grace a :is(). LA SPECIFICITE EST RIGOUREUSEMENT LA MEME
       - :is() prend celle de son argument le plus specifique, donc
       :is(#motorsDialog,#meansDialog) vaut un ID comme avant, et
       :is(td.cteg,...) vaut un type + une classe comme "td.cteg" : la regle
       continue donc de battre style.css et la cle de config exactement comme
       hier. C'est bien une reecriture a rendu identique, pas un allegement de
       poids.

   (2) LES CELLULES-NUMEROS des deux ailes (.bg-pink cote MOTEURS,
       .bg-light-green cote MOYENS - les petites cases qui portent 19, 20, 21...)
       passent au gris #9b9691. Elles etaient peintes par les variables de
       theme --d2 et --d1 ; on ne touche PAS a ces variables, qui peignent aussi
       les colonnes de numeros de la table ARTISTES : seule la classe est
       surchargee, et seulement chez Mennour. Verifie au harnais : ces deux
       classes n'existent QUE dans les deux ailes (blocks.js:182 et 693), la
       colonne ARTISTES ne les porte pas.

   (3) LE VER DE L'AILE MOTEURS PART DU COIN BAS-DROIT et s'arrete en haut a
       droite - mecanique et raison detaillees dans blocks.js. L'aile MOYENS ne
       bouge pas ("a droite il a le comportement parfait").
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour :is(#motorsDialog, #meansDialog) tr:not(.hover):not(:hover) :is(td.cteg, td.scteg, td.sscteg, td.libelle):not(.hover) {
        background: rgb(227, 217, 207) !important;
    }

    body.P-Mennour #motorsDialog td.bg-pink,
    body.P-Mennour #meansDialog td.bg-light-green {
        background-color: #9b9691 !important;
    }

    body.P-Mennour {
        --sel-worm-second-start-br: 1; /* 369 : l'aile MOTEURS demarre en bas a droite */
    }
}
/* ============================================================================
   CVG-PATCH370 : Mennour desktop - six valeurs relevees par Maxou dans son
   navigateur (2026-08-14) et reportees telles quelles, plus l'epaisseur des
   filets qui passe de 2 a 3 px.

   (1) COLONNES DE NUMEROS DE LA TABLE ARTISTES (premiere et derniere cellule
       de chaque ligne) : #ddd6cf. Elles etaient peintes par les variables de
       theme --d2 et --d1 ; celles-ci restent intactes, on surcharge la cellule.
   (2) ENTETE DE LA COLONNE ARTISTES : #fffdf9, un blanc casse.
   (3) LIEN DU SUR-TITRE ("par Maxime Chanson") : #a1793e. Meme media que la
       regle du PATCH qui l'avait pose en taupe - donc la tranche
       tablette-portrait, qui suit le regime mobile, n'est pas touchee. Le
       survol rouge Mennour est conserve : sa regle a une pseudo-classe de
       plus, elle reste au-dessus.
   (4) BANDEAUX DES DEUX AILES : #311e01, un brun tres fonce a la place du noir
       du theme (--d4 / --d5).
   (5) LES FILETS DE STRUCTURE PASSENT DE 2 A 3 px, sur les memes quatre
       selecteurs qu'au PATCH340.
   (6) ET LE TRAIT DU POURTOUR SUIT, de 2 a 3 px. C'EST LA PRECAUTION QUE MAXOU
       DEMANDE ("il ne faut pas que ca impacte negativement la position de
       certaines bordures de la zone selectionnee"). Le trait du pourtour est
       dessine SUR la frontiere des cellules, centre dessus (PATCH282) : il doit
       donc etre AU MOINS aussi epais que le filet qu'il recouvre. Reste a 2 px
       sur des filets de 3, il laisserait depasser un demi-pixel de gris de part
       et d'autre - le rendu bi-ton "double" que le 282 avait precisement
       supprime. La geometrie, elle, se recale seule : le module relit les
       positions des cellules a chaque trace, et main.js relit borderTopWidth
       pour poser le cadre d'artiste.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour #artists tbody tr td:first-child,
    body.P-Mennour #artists tbody tr td:last-child {
        background: #ddd6cf !important;
    }

    body.P-Mennour #artists thead th {
        background: #fffdf9 !important;
    }

    body.P-Mennour #motors thead th,
    body.P-Mennour #means thead th {
        background: #311e01 !important;
    }

    /* (5) filets de structure : 3px - etait 2px au PATCH340 */
    body.P-Mennour #motors td,
    body.P-Mennour #means td,
    body.P-Mennour #artists tbody td,
    body.P-Mennour #artists thead th {
        border-width: 3px !important;
    }

    /* (6) le trait du pourtour doit couvrir le filet qu'il recouvre */
    body.P-Mennour {
        --sel-outline-width: 3px; /* 370 : etait 2px au 347 - suit les filets */
    }
}

@media (min-width: 551px) and (not ((max-width: 1000px) and (min-height: 1000px) and (orientation: portrait))) {
    body.P-Mennour .upperTitle > a,
    body.P-Mennour .upperTitle > a:visited {
        color: #a1793e !important;
    }
}
/* ============================================================================
   CVG-PATCH371 : Mennour desktop - trois retours Maxou du 2026-08-14.

   (1) LE VER NE DOIT PLUS SE DEDOUBLER cote MOTEURS - il quitte l'arrivee et
       passe directement a la remontee des MOYENS. La cause et le remede sont
       dans blocks.js : le pointille se repete le long du chemin et sa periode
       vaut la longueur du chemin, si bien qu'un second morceau entrait par le
       DEPART pendant que la tete sortait par l'ARRIVEE. Sans effet sur l'aile
       MOYENS, dont le chemin est ferme : les deux morceaux s'y rejoignent au
       point de fermeture, ce qui est justement ce qui rend le passage du coin
       invisible.

   (2) LE VER PASSE DE d2760a A b0642e : le caramel etait trop orange.

   (3) LE CADRE DE L'ARTISTE SELECTIONNE EST D'UN SEUL TON. Le cadre n'est pas
       une bordure posee sur la ligne : c'est un div flottant, peint DERRIERE
       la table. Son fond creme ne se voyait donc qu'a travers la cellule du
       NOM, qui est transparente - les deux cellules de numeros, elles, portent
       leur propre fond (le ddd6cf du PATCH370) et le masquaient. On les rend
       transparentes pour la seule ligne selectionnee : le creme du cadre passe
       alors d'un bord a l'autre. La classe .selected est posee par main.js sur
       le tr de l'artiste choisi - verifie au harnais, c'est bien la ligne qui
       se trouve sous le cadre.
       RESERVE CONNUE : quand la liste boucle et que les DEUX exemplaires de la
       ligne sont a l'ecran, le cadre jumeau (#selectedTwin) se pose sur une
       ligne qui, elle, ne porte pas la classe - ses cellules de numeros
       resteront ddd6cf. C'est un etat transitoire du defilement, anterieur a
       ce patch, et qui demande un correctif cote main.js.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Mennour {
        --sel-worm-color: #b0642e; /* 371 : etait d2760a, juge trop orange */
    }

    body.P-Mennour #artists tbody tr.selected td:first-child,
    body.P-Mennour #artists tbody tr.selected td:last-child {
        background: transparent !important;
    }
}

/* ============================================================================
   CVG-PATCH372 : Stoschek desktop - deux demandes Maxou du 2026-08-15, sur
   capture annotee de l'aile MOYENS.

   (1) LA SURBRILLANCE QUITTE LE GRIS POUR LE BLEU PALE. Deux valeurs, relevees
       par Maxou dans son navigateur : #e9f1ff pour TOUTES les zones de texte de
       la zone selectionnee, #bbd4ff pour la CELLULE-NUMERO de la bande.
       Ce que la zone valait avant, mesure au harnais : les quatre niveaux de
       hierarchie surlignes (cteg / scteg / sscteg) etaient a #c7c7c7 (le
       --stk-gris du PATCH274c), et tout le reste - libelle, cellule-numero,
       cellule de texte, spans .short-text/.long-text - a #e9e9e9. Trois teintes
       deviennent donc deux, et la zone se lit d'un seul tenant.
       LES LISTES DE SELECTEURS SONT RECOPIEES A L'IDENTIQUE depuis les trois
       regles du 274c (aplats du chemin, gris soutenu de la hierarchie, spans de
       texte) : a !important egal, c'est l'ordre qui tranche, et ce bloc est le
       dernier du fichier. Rien n'est retire plus haut - le 274c reste lisible
       comme l'etat d'ou l'on part.
       LA CELLULE-NUMERO DEMANDE SA PROPRE REGLE, et deux fois plutot qu'une.
       En etat SELECTIONNE elle est prise par "#motors tr.hover td" (0,1,2,3 en
       specificite) : "td.bg-pink" suffit a passer devant. Mais en etat de
       PRE-SELECTION (survol avant clic, body sans .selected) la regle qui la
       peint est "body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay)",
       qui vaut (0,1,4,3) grace a ses deux :not() et son :hover - une simple
       classe de plus n'y suffirait pas. Le selecteur de survol est donc repris
       en entier, classe comprise, pour valoir (0,1,5,3). Sans cette seconde
       ligne, le numero resterait bleu pale une fois selectionne et redeviendrait
       gris au simple survol : incoherence invisible en capture statique.
       LE SURVOL SUIT LA SELECTION, deliberement : les memes cellules doivent
       porter la meme couleur avant et apres le clic, sans quoi la zone
       changerait de teinte au moment ou l'on clique dessus.

   (2) LES EPAISSEURS DE BORDURE SONT CELLES DE MENNOUR. Quatre traits, tous
       ramenes a 3 px - le calibre pose chez Mennour au PATCH370 :
         - les FILETS de structure, sur les quatre memes selecteurs que chez
           Mennour (#motors td, #means td, #artists tbody td, #artists thead th) :
           2 px -> 3 px ;
         - le POURTOUR de la zone selectionnee, trace en SVG par le module 281
           de blocks.js : Stoschek ne posait aucune --sel-outline-width et
           retombait donc sur le repli 6 du module. La variable est desormais
           posee a 3 px. AUCUNE LIGNE DE JS N'EST TOUCHEE : le module relit
           cette variable a chaque trace ;
         - le POURTOUR DE PRE-SELECTION, qui lui est en CSS (le survol dessine
           un simple rectangle, quatre bordures suffisent) : ses 6 px du
           PATCH281 suivent a 3 px. Il faut les reprendre cote par cote et non
           par un border-width global : les trois regles du 281 posent des
           RACCOURCIS (border-top: 6px solid ...) a une specificite de (0,1,4,3),
           que le border-width des filets, a (0,1,1,2), ne bat pas ;
         - le CADRE DE L'ARTISTE selectionne, que le PATCH276 avait aligne
           explicitement sur le pourtour ("MEME epaisseur que le pourtour du
           chemin") : il suit donc, de 6 px a 3 px. Le cadre de SURVOL, lui, est
           deja a 3 px (--hover-cursor-border, PATCH274b) - rien a faire.
       LA GEOMETRIE SE RECALE SEULE, et c'est verifie et non suppose : le module
       281 relit la position reelle des cellules a chaque trace, et main.js relit
       borderTopWidth pour poser le cadre d'artiste.

   PERIMETRE. Media min-width:551px = frontiere des cles IsMD de l'injecteur :
   le regime SMARTPHONE de Stoschek reste strictement intact. Scope
   body.P-Stoschek partout : les huit autres portraits, Mennour compris, ne
   voient rien.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1a) toutes les zones de TEXTE de la surbrillance : #e9f1ff --------
       Listes recopiees des trois regles du 274c. La cellule-numero y figure
       encore (elle est un td de la bande) : (1b) la reprend juste apres. */
    body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Stoschek #motors td.hover:not(.overlay),
    body.P-Stoschek #motors tr.hover,
    body.P-Stoschek #motors tr.hover td,
    body.P-Stoschek:not(.selected) #means tr:hover td:not(.overlay),
    body.P-Stoschek #means td.hover:not(.overlay),
    body.P-Stoschek #means tr.hover,
    body.P-Stoschek #means tr.hover td,
    body.P-Stoschek #motors td.cteg.hover,
    body.P-Stoschek #motors td.scteg.hover,
    body.P-Stoschek #motors td.sscteg.hover,
    body.P-Stoschek #means td.cteg.hover,
    body.P-Stoschek #means td.scteg.hover,
    body.P-Stoschek #means td.sscteg.hover,
    body.P-Stoschek #motors tr.hover .short-text,
    body.P-Stoschek #motors tr.hover .long-text,
    body.P-Stoschek #motors tr:hover .short-text,
    body.P-Stoschek #motors tr:hover .long-text,
    body.P-Stoschek #means tr.hover .short-text,
    body.P-Stoschek #means tr.hover .long-text,
    body.P-Stoschek #means tr:hover .short-text,
    body.P-Stoschek #means tr:hover .long-text {
        background: #e9f1ff !important;
    }

    /* --- (1b) la cellule-numero de la surbrillance : #bbd4ff ---------------
       Deux lignes par aile : l'etat selectionne (tr.hover), puis l'etat de
       pre-selection, dont le selecteur doit etre repris en entier pour passer
       devant (cf. en-tete). Les cellules-numeros HORS surbrillance ne sont pas
       touchees : elles gardent le gris de la grille. */
    body.P-Stoschek #motors tr.hover td.bg-pink,
    body.P-Stoschek #motors td.bg-pink.hover,
    body.P-Stoschek:not(.selected) #motors tr:hover td.bg-pink:not(.overlay),
    body.P-Stoschek #means tr.hover td.bg-light-green,
    body.P-Stoschek #means td.bg-light-green.hover,
    body.P-Stoschek:not(.selected) #means tr:hover td.bg-light-green:not(.overlay) {
        background: #bbd4ff !important;
    }

    /* --- (2a) filets de structure : 3px - memes selecteurs que Mennour ------ */
    body.P-Stoschek #motors td,
    body.P-Stoschek #means td,
    body.P-Stoschek #artists tbody td,
    body.P-Stoschek #artists thead th {
        border-width: 3px !important;
    }

    /* --- (2b) pourtour SVG de la zone selectionnee : repli 6 -> 3px --------- */
    body.P-Stoschek {
        --sel-outline-width: 3px; /* 372 : Stoschek n'en posait aucune */
    }

    /* --- (2c) pourtour CSS de la PRE-SELECTION : 6px -> 3px ----------------
       Cote par cote : les raccourcis du 281 ne se laissent pas battre par le
       border-width de (2a). Seule la largeur est reprise, la couleur et le
       style restent ceux du 281. */
    body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:not(.overlay) {
        border-top-width: 3px !important;
        border-bottom-width: 3px !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:first-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:first-child:not(.overlay) {
        border-left-width: 3px !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:last-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:last-child:not(.overlay) {
        border-right-width: 3px !important;
    }

    /* --- (2d) cadre de l'artiste selectionne : 6px -> 3px, il suit le
       pourtour comme le 276 l'avait voulu ------------------------------------ */
    body.P-Stoschek #artistsScroll > div#selected.cursor {
        border-width: 3px !important;
    }
}

/* ============================================================================
   CVG-PATCH373 : Stoschek desktop - LE POURTOUR REVIENT A 6 px ET DEVIENT
   REGULIER SUR TOUT SON PARCOURS ; le cadre de l'artiste suit. Retour Maxou du
   2026-08-15, capture a l'outline volontairement epaissi : "j'ai exagere
   l'outline pour que tu voies qu'il n'est pas regulier partout ! par ailleurs
   je veux qu'il ait une width de 6px. Enfin je veux la meme chose pour
   l'encadre de l'artiste."

   LE DEFAUT ETAIT REEL, ET IL EST ANTERIEUR AU PATCH372 - le 372 l'a seulement
   rendu moins voyant en amincissant le trait. Sa cause est dans le PATCH282 :
   depuis lui le trait est CENTRE sur la frontiere des cellules, donc sa moitie
   exterieure deborde de la zone. Sur une frontiere INTERIEURE au tableau cela
   ne se voit pas. Mais sur celles qui coincident avec le bord du CONTENU
   DEFILANT, cette moitie tombe hors de #motors-scroll / #means-scroll, dont
   l'overflow vaut "scroll" : elle est purement et simplement coupee.
   MESURE AU HARNAIS, trait regle a 16 pour reproduire la capture de Maxou :
   rogne de 8 px a gauche, 8 en haut, 5 a droite - le bord droit de la zone
   s'arretant 3 px avant celui du tableau - et 0 en bas. Soit TROIS epaisseurs
   differentes a l'ecran sur un seul et meme pourtour : 8, 11 et 16.
   LE REMEDE EST DANS blocks.js et il ne touche pas au trace : il BORNE la
   geometrie de la zone a la region ou le trait tient tout entier, c'est-a-dire
   a une demi-epaisseur des bords du contenu defilant. Seules les frontieres
   extremes bougent, d'une demi-epaisseur au plus, et seulement celles qui
   debordaient ; les frontieres interieures sont hors d'atteinte des bornes.
   A 6 px, cela deplace le bord gauche et le bord haut de 3 px vers l'interieur
   et ne touche a rien d'autre : le bord droit avait deja la place.
   LE GARDE-FOU EST INERTE PAR DEFAUT et ne s'allume qu'ici, par
   --sel-outline-clip-guard. Le module est PARTAGE avec Mennour depuis le
   PATCH338, et Mennour porte exactement le meme defaut - 1,5 px sur deux cotes
   a son trait de 3 px. On ne l'y allume pas sans que Maxou l'ait demande : son
   pourtour, son ombre et son ver derivent tous de cette geometrie, et le 371
   vient d'etre valide. Un mot de lui suffira, la variable est prete.

   ET LE TRAIT REVIENT A 6 px, comme le cadre de l'artiste - qui etait deja
   aligne sur lui par le PATCH276 ("MEME epaisseur que le pourtour du chemin").
   Les deux etaient descendus a 3 px au PATCH372, ou je les avais cales sur
   Mennour ; Maxou tranche pour 6. LES FILETS DE STRUCTURE, EUX, RESTENT A
   3 px : le retour ne porte que sur "l'outline" et "l'encadre de l'artiste",
   et 6 sur 3 reste conforme a la regle du PATCH370 - le trait du pourtour doit
   etre au moins aussi epais que le filet qu'il recouvre, faute de quoi le gris
   depasse de part et d'autre.

   PERIMETRE. Media min-width:551px ; scope body.P-Stoschek. Le regime
   smartphone et les huit autres portraits ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Stoschek {
        --sel-outline-width: 6px; /* 373 : etait 3px au 372 */
        --sel-outline-clip-guard: 1; /* 373 : trait d'epaisseur egale sur les quatre cotes */
    }

    body.P-Stoschek #artistsScroll > div#selected.cursor {
        border-width: 6px !important; /* 373 : etait 3px au 372, il suit le pourtour */
    }
}

/* ============================================================================
   CVG-PATCH374 : Stoschek desktop - LES DEUX COLONNES DE NUMEROS DE LA TABLE
   ARTISTES passent a #e2edff. Regle dictee telle quelle par Maxou le
   2026-08-15, sur le selecteur du PATCH274g qu'elle vient surcharger.

   Elles etaient a #c9d1fa (--stk-bleu-pale, le palier C2 pose au 274g). LA
   VARIABLE N'EST PAS TOUCHEE, seules les deux cellules le sont : --stk-bleu-pale
   peint aussi le clignotement d'attention des trois tables, la bulle de survol
   du nom d'artiste, l'encre des liens de la modale et la bande de la ligne
   survolee - les repeindre toutes serait deborder tres au-dela de la demande.
   Le 274g posait deux regles jumelles (une par cellule) pour pouvoir les
   distinguer ; ici la couleur est la meme des deux cotes, une seule suffit.

   CONSEQUENCE A CONNAITRE, ET C'EST UN GAIN. La bande de la LIGNE SURVOLEE
   (PATCH280) reste, elle, a #c9d1fa. Jusqu'ici les deux valeurs etant egales,
   les cellules de numeros ne changeaient pas au survol : la ligne ne se
   signalait que par sa cellule de NOM, qui passait du blanc au bleu pale. Avec
   le fond au repos eclairci, la bande survolee devient un bleu franchement
   plus soutenu d'un bord a l'autre de la ligne - le survol se lit desormais
   sur toute sa largeur. Si Maxou prefere l'ancien rendu, il suffira d'aligner
   la bande sur #e2edff.

   PERIMETRE. Media min-width:551px = frontiere des cles IsMD de l'injecteur :
   le regime smartphone reste intact. Scope body.P-Stoschek : les huit autres
   portraits ne voient rien. Ce fichier charge APRES le style de config
   (contrat PATCH183) et cette regle est la derniere du fichier : a specificite
   egale avec le 274g, l'ordre tranche.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Stoschek #artists tbody tr td:first-child,
    body.P-Stoschek #artists tbody tr td:last-child {
        background: #e2edff !important; /* 374 : etait le c9d1fa du 274g */
    }
}

/* ============================================================================
   CVG-PATCH375 : Stoschek desktop - RENVERSEMENT NOIR / BLEU. L'ENCRE ET LES
   BANDEAUX PASSENT AU BLEU, LE NOIR SE REPLIE SUR LES SEULES BORDURES ; et deux
   traits noirs sont ajoutes autour des ailes. Arbitrage Maxou du 2026-08-15,
   apres trois simulations au harnais - "garde ca, c'est mieux", sur la maquette
   a 6 px.

   (1) LE NOIR ET LE BLEU ECHANGENT LEURS ROLES. Jusqu'ici --stk-noir (#111111)
       portait TROIS choses a la fois : l'encre du portrait, les aplats des deux
       bandeaux d'ailes, et la COULEUR DES FILETS de structure. On la bascule au
       bleu #002AFF, ce qui emporte d'un coup le titre, le sur-titre, les
       libelles de hierarchie, les liens d'exemples, les noms d'artistes, les
       numeros et les deux bandeaux - puis ON REND LE NOIR AUX SEULS FILETS,
       nommement. C'est le sens de la demande : "juste les bordures sont noires".
       Deux ajustements suivent le meme mouvement : le mot COLLECTION du titre
       repasse au noir (il portait l'accent C2, qui est desormais la couleur
       generale et ne distinguerait plus rien), et l'entete ARTISTES garde son
       cadre noir.
       TROIS SURFACES SONT EXPRESSEMENT RETENUES AU NOIR : le fond de la modale
       d'animation, son bandeau de titre, et le bouton de commande du cryptex.
       Elles consomment --stk-noir mais n'apparaissent sur AUCUNE des captures
       validees ; les laisser suivre aurait repeint en bleu des ecrans que Maxou
       n'a pas regardes - et le bouton cryptex, dont le lisere est deja bleu,
       aurait perdu son contour. On ne deborde pas du perimetre revu.

   (2) LE POURTOUR DE LA ZONE SELECTIONNEE REVIENT A 3 px, cadre de l'artiste
       compris - ils etaient repasses a 6 au PATCH373. Le trait reste BLEU :
       c'est desormais le seul reperage de la selection dans des ailes ou tout
       le reste est noir ou bleu d'encre. Le garde-fou de rognage du 373 reste
       actif, le trait garde donc son epaisseur egale sur les quatre cotes.
       AU PASSAGE, UNE INCOHERENCE DU 373 DISPARAIT : ce patch avait porte le
       pourtour SVG a 6 px sans toucher au pourtour CSS de PRE-SELECTION, reste
       a 3 depuis le 372 - le survol annoncait donc un trait deux fois plus fin
       que ce que le clic donnait. Les deux valent 3 px a nouveau.

   (3) LES COLONNES DE NUMEROS DES AILES RECOIVENT DES LISERES NOIRS DE 6 px sur
       leurs deux aretes verticales. En border-collapse l'arete est partagee
       avec la cellule voisine et c'est la plus epaisse qui l'emporte : la
       colonne se detache des deux cotes SANS toucher au reste de la grille, qui
       reste a 3 px.

   (4) ET LES DEUX AILES RECOIVENT UN POURTOUR EXTERIEUR NOIR DE 6 px. Il est
       pose en OUTLINE avec un offset negatif, et non en bordure : une bordure
       aurait pris sa place dans le flux et decale toute la geometrie des ailes
       - or le module 281 et main.js calculent leurs traces sur cette geometrie.
       L'outline se dessine a l'interieur de la boite, rien ne bouge.

   CE QUI N'EST PAS FAIT, ET POURQUOI. Une simulation intermediaire ramenait au
   noir l'encre du diagramme hors surbrillance, epaississait le pourtour de
   selection et l'y passait en noir : Maxou l'a ecartee au profit de celle-ci.
   La colonne ARTISTES ne recoit ni grille noire ni cadre exterieur, pour la
   meme raison.

   PERIMETRE. Media min-width:551px = frontiere des cles IsMD de l'injecteur :
   le regime SMARTPHONE reste strictement intact - y compris la modale SM, dont
   les couleurs sont ecrites en dur sous max-550. Scope body.P-Stoschek : les
   huit autres portraits ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1) l'encre bascule au bleu ---------------------------------------- */
    body.P-Stoschek {
        --stk-noir: #002AFF; /* 375 : etait #111111 depuis le 274 */

        /* surfaces expressement retenues au noir (cf. en-tete) */
        --anime-bg: #111111;
        --anime-title-bg: #111111;
        --cryptex-order-btn-bg: #111111;
    }

    /* --- ... et le noir se replie sur les filets de structure --------------- */
    body.P-Stoschek #motors td,
    body.P-Stoschek #means td {
        border-color: #111111 !important;
    }

    body.P-Stoschek #artists thead th {
        border-color: #111111 !important;
    }

    /* le mot COLLECTION : l'accent C2 est devenu la couleur generale, il ne
       distinguerait plus rien - c'est le noir qui le detache maintenant */
    body.P-Stoschek .title .stk-c2 {
        color: #111111 !important;
    }

    /* --- (2) pourtour de la selection et cadre d'artiste : 6px -> 3px ------- */
    body.P-Stoschek {
        --sel-outline-width: 3px; /* 375 : etait 6px au 373 */
    }

    body.P-Stoschek #artistsScroll > div#selected.cursor {
        border-width: 3px !important; /* 375 : etait 6px au 373 */
    }

    /* --- (3) colonnes de numeros des ailes : liseres verticaux noirs 6px ---- */
    body.P-Stoschek #motorsDialog td.bg-pink,
    body.P-Stoschek #meansDialog td.bg-light-green {
        border-left: 6px solid #111111 !important;
        border-right: 6px solid #111111 !important;
    }

    /* --- (4) pourtour exterieur des deux ailes ----------------------------- */
    body.P-Stoschek #motors > .meansAndMotorsDialog,
    body.P-Stoschek #means > .meansAndMotorsDialog {
        outline: 6px solid #111111 !important;
        outline-offset: -6px !important;
    }
}

/* ============================================================================
   CVG-PATCH376 : Stoschek desktop - DEUX VALEURS DU PATCH375 CORRIGEES, dictees
   par Maxou le 2026-08-15 sur les selecteurs eux-memes : les liseres des
   colonnes de numeros des ailes passent de 6 a 4 px, et --sel-outline-width de
   3 a 5 px.

   LE POURTOUR DE PRE-SELECTION SUIT LES 5 px, ET CE N'EST PAS UN AJOUT
   ARBITRAIRE. --sel-outline-width ne pilote que le trait SVG de l'etat
   SELECTIONNE ; le pourtour du SURVOL, lui, est en CSS - au survol la zone est
   un simple rectangle, quatre bordures suffisent, le module 281 n'est pas
   sollicite. Les laisser a 3 px recreerait exactement l'ecart que le PATCH375
   venait de supprimer : un survol annoncant un trait plus fin que celui que le
   clic donne. Les deux valent donc 5 px. Il faut les reprendre COTE PAR COTE :
   les regles du PATCH281 posent des RACCOURCIS a une specificite de (0,1,4,3),
   qu'aucun border-width global ne bat.

   CE QUI NE BOUGE PAS. Le CADRE DE L'ARTISTE reste a 3 px : Maxou n'a nomme que
   --sel-outline-width, et le cadre est un objet distinct, dans une autre
   colonne. A SIGNALER TOUTEFOIS - le PATCH276 les avait explicitement alignes
   ("MEME epaisseur que le pourtour du chemin") et cet alignement est desormais
   rompu, 3 contre 5. Un mot suffit pour le remettre au pas.
   Le pourtour EXTERIEUR des ailes reste a 6 px : la correction ne porte que sur
   les liseres des colonnes de numeros, qui sont un autre trait.

   Le garde-fou de rognage du PATCH373 continue de s'appliquer : a 5 px la
   demi-epaisseur vaut 2,5 px, et le trait reste d'epaisseur egale sur les
   quatre cotes.

   PERIMETRE. Media min-width:551px ; scope body.P-Stoschek.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Stoschek {
        --sel-outline-width: 5px; /* 376 : etait 3px au 375 */
    }

    body.P-Stoschek #motorsDialog td.bg-pink,
    body.P-Stoschek #meansDialog td.bg-light-green {
        border-left-width: 4px !important; /* 376 : etait 6px au 375 */
        border-right-width: 4px !important;
    }

    /* le pourtour de PRE-SELECTION suit le trait de selection (cf. en-tete) */
    body.P-Stoschek:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:not(.overlay) {
        border-top-width: 5px !important;
        border-bottom-width: 5px !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:first-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:first-child:not(.overlay) {
        border-left-width: 5px !important;
    }

    body.P-Stoschek:not(.selected) #motors tr:hover td:last-child:not(.overlay),
    body.P-Stoschek:not(.selected) #means tr:hover td:last-child:not(.overlay) {
        border-right-width: 5px !important;
    }
}

/* ============================================================================
   CVG-PATCH378 : Stoschek desktop - deux defauts releves par Maxou sur TESTER
   le 2026-08-15, captures annotees 1 et 2.

   NUMERO CEDE : ce bloc etait ecrit en 377 quand une session parallele a pousse
   son propre CVG-PATCH377 (Mennour, commit 075eb02) avec le meme numero ET le
   meme buster 20260815f. Regle du depot : le second cede. Il devient 378, le
   buster passe a 20260815g. Le bloc Mennour du 377 se trouve APRES celui-ci
   dans le fichier - sans consequence, les deux portees sont disjointes
   (body.P-Mennour d'un cote, body.P-Stoschek de l'autre) et aucun selecteur
   n'est partage ; on ne le deplace pas pour ne pas gonfler le diff.

   (1) IL RESTE DU BLEU DANS LE DIAGRAMME SUR DES CELLULES NON SURLIGNEES.
       Constat exact, et la cause est dans le PATCH375 : en basculant --stk-noir
       au bleu, il a emporte l'encre de TOUTES les cellules qui tiennent leur
       couleur de cette variable - c'est-a-dire de --d3-t, --d2-t, --d1-t et des
       liens - sans distinguer la zone selectionnee du reste. Le rendu n'est
       meme pas uniforme : les cellules de hierarchie sont reparties en groupes
       bg-gray1, bg-gray3, bg-gray5... et certains groupes tiennent leur encre
       d'une cle de config qui pose une valeur EN DUR, restee noire. D'ou le
       melange visible sur la capture 1 - PERCEPTION, MECHANISMS, LIMITS, TIME,
       SPACE en bleu, MISE EN SCENE, DOCUMENTARY-STYLE, PARODIC en noir, sans
       rapport avec la selection.
       LA REGLE EST DONC POSEE EN DEUX TEMPS : tout l'interieur des deux ailes
       repasse au NOIR - la cellule et ses descendants, pour attraper aussi les
       spans .short-text / .long-text et les liens d'exemples - puis le BLEU est
       rendu a la SEULE zone surlignee. Les selecteurs .hover portent une classe
       de plus, ils repassent naturellement devant sans !important supplementaire
       a arbitrer. Les th ne sont pas cibles : les deux bandeaux gardent leur
       titre blanc sur bleu.
       Le bleu ne designe donc plus, dans les ailes, que le moteur et le moyen
       de l'artiste choisi - ce que le PATCH375 avait fait perdre.

   (2) LE CADRE DE LA COLONNE ARTISTES EST PLUS FIN QUE LE POURTOUR DES AILES.
       Capture 2 contre 2b : 3 px d'un cote, 6 de l'autre. Il passe a 6 px.
       Les deux traits ne sont pas de meme nature - celui des ailes est un
       outline pose sur le conteneur au PATCH375, celui-ci est la bordure de
       l'entete ARTISTES (#artists thead th) - mais ils se lisent cote a cote
       comme le meme geste, et doivent donc avoir le meme calibre.
       A SIGNALER : sous l'entete, la LISTE des artistes n'a aucun cadre
       exterieur, seulement les liseres bleus de ses deux colonnes de numeros
       (PATCH280). Lui en donner un demanderait de choisir sur quelle arete le
       poser : l'entete fait 288 px de large, les lignes 306 et le conteneur
       defilant 323 - trois rectangles differents, aucun ne cerne la colonne.
       On ne tranche pas a la place de Maxou.

   PERIMETRE. Media min-width:551px ; scope body.P-Stoschek.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1) l'encre du diagramme repasse au noir... ----------------------- */
    body.P-Stoschek #motors td,
    body.P-Stoschek #motors td *,
    body.P-Stoschek #means td,
    body.P-Stoschek #means td * {
        color: #111111 !important;
    }

    /* --- ... sauf la zone surlignee, qui garde le bleu --------------------- */
    body.P-Stoschek #motors td.hover,
    body.P-Stoschek #motors td.hover *,
    body.P-Stoschek #motors tr.hover td,
    body.P-Stoschek #motors tr.hover td *,
    body.P-Stoschek #means td.hover,
    body.P-Stoschek #means td.hover *,
    body.P-Stoschek #means tr.hover td,
    body.P-Stoschek #means tr.hover td * {
        color: #002AFF !important;
    }

    /* --- (2) le cadre de l'entete ARTISTES au calibre du pourtour des ailes - */
    body.P-Stoschek #artists thead th {
        border-width: 6px !important; /* 378 : etait 3px depuis le 372 */
    }
}
/* ============================================================================
   CVG-PATCH377 : Mennour desktop - deux demandes Maxou du 2026-08-15, la
   premiere dictee sur le selecteur lui-meme.

   (1) LES CELLULES-NUMEROS DES DEUX AILES (.bg-pink cote MOTEURS,
       .bg-light-green cote MOYENS - les petites cases qui portent 19, 20,
       21...) passent de #9b9691 a #e3d9cf. C'est la regle du PATCH369 (2),
       recopiee a l'identique - meme selecteur, meme !important - avec la seule
       valeur changee ; elle la surcharge par l'ordre, ce bloc etant le dernier
       du fichier. Rien n'est retire plus haut.
       LA VALEUR N'EST PAS UNE COULEUR DE PLUS : #e3d9cf, c'est exactement le
       rgb(227,217,207) que le PATCH369 (1) avait pose sur les colonnes de
       hierarchie hors selection. Le gris moyen quittait la bande ; le numero
       prend desormais le fond de ses voisines et se lit comme elles.
       Les variables de theme --d1 / --d2 ne sont toujours pas touchees : elles
       peignent aussi les colonnes de numeros de la table ARTISTES, qui ne
       portent pas ces deux classes (verifie au PATCH369, blocks.js:182 et 693).

   (2) L'OMBRE PORTEE SOUS LES CELLULES SELECTIONNEES EST RETIREE. Ce n'est pas
       un box-shadow : dans les ailes le contour est un ESCALIER, et l'ombre est
       peinte par l'overlay SVG des PATCH341/348/349 - une copie du contour,
       floutee, decalee vers le bas, puis rognee en evenodd pour ne subsister
       qu'a l'EXTERIEUR de la zone. On ne la retire donc pas en CSS sur les
       cellules : on la retire A LA SOURCE.
       LE MODULE EST DEJA PREVU POUR. blocks.js:1698 ne construit tout ce
       dispositif que "if (stkOlShCol)", c'est-a-dire si --sel-shadow-color est
       posee et non vide - c'est ce qui fait que les huit autres portraits n'ont
       jamais eu d'ombre. Il suffit de rendre la variable vide chez Mennour.
       POURQUOI "initial" ET NON "transparent". Sur une propriete personnalisee,
       initial vaut la valeur garantie-invalide : getComputedStyle rend la
       chaine VIDE, la branche entiere est sautee, et pas un noeud n'est ajoute
       au SVG. Avec transparent la variable resterait non vide - filtre, bruit
       fractal, clip et trois passes de trace seraient encore construits et
       redessines a chaque defilement, pour un resultat invisible.
       AUCUNE LIGNE DE JS N'EST TOUCHEE, et les autres --sel-shadow-* (dy, dx,
       blur, spread, wobble, core, top, grain, overshoot, top-color) sont
       laissees en place : elles deviennent inertes, et une seule ligne
       supprimee ici rendrait l'ombre telle qu'elle etait au PATCH368.
       CE QUE CELA EMPORTE AUSSI : le lisere d'ombre de l'arete HAUTE
       (--sel-shadow-top, PATCH349), qui vit dans la meme branche - il fait
       partie de l'ombre. Le TRAIT du pourtour (--sel-outline-*) et le VER
       (--sel-worm-*) sont ailleurs dans le module : ils ne bougent pas.

   CE QUI N'EST PAS TOUCHE. L'ombre du CADRE DE L'ARTISTE selectionne
   (PATCH354, retouchee au PATCH367 (1)) reste en place : c'est un box-shadow,
   sur un objet distinct, dans une autre colonne - Maxou a nomme les cellules.
   Les ombres du bouton PROFIL et de l'icone HOME (PATCH367) non plus.

   PERIMETRE. Media min-width:551px = frontiere des cles IsMD de l'injecteur :
   le regime SMARTPHONE de Mennour reste intact, et le module JS se retire de
   lui-meme sous 551px. Scope body.P-Mennour : les huit autres portraits,
   Stoschek compris, ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) les cellules-numeros des deux ailes : etait #9b9691 au PATCH369 */
    body.P-Mennour #motorsDialog td.bg-pink,
    body.P-Mennour #meansDialog td.bg-light-green {
        background-color: #e3d9cf !important;
    }

    /* (2) plus d'ombre sous la zone selectionnee (cf. en-tete) */
    body.P-Mennour {
        --sel-shadow-color: initial; /* 377 : etait rgba(69,45,20,.72) au 367 */
    }
}
/* ============================================================================
   CVG-PATCH379 : Mennour desktop - deux demandes Maxou du 2026-08-15, sur
   capture annotee du portrait EN (cercle rouge sur l'aile MOYENS, cercle vert
   sur la colonne ARTISTES).

   (1) LE POURTOUR DE LA ZONE SURLIGNEE EST RETIRE - "des pourtours plus epais
       ou d'une autre couleur autour des cellules en surbrillance : retirer,
       garde celle qu'on voit ailleurs dans le tableau".

       CE N'EST PAS UNE BORDURE, ET C'EST MESURE. Au harnais, les cellules
       surlignees portent EXACTEMENT les bordures de leurs voisines : 3 px
       rgb(51,48,42) sur les quatre cotes, identiques a la ligne du dessus, a
       celle du dessous et au reste de la table. Il n'y a donc rien a
       "normaliser" cote cellules - la demande porte sur un objet qui n'est pas
       dans le tableau.

       CE QUE C'EST : le TRAIT du module 281/341, un chemin SVG pose en overlay
       au-dessus des cellules. Il explique a lui seul les deux symptomes que
       Maxou decrit. "D'une autre couleur" : il est en #4b2511, un brun, quand
       la grille est en #33302a, un gris chaud. "Plus epais" : depuis le
       PATCH282 il est CENTRE sur la frontiere des cellules - ses 3 px
       chevauchent donc le filet de 3 px qui est dessous, et l'oeil lit la
       somme, pas le trait.

       POURQUOI AUCUNE VARIABLE CSS NE PEUT L'ETEINDRE. Les deux leviers
       evidents sont fermes, verifie dans blocks.js et non suppose :
         - --sel-outline-width a 0 ne donne pas un trait nul mais le REPLI du
           module, 6 px (blocks.js:1460, "if (!(stkOlW > 0)) stkOlW = 6") ;
         - --sel-outline-color n'est qu'un repli depuis le PATCH365 : le module
           lit la couleur SUR LE CADRE de l'artiste a chaque trace
           (blocks.js:1456, follow-cursor) et ecrase la variable. La mettre a
           transparent ne changerait rien tant que le cadre, lui, a une bordure
           visible - et cette bordure, on la garde.
       Le levier est donc pris UN CRAN PLUS BAS, sur le noeud SVG lui-meme :
       une propriete CSS "stroke" bat toujours l'attribut de presentation que le
       module ecrit sur le chemin. AUCUNE LIGNE DE JS N'EST TOUCHEE.

       LE SELECTEUR DESIGNE LE POURTOUR ET RIEN D'AUTRE. Le module ajoute au SVG
       le pourtour D'ABORD, le ver ENSUITE ; l'ombre du 341, quand elle existait,
       vivait dans un g[clip-path] et n'a jamais ete un enfant direct. Le premier
       enfant "path" du SVG est donc le pourtour, dans tous les cas de figure.

       LE VER RESTE, deliberement : Maxou n'a demande que le pourtour. Il garde
       sa couleur, sa largeur et son parcours - il est le SECOND chemin, le
       selecteur ne l'atteint pas. La zone reste donc designee par sa
       surbrillance et par le ver qui en fait le tour, sans trait fixe.

   (2) LE CADRE DE L'ARTISTE SELECTIONNE PERD SON OMBRE (cercle vert). Trois
       passes de box-shadow posees au PATCH354 et reglees au PATCH367 (1) : la
       regle les annule d'un bloc, par l'ordre - ce bloc est le dernier du
       fichier. C'est le pendant du PATCH377 (2), qui avait retire l'ombre des
       ailes ; les deux panneaux reviennent au meme registre, sans relief.
       LA BORDURE DU CADRE, ELLE, N'EST PAS TOUCHEE - c'est elle qui designe
       l'artiste, et c'est aussi elle que le module lit en follow-cursor.
       #selectedTwin est vise en meme temps, comme au 354 : c'est le miroir que
       main.js clone pour la ligne jumelle quand la boucle est active.

   PERIMETRE. Media min-width:551px : le regime SMARTPHONE de Mennour reste
   intact, et le module JS se retire de lui-meme sous 551px. Scope
   body.P-Mennour : les huit autres portraits, Stoschek compris, ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) le pourtour de la zone surlignee s'efface ; le ver, second chemin
       du SVG, n'est pas atteint (cf. en-tete) */
    body.P-Mennour svg.stk-outline > path:first-of-type {
        stroke: transparent !important;
    }

    /* (2) le cadre de l'artiste perd ses trois passes d'ombre du 354/367 */
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        box-shadow: none !important;
    }
}
/* ============================================================================
   CVG-PATCH380 : Mennour desktop - trois demandes Maxou du 2026-08-15.

   NUMERO : 380 et non 372. Ce bloc a d'abord ete ecrit sous le numero 372,
   pris sur une lecture de l'historique qui s'arretait au PATCH371 ; or une
   autre session a produit dans la journee les patchs 372 a 379, dont le 377 et
   le 379 sur ce meme portrait. Verification faite avant commit (regle du
   CLAUDE.md), le numero libre est 380. Ce bloc est le dernier du fichier : il
   passe donc APRES le 379, et ne le contredit sur aucune propriete - le 379
   eteint le trait du pourtour et l'ombre du cadre, ce bloc-ci pose des fonds.

   (1) TOUTE LA ZONE SELECTIONNEE PASSE EN #efdab8 - la ligne de l'artiste
       comme les bandes de moteurs et de moyens qui lui correspondent. Elles
       etaient au creme #fffaf2 depuis le PATCH233 ; ce creme sert desormais de
       fond general (point 2), la selection devait donc s'en detacher. La ligne
       d'artiste n'a pas de fond propre : c'est le cadre flottant, peint
       derriere la table, qui porte la couleur (mecanique du PATCH371).

   (2) LES FONDS BLANCS DES DIAGRAMMES PASSENT EN #fffaf2. Ce blanc n'etait pas
       pose sur les cellules mais sur les TABLES elles-memes, et il transparait
       par les cellules sans fond propre - c'est lui qui faisait 35 % de la page
       a la derniere mesure. On le remplace a la source, sur les trois tables ;
       les cellules qui ont deja leur fond (champs, colonnes de numeros, voiles
       de hierarchie) ne bougent pas, et aucun texte n'est touche.
       Les bulles d'aide (div.tooltip2) restent blanches : ce sont des calques
       flottants, pas des fonds de diagramme.

   (3) LE TRAIT "PLUS FIN" DE LA COLONNE ARTISTES N'EST PAS PLUS FIN, IL EST
       PLUS CLAIR. Mesure au harnais : toutes les bordures font 3px, mais les
       cellules de la colonne ARTISTES sont bordees d'olive rgb(78,76,31) sur
       leurs cotes et de beige rgb(196,188,171) en haut et en bas, alors que
       les ailes ET l'en-tete ARTISTES sont en charbon rgb(51,48,42). A largeur
       egale, le plus clair se lit comme plus mince - d'ou l'impression, tres
       nette au zoom 3x, d'un trait affaibli le long de la colonne des numeros
       de droite. On aligne les VERTICALES sur le charbon ; les horizontales
       restent claires, elles separent des lignes d'une meme liste et non deux
       zones du diagramme.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) zone selectionnee - ailes */
    body.P-Mennour:not(.selected) #motors tr:hover td:not(.overlay),
    body.P-Mennour #motors td.hover:not(.overlay),
    body.P-Mennour #motors tr.hover td,
    body.P-Mennour #motors tr.hover .short-text,
    body.P-Mennour #motors tr.hover .long-text,
    body.P-Mennour #motors tr:hover .short-text,
    body.P-Mennour #motors tr:hover .long-text,
    body.P-Mennour:not(.selected) #means tr:hover td:not(.overlay),
    body.P-Mennour #means td.hover:not(.overlay),
    body.P-Mennour #means tr.hover td,
    body.P-Mennour #means tr.hover .short-text,
    body.P-Mennour #means tr.hover .long-text,
    body.P-Mennour #means tr:hover .short-text,
    body.P-Mennour #means tr:hover .long-text {
        background: #efdab8 !important;
    }

    /* (1) zone selectionnee - cadre de l'artiste */
    body.P-Mennour #artistsScroll > div#selected.cursor,
    body.P-Mennour #artistsScroll > div#selectedTwin.cursor {
        background-color: #efdab8 !important;
    }

    /* (2) fonds blancs des diagrammes */
    body.P-Mennour #motors table,
    body.P-Mennour #means table,
    body.P-Mennour #artists table {
        background-color: #fffaf2 !important;
    }

    /* (3) verticales de la colonne ARTISTES au meme charbon que le reste */
    body.P-Mennour #artists tbody td {
        border-left-color: rgb(51, 48, 42) !important;
        border-right-color: rgb(51, 48, 42) !important;
    }
}

/* ============================================================================
   CVG-PATCH381 : Stoschek desktop - L'ENTETE ARTISTES PREND LE BLEU POUR SON
   CADRE ET LA HAUTEUR DES DEUX AILES. Deux demandes Maxou du 2026-08-15, sur
   capture annotee (cercle vert autour du bloc ARTISTES).

   NUMERO : 381. Le bloc a failli sortir en 379 ; verification faite avant
   commit comme le prescrit CLAUDE.md section 6, la session parallele qui
   travaille sur Mennour a consomme 377, 379 et 380 pendant la journee. Le
   premier numero libre est 381, et le buster passe de 20260815i a 20260815j.

   (1) LE CADRE DE L'ENTETE PASSE DU NOIR AU BLEU. Il etait noir depuis le
       PATCH375, qui avait replie le noir sur les bordures, et venait de passer
       a 6 px au PATCH378 pour egaler le pourtour des ailes. L'epaisseur ne
       bouge pas, seule la couleur change : --stk-bleu, c'est-a-dire exactement
       l'aplat des deux bandeaux MOTEURS et MOYENS. Les trois blocs sont alors
       coiffes de la meme couleur, l'un en aplat plein, l'autre en cadre.

   (2) ET L'ENTETE PREND LA HAUTEUR DES DEUX AILES. L'ecart est mesure, pas
       estime : les tables d'entete des ailes font 160 px locaux, celle
       d'ARTISTES 182 - soit 22 px locaux, 12,7 px a l'ecran, ce qui suffit a
       faire depasser le bloc central sous les deux autres alors que les trois
       partent du meme haut (106,9 px).
       L'ecart ne vient pas d'une hauteur declaree mais du REMPLISSAGE : le th
       des ailes a 51 px de padding vertical, celui d'ARTISTES 53, et ce dernier
       porte en plus les deux bordures de 6 px du PATCH378 - qui s'ajoutent a la
       boite, le th etant en content-box. On ne rogne donc pas le padding a
       l'aveugle : on FIXE la hauteur a 160 px en border-box, bordures
       comprises, on annule le padding vertical devenu inutile, et on centre le
       titre verticalement. Le calcul se fait tout seul quelle que soit la
       taille du titre - et il n'y a pas de sous-titre cote ARTISTES, la ou les
       ailes en ont un.
       CONSEQUENCE VOULUE : la liste des artistes remonte de 22 px locaux et se
       cale sur le haut des deux diagrammes. main.js relit la geometrie a chaque
       positionnement, le cadre de l'artiste et le pourtour suivent seuls.

   PERIMETRE. Media min-width:551px = frontiere des cles IsMD de l'injecteur :
   le regime smartphone reste intact. Scope body.P-Stoschek : les huit autres
   portraits, Mennour compris, ne voient rien.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1) cadre de l'entete au bleu des bandeaux ------------------------ */
    body.P-Stoschek #artists thead th {
        border-color: var(--stk-bleu) !important; /* 381 : etait #111111 au 375 */
    }

    /* --- (2) meme hauteur que les entetes des deux ailes : 160px locaux -----
       LE th EST REGLE A 154, PAS A 160, ET CE N'EST PAS UN TATONNEMENT. Les
       tables sont en border-collapse : la MOITIE EXTERIEURE de la bordure d'une
       cellule de bord deborde de la ligne et vient grossir la boite de la
       TABLE. Avec les 6 px du PATCH378, cela fait 3 px au-dessus et 3 en
       dessous - mesure au harnais : th, thead et tr tous a 160, et la table a
       166. C'est la table que l'oeil compare aux deux ailes, puisque c'est son
       bord exterieur qui porte le cadre. On vise donc 154 + 3 + 3 = 160.
       Les ailes n'ont pas ce probleme : leur th n'a qu'un filet de 1 px en
       haut, dont la demi-epaisseur se perd dans l'arrondi. */
    body.P-Stoschek #artists > table {
        height: 160px !important;
    }

    body.P-Stoschek #artists thead th {
        box-sizing: border-box !important;
        height: 154px !important;
        padding-top: 0 !important;
        padding-bottom: 0 !important;
        vertical-align: middle !important;
    }
}

/* ============================================================================
   CVG-PATCH382 : Stoschek desktop - quatre points releves par Maxou sur TESTER
   le 2026-08-15, captures annotees. Numero verifie avant commit (CLAUDE.md
   section 6) : 377, 379 et 380 sont a la session parallele, 381 est a moi, le
   premier libre est 382. Buster 20260815j vers 20260815k.

   (1) LES ICONES DU HAUT SE CENTRENT SUR LE TITRE. Mesure au harnais : le titre
       a son centre a 29,0 px de l'ecran, le bouton PROFILE a 40,6 et le groupe
       d'icones de droite a 37,7 - soit 11,6 et 8,7 px visuels trop bas. Les
       deux blocs sont en position absolue, on les remonte donc par un
       transform, qui ne touche a rien d'autre.
       LES VALEURS SONT EN PIXELS LOCAUX, PAS VISUELS : la page est peinte a
       l'echelle 0,5872 (mesuree, pas supposee), un translateY s'exprime avant
       cette echelle. D'ou 11,6/0,5872 = 19,8 -> 20 px pour PROFILE, et
       8,7/0,5872 = 14,8 -> 15 px pour le groupe de droite. Ecart residuel
       calcule : 0,14 et 0,11 px visuels, soit un dixieme de pixel.
       Le groupe de droite est deplace D'UN BLOC et non icone par icone : ses
       trois enfants sont alignes par le HAUT (tous a la meme ordonnee), les
       centrer separement les desalignerait entre eux.

   (2) LE SURVOL D'UNE BANDE NON SELECTIONNEE L'ALLUME COMME UNE SELECTION.
       C'est le "bizarre, la cellule du haut des moteurs est toujours en
       surbrillance bleue" : la bande 17 s'allumait alors que l'artiste choisi
       est sur le moteur 20. Reproduit au harnais a la souris reelle, artiste
       deja selectionne : .short-text et .long-text de la bande 17 passent a
       rgb(233,241,255) sur rgb(0,42,255) - exactement les couleurs de la
       selection.
       LA CAUSE EST UN GARDE MANQUANT, ET IL MANQUE DEPUIS LE SOCLE. Les regles
       de survol des CELLULES sont bien protegees par :not(.selected) depuis le
       PATCH281 - une fois un artiste choisi, survoler ailleurs ne peint plus
       les td. Mais les regles qui peignent les SPANS de texte ne l'ont jamais
       ete : ni celles du socle (style.css:414 et 429, "#motors tr:hover
       .short-text"), ni leur recopie du PATCH274c. Elles continuaient donc de
       s'appliquer par-dessus la selection. Verifie aussi : le td de la bande
       restait bien transparent, seuls les spans s'allumaient - d'ou une bande
       qui parait surlignee alors que sa cellule ne l'est pas.
       On neutralise pour le seul etat selectionne, et pour la seule ligne qui
       n'est PAS la bande retenue (tr:hover:not(.hover)) : fond blanc et encre
       noire, c'est-a-dire l'etat de repos. Specificite (0,1,5,2), au-dessus du
       socle (0,1,2,1) et de la recopie (0,1,3,2). Les cellules de hierarchie
       de cette meme ligne, elles, gardent leur bleu quand elles appartiennent
       vraiment au chemin : elles n'ont pas de span de texte, la regle ne les
       voit pas.

   (3) LA BORDURE BASSE DE L'ENTETE ARTISTES DEVIENT FINE : 6 px -> 3 px, le
       calibre des filets. LA HAUTEUR DU th SUIT, DE 154 A 155,5 px, et ce
       n'est pas cosmetique : en border-collapse la boite de la TABLE vaut la
       hauteur du th plus la MOITIE de chaque bordure de bord (demonstration au
       PATCH381). En passant la bordure basse de 6 a 3, la table perdrait
       1,5 px et l'entete ne serait plus a la hauteur des ailes, que le 381
       vient d'aligner. 155,5 + 3 + 1,5 = 160, l'alignement tient.

   (4) LE BOUTON PROFIL : fond blanc, pourtour bleu, texte bleu #002aff en
       graisse 800. Les quatre proprietes sont posees explicitement plutot que
       laissees aux variables --btn / --btn-t : celles-ci servent aussi
       d'autres boutons, et --btn-t suit --stk-noir, qui a change de sens au
       PATCH375.

   NON TRAITE, ET C'EST UNE REPONSE, PAS UN OUBLI : "l'epaisseur de la bordure
   externe du tableau MOTEURS est bonne, celle du tableau MOYENS est plus fine".
   Les deux pourtours sont STRICTEMENT identiques - meme regle, et mesure au
   harnais : les deux ailes font 607,7 px de large, meme haut et meme hauteur,
   et portent toutes deux "6px solid rgb(17,17,17) offset -6px". Ce que l'oeil
   compare n'est pas la meme chose des deux cotes. Zoom optique x4 sur les deux
   aretes : a droite de MOTEURS on voit le pourtour NOIR de 6 px (3,5 px
   visuels) ; a gauche de MOYENS on voit un trait BLEU de 5 px (2,9 px visuels),
   qui est le pourtour de la ZONE SELECTIONNEE - chez cet artiste la zone touche
   le bord gauche de l'aile et le trait bleu recouvre le noir. Le noir est bien
   la, dessous. Deux objets differents, pas deux epaisseurs : rien a corriger
   sans que Maxou tranche (soit le trait de selection monte a 6 pour se
   confondre, soit il descend pour se distinguer franchement).

   PERIMETRE. Media min-width:551px ; scope body.P-Stoschek.
   ========================================================================== */
@media (min-width: 551px) {

    /* --- (1) icones du haut centrees sur le titre (px LOCAUX, cf. en-tete) -- */
    body.P-Stoschek .language-switcher {
        transform: translateY(-20px) !important;
    }

    body.P-Stoschek #btn-group-right {
        transform: translateY(-15px) !important;
    }

    /* --- (2) un artiste selectionne : le survol d'une AUTRE bande n'allume
       plus ses spans de texte ------------------------------------------------ */
    body.P-Stoschek.selected #motors tr:hover:not(.hover) .short-text,
    body.P-Stoschek.selected #motors tr:hover:not(.hover) .long-text,
    body.P-Stoschek.selected #motors tr:hover:not(.hover) a,
    body.P-Stoschek.selected #means tr:hover:not(.hover) .short-text,
    body.P-Stoschek.selected #means tr:hover:not(.hover) .long-text,
    body.P-Stoschek.selected #means tr:hover:not(.hover) a {
        background: #ffffff !important;
        color: #111111 !important;
    }

    /* --- (3) bordure basse de l'entete ARTISTES : fine, et la hauteur suit -- */
    body.P-Stoschek #artists thead th {
        border-bottom-width: 3px !important; /* 382 : etait 6px au 378 */
        height: 155.5px !important; /* 382 : 155,5 + 3 + 1,5 = 160, cf. en-tete */
    }

    /* --- (4) bouton PROFIL ------------------------------------------------- */
    body.P-Stoschek a.portrait-profile-link {
        background: #ffffff !important;
        background-color: #ffffff !important;
        border-color: #002AFF !important;
        color: #002AFF !important;
        font-weight: 800 !important;
    }
}
/* ============================================================================
   CVG-PATCH383 : Mennour desktop - quatre demandes Maxou du 2026-08-15, sur
   deux captures annotees (ellipse rouge sur le bord bas de l'entete ARTISTES ;
   rectangles rouges sur les bords de la colonne, rectangle vert sur le contour
   d'une aile, designe comme la reference).

   (1) LES NOMS D'ARTISTES PASSENT EN QUANTICO. La fonte n'etait pas chargee
       sur cette page : _layout2 la demande, mais Mennour est servi par
       _layout1, et le releve au harnais ne trouvait aucune feuille Quantico.
       Elle est donc ajoutee a la requete Google Fonts deja presente dans
       _layout1 - voir le commentaire sur place, l'arobase suivie de chiffres
       ne peut pas etre ecrite en balise nue.
       Le nom vit dans un div.artist-name a l'interieur de td.artistName ; la
       regle vise le div, comme Maxou l'a dicte.

   (2) LES CELLULES-NUMEROS DES DEUX AILES PASSENT A #a99e93. Elles etaient a
       #e3d9cf depuis le PATCH377 (autre session, ce matin). Meme selecteur,
       repris tel quel.

   (3) L'ENTETE ARTISTES REPREND LA HAUTEUR DES DEUX AILES. Mesure au harnais :
       174 px locaux contre 169 pour MOTEURS et MOYENS, d'ou le bord bas qui
       descend "un chouia plus bas" - 3 px visuels d'ecart, exactement ce que
       l'ellipse rouge entoure. L'ecart ne vient pas d'un reglage unique mais
       de la somme de trois : un padding vertical de 53 px au lieu de 51, et
       une bordure basse de 3 px que les ailes n'ont pas. Plutot que de rejouer
       cette arithmetique - qui casserait au moindre changement de sous-titre -
       on FIXE la hauteur a celle des ailes, en border-box : la cellule inclut
       alors ses bordures et son padding dans les 169 px, et les trois bandeaux
       se terminent sur la meme ligne.

   (4) LE CONTOUR DE LA COLONNE ARTISTES PREND LE POIDS DE CELUI DES AILES.
       Mesure au balayage de pixels : le contour d'une aile est peint sur 3 px,
       celui de la colonne ARTISTES sur 2. L'ecart s'explique : le contour
       d'une aile est une SOMME - la bordure de 3 px locaux de la cellule de
       bord, PLUS le trait de 1 px que porte le conteneur div#motors/div#means -
       tandis que la colonne ARTISTES n'a que la bordure de ses cellules, soit
       3 px locaux = 1,76 px visuels, arrondis a 2.
       On ne peut pas reproduire la recette des ailes : leur div epouse leur
       table, alors que div#artists est plus large que la sienne de 28 px de
       chaque cote - le trait tomberait a cote. On passe donc par les TABLES :
       une bordure de 5 px locaux posee sur la table entre dans le calcul de
       border-collapse, l'emporte sur les 3 px des cellules de bord, et donne
       5 x 0,587 = 2,9 px visuels, soit les 3 px du contour de reference. Les
       DEUX tables sont visees : l'entete et le corps sont deux tables
       distinctes dans ce portrait.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) noms d'artistes */
    body.P-Mennour #artistsScroll .artist-name {
        font-family: 'Quantico', sans-serif !important;
    }

    /* (2) cellules-numeros des deux ailes */
    body.P-Mennour #motorsDialog td.bg-pink,
    body.P-Mennour #meansDialog td.bg-light-green {
        background-color: #a99e93 !important;
    }

    /* (3) entete ARTISTES a la hauteur des deux ailes.
       PAS PAR height : sur une cellule de tableau, height n'est qu'un MINIMUM
       - le contenu commande. Essaye au harnais, le bandeau passait de 174 a
       176 px locaux au lieu de descendre a 169. On agit donc sur la cause,
       le padding vertical : 53 px de part et d'autre au lieu de 51 chez les
       ailes, plus une bordure basse de 3 px qu'elles n'ont pas, soit 7 px de
       trop pour 5 a rattraper. Padding ramene a 51,5 px : 51,5 x 2 + 63 de
       contenu + 3 de bordure = 169, la hauteur des deux ailes. */
    body.P-Mennour #artists thead th {
        padding-top: 51.5px !important;
        padding-bottom: 51.5px !important;
    }

    /* (4) contour de la colonne ARTISTES au poids de celui des ailes */
    body.P-Mennour #artists table,
    body.P-Mennour #artistsScroll table {
        border: 5px solid rgb(51, 48, 42) !important;
    }
}
/* ============================================================================
   CVG-PATCH384 : Mennour desktop - deux demandes Maxou du 2026-08-16.

   (1) L'ENTETE DE LA COLONNE ARTISTES PASSE A #fffaf2. Il etait reste a
       #fffdf9 depuis le PATCH370 : c'est un oubli du PATCH380, qui devait
       ramener a #fffaf2 "tous les fonds des diagrammes qui etaient blancs" et
       n'avait traite que les trois tables. Ce bandeau est le dernier blanc du
       portrait.

   (2) LE BOUTON PROFIL PREND LES VALEURS REGLEES PAR MAXOU DANS DEVTOOLS,
       relevees sur sa capture : fond #855b1a, arrondi 21 px, bordure de 5 px
       #452005, encre #fff7eb, graisse 800, corps 15 px, padding 4/23 px,
       interlettre 1 px - et l'ombre RETIREE, decochee sur la capture. La regle
       qu'il modifiait en direct est celle du PATCH367 (l'ombre barree y est
       mot pour mot) ; ce bloc, dernier du fichier, la remplace.
       LA BORDURE EST LE POINT DELICAT : style.css pose "border: none" en
       !important sur ce bouton ; il faut donc redeclarer les quatre cotes,
       ce que fait la forme raccourcie ci-dessous.
       LE SURVOL ROUGE MENNOUR EST CONSERVE - la regle du PATCH366 porte une
       pseudo-classe de plus et reste au-dessus.
   ========================================================================== */
@media (min-width: 551px) {
    /* (1) dernier fond blanc du portrait */
    body.P-Mennour #artists thead th {
        background: #fffaf2 !important;
    }

    /* (2) bouton PROFIL, valeurs dictees */
    body.P-Mennour #container .language-switcher a.portrait-profile-link {
        background-color: #855b1a !important;
        border-radius: 21px !important;
        border: 5px solid #452005 !important;
        box-shadow: none !important;
        color: #fff7eb !important;
        font-weight: 800 !important;
        font-size: 15px !important;
        padding: 4px 23px !important;
        letter-spacing: 1px !important;
    }
}

/* ============================================================================
   CVG-PATCH385 : Stoschek desktop - LA BORDURE BASSE DE L'ENTETE ARTISTES NE
   DOIT PLUS SE PEINDRE PLUS FINE QUE LES LISERES DES COLONNES DE NUMEROS.
   Retour Maxou du 2026-08-16, capture annotee : "apres le demarrage du scroll
   de la liste, la bordure diminue - je veux qu'elle fasse la meme taille que
   les colonnes moteur et moyen de la colonne centrale, pas plus petite".

   LE DEFAUT EST REEL MAIS CE N'EST PAS UNE HISTOIRE DE SCROLL, C'EST UN
   ARRONDI SOUS-PIXEL - et il ne se voit qu'aux fenetres etroites. Mesure au
   pixel peint (balayage PNG au harnais), bordure et lisere valant tous deux
   3 px locaux :
     - fenetre 1526 (echelle 0,56)  : bordure 2 px peints, lisere 2 px - egaux ;
     - fenetre 1174 (echelle 0,431, LA LARGEUR DE LA CAPTURE DE MAXOU) :
       lisere 1 px continu, bordure 1 px FRAGMENTE (bleu / boue / bleu) -
       3 px locaux ne font plus que 1,29 px visuels, et le trait horizontal
       tombe a cheval sur la grille de pixels la ou le lisere vertical, lui,
       tient sa colonne.
   Le "demarrage du scroll" n'est que le declencheur apparent : l'initialisation
   de la liste (main.js la positionne, la barre de defilement apparait) decale
   la page d'une fraction de pixel et fait basculer l'arrondi. Verifie aussi
   dans les deux etats de defilement (frontiere de ligne au haut du conteneur /
   ligne coupee en plein milieu) : le trait de l'entete est constant, c'est ce
   qui vient se coller dessous qui change l'impression - mais a 1174 il est
   objectivement plus fin que le lisere.

   REMEDE : la bordure basse passe de 3 a 4 px locaux. A 0,431 elle peint
   desormais 2 px continus (contre 1 au lisere) ; a 0,56, 2 px contre 2. Elle
   ne peut plus s'arrondir SOUS le lisere - "pas plus petite", quitte a etre
   un pixel au-dessus aux fenetres etroites.
   ET LA HAUTEUR DU th SUIT, DE 155,5 A 155 : en border-collapse la boite de
   la table vaut le th plus la MOITIE de chaque bordure de bord (demonstration
   au PATCH381). 155 + 3 (moitie du 6 haut) + 2 (moitie du 4 bas) = 160 -
   l'alignement des trois entetes, acquis du 381, tient.

   PERIMETRE. Media min-width:551px ; scope body.P-Stoschek.
   ========================================================================== */
@media (min-width: 551px) {
    body.P-Stoschek #artists thead th {
        border-bottom-width: 4px !important; /* 385 : etait 3px au 382 */
        height: 155px !important; /* 385 : 155 + 3 + 2 = 160, cf. en-tete */
    }
}

/* ==========================================================================
   CVG-PATCH386 : Mennour SMARTPHONE - intro video. Numero verifie avant
   usage au ramassage du 2026-08-16 : 385 etait le dernier pris. Deux
   demandes Maxou du 2026-08-15 : "le cryptex dans la video doit etre
   visuellement un peu plus haut sur le telephone, pour paraitre centre - la
   il ne semble pas centre verticalement" et "la trainee de fumee a cote de
   SKIP, la meme que pour Stoschek, mais en blanc".

   (1) LE CRYPTEX REMONTE DE 52 px. La video est POURTANT centree au pixel :
   mesure au harnais (Chromium 396x860, style.css + cette feuille, video reelle
   src/vid/Mennour/smartphone-fr.mp4 en 1920x1080) - bande video de y 318.6 a
   541.4, donc centre a 430 = exactement la moitie des 860. Et le cryptex est
   centre DANS le cadre : barycentre des pixels clairs mesure sur 40 images
   reparties dans les 20 secondes = 48.0% de la hauteur du cadre (bbox 47.6%),
   soit 1 px au-dessus du centre a cette echelle. Rien n'est donc decentre
   mathematiquement : ce qui decentre, c'est le POIDS VISUEL DU LIEN PASSER en
   bas d'ecran. Mesure au meme harnais : ses glyphes occupent y 756 a 785, donc
   sous la video il y a 215 px de noir jusqu'au mot, et au-dessus 319 px de noir
   jusqu'au bord haut - l'oeil lit cet ecart, pas la geometrie du calque.
   La valeur EGALISE ces deux noirs : gap = (756 - 222.75) / 2 = 266.7, soit une
   remontee de 318.6 - 266.7 = 51.9 px, arrondie a 52. Elle est INDEPENDANTE DE
   LA HAUTEUR D'ECRAN (le centre de la video vaut H/2 et le haut des glyphes
   H - 104, donc la cible vaut toujours H/2 - 52) : un telephone plus court ou
   un navigateur qui montre sa barre d'URL ne la deregle pas, d'ou un px et non
   un pourcentage de viewport. C'est deux fois la remontee du PATCH305 pour
   Stoschek (-26 px, "un chouia", cadre rouge dessine par Maxou) : ici la
   demande est de paraitre CENTRE, pas d'un cran vers le haut - si c'est trop,
   la seule valeur a changer est le -52px de la premiere regle.
   Meme mecanisme que le 305 : translateY sur #video1, qui ne touche ni au
   margin:auto qui centre la video dans le flex #videoDiv, ni au fond noir
   uniforme, ni au flux (aucun reflow, la video n'est pas redimensionnee).
   Si une cle de config posait un jour un transform sur #video1 chez Mennour,
   ce !important l'ecraserait : le repli serait alors position:relative + top.

   (2) TRAINEE CREME A COTE DE PASSER / SKIP. Report EXACT de la trainee
   Stoschek des PATCH306/307 - meme geometrie au chiffre pres (fuseau de 165%
   de large, tete a right 58% qui glisse SOUS les glyphes pour toucher le mot,
   inclinaison de 9deg qui remonte le bras gauche, flou de 6 px) - avec les
   deux seules differences voulues : le degrade passe du rose/lavande a la
   CREME DU HEADER MENNOUR, #dedad0 = rgb(222,218,208), hex dicte par Maxou le
   2026-08-16 (d'abord demandee blanche la veille, puis accordee a la creme en
   meme temps que le theme-color des layouts, qui prend la meme valeur), et
   l'EMANATION du PATCH305 (les text-shadow autour des lettres et leur
   respiration) N'EST PAS reportee. Maxou demande la trainee "a cote de" SKIP :
   le halo sur les glyphes eux-memes n'est pas dans la demande, et un halo
   clair sur des lettres deja claires (lightgray du socle) empaterait le mot au
   lieu de fumer a cote. Si Maxou veut aussi l'emanation, elle s'ajoute en une
   regle sur le meme selecteur.
   position:relative + isolation:isolate + overflow:visible sont REPOSES ICI :
   le socle les pose sur p.videoClick > a (PATCH256) mais DANS le regime
   desktop, ferme au 228 - sous 550px le lien est donc position:static, un
   pseudo en z-index:-1 y passerait derriere la video et le fond noir, et la
   cle overflow:hidden de la config Mennour le retrancherait au rectangle du
   lien. isolation:isolate cree le contexte d'empilement qui garde la trainee
   DERRIERE les lettres mais DEVANT la video (meme raison qu'au 256/306).
   Rien a prevoir pour prefers-reduced-motion : la trainee ne bouge pas.
   PERIMETRE : media max-width 550px et scope body.P-Mennour - le DESKTOP de
   Mennour et les huit autres portraits (Stoschek garde sa trainee rose) sont
   strictement inchanges. Les ::before/::after du socle sont hors de portee :
   ils vivent dans le regime desktop.
   RAMASSAGE : le buster de portrait-standard.css EST bumpe dans ce meme
   chantier (20260815n -> 20260815o dans les deux layouts, recale sur le n
   des PATCH377-385 pousses en parallele), sur consigne Maxou du 2026-08-16
   d'achever le travail - les layouts etaient de toute facon touches pour le
   theme-color creme (meta ligne 18, meme #dedad0 que la trainee).
   ========================================================================== */
@media (max-width: 550px) {
    body.P-Mennour #video1 {
        /* CVG-PATCH388 : "le cryptex est un chouia trop haut, baisser d'un
           chouia" (Maxou 2026-08-16). Le chouia maison = les 26px du PATCH305
           Stoschek : -52 + 26 = -26. Seule valeur a retoucher si besoin. */
        transform: translateY(-26px) !important;
    }

    body.P-Mennour p.videoClick > a {
        position: relative !important;
        isolation: isolate !important;
        overflow: visible !important;
    }

    body.P-Mennour p.videoClick > a::before {
        content: "";
        position: absolute;
        top: 42%;
        right: 58%;
        width: 165%;
        height: 0.9em;
        transform: rotate(9deg); /* sens ecran : +9deg REMONTE le bras gauche (y vers le bas), cf. PATCH307 */
        transform-origin: 100% 50%;
        background: linear-gradient(to left,
            rgba(222, 218, 208, .34),
            rgba(222, 218, 208, .14) 45%,
            rgba(222, 218, 208, 0) 82%);
        filter: blur(6px);
        border-radius: 999px;
        pointer-events: none;
        z-index: -1;
    }
}


/* ==========================================================================
   CVG-PATCH398 : Mennour - LA FUMEE PASSE EN WebGL VOLUMETRIQUE, le bloc CSS
   des PATCH389 a 397 est RETIRE. Arbitrage Maxou du 2026-08-20 : le module
   autonome src/js/fog-reveal.js (nappe brune volumetrique - bruit simplex 3D,
   deformation de domaine, absorption de la lumiere vers une source haute) a
   ete regle au banc d'essai ce jour et remplace la transposition CSS du 397.
   Les deux ne peuvent pas cohabiter : meme page, meme declencheur
   (:has(#videoDiv[style*="top"])), elles se seraient superposees.
   Ce qui disparait ici : la copie marron/beige du bloc Stoschek (rideau
   .fog/.fog__grad/.fog__clouds/.fog__edge scope body.P-Mennour, keyframes
   mnrFog*, couche de residu mnrFogHaze). Recuperable telle quelle dans
   l'historique git au commit du PATCH397 si l'arbitrage se retourne.
   Ce qui NE bouge PAS : le markup .fog des deux layouts, PARTAGE avec la
   brume violette de Stoschek (regles body.P-Stoschek .fog, plus haut dans ce
   fichier, PATCH313+315+316+320+323+325) - le violet reste a Stoschek, le
   marron passe au WebGL chez Mennour. Sans regle scopee body.P-Mennour, le
   markup laisse pour Stoschek n'a plus aucun effet sur la page Mennour.
   Pilotage de la nappe WebGL : src/js/fog-mennour.js (conteneur, declenchement
   a la chute du rideau video, garde motion reduite, repli sans WebGL).
   ========================================================================== */
/* ==========================================================================
   CVG-PATCH391 : Mennour mobile/tablette - LISIBILITE DE LA SIGNATURE
   "Maxime Chanson" PAR CONTRE-DEGRADE DANS LES LETTRES. Demandes Maxou du
   2026-08-16, arbitrage "P1" sur trois simulations : "un degrade sur le
   texte uniquement de .upperTitle a:visited, tres etendu, de la gauche vers
   la droite, prenant en compte le background du header qui a lui-meme un
   degrade : dans les zones claires du fond, plus sombre ; dans les zones
   sombres, plus clair - qu'il garde sa couleur lumineuse mais lisible, une
   fois retire le background --s7 de body.P-Mennour .upperTitle".
   Numero verifie avant usage : 390 etait le dernier pris.

   (1) LE FOND DU PATCH218 EST RETIRE (premisse de la demande). La regle
       style.css:3289-3295 posait un degrade horizontal rgba(233,233,233,.42)
       sur .upperTitle ; mesure au harnais sur rendu fonds-seuls, il dessine
       un ressaut de luminance de 7.08/255 sur la ligne basse de la boite (la
       "bordure rectangulaire" refusee) et ne rapporte que 0.03 point de
       contraste. Il est annule ICI plutot qu'edite la-bas : cette feuille
       est chargee apres style.css, meme selecteur + !important, plus grande
       specificite (0,1,1 avec body.P-Mennour) - et la neutralisation est
       isolable, commentable seule pour restaurer le 218.

   (2) LE NOM EST PEINT PAR UN DEGRADE DANS SES GLYPHES (background-clip:
       text, fill transparent), EN NEGATIF DU FOND : le header Mennour porte
       un degrade ~92deg clair a gauche -> sombre a droite (capture Maxou du
       2026-08-16, telephone reel) ; la ou le fond est clair les lettres
       sont bronze, la ou il s'assombrit elles montent vers le #fff5c4
       lumineux de la config. Variante retenue P1 "croisement doux" : pente
       CONTINUE sur toute la largeur du nom, six arrets de #6e5520 a
       #fffbe0. Regle apprise aux essais et a garder pour tout reglage :
       une bascule RAIDE cree une lettre-fantome au point de croisement (une
       lettre a moitie dans chaque regime devient illisible) - toute
       retouche doit garder des transitions etalees ; l'alternative propre
       est de caler la bascule dans l'espace entre les deux mots (variante
       P3, ecartee par Maxou au profit de P1).

   POURQUOI PAS :visited, alors que la clef de config vit la : les
   navigateurs INTERDISENT de styler :visited avec autre chose que des
   couleurs unies (anti-pistage) - un degrade y est ignore. La regle porte
   donc sur le lien TOUS ETATS ; -webkit-text-fill-color:transparent
   s'applique visite ou non, et la couleur #fff5c4 que la config pose sur
   a:visited devient sans effet visible sans qu'on y touche.
   background-clip:text est porte par Chromium, WebKit et Firefox (verifie
   au banc pour Chromium ; propriete standard + prefixe poses tous deux).

   BANC DES SIMULATIONS : snapshot statique OneDrive/Mennour/indexEN_sm.html
   servi en local, fond du header RECONSTRUIT d'apres la capture telephone
   de Maxou (le snapshot, anterieur, a un header trop uniforme ; la page
   reelle est verrouillee en ligne, 403). CONSEQUENCE ASSUMEE : les
   POURCENTAGES des arrets sont a caler sur le vrai header apres mise sur
   tester - le principe (sombre a gauche, lumineux a droite, pente continue)
   tient tant que le header s'assombrit vers la droite ; si le fond change
   en base, c'est la liste d'arrets ci-dessous qu'il faut recalculer.

   PERIMETRE : media identique a celui du PATCH218 (smartphone ET tablette
   portrait), scope body.P-Mennour - desktop Mennour (signature #a1793e du
   PATCH370, hors de ce media) et les huit autres portraits inchanges.
   ========================================================================== */
@media screen and (max-width: 550px), (max-width: 1000px) and (min-height: 1000px) and (orientation: portrait) {
    body.P-Mennour .upperTitle {
        background: none !important;   /* annule le degrade du PATCH218 (style.css:3289) et le --s7 du socle */
    }

    body.P-Mennour .upperTitle a {
        /* CVG-PATCH392 : reequilibrage un chouia dans les deux sens (retour
           Maxou sur tester : "MAXIME est un chouia trop sombre et CHANSON un
           chouia trop clair") - depart 6e5520 -> 85662a, arrivee fffbe0 ->
           fff5c4. CVG-PATCH393, deuxieme passe sur nouveau retour ("MAXIME
           toujours un peu trop sombre, CHANSON pourrait etre un chouia plus
           sombre") : rampe resserree encore vers le centre - depart eclairci
           85662a -> 9a7a35, arrivee assombrie fff5c4 -> f2e19e.
           CVG-PATCH394, troisieme passe ("MAXIME un chouia plus clair et
           CHANSON un chouia plus sombre") : 9a7a35 -> ab8b40 et f2e19e ->
           e8d391. CVG-PATCH395, quatrieme passe ("juste le NSON de CHANSON
           un chouia plus sombre") : e3ca84 -> ddc17a a 78, e8d391 -> e0c980
           a 100. CVG-PATCH396, cinquieme passe ("encore un mini chouia pour
           le ON de CHANSON") : queue seule - ddc17a -> dabd72 a 78 et
           e0c980 -> dcc276 a 100. CVG-PATCH397, sixieme passe ("et le AXI de
           MAXIME un chouia plus clair") : bd9c4a -> c6a654 a 22 et d2af62
           -> d7b569 a 40, les extremites ne bougent pas. Pente toujours
           continue - pas de bascule raide, sinon lettre-fantome. */
        background-image: linear-gradient(90deg,
            #ab8b40 0%,
            #c6a654 22%,
            #d7b569 40%,
            #ddc077 58%,
            #dabd72 78%,
            #dcc276 100%) !important;
        -webkit-background-clip: text !important;
                background-clip: text !important;
        color: transparent !important;
        -webkit-text-fill-color: transparent !important;
    }
}

/* ==========================================================================
   CVG-PATCH399 : Mennour - LE RIDEAU VIDEO FOND DANS LA FUMEE pendant sa
   chute. Constat sur enregistrement Maxou du 2026-08-20 : le panneau d'intro
   descendait avec une coupure basse NETTE ET DROITE, aucune impression que la
   fumee l'emporte (le volet JS du meme patch, dans fog-mennour.js, corrige
   l'autre moitie du probleme : la nappe WebGL se retirait PENDANT la chute
   du rideau et n'etait donc jamais visible - elle attend desormais, pleine
   et figee, que le rideau soit parti).
   RETIRE PAR CVG-PATCH400 (consigne Maxou 2026-08-20 soir : la video ne
   bouge JAMAIS) : closeIntro() ne fait plus descendre le calque chez
   Mennour - l'orchestration complete est passee a fog-mennour.js (la fumee
   recouvre la video immobile puis se retire). Le masque de transparence du
   bas de #videoDiv pendant sa chute n'avait donc plus d'objet, et son
   selecteur [style*="top"] ne pouvait plus jamais matcher (closeIntro ne
   pose plus de top inline sur ce portrait). Regle recuperable au commit du
   PATCH399 si un rideau anime revenait un jour.
   ========================================================================== */

/* ==========================================================================
   CVG-PATCH413+414 : LE NOIR DE LA VIDEO DU CRYPTEX EST TEINTE DE LA
   COULEUR GENERALE DU PORTRAIT (decisions Maxou du 2026-08-20, avec
   l'abandon de toute fumee - le geste rideau est dans closeIntro() des
   deux layouts ; fog-mennour.js a ete supprime par le 414) : brun pour
   Mennour, violet pour Stoschek, et regle GENERIQUE pour tous les autres.
   Mecanique en deux couches : (1) le FOND du calque d'intro #videoDiv (noir
   dans le socle, style.css:1431) passe a la teinte - visible autour de la
   video et pendant le chargement ; (2) mix-blend-mode:screen sur l'element
   video : tout pixel NOIR de la video laisse voir le fond teinte dessous,
   les clairs restent intacts - le noir de la video elle-meme est donc
   teinte, sans toucher au fichier video. Le lien PASSER et le loader ne
   sont pas blendes (elements voisins, pas descendants de la video).
   414 : teintes Mennour/Stoschek ASSOMBRIES et generalisation - la regle
   generique ci-dessous teinte tous les portraits depuis leur browser-color
   (doctrine 310), les deux nommes gardent leur valeur en dur.
   ========================================================================== */
/* --- CVG-PATCH414 : GENERALISATION A TOUS LES PORTRAITS ------------------
   Regle generique : le fond du calque = le browser-color du portrait (pose
   par les layouts dans la variable --ap-intro-tint, lue de la cle
   theme.browser-color en base - doctrine 310) assombri a 30 pour cent sur
   noir via color-mix. Portrait sans cle en base (repli #ffffff) : noir
   legerement gris - des que la cle est posee en base, la teinte devient
   juste sans redeploiement. Navigateur sans color-mix : declaration
   ignoree, le noir du socle reste. Les deux portraits nommes par Maxou
   gardent leur teinte EXPLICITE ci-dessous (plus specifique dans l'ordre
   source : memes selecteurs, declares apres). Le blend de la video vaut
   pour tout #videoDiv (seuls ces layouts en ont un). */
body[class^="P-"] #videoDiv,
body[class*=" P-"] #videoDiv {
    background: color-mix(in srgb, var(--ap-intro-tint, #808080) 30%, #000) !important;
}

#videoDiv video {
    mix-blend-mode: screen;
}

body.P-Mennour #videoDiv {
    background: #261507 !important;   /* 414 : encore plus sombre (etait 3b240f) */
}

body.P-Stoschek #videoDiv {
    background: #1b0a3a !important;   /* 414 : encore plus sombre (etait 2b1259) */
}


/* ==========================================================================
   CVG-PATCH415 : ADIAF - retours Maxou du 2026-08-21 (captures smartphone).
   (1) FOND DE LA VIDEO D'INTRO PLUS SOMBRE. Deux couches : le CALQUE quitte
   la regle generique 414 (30 pour cent du browser-color) pour un bleu nuit
   en dur, famille du bleu ADIAF 1E40EB ; et la VIDEO elle-meme est
   assombrie par filter:brightness - son fond bleu vif est DANS les pixels
   du fichier, aucun fond CSS ne peut l'assombrir, et le blend screen du
   413 ne fait qu'eclaircir. 0.6 garde le cryptex et ses lettres lisibles.
   (2) CADRE DE SELECTION ROUGE PLUS EPAIS/PRESENT en smartphone : le
   regime SM d'Adiaf est le cadre solide tr.selected (PATCH175, 5px,
   style.css:775) - passe a 7px. Meme selecteur et meme media que le 175 :
   cette feuille charge APRES style.css, l'ordre source tranche a
   specificite et !important egaux. Le regime desktop (dotted 8px) est
   inchange. Scope Adiaf strict pour les deux points.
   ========================================================================== */
/* 416 : sombre ACCENTUE (retour Maxou "accentuer sombre") et selecteurs
   DOUBLES - la classe body.P-Adiaf suppose la casse exacte de Model.id, le
   canal :has(#portrait-id) est celui, eprouve, des PATCH171-196 : les deux
   sont poses, le premier qui matche suffit. */
body.P-Adiaf #videoDiv,
body:has(#portrait-id[value="Adiaf"]) #videoDiv {
    background: #06081e !important;   /* 416 : etait 0a0d2e */
}

/* 417 : le filter brightness (0.6 au 415, 0.42 au 416) est RETIRE - il
   voilait le cryptex AVEC le fond (retour Maxou : "le cryptex est voile
   par ton obscurcissement"). Un assombrissement CSS de la video est
   indivisible : fond bleu vif et cryptex bleu vif vivent dans les memes
   pixels, et le cryptex se deplace dans le cadre (une vignette le
   voilerait aussi). Seule reste la teinte du CALQUE autour de la video ;
   assombrir le fond DANS l'image sans toucher le cryptex = reexport du
   fichier video, hors de portee du CSS. */

@media (max-width: 550px) {
    body:has(#portrait-id[value="Adiaf"]) #artistsContainer tr.selected td {
        border-width: 10px !important; /* 416 : etait 7 (et 5 avant le 415) */
    }
}

/* ==========================================================================
   CVG-PATCH418 : LE DECALAGE HORIZONTAL DE LA PAGE D'ACCUEIL AU CHARGEMENT
   (droite puis retour a gauche) - cause identifiee, correctif CSS.

   DIAGNOSTIC (mesures DevTools Maxou sur /Adiaf, fenetre 398px, buster
   20260821c donc release complete) :
     - pendant le chargement : #container n'a AUCUN style inline, son left
       calcule vaut 199px (= 50 pour cent de la fenetre), bord gauche reel
       a x=199, largeur 872px (il deborde a droite) ;
     - a la fin du chargement : le script pose en inline
       "transform: scale(0.225) translate(-50%, 0%); width: 444.444vw"
       -> bord gauche reel a x=0. Saut sec, aucune transition.

   CAUSE. Le left:50 pour cent vient de .widthFix (style.css:2314), pose des
   le premier rendu ; sa compensation translate(-50%) n'existe QUE dans le
   style inline ecrit par checkWidth() de difPMD.js (et difBoros.js pour
   _layout2), appele en $(document).ready. Entre le premier rendu et cet
   appel, le calage est donc a moitie fait : left applique, compensation
   absente = decalage d'une demi-fenetre. Defaut ancien du socle, jusqu'ici
   MASQUE par le calque d'intro qui couvrait l'ecran ; il est devenu visible
   parce que le container non reduit (872px) DEBORDE hors du calque a droite.

   CORRECTIF. Tant que le style inline n'est pas pose (selecteur d'attribut
   sur "scale", le meme canal que les declencheurs 313/398), on neutralise le
   left:50 pour cent et on borne la largeur a l'ecran : le bord gauche est
   alors deja a x=0 et rien ne deborde. Quand le script pose son inline, la
   regle CESSE de matcher, left:50 pour cent revient ET sa compensation avec :
   bord gauche toujours x=0. ZERO saut, la geometrie finale est intacte.
   Aucune valeur du socle n'est reecrite : la regle est purement transitoire.
   PERIMETRE : la media composee du layout mobile (celle du PATCH175), soit
   exactement les deux regimes ou checkWidth applique le scale (smartphone
   FORCE_SM, et tablette portrait orientation 0). Le DESKTOP n'est pas
   touche - la ou le scale n'est pas garanti, un left:0 permanent aurait
   deplace la page des neuf portraits. Si le script ne tourne jamais (echec
   JS), la page reste a gauche non reduite : degradation plus douce
   qu'aujourd'hui, jamais de page blanche.
   ========================================================================== */
/* 421 : plus AUCUNE media query - la garde est desormais posee a TOUTES les
   largeurs, desktop compris. Fait etabli en lisant checkWidth() (difPMD et
   difBoros) branche par branche : les QUATRE chemins ecrivent
   $container.css("transform", "scale(...) translate(-50%,0%)") - smartphone,
   tablette portrait (les deux orientations), et le dernier else pour
   windowsize > 550 comme < 551. Le style inline finit donc TOUJOURS par
   arriver : la garde :not([style*="scale"]) s'annule dans tous les cas et ne
   peut pas rester collee. Le risque qui motivait le perimetre reduit du
   418/420 (un left:0 permanent sur desktop) n'existe pas. */
#container:not([style*="scale"]) {
    left: 0 !important;
    max-width: 100vw;
}

/* ==========================================================================
   CVG-PATCH421 (2) : LE DRAPEAU NE SE POSE PLUS SUR LE BOUTON PARTAGE.
   Capture Maxou du 2026-08-21 : dans le footer, le drapeau tricolore est
   SUPERPOSE au bouton de partage. Cause : le socle declare
   .language-switcher { position: absolute; bottom: 3px } (style.css:651),
   valable dans le bandeau du header ou il vit au repos. checkWidth() le
   DEPLACE dans #bottom-bar (appendTo) sans toucher a son positionnement :
   absolute, il reste HORS du flux flex du footer et se pose sur ce qui
   occupe deja la place. La media mobile du socle (style.css:1858) corrige
   deja le tir avec position:relative, mais elle ne couvre que <551px et la
   tablette portrait haute - PAS la bande 551-1000 de la capture, ou le
   drapeau image est justement le seul a etre visible (sous 551px le socle
   le masque et le remplace par un bouton texte FR/EN).
   Correctif : des que le commutateur est DANS le footer, il rejoint le flux
   flex, quel que soit le regime. Aucune taille touchee (lecon du 419 :
   le 253 garde la main sur les cotes du drapeau).
   ========================================================================== */
#bottom-bar .language-switcher {
    position: relative !important;
    bottom: auto !important;
}
/* 420 : la troisieme condition ajoute la BANDE INTERMEDIAIRE en portrait
   (551-1000px de large, hauteur quelconque) - mesure au banc : a 600x800 le
   container etait a x=300 avant le script, le 418 seul ne la couvrait pas.
   C'est la fenetre ou checkWidth bascule en regime mobile (portrait, H>W)
   alors que la media CSS mobile du socle ne matche pas encore.
   Le DESKTOP PAYSAGE reste volontairement HORS perimetre : le banc l'affiche
   a x=640 sans le style de config injecte depuis la base, alors que le
   desktop reel n'est pas decale - la compensation y vient donc de la config,
   hors depot, et un left:0 en aveugle la casserait. A traiter seulement sur
   constat DevTools du desktop reel. */

/* ==========================================================================
   CVG-PATCH420 : LA REGLE DU 419 EST RETIREE - elle RETRECISSAIT le drapeau
   au lieu de le remettre en place. Mesure au banc Playwright local (vraies
   feuilles style.css + portrait-standard.css, chromium, trois largeurs) :
     - a 600 et 1280px, SANS le 419 le drapeau du footer fait 57x38 px CSS
       (c'est le 253 : height 38px, width auto) ; AVEC le 419 il tombe a
       45x30 - un tiers de moins. C'est une regression, pas un correctif.
     - a 398px (smartphone vrai), le drapeau IMAGE est display:none dans les
       deux cas : le socle le masque par conception (style.css, media mobile :
       .language-switcher a img{display:none}) et le remplace par un bouton
       TEXTE FR/EN (content "FR"/"EN" sur :after, font-size 50px locaux).
       "Le drapeau est absent" en smartphone est donc le comportement
       HISTORIQUE du socle, ni un effet du 419 ni un effet des 413-418.
   Le constat d'origine ("le drapeau a bouge", present jusqu'en prod via la
   Release-526) reste NON EXPLIQUE : il ne peut pas venir du regime mobile
   vrai (pas de drapeau image) et l'hypothese du 419 (bande de chevauchement
   CSS desktop / JS mobile) est infirmee par la mesure. A reprendre sur un
   constat precis : largeur de fenetre et capture avant/apres.
   ========================================================================== */

/* ==========================================================================
   CVG-PATCH422 : ADIAF SMARTPHONE - LES DEUX SYMPTOMES DU 2026-08-22 ENFIN
   MESURES A LA SOURCE (sonde Playwright sur Chrome reel, emulation Pixel
   398x860, tester et prod, chronologie image par image + A/B par injection).

   (1) "LA VIDEO ET L'ACCUEIL SEMBLENT DECALES A DROITE AVANT DE SE REPLACER".
   Ce n'est PAS le left:50 pour cent du 418 (deja corrige, conteneur a x=0
   des la premiere image). C'est le LAYOUT VIEWPORT de Chrome Android qui
   s'ELARGIT : la config Adiaf en base pose #video1 { width: 110% } (cle
   IsSM, presente sur tester ET prod) -> la video fait 437.8px dans un ecran
   de 398 ; #videoDiv ne rogne rien, le document deborde, et Chrome mobile
   elargit alors le viewport de mise en page a la largeur du contenu
   (window.innerWidth mesure 398 -> 438 ; visualViewport reste 398). Tout ce
   qui est centre dans ce viewport (le #container, left:50 pour cent) glisse
   de 20px vers la droite, le bord droit de l'ecran est coupe. Quand
   closeIntro() masque #videoDiv, le debordement disparait, le viewport
   revient a 398 et la page "se replace". Second debordement, transitoire :
   le loader "Loading video..." est un ENFANT FLEX de #videoDiv, a gauche de
   la video ; tant que canplaythrough n'a pas masque le loader, loader +
   video font 496px (mesure : innerWidth 534 puis 438 au fil des images).
   Correctif GENERIQUE (les 9 portraits, les deux layouts) : le calque
   d'intro ROGNE son contenu et CENTRE la video (free-space negatif : les
   margin:auto du socle valent 0 et justify-content:center repartit le
   debord des deux cotes - la video Adiaf garde son zoom 110 pour cent,
   19.9px coupes a gauche ET a droite au lieu de 40 a droite seulement) ;
   le loader sort du flux (absolu, meme coin haut-gauche qu'aujourd'hui).
   Le calque ne peut plus jamais faire deborder le document. Mesure apres
   correctif : innerWidth 398 sur TOUTES les images, scrollWidth 398,
   conteneur a x=0 de la premiere image a la fin de l'intro.

   (2) "LE DRAPEAU FRENCH/ENGLISH N'APPARAIT PAS, OU EST CACHE PRES DU
   BOUTON SHARE". Sous 551px le drapeau est le bouton TEXTE "EN"/"FR"
   (socle, :after). Mesure en repere local 1600 : EN occupe [549, 654] et le
   disque ShareThis [542, 652] - superposition TOTALE, le partage recouvre
   EN. Cause : la cle config IsSM '#st-1.st-has-labels .st-btn.st-remove-label
   { right: 215px }' tire le glyphe de 215px a GAUCHE de son conteneur
   (.st-btn est position:relative chez ShareThis), alors que le 223 avait
   cale le CONTENEUR (margin-left -82px, style.css) pour un ecart
   EN -> partage de 103 - le conteneur est bien a [757, 867], c'est le
   glyphe qui n'y est plus. st-remove-label est pose par ShareThis a
   l'execution (largeur du bouton + spacing > largeur du conteneur) : la
   regle s'applique aujourd'hui avec un UA mobile comme desktop, a 398px.
   Le disque NFT, lui, est a [793, 905] (right:46px du 175) : une fois le
   partage rendu a son conteneur [757, 867], les deux disques se chevauchent
   (le gif NFT etait en 404 lors des mesures du 196/223, le 223 a donc
   compose la rangee sans lui). Correctif : le glyphe reprend sa place
   (right:0), et le disque NFT avance de 177px, a [970, 1082]. Rangee
   finale, de gauche a droite : home, Profil, EN, partage, NFT, cryptex ;
   ecarts 103 / 103 / 103 / 103, cryptex intact a droite (157). Aucune
   taille touchee. Le :has() + #bottom-bar battent la cle config a la
   specificite, l'ordre de cette feuille bat le right:46px de style.css.
   Media = celle des cles IsSM (max-width 550), la seule ou la cle existe.

   (3) Au passage, HORS CSS : dfrnc.com (morph3.min.js, GSDevTools3.min.js,
   deux <script> synchrones des deux layouts) ne repond plus (DNS ok,
   TCP 80/443 muets, verifie depuis le poste) - voir les layouts.
   ========================================================================== */
#videoDiv {
    overflow: hidden !important;
    justify-content: center !important;
}

#welcome_loader {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
}

@media (max-width: 550px) {
    body:has(#portrait-id[value="Adiaf"]) #bottom-bar #st-1 .st-btn {
        right: 0 !important;
    }

    body:has(#portrait-id[value="Adiaf"]) #bottom-bar button#NFT-btn img {
        right: -131px !important; /* 175 : 46 ; +177 = apres le partage, ecart 103 */
    }
}
