/**
 * ================================================================
 * FICHIER : jarvis.css
 * EMPLACEMENT : 2027_B2B/_modules/jarvis/jarvis.css
 * RENOMMAGE   : 06/11/2026 (Claude, JaxXBot anunaqi n° 2122, Jarvis #1025 de JaxX) : ancien chemin 2027_B2B/_modules/tchat_site/tchat_site.css (plus chargé ; copie laissée sur le serveur pour les pages en cache)
 * SHORT_DESC : Apparence du tchat du site public (bouton flottant, panneau, bulles), clair et sombre
 * DESCRIPTION : Uniquement des variables du thème (--accent, --surface, --encre, --ligne…) : suit les modes
 *               clair / sombre et les palettes. Rayons de 2 px comme le reste du site. Sur téléphone (≤ 900 px),
 *               le bouton se place au-dessus de la barre d'onglets et le panneau occupe l'écran (feuille plein écran).
 *
 * SOMMAIRE :
 *   - JARVIS_BOUTON   : Bouton flottant et pastille
 *   - JARVIS_PANNEAU  : Panneau, en-tête, actions
 *   - JARVIS_FIL      : Bulles des messages
 *   - JARVIS_SAISIE   : Formulaire, dictée, erreurs
 *   - JARVIS_ATELIER  : Déclencheur réduit à l'icône dans l'atelier _adm
 *   - JARVIS_MOBILE   : Téléphone
 *   - JARVIS_TACTILE  : Écrans tactiles (iPad) : volet par-dessus la page, sans flou ni animations en boucle
 *   - JARVIS_VOLET_ANIME : Glissement du volet (ordinateur) et bouton compact (mobile), en fin de fichier
 *   - JARVIS_RETOUCHES_697 : Miniature qui dépasse, bulle sur mobile, en-tête compact et clavier
 *   - JARVIS_LENTEUR_734 : Apparition des échanges plus lente, tous thèmes (dernière section)
 *   - JARVIS_RETOUCHES_711 : Miniature nettement plus haute que le bouton, survol adouci (dernière section)
 *   - JARVIS_FILIGRANE_710 : Filigrane calé sur la hauteur du panneau et centré (dernière section)
 *   - JARVIS_FILIGRANE_NET_972 : Filigrane net au repos (pas de calque composité permanent, centrage sans translate)
 *   - JARVIS_INVITE   : Bouton : miniature agrandie, bulle de dialogue, « Des questions ? » animé au survol
 *   - JARVIS_MEDIAS_1257 : Images des réponses, cartes d'aperçu des liens, visionneuse floutée (dernière section)
 *
 * MODIFICATIONS :
 *   - 06/11/2026 15:36 : Module renommé Jarvis (_modules/jarvis/jarvis.css, classes jarvis_*) ; bouton du mode vocal en pause
 *     après un changement de page (classe jarvis_vocal_reprise) (Claude, JaxXBot anunaqi n° 2122, Jarvis #1022 et #1025 de JaxX) — A VALIDER PAR JaxX
 *   - 14/10/2026 02:13 : Images des réponses de Jarvis, cartes d'aperçu des pages du site et visionneuse floutée
 *     (précédent, suivant, miniatures, téléphone), icône des liens extérieurs (Dialogue n° 1257, Claude) — A VALIDER PAR JaxX
 *   - 14/10/2026 01:32 : Bulle « Jarvis rédige une réponse » sans bordure ni anneau accent dans tous les thèmes, ombre douce
 *     conservée (Dialogue n° 1239, Claude) — A VALIDER PAR JaxX
 *   - 14/10/2026 01:15 : Filigrane et miniatures de Jarvis en images de fond : seule l'URL change au changement de thème,
 *     fondu de 0,8 s (filigrane) et 0,6 s (miniatures) ; remplace la bague du n° 836 (Dialogue n° 1225, Claude) — A VALIDER PAR JaxX
 *   - 13/10/2026 03:58 : Lecture à voix haute : le texte lu garde sa couleur normale (fond et halo seuls), plus de texte noir
 *     dû à --accent_texte ni de couleur forcée sur la bulle lue (Dialogue n° 1049, Claude) — A VALIDER PAR JaxX
 *   - 13/10/2026 01:41 : Filigrane de Jarvis plus net : will-change et backface-visibility réservés à la transition en bague,
 *     centrage par marges auto au lieu de translateX(-50 %) (section JARVIS_FILIGRANE_NET_972) (Dialogue n° 972, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 20:49 : Apparition des échanges de Jarvis plus lente (durées × 1,6 environ, écart 0,07 → 0,12 s),
 *     mouvement réduit enfin respecté pour tous les thèmes (section JARVIS_LENTEUR_734) (Dialogue n° 734, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 20:06 : Apparition animée des échanges à l'ouverture de Jarvis, du plus récent au plus ancien, une animation
 *     par thème (section JARVIS_APPARITION_719) (Dialogue n° 719, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 19:43 : Filigrane de Jarvis calé sur la hauteur du panneau, centré, même taille pour tous les thèmes (Dialogue n° 710, Claude MONSTERJaxX #2) — A VALIDER PAR JaxX
 *   - 10/10/2026 19:29 : Bouton du tchat : miniature de Jarvis plus haute que le bouton (dépasse franchement par le haut), survol adouci sans rebond (Dialogue n° 711, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 18:37 : Bouton : miniature de Jarvis qui dépasse du cadre et s'agrandit au survol (ordinateur), bulle de chat
 *     conservée sur mobile ; avatar de l'en-tête agrandi ; en-tête compact sur mobile, panneau calé sur la zone visible
 *     quand le clavier est ouvert ; ligne de profil masquée (Dialogue n° 697, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 18:04 : Filigrane : le Jarvis en pied d'origine en version 2×, agrandi (62 % de la largeur, de la tête aux genoux),
 *     fondu vers le bas (Dialogue n° 688, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 17:32 : Filigrane de Jarvis sur toute la largeur du panneau, calé en bas à droite et fondu vers le haut ; mode sombre lu sur
 *     html:not(.bright_mode) (l'ancien sélecteur data-theme ne s'appliquait jamais) (Dialogue n° 684, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 07:06 : Rayons codés en dur passés aux jetons du thème (--rayon_carte, --rayon_bouton, --rayon_input, --rayon_badge, --rayon_p), ancienne valeur en commentaire ; ronds à 50 % conservés (Dialogue n° 599, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 06:30 : Volet latéral animé sur ordinateur (>= 1025 px : glissement depuis le bord droit à l'ouverture et à
 *     la fermeture, 320 ms, prefers-reduced-motion respecté) ; bouton mobile compact sans bulle, miniature de Jarvis plus
 *     grande qui dépasse de la plaque, compteur en exposant (Dialogue n° 568 et n° 573, Claude) — A VALIDER PAR JaxX
 *   - 10/10/2026 04:04 : Miniature de Jarvis recadrée (tête entière, nœud papillon, haut du costume) ; bouton du tchat avec
 *     icône de dialogue et « Des questions ? » qui se déroule au survol (Dialogue n° 540, Claude MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 10/10/2026 03:04 : Écrans tactiles : le volet ne rétrécit plus la page, bulles sans flou d'arrière-plan, animations de
 *     rédaction allégées, contre les rechargements de page sur iPad (Dialogue n° 506, Claude) — A VALIDER PAR JaxX
 *   - 09/10/2026 22:26 : Mention sous le formulaire repliée (« À propos de ce tchat », dépliée en glissant) (demande de JaxX,
 *     Dialogue n° 396, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 09/10/2026 22:19 : Jarvis ouvert sur ordinateur (> 900 px) = volet pleine hauteur calé à droite qui pousse la page
 *     vers la gauche sans rien masquer (demande de JaxX, Dialogue n° 385, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 09/10/2026 22:11 : Bouton flottant calé dans le coin en bas à droite (ordinateur) et contre le bord droit au-dessus
 *     de la barre d'onglets (téléphone) (demande de JaxX, Dialogue n° 382, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 09/10/2026 22:10 : Bouton « Mode vocal » de Jarvis mis en évidence, animé à l'écoute et quand Jarvis parle
 *     (demande de JaxX, Dialogue n° 372, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 09/10/2026 21:33 : Avatar du majordome robot (visuel d'Antigravity) dans le bouton et l'en-tête du panneau
 *     (demande de JaxX, Dialogue n° 348, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *   - 09/10/2026 21:25 : Formulaire de rappel (agents absents) ; dans l'atelier sur téléphone, bouton en languette au bord
 *     droit à mi-hauteur, sans recouvrir les boutons « Répondre » du JaxX_Bot (demande de JaxX, Dialogue n° 348 ;
 *     signalement n° 346), session MONSTERJaxX #3 — A VALIDER PAR JaxX
 *   - 09/10/2026 21:10 : Déclencheur réduit à l'icône dans l'atelier _adm, rollover (demande de JaxX, Dialogue n° 340) — A VALIDER PAR JaxX
 *   - 09/10/2026 19:02 : Création (demande de JaxX, Dialogue n° 317, session MONSTERJaxX #3) — A VALIDER PAR JaxX
 *
 * ================================================================
 */

/* JARVIS_BOUTON =================================================== */
.jarvis
{
    position: fixed;
    right: 24px;
    bottom: calc(24px + env(safe-area-inset-bottom));
    z-index: 1050;
    font-family: var(--police_texte);
}

.jarvis_bouton
{
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 12px 18px;
    border: 1px solid var(--ligne_forte);
    border-radius: var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px */
    background: var(--accent);
    color: var(--accent_texte);
    font: 600 var(--texte_s) / 1 var(--police_texte);
    box-shadow: var(--ombre);
    cursor: pointer;
    transition: transform var(--duree) var(--easing), box-shadow var(--duree) var(--easing);
}

.jarvis_bouton:hover
{
    transform: translateY(-2px);
}

.jarvis_bouton:focus-visible,
.jarvis_action:focus-visible,
.jarvis_envoyer:focus-visible,
.jarvis_texte:focus-visible
{
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.jarvis_icone,
.jarvis_action svg
{
    width: 20px;
    height: 20px;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* 09/10/2026 21:33 (Claude, n° 348) : majordome robot d'Antigravity, recadré sur le casque — A VALIDER PAR JaxX */
.jarvis_avatar
{
    display: block;
    flex: none;
    width: 28px;
    height: 28px;
    overflow: hidden;
    border-radius: var(--rayon_p, 2px); /* ancien (n° 599) : 2px */
    background: var(--accent);
}

.jarvis_avatar img
{
    display: block;
    width: 100%;
    height: 100%;
    max-width: none;
    object-fit: cover;
    /* transform: scale(2.4); */
    /* transform-origin: 50% 2%; */
    /* 10/10/2026 04:04 (Claude, Dialogue n° 540 de JaxX) : l'ancien zoom × 2,4 ne montrait que le haut du casque ; zoom
       léger calé en haut : la tête entière, le nœud papillon et le haut du costume restent visibles — A VALIDER PAR JaxX */
    transform: scale(1.12);
    transform-origin: 55% 0%;
}

.jarvis_entete .jarvis_avatar
{
    width: 44px;
    height: 44px;
    border: 1px solid var(--ligne_forte);
}

.jarvis_pastille
{
    min-width: 20px;
    padding: 2px 6px;
    border-radius: var(--rayon_badge, 2px); /* ancien (n° 599) : 2px */
    background: var(--accent_texte);
    color: var(--accent);
    font-size: var(--texte_xs);
    text-align: center;
}

@media (max-width: 900px)
{
    .jarvis[data-ouvert="1"] .jarvis_bouton
    {
        display: none;
    }
}

/* 12/10/2026 (Antigravity, Dialogue n° 857 de JaxX : bouton fermer au même endroit sur desktop avec icône transformée) */
.jarvis:not([data-ouvert="1"]) .jarvis_icone_svg_fermer,
.jarvis:not([data-ouvert="1"]) .jarvis_survol_fermer,
.jarvis:not([data-ouvert="1"]) .jarvis_texte_fermer
{
    display: none !important;
}

@keyframes jarvis_bouton_volet_entree
{
    from
    {
        transform: translateX(var(--jarvis_volet_largeur));
    }
    to
    {
        transform: none;
    }
}

@keyframes jarvis_bouton_volet_sortie
{
    from
    {
        transform: none;
    }
    to
    {
        transform: translateX(var(--jarvis_volet_largeur));
    }
}

@media (min-width: 901px)
{
    /* 13/10/2026 (Antigravity, Dialogue n° 890, 942 de JaxX : bouton collé en bas à droite, icône à gauche de l'avatar sans réduction du modèle) */
    .jarvis:not([data-ouvert="1"])
    {
        right: 0;
        bottom: 0;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton
    {
        position: relative;
        right: 0;
        bottom: 0;
        display: inline-flex;
        align-items: center;
        gap: 10px;
        border-width: 1px 0 0 1px;
        border-radius: min(var(--rayon_bouton, 16px), 24px) 0 0 0;
        padding: 6px 16px 6px 14px;
        min-height: 48px;
    }

    /* Modèle de l'avatar identique à celui du panneau ouvert (44px) sans réduction */
    .jarvis .jarvis_bouton .jarvis_avatar
    {
        position: relative;
        top: 0;
        left: 0;
        width: 44px;
        height: 44px;
        flex: none;
        overflow: hidden;
        border-radius: var(--rayon_p, 2px);
    }

    .jarvis .jarvis_bouton .jarvis_icone_bulle
    {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 22px;
        height: 22px;
        flex: none;
    }

    /* 13/10/2026 (Antigravity, Dialogue n° 869, 942 de JaxX : bouton d'ouverture/fermeture glissant solidaire du volet) */
    .jarvis[data-ouvert="1"] .jarvis_bouton
    {
        display: inline-flex;
        align-items: center;
        gap: 10px;
        position: absolute;
        right: 100%;
        bottom: 0;
        z-index: 1001;
        border-width: 1px 0 0 1px;
        border-radius: min(var(--rayon_bouton, 16px), 24px) 0 0 0;
        padding: 6px 16px 6px 14px;
        min-height: 48px;
        animation: jarvis_bouton_volet_entree var(--jarvis_volet_duree, 320ms) var(--jarvis_volet_easing, cubic-bezier(0.22, 1, 0.36, 1)) both;
        will-change: transform;
    }

    .jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_bouton
    {
        animation: jarvis_bouton_volet_sortie var(--jarvis_volet_duree, 320ms) var(--jarvis_volet_easing, cubic-bezier(0.22, 1, 0.36, 1)) both;
    }

    .jarvis[data-ouvert="1"] .jarvis_bouton:hover
    {
        transform: none;
        filter: brightness(1.08);
    }

    .jarvis[data-ouvert="1"] .jarvis_icone_svg_ouvrir,
    .jarvis[data-ouvert="1"] .jarvis_survol_ouvrir,
    .jarvis[data-ouvert="1"] .jarvis_texte_ouvrir
    {
        display: none !important;
    }

    /* Bouton fermé de la même couleur que le texte absolument (n° 942) */
    .jarvis[data-ouvert="1"] .jarvis_icone_svg_fermer
    {
        display: inline-flex !important;
        align-items: center;
        justify-content: center;
        color: currentColor;
    }

    .jarvis[data-ouvert="1"] .jarvis_survol_fermer,
    .jarvis[data-ouvert="1"] .jarvis_texte_fermer
    {
        display: inline-flex;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton:hover
    {
        transform: none;
        filter: brightness(1.08);
    }
}
/* JARVIS_BOUTON =================================================== */

/* JARVIS_PANNEAU ================================================== */
.jarvis_panneau
{
    position: relative;
    display: flex;
    flex-direction: column;
    width: min(400px, calc(100vw - 48px));
    height: min(620px, calc(100vh - 140px));
    border: 1px solid var(--ligne_forte);
    border-radius: var(--rayon_carte, 2px); /* ancien (n° 599) : 2px */
    background: var(--surface);
    color: var(--encre);
    box-shadow: var(--ombre);
    overflow: hidden;
}

/* 10/10/2026 00:40 (Antigravity, n° 437/441/463) : silhouette filigrane de Jarvis de 3/4 via balise img minifiée */
/* ancien (n° 437/441/463, remplacé au n° 684) :
.jarvis_filigrane
{
    position: absolute;
    right: 12px;
    bottom: 20px;
    height: 78%;
    width: auto;
    max-height: calc(100% - 130px);
    object-fit: contain;
    opacity: 0.32;
    filter: contrast(1.08);
    pointer-events: none;
    z-index: 0;
    user-select: none;
}

:root[data-theme="dark"] .jarvis_filigrane,
[data-theme="dark"] .jarvis_filigrane
{
    opacity: 0.38;
    filter: brightness(1.35) contrast(1.15);
}
*/

/* 10/10/2026 17:32 (Claude, Dialogue n° 684) : JaxX le trouvait « beaucoup trop petit » et flou. Image du thème actif
 * (data-filigranes-themes), sur toute la largeur du panneau, calée en bas à droite, fondue vers le haut pour laisser
 * l'en-tête lisible. */
/*
.jarvis_filigrane
{
    position: absolute;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 84%;
    object-fit: contain;
    object-position: right bottom;
    opacity: 0.22;
    filter: contrast(1.05);
    -webkit-mask-image: linear-gradient(to top, #000000 58%, transparent 100%);
    mask-image: linear-gradient(to top, #000000 58%, transparent 100%);
    pointer-events: none;
    z-index: 0;
    user-select: none;
}

html:not(.bright_mode) .jarvis_filigrane
{
    opacity: 0.3;
    filter: brightness(1.3) contrast(1.1);
}
*/

/* 10/10/2026 18:04 (Claude, Dialogue n° 688) : « exactement celui-là mais en haute qualité » : le Jarvis en pied d'origine,
 * agrandi (62 % de la largeur du panneau, de la tête aux genoux, le bas est coupé par le panneau), net (image 2×),
 * fondu vers le bas pour laisser lisible la zone de saisie. */
.jarvis_filigrane
{
    position: absolute;
    top: 58px;
    right: 2%;
    width: 62%;
    max-width: 320px;
    height: auto;
    opacity: 0.26;
    filter: contrast(1.05);
    -webkit-mask-image: linear-gradient(to bottom, #000000 55%, transparent 92%);
    mask-image: linear-gradient(to bottom, #000000 55%, transparent 92%);
    pointer-events: none;
    z-index: 0;
    user-select: none;
    transition: opacity 0.35s ease, filter 0.35s ease;
}

/* 13/10/2026 (Antigravity, Dialogue n° 863 de JaxX : « Dans le chat supprimer le filtre html:not(.bright_mode) .jarvis_filigrane »)
html:not(.bright_mode) .jarvis_filigrane
{
    opacity: 0.34;
    filter: brightness(1.45) contrast(1.1);
} */

.jarvis_entete,
.jarvis_role,
.jarvis_fil,
.jarvis_rappel,
.jarvis_formulaire
{
    position: relative;
    z-index: 1;
}

.jarvis_panneau[hidden]
{
    display: none;
}

.jarvis_entete
{
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 16px 16px 12px;
    border-bottom: 1px solid var(--ligne);
}

.jarvis_entete_texte
{
    flex: 1;
    min-width: 0;
}

.jarvis_titre
{
    margin: 0;
    font: 700 var(--texte_m) / 1.25 var(--police_titres);
}

.jarvis_statut
{
    margin: 4px 0 0;
    color: var(--encre_second);
    font-size: var(--texte_xs);
}

.jarvis_statut[data-en_ligne="1"]::before
{
    content: '';
    display: inline-block;
    width: 8px;
    height: 8px;
    margin-right: 6px;
    border-radius: 50%;
    background: var(--succes);
}

.jarvis_action
{
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    flex: none;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_p, 2px); /* ancien (n° 599) : 2px */
    background: transparent;
    color: var(--encre_second);
    cursor: pointer;
}

.jarvis_action:hover,
.jarvis_action[aria-pressed="true"]
{
    border-color: var(--accent);
    color: var(--accent);
}

.jarvis_voix_auto[aria-pressed="false"] .jarvis_ondes
{
    opacity: 0.25;
}

.jarvis_micro[aria-pressed="true"]
{
    background: var(--accent);
    color: var(--accent_texte);
    animation: jarvis_pulsation 1.4s ease-in-out infinite;
}

@keyframes jarvis_pulsation
{
    50%
    {
        box-shadow: 0 0 0 6px var(--accent_halo);
    }
}

.jarvis_role
{
    margin: 0;
    padding: 8px 16px;
    border-bottom: 1px solid var(--ligne);
    color: var(--encre_second);
    font-size: var(--texte_xs);
}

.jarvis_masque
{
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

.jarvis_piege
{
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}
/* JARVIS_PANNEAU ================================================== */

/* JARVIS_VOLET ==================================================== */
/* 09/10/2026 22:19 (Claude, Dialogue n° 385 de JaxX : « Quand le Jarvis est ouvert utiliser toute la hauteur sur desktop, la
   fenêtre doit être calée en bas et à droite, elle peut fonctionner comme un volet et ne doit jamais rien masquer, elle
   pousse le contenu vers la gauche ») : sur ordinateur, le panneau ouvert devient un volet sur toute la hauteur, calé à
   droite. jarvis.js pose html.jarvis_volet_ouvert : la page réserve la largeur du volet (marge droite du body) et
   les éléments fixes collés au bord droit (en-tête, panneau et notifications de l'atelier, bandeau des cookies) se décalent
   d'autant. Fenêtre flottante de 400 × 620 px conservée sur téléphone (feuille plein écran, section JARVIS_MOBILE) */
@media (min-width: 901px)
{
    :root
    {
        --jarvis_volet_largeur: clamp(340px, 30vw, 440px);
        --jarvis_decalage: 0px;
    }

    html.jarvis_volet_ouvert
    {
        --jarvis_decalage: var(--jarvis_volet_largeur);
    }

    body
    {
        transition: margin-right var(--duree) var(--easing);
    }

    html.jarvis_volet_ouvert body
    {
        margin-right: var(--jarvis_decalage);
        overflow-x: clip;
    }

    .header_principal,
    .adm_panneau
    {
        right: var(--jarvis_decalage);
        transition: right var(--duree) var(--easing);
    }

    .adm_notifications
    {
        right: calc(20px + var(--jarvis_decalage));
    }

    .cookie-banner
    {
        right: calc(20px + var(--jarvis_decalage));
    }

    .jarvis[data-ouvert="1"]
    {
        top: 0;
        right: 0;
        bottom: 0;
        width: var(--jarvis_volet_largeur);
    }

    .jarvis[data-ouvert="1"] .jarvis_panneau
    {
        width: 100%;
        height: 100%;
        padding-bottom: env(safe-area-inset-bottom);
        border-width: 0 0 0 1px;
        border-radius: 0;
        box-shadow: none;
        animation: jarvis_volet_entree var(--duree) var(--easing) both;
    }
}

@keyframes jarvis_volet_entree
{
    from
    {
        transform: translateX(100%);
    }
    to
    {
        transform: none;
    }
}
/* JARVIS_VOLET ==================================================== */

/* JARVIS_FIL ====================================================== */
.jarvis_fil
{
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 16px;
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* 11/10/2026 01:28 (Antigravity, Dialogue n° 748 de JaxX : « Dans Jarvis j'aimerais que les premiers messages commencent en bas quand on commence la discussion ») */
.jarvis_fil::before
{
    content: '';
    margin-top: auto;
}

.jarvis_accueil,
.jarvis_bulle
{
    position: relative;
    margin: 0;
    padding: 10px 12px;
    border-radius: var(--rayon_input, 2px); /* ancien (n° 599) : 2px */
    font-size: var(--texte_s);
    line-height: 1.5;
    overflow-wrap: anywhere;
}

.jarvis_accueil,
.jarvis_bulle_agent
{
    align-self: flex-start;
    max-width: 92%;
    border: 1px solid color-mix(in srgb, var(--ligne) 65%, transparent);
    background: color-mix(in srgb, var(--fond_second) 60%, transparent);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
}

.jarvis_bulle_visiteur
{
    align-self: flex-end;
    max-width: 85%;
    border: 1px solid color-mix(in srgb, var(--accent) 70%, transparent);
    background: color-mix(in srgb, var(--accent) 45%, transparent);
    color: var(--encre);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
}

.jarvis_bulle p
{
    margin: 0 0 8px;
}

.jarvis_bulle p:last-child
{
    margin-bottom: 0;
}

.jarvis_bulle ul
{
    margin: 0 0 8px;
    padding-left: 18px;
}

.jarvis_bulle a
{
    color: var(--accent);
    text-decoration: underline;
    text-underline-offset: 2px;
}

.jarvis_bulle_meta
{
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 4px;
    color: var(--encre_second);
    font-size: var(--texte_xs);
}

.jarvis_bulle_visiteur .jarvis_bulle_meta
{
    color: inherit;
    opacity: 0.8;
}

.jarvis_ecouter
{
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    padding: 0;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_p, 2px); /* ancien (n° 599) : 2px */
    background: transparent;
    color: var(--encre_second);
    cursor: pointer;
    transition: all 0.2s ease;
}

.jarvis_ecouter_icone
{
    display: block;
    width: 14px;
    height: 14px;
    flex-shrink: 0;
}

.jarvis_ecouter:hover,
.jarvis_ecouter[aria-pressed="true"]
{
    border-color: var(--accent);
    color: var(--accent);
    background: rgba(255, 255, 255, 0.05);
}

/* 13/10/2026 (Antigravity, Dialogue n° 948 de JaxX : égaliseur spectrogramme unique quand le message est lu) */
.jarvis_ecouter .jarvis_spectrogramme_vocal
{
    display: inline-flex;
    align-items: flex-end;
    justify-content: center;
    gap: 1.5px;
    width: 14px;
    height: 12px;
    opacity: 1;
}

.jarvis_ecouter .jarvis_spectrogramme_vocal span
{
    display: block;
    width: 2px;
    height: 100%;
    background: currentColor;
    border-radius: 1px;
    animation: jarvis_spectre_ondulation 0.8s ease-in-out infinite alternate;
}

/* 13/10/2026 (Antigravity, Dialogue n° 948 de JaxX : mise en évidence de la phrase en cours de lecture) */
.jarvis_phrase
{
    display: inline;
    transition: background 0.25s ease, color 0.25s ease, box-shadow 0.25s ease;
}

.jarvis_phrase.jarvis_phrase_active
{
    background: color-mix(in srgb, var(--accent) 22%, transparent);
    /* color: var(--accent_texte, inherit); */
    /* 13/10/2026 03:58 (Claude, Dialogue n° 1049 de JaxX : « conserver la couleur normale du texte ») :
       --accent_texte est la couleur du texte posé SUR l'accent plein (presque noire dans plusieurs thèmes) */
    color: inherit;
    border-radius: var(--rayon_p, 2px);
    padding: 1px 3px;
    margin: -1px -3px;
    box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 30%, transparent);
}

/* JARVIS_REDIGE_HYPNOTIQUE ======================================== */
/* 10/10/2026 03:00 (Antigravity, Dialogue n° 496 de JaxX : animation raffinée, subtile et harmonisée avec le thème) */
.jarvis_redige
{
    align-self: flex-start;
    margin: 4px 0 8px 0;
    color: var(--encre_second);
    font-size: var(--texte_xs);
}

.jarvis_redige_hypnotique
{
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 12px 6px 8px;
    /* border: 1px solid var(--ligne); */
    /* 14/10/2026 01:32 (Claude, Dialogue n° 1239 de JaxX : « dans tous les thèmes, retirer la bordure cadre du petit message
       Jarvis rédige une réponse ») : plus de bordure ni d'anneau accent, l'ombre portée douce reste */
    border: 0;
    border-radius: var(--rayon_carte, 2px); /* ancien (n° 599) : 2px */
    background: var(--surface);
    /* box-shadow: 0 4px 16px rgba(0, 0, 0, 0.22), 0 0 0 1px var(--accent_halo); */
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.22);
    position: relative;
    overflow: visible;
    animation: jarvis_bulle_apparition 0.28s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

/* Avatar de Jarvis avec halo respirant feutré */
.jarvis_redige_avatar_cadre
{
    position: relative;
    width: 32px;
    height: 32px;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.jarvis_redige_avatar
{
    width: 32px;
    height: 32px;
    border-radius: 50%;
    position: relative;
    z-index: 2;
    overflow: hidden;
    border: 1px solid var(--accent);
    box-shadow: 0 0 8px var(--accent_halo);
    background: var(--fond_second);
}

.jarvis_redige_avatar img
{
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Onde concentrique unique, lente et feutrée */
.jarvis_aura_halo
{
    position: absolute;
    inset: -4px;
    pointer-events: none;
    z-index: 1;
}

.jarvis_aura_onde
{
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 1px solid var(--accent);
    opacity: 0;
}

.jarvis_aura_onde_1
{
    animation: jarvis_onde_subtile 2.6s cubic-bezier(0.2, 0.6, 0.35, 1) infinite;
}

.jarvis_aura_onde_2,
.jarvis_aura_onde_3
{
    display: none;
}

/* Corps central épuré */
.jarvis_redige_corps
{
    display: flex;
    align-items: center;
    gap: 8px;
}

/* Indicateur gyroscopique minimaliste */
.jarvis_vortex_hypnotique
{
    position: relative;
    width: 16px;
    height: 16px;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.jarvis_anneau_externe
{
    position: absolute;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    border: 1px solid var(--ligne);
    border-top-color: var(--accent);
    animation: jarvis_orbite_lente 2.4s linear infinite;
}

.jarvis_anneau_interne
{
    display: none;
}

.jarvis_centre_pulsation
{
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--accent);
    box-shadow: 0 0 6px var(--accent_halo);
    animation: jarvis_coeur_doux 1.6s ease-in-out infinite alternate;
}

.jarvis_particules_orbitales
{
    display: none;
}

/* Texte avec reflet doux accordé aux couleurs de thème */
.jarvis_redige_texte_bloc
{
    display: flex;
    align-items: center;
    gap: 6px;
    white-space: nowrap;
}

.jarvis_redige_libelle
{
    font-size: var(--texte_xs);
    font-weight: 500;
    letter-spacing: 0.01em;
    color: var(--encre_second);
    background: linear-gradient(90deg, var(--encre_second) 0%, var(--encre) 50%, var(--encre_second) 100%);
    background-size: 200% 100%;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    animation: jarvis_shimmer_subtil 3.2s ease-in-out infinite;
}

/* 3 points d'attente ondulants aux couleurs du thème */
.jarvis_ondes_points
{
    display: inline-flex;
    align-items: center;
    gap: 3px;
    margin-left: 1px;
}

.jarvis_ondes_points span
{
    display: inline-block;
    width: 3.5px;
    height: 3.5px;
    border-radius: 50%;
    background: var(--accent);
    box-shadow: 0 0 4px var(--accent_halo);
    opacity: 0.35;
    animation: jarvis_point_ondulation 1.3s ease-in-out infinite;
}

.jarvis_ondes_points span:nth-child(1)
{
    animation-delay: 0s;
}

.jarvis_ondes_points span:nth-child(2)
{
    animation-delay: 0.22s;
}

.jarvis_ondes_points span:nth-child(3)
{
    animation-delay: 0.44s;
}

/* Particules géométriques d'évaporation (Dialogue n° 513 de JaxX : ronds, triangles, croix ascendants) */
.jarvis_particules_evaporation
{
    position: absolute;
    inset: -14px -6px -2px -6px;
    pointer-events: none;
    overflow: visible;
    z-index: 3;
}

.jarvis_particule_forme
{
    position: absolute;
    bottom: 2px;
    opacity: 0;
    will-change: transform, opacity;
    animation: jarvis_evaporation_ascendante 2.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) infinite;
}

/* Forme : Rond */
.jarvis_forme_rond
{
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--accent);
    box-shadow: 0 0 4px var(--accent_halo);
}

/* Forme : Triangle */
.jarvis_forme_triangle
{
    width: 5px;
    height: 5px;
    background: var(--accent);
    box-shadow: 0 0 4px var(--accent_halo);
    clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
    -webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}

/* Forme : Croix */
.jarvis_forme_croix
{
    width: 5px;
    height: 5px;
    background: var(--accent);
    box-shadow: 0 0 4px var(--accent_halo);
    clip-path: polygon(35% 0%, 65% 0%, 65% 35%, 100% 35%, 100% 65%, 65% 65%, 65% 100%, 35% 100%, 35% 65%, 0% 65%, 0% 35%, 35% 35%);
    -webkit-clip-path: polygon(35% 0%, 65% 0%, 65% 35%, 100% 35%, 100% 65%, 65% 65%, 65% 100%, 35% 100%, 35% 65%, 0% 65%, 0% 35%, 35% 35%);
}

/* Répartition des 6 particules sur la largeur */
.jarvis_particules_evaporation .p_1
{
    left: 14%;
    animation-delay: 0s;
    animation-duration: 2.2s;
}

.jarvis_particules_evaporation .p_2
{
    left: 30%;
    animation-delay: 0.45s;
    animation-duration: 2.6s;
}

.jarvis_particules_evaporation .p_3
{
    left: 50%;
    animation-delay: 0.9s;
    animation-duration: 2.3s;
}

.jarvis_particules_evaporation .p_4
{
    left: 68%;
    animation-delay: 1.35s;
    animation-duration: 2.5s;
}

.jarvis_particules_evaporation .p_5
{
    left: 84%;
    animation-delay: 1.8s;
    animation-duration: 2.4s;
}

.jarvis_particules_evaporation .p_6
{
    left: 94%;
    animation-delay: 0.7s;
    animation-duration: 2.7s;
}

/* SPECTROGRAMME_VOCAL ================================================= */
/* 10/10/2026 03:25 (Antigravity, Dialogue n° 513 de JaxX : spectrogramme visuel discret aux couleurs du thème pendant la réponse vocale) */
.jarvis_statut_ligne
{
    display: flex;
    align-items: center;
    gap: 8px;
}

.jarvis_spectrogramme_vocal
{
    display: inline-flex;
    align-items: flex-end;
    gap: 2px;
    height: 14px;
    margin-left: 6px;
    vertical-align: middle;
    opacity: 0;
    transition: opacity 0.25s ease;
    pointer-events: none;
}

.jarvis_spectrogramme_vocal span
{
    width: 2px;
    height: 3px;
    border-radius: 1px;
    background: var(--accent);
    box-shadow: 0 0 3px var(--accent_halo);
    transform-origin: bottom center;
}

/* Spectrogramme actif quand Jarvis parle */
#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal,
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal
{
    opacity: 1;
}

#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal span,
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal span
{
    animation: jarvis_spectre_ondulation 0.8s ease-in-out infinite alternate;
}

#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal span:nth-child(1),
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal span:nth-child(1)
{
    animation-duration: 0.65s;
    animation-delay: 0s;
}

#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal span:nth-child(2),
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal span:nth-child(2)
{
    animation-duration: 0.85s;
    animation-delay: 0.18s;
}

#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal span:nth-child(3),
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal span:nth-child(3)
{
    animation-duration: 0.52s;
    animation-delay: 0.32s;
}

#jarvis[data-jarvis-parle="1"] .jarvis_spectrogramme_vocal span:nth-child(4),
.jarvis_ecouter[aria-pressed="true"] .jarvis_spectrogramme_vocal span:nth-child(4)
{
    animation-duration: 0.72s;
    animation-delay: 0.12s;
}

/* Keyframes épurées et légères */
@keyframes jarvis_bulle_apparition
{
    from
    {
        opacity: 0;
        transform: translateY(4px);
    }
    to
    {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes jarvis_onde_subtile
{
    0%
    {
        transform: scale(0.95);
        opacity: 0.45;
    }
    100%
    {
        transform: scale(1.35);
        opacity: 0;
    }
}

@keyframes jarvis_orbite_lente
{
    from
    {
        transform: rotate(0deg);
    }
    to
    {
        transform: rotate(360deg);
    }
}

@keyframes jarvis_coeur_doux
{
    0%
    {
        transform: scale(0.85);
        opacity: 0.6;
    }
    100%
    {
        transform: scale(1.2);
        opacity: 1;
    }
}

@keyframes jarvis_shimmer_subtil
{
    0%
    {
        background-position: 150% 0;
    }
    100%
    {
        background-position: -150% 0;
    }
}

@keyframes jarvis_point_ondulation
{
    0%, 100%
    {
        transform: translateY(0);
        opacity: 0.35;
    }
    50%
    {
        transform: translateY(-2px);
        opacity: 1;
    }
}

@keyframes jarvis_evaporation_ascendante
{
    0%
    {
        transform: translateY(4px) scale(0.4) rotate(0deg);
        opacity: 0;
    }
    18%
    {
        opacity: 0.75;
        transform: translateY(-4px) scale(1) rotate(25deg);
    }
    65%
    {
        opacity: 0.45;
        transform: translateY(-18px) scale(0.85) rotate(70deg);
    }
    100%
    {
        transform: translateY(-34px) scale(0.2) rotate(140deg);
        opacity: 0;
    }
}

@keyframes jarvis_spectre_ondulation
{
    0%
    {
        height: 3px;
        opacity: 0.35;
    }
    100%
    {
        height: 13px;
        opacity: 1;
    }
}

/* Si l'utilisateur préfère réduire les animations */
@media (prefers-reduced-motion: reduce)
{
    .jarvis_redige_hypnotique,
    .jarvis_anneau_externe,
    .jarvis_centre_pulsation,
    .jarvis_aura_onde_1,
    .jarvis_ondes_points span,
    .jarvis_particule_forme,
    .jarvis_spectrogramme_vocal span
    {
        animation: none !important;
        transform: none !important;
    }
    .jarvis_redige_libelle
    {
        animation: none !important;
        background: none !important;
        -webkit-text-fill-color: var(--encre_second) !important;
        color: var(--encre_second) !important;
    }
}
/* JARVIS_REDIGE_HYPNOTIQUE ======================================== */
/* JARVIS_FIL ====================================================== */

/* JARVIS_SAISIE =================================================== */
.jarvis_formulaire
{
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 12px 16px;
    border-top: 1px solid var(--ligne);
}

.jarvis_texte
{
    width: 100%;
    min-height: 48px;
    max-height: 140px;
    padding: 10px 12px;
    border: 1px solid var(--ligne_forte);
    border-radius: var(--rayon_input, 2px); /* ancien (n° 599) : 2px */
    background: var(--surface_input);
    color: var(--encre);
    font: 400 var(--texte_s) / 1.45 var(--police_texte);
    resize: vertical;
}

.jarvis_outils
{
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
}

/* 09/10/2026 22:10 (Claude, n° 372) : bouton « Mode vocal » de Jarvis, mis en évidence à gauche des outils ;
   data-phase = inactif | ecoute | attente | parle (posé par jarvis.js) — A VALIDER PAR JaxX */
.jarvis_vocal
{
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-right: auto;
    min-height: 40px;
    padding: 8px 14px 8px 12px;
    border: 1px solid var(--accent);
    border-radius: var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px */
    background: var(--accent_halo);
    color: var(--accent);
    font: 600 var(--texte_s) / 1 var(--police_texte);
    cursor: pointer;
    transition: background 0.2s ease, color 0.2s ease;
}

.jarvis_vocal[hidden]
{
    display: none;
}

.jarvis_vocal svg
{
    width: 20px;
    height: 20px;
    flex: none;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
}

.jarvis_vocal:hover,
.jarvis_vocal[aria-pressed="true"]
{
    background: var(--accent);
    color: var(--accent_texte);
}

.jarvis_vocal:focus-visible
{
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.jarvis_vocal[data-phase="ecoute"]
{
    animation: jarvis_pulsation 1.4s ease-in-out infinite;
}

.jarvis_vocal[data-phase="attente"]
{
    opacity: 0.8;
    cursor: progress;
}

.jarvis_vocal[data-phase="parle"]
{
    background: var(--accent);
    color: var(--accent_texte);
    animation: jarvis_vocal_halo 1.1s ease-in-out infinite;
}

.jarvis_vocal[data-phase="parle"] svg path
{
    transform-origin: center;
    animation: jarvis_vocal_ondes 0.9s ease-in-out infinite;
}

@keyframes jarvis_vocal_halo
{
    0%,
    100%
    {
        box-shadow: 0 0 0 0 var(--accent_halo);
    }

    50%
    {
        box-shadow: 0 0 0 8px var(--accent_halo);
    }
}

@keyframes jarvis_vocal_ondes
{
    0%,
    100%
    {
        transform: scaleY(1);
    }

    50%
    {
        transform: scaleY(0.55);
    }
}

/* 06/11/2026 15:36 (Claude, JaxXBot anunaqi n° 2122, Jarvis #1022 de JaxX) : mode vocal en pause après un changement de page (geste attendu) — A VALIDER PAR JaxX */
.jarvis .jarvis_vocal.jarvis_vocal_reprise
{
    border-style: dashed;
    animation: jarvis_vocal_halo 1.8s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis .jarvis_vocal.jarvis_vocal_reprise
    {
        animation: none;
    }
}

/* 13/10/2026 (Dialogue n° 946 de JaxX : « indicateur visuel du mode vocal de Jarvis beaucoup plus discret une simple ligne en haut du champ qui fonctionne à rebours ») */
.jarvis_formulaire
{
    position: relative;
}

.jarvis_ligne_silence
{
    position: absolute;
    top: 13px;
    left: 18px;
    right: 18px;
    height: 3px;
    border-radius: var(--rayon_input, 2px) var(--rayon_input, 2px) 0 0;
    overflow: hidden;
    pointer-events: none;
    z-index: 5;
    background: rgba(255, 255, 255, 0.08);
}

.jarvis_ligne_silence[hidden]
{
    display: none !important;
}

.jarvis_ligne_silence_jauge
{
    display: block;
    height: 100%;
    width: 100%;
    background: var(--accent, #d4af37);
    box-shadow: 0 0 8px var(--accent, #d4af37), 0 0 2px rgba(255, 255, 255, 0.6);
    transform-origin: left center;
    will-change: transform;
}

.jarvis_envoyer
{
    padding: 10px 18px;
    border: 0;
    border-radius: var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px */
    background: var(--accent);
    color: var(--accent_texte);
    font: 600 var(--texte_s) / 1 var(--police_texte);
    cursor: pointer;
}

.jarvis_envoyer[disabled]
{
    opacity: 0.55;
    cursor: wait;
}

.jarvis_erreur
{
    margin: 0;
    color: var(--erreur);
    font-size: var(--texte_xs);
}

.jarvis_mention
{
    margin: 0;
    padding: 0 16px 12px;
    color: var(--encre_attenuee);
    font-size: var(--texte_xs);
    line-height: 1.4;
}

/* 09/10/2026 22:26 (Claude, Dialogue n° 396 de JaxX : « réduire cette mention dans un slidetoggle ») : mention repliée,
   dépliée en glissant (Edge / Chrome : ::details-content + interpolate-size ; ailleurs : ouverture directe) — A VALIDER PAR JaxX */
.jarvis_mention
{
    interpolate-size: allow-keywords;
}

.jarvis_mention_titre
{
    display: inline-flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    list-style: none;
    user-select: none;
}

.jarvis_mention_titre::-webkit-details-marker
{
    display: none;
}

.jarvis_mention_titre:hover,
.jarvis_mention_titre:focus-visible
{
    color: var(--encre);
}

.jarvis_mention_titre svg
{
    width: 14px;
    height: 14px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
    transition: transform var(--duree) var(--easing);
}

.jarvis_mention[open] .jarvis_mention_titre svg
{
    transform: rotate(180deg);
}

.jarvis_mention::details-content
{
    block-size: 0;
    overflow: hidden;
    transition: block-size var(--duree) var(--easing), content-visibility var(--duree) var(--easing) allow-discrete;
}

.jarvis_mention[open]::details-content
{
    block-size: auto;
}

.jarvis_mention_texte
{
    margin: 6px 0 0;
}

/* 09/10/2026 21:25 (Claude, n° 348) : rappel proposé quand les agents sont absents — A VALIDER PAR JaxX */
.jarvis_rappel
{
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 12px 16px;
    border-top: 1px solid var(--ligne);
    background: var(--surface_alt, var(--surface));
}

.jarvis_rappel[hidden]
{
    display: none;
}

.jarvis_rappel_texte,
.jarvis_rappel_mention
{
    margin: 0;
    color: var(--encre);
    font-size: var(--texte_xs);
    line-height: 1.45;
}

.jarvis_rappel_mention
{
    color: var(--encre_attenuee);
}

.jarvis_rappel_champs
{
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
}

.jarvis_rappel_champ
{
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
    color: var(--encre_attenuee);
    font-size: var(--texte_xs);
}

.jarvis_rappel_champ input
{
    width: 100%;
    padding: 8px 10px;
    border: 1px solid var(--ligne_forte);
    border-radius: var(--rayon_input, 2px); /* ancien (n° 599) : 2px */
    background: var(--surface_input);
    color: var(--encre);
    font: 400 var(--texte_s) / 1.3 var(--police_texte);
}

.jarvis_rappel_champ input:focus-visible
{
    outline: 2px solid var(--accent);
    outline-offset: 1px;
}

.jarvis_rappel_actions
{
    display: flex;
    justify-content: flex-end;
    gap: 8px;
}

.jarvis_rappel_envoyer,
.jarvis_rappel_plus_tard
{
    padding: 9px 14px;
    border-radius: var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px */
    font: 600 var(--texte_xs) / 1 var(--police_texte);
    cursor: pointer;
}

.jarvis_rappel_envoyer
{
    border: 0;
    background: var(--accent);
    color: var(--accent_texte);
}

.jarvis_rappel_plus_tard
{
    border: 1px solid var(--ligne_forte);
    background: transparent;
    color: var(--encre);
}

.jarvis_rappel_envoyer[disabled]
{
    opacity: 0.55;
    cursor: wait;
}

.jarvis_rappel_erreur
{
    margin: 0;
    color: var(--erreur);
    font-size: var(--texte_xs);
}

.jarvis_rappel_merci
{
    color: var(--encre);
    font-weight: 600;
}
/* JARVIS_SAISIE =================================================== */

/* JARVIS_ATELIER ================================================== */
/* 11/10/2026 01:32 (Antigravity, Dialogue n° 750 de JaxX : « Pourquoi l'avatar est redevenu petit sur le bouton ? En fait on dirait qu'il est petit en back-office alors qu'il est correct en front office je veux qu'il soit comme au front office de partout ») */
/* Ancien comportement réduit neutralisé pour harmoniser le grand avatar en buste et le libellé sur toutes les pages (front et back-office) :
.adm_page .jarvis_bouton,
.jarvis_atelier .jarvis_bouton
{
    padding: 12px;
    gap: 0;
}

.adm_page .jarvis_bouton_texte,
.jarvis_atelier .jarvis_bouton_texte
{
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}
*/
/* JARVIS_ATELIER ================================================== */

/* JARVIS_MOBILE =================================================== */
@media (max-width: 900px)
{
    .jarvis
    {
        right: 16px;
        bottom: calc(var(--hauteur_tab_bar) + env(safe-area-inset-bottom) + 12px);
    }

    .jarvis_bouton
    {
        padding: 12px;
    }

    /* 09/10/2026 22:11 (Claude, n° 382) : sur téléphone, calé contre le bord droit, au-dessus de la barre d'onglets */
    .jarvis:not([data-ouvert="1"])
    {
        right: 0;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton
    {
        border-width: 1px 0 1px 1px;
        border-radius: var(--rayon_bouton, 2px) 0 0 var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px 0 0 2px */
    }

    .jarvis_bouton_texte
    {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
    }

    .jarvis[data-ouvert="1"]
    {
        inset: 0;
        z-index: 1200;
    }

    .jarvis_panneau
    {
        width: 100%;
        height: 100%;
        height: 100dvh;
        border: 0;
        padding-top: env(safe-area-inset-top);
        padding-bottom: env(safe-area-inset-bottom);
    }

    .jarvis_texte,
    .jarvis_rappel_champ input
    {
        font-size: 16px;
    }

    .jarvis_rappel_champs
    {
        grid-template-columns: 1fr;
    }

    /* 09/10/2026 21:25 (Claude, n° 348 et n° 346) : dans l'atelier, le bouton devient une languette au bord droit,
       à mi-hauteur, pour ne plus recouvrir les boutons « Répondre » du JaxX_Bot ni la barre d'onglets — A VALIDER PAR JaxX */
    .jarvis_atelier:not([data-ouvert="1"])
    {
        right: 0;
        bottom: calc(50% - 22px);
    }

    .jarvis_atelier .jarvis_bouton
    {
        padding: 10px 6px 10px 8px;
        border-radius: var(--rayon_bouton, 2px) 0 0 var(--rayon_bouton, 2px); /* ancien (n° 599) : 2px 0 0 2px */
        opacity: 0.88;
    }

    .jarvis_atelier .jarvis_bouton:hover,
    .jarvis_atelier .jarvis_bouton:focus-visible
    {
        opacity: 1;
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_bouton,
    .jarvis_micro[aria-pressed="true"],
    .jarvis_vocal,
    .jarvis_vocal svg path
    {
        transition: none;
        animation: none;
    }

    /* 09/10/2026 22:19 (n° 385) : volet sans glissement ni transition de la page */
    body,
    .header_principal,
    .adm_panneau,
    .jarvis[data-ouvert="1"] .jarvis_panneau
    {
        transition: none;
        animation: none;
    }

    /* 09/10/2026 22:26 (n° 396) : mention dépliée sans glissement */
    .jarvis_mention::details-content,
    .jarvis_mention_titre svg
    {
        transition: none;
    }
}
/* JARVIS_MOBILE =================================================== */

/* JARVIS_TACTILE ================================================== */
/* 10/10/2026 03:04 (Claude, Dialogue n° 506 de JaxX : « Sur iPad Jarvis a l'air de faire bugger la page, du coup la page
   est rechargée totalement et Jarvis est à nouveau fermé ») : un rechargement spontané sous Safari iPad signale un onglet
   coupé par iPadOS faute de mémoire graphique. Sur écran tactile (hover: none et pointer: coarse), on retire ce qui
   multiplie les calques : la page n'est plus rétrécie par le volet (il passe par-dessus), les bulles perdent leur flou
   d'arrière-plan (0,8 px, invisible à l'œil), les animations en boucle de la rédaction sont figées ou allégées.
   Ordinateur (souris) inchangé. */
@media (hover: none) and (pointer: coarse)
{
    .jarvis_accueil,
    .jarvis_bulle_agent,
    .jarvis_bulle_visiteur
    {
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
    }

    .jarvis_aura_onde,
    .jarvis_anneau_externe,
    .jarvis_redige_libelle
    {
        animation: none;
    }
}

@media (min-width: 901px) and (hover: none) and (pointer: coarse)
{
    html.jarvis_volet_ouvert
    {
        --jarvis_decalage: 0px;
    }

    body,
    .header_principal,
    .adm_panneau
    {
        transition: none;
    }

    html.jarvis_volet_ouvert body
    {
        margin-right: 0;
    }
}
/* JARVIS_TACTILE ================================================== */

/* JARVIS_INVITE =================================================== */
/* 10/10/2026 04:04 (Claude, Dialogue n° 540 de JaxX : « Pour le bouton qui permet de démarrer le chat ajouter un icône
   dialogue et faire en sorte qu'au survol "des questions ?" apparaisse de manière animée ») : bouton = miniature de
   Jarvis agrandie + bulle de dialogue (icône posée par Antigravity dans le widget) ; au survol (ou au clavier), « Des questions ? » se déroule depuis la bulle, qui
   hoche une fois. Le libellé complet reste lu par les lecteurs d'écran (aria-label). Placé en fin de fichier pour
   l'emporter sur les réglages de l'atelier et du téléphone. — A VALIDER PAR JaxX */
.jarvis .jarvis_bouton
{
    gap: 8px;
}

.jarvis_bouton .jarvis_avatar
{
    width: 36px;
    height: 36px;
    transition: transform var(--vitesse_transition, 0.3s) cubic-bezier(0.34, 1.56, 0.64, 1), filter var(--vitesse_transition, 0.3s) ease;
}

.jarvis_bouton:hover .jarvis_avatar,
.jarvis_bouton:focus-visible .jarvis_avatar
{
    transform: scale(1.16);
    filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.35));
}

.jarvis_icone_bulle
{
    display: inline-flex;
    flex: none;
    transform-origin: 20% 90%;
}

.jarvis_icone_bulle svg
{
    display: block;
    width: 22px;
    height: 22px;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.jarvis_bouton .jarvis_bouton_texte
{
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

.jarvis_bouton_survol
{
    display: inline-block;
    max-width: 0;
    margin-left: -8px;
    overflow: hidden;
    white-space: nowrap;
    opacity: 0;
    transform: translateX(-6px);
    transition: max-width 0.42s var(--easing), margin-left 0.42s var(--easing), opacity 0.3s var(--easing), transform 0.42s var(--easing);
}

.jarvis_bouton:hover .jarvis_bouton_survol,
.jarvis_bouton:focus-visible .jarvis_bouton_survol
{
    max-width: 10em;
    margin-left: 0;
    opacity: 1;
    transform: none;
}

.jarvis_bouton:hover .jarvis_icone_bulle,
.jarvis_bouton:focus-visible .jarvis_icone_bulle
{
    animation: jarvis_bulle_hoche 0.6s var(--easing);
}

@keyframes jarvis_bulle_hoche
{
    0%
    {
        transform: rotate(0deg);
    }

    30%
    {
        transform: rotate(-12deg);
    }

    60%
    {
        transform: rotate(8deg);
    }

    100%
    {
        transform: rotate(0deg);
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_bouton_survol,
    .jarvis_icone_bulle
    {
        transition: none;
        animation: none;
    }

    .jarvis_bouton:hover .jarvis_icone_bulle,
    .jarvis_bouton:focus-visible .jarvis_icone_bulle
    {
        animation: none;
    }
}
/* JARVIS_INVITE =================================================== */

/* JARVIS_VOLET_ANIME ============================================== */
/* 10/10/2026 06:30 (Claude, Dialogue n° 568 de JaxX : « Quand on lance Jarvis, j'aimerais qu'il y ait une animation de volet
   latéral sur écran desktop. ») : à partir de 1025 px, le panneau glisse depuis le bord droit à l'ouverture
   (jarvis_volet_entree) et repart vers la droite à la fermeture (jarvis_volet_sortie, déclenchée par
   jarvis.js via data-fermeture, 320 ms avant le masquage). La page suit avec la même durée. De 901 à 1024 px, l'animation
   d'entrée d'origine est conservée. */
@media (min-width: 1025px)
{
    :root
    {
        --jarvis_volet_duree: 320ms;
        --jarvis_volet_easing: cubic-bezier(0.22, 1, 0.36, 1);
    }

    body,
    .header_principal,
    .adm_panneau
    {
        transition-duration: var(--jarvis_volet_duree);
        transition-timing-function: var(--jarvis_volet_easing);
    }

    .jarvis[data-ouvert="1"] .jarvis_panneau
    {
        animation: jarvis_volet_entree var(--jarvis_volet_duree) var(--jarvis_volet_easing) both;
        will-change: transform;
    }

    .jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_panneau
    {
        animation: jarvis_volet_sortie var(--jarvis_volet_duree) var(--jarvis_volet_easing) both;
    }

    .jarvis[data-ouvert="1"] .jarvis_bouton
    {
        animation: jarvis_bouton_volet_entree var(--jarvis_volet_duree) var(--jarvis_volet_easing) both;
        will-change: transform;
    }

    .jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_bouton
    {
        animation: jarvis_bouton_volet_sortie var(--jarvis_volet_duree) var(--jarvis_volet_easing) both;
    }
}

@keyframes jarvis_volet_sortie
{
    from
    {
        transform: none;
    }
    to
    {
        transform: translateX(100%);
    }
}

@media (min-width: 1025px) and (prefers-reduced-motion: reduce)
{
    body,
    .header_principal,
    .adm_panneau
    {
        transition: none;
    }

    .jarvis[data-ouvert="1"] .jarvis_panneau,
    .jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_panneau,
    .jarvis[data-ouvert="1"] .jarvis_bouton,
    .jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_bouton
    {
        animation: none;
    }
}

/* 10/10/2026 06:30 (Claude, Dialogue n° 573 de JaxX : « En version mobile l'icône Jarvis doit être plus compacte ; ne pas
   utiliser l'icône bulle ; le nombre de messages en attente doit être en position exposant. La miniature de Jarvis doit
   dépasser de la plaque de fond et donc être un petit peu plus grande. ») : sur mobile, plaque de fond réduite (44 × 40 px),
   bulle et « Une question ? » masqués, miniature de 58 × 58 px calée à droite de la plaque, qui dépasse par le haut et par la gauche, compteur
   en exposant (coin haut droit). Jetons du thème uniquement. */
@media (max-width: 900px)
{
    .jarvis .jarvis_bouton
    {
        position: relative;
        display: block;
        width: 44px;
        height: 40px;
        padding: 0;
        gap: 0;
        overflow: visible;
    }

    .jarvis .jarvis_bouton .jarvis_icone_bulle,
    .jarvis .jarvis_bouton .jarvis_bouton_survol
    {
        display: none;
    }

    .jarvis .jarvis_bouton .jarvis_avatar
    {
        position: absolute;
        bottom: 0;
        right: 0;
        width: 58px;
        height: 58px;
        overflow: visible;
        border-radius: 0;
        background: transparent;
        pointer-events: none;
        transition: transform var(--vitesse_transition, 0.3s) cubic-bezier(0.34, 1.56, 0.64, 1);
    }

    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:active .jarvis_avatar
    {
        transform: translateX(-50%) scale(1.12);
    }

    .jarvis .jarvis_bouton .jarvis_avatar img
    {
        object-fit: contain;
        object-position: 50% 100%;
        transform: none;
        filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
    }

    .jarvis .jarvis_bouton .jarvis_pastille
    {
        position: absolute;
        top: -9px;
        right: 1px;
        z-index: 2;
        min-width: 18px;
        padding: 2px 5px;
        border: 1px solid var(--accent);
        border-radius: var(--rayon_badge, 9px); /* ancien (n° 599) : 9px */
        font-size: 11px;
        font-weight: 700;
        line-height: 1.1;
        box-shadow: var(--ombre);
    }

    .jarvis .jarvis_bouton .jarvis_pastille[hidden]
    {
        display: none;
    }
}
/* JARVIS_VOLET_ANIME ============================================== */

/* JARVIS_RETOUCHES_697 ============================================ */
/* 10/10/2026 18:37 (Claude, Dialogue n° 697 de JaxX : « La miniature des Jarvis doit légèrement dépasser du cadre et s'agrandir
   au survol. En version mobile il faut garder l'icône de chat. jarvis_avatar doit être plus grand si c'est possible. Sur
   mobile il faut […] compacter l'en-tête pour gagner de la place sur le fil de discussion car parfois avec le clavier on ne
   voit plus du tout les messages. Supprimer l'information sur le profil reconnu ») : section placée en fin de fichier pour
   l'emporter sur les précédentes. L'atelier _adm (languette réduite à l'icône) n'est pas modifié. Jetons du thème
   uniquement. — A VALIDER PAR JaxX */
.jarvis_role
{
    display: none;
}

@media (min-width: 901px)
{
    /* Miniature en buste, calée en bas du bouton, qui dépasse par le haut ; agrandie au survol et au clavier */
    .jarvis .jarvis_bouton
    {
        position: relative;
        overflow: visible;
        padding-left: 70px;
    }

    .jarvis .jarvis_bouton .jarvis_avatar
    {
        position: absolute;
        left: 10px;
        bottom: 0;
        width: 52px;
        height: 62px;
        overflow: visible;
        border-radius: 0;
        background: transparent;
        pointer-events: none;
        transform-origin: 50% 100%;
    }

    .jarvis .jarvis_bouton .jarvis_avatar img
    {
        object-fit: contain;
        object-position: 50% 100%;
        transform: none;
        filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
    }

    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:focus-visible .jarvis_avatar
    {
        transform: scale(1.18);
        filter: none;
    }

    /* Avatar de l'en-tête du panneau : 44 px auparavant */
    .jarvis_entete .jarvis_avatar
    {
        width: 64px;
        height: 64px;
    }
}

@media (max-width: 900px)
{
    /* Bouton : la bulle de chat revient à gauche de la plaque, la miniature reste à droite et dépasse par le haut */
    .jarvis .jarvis_bouton
    {
        width: 86px;
    }

    .jarvis .jarvis_bouton .jarvis_icone_bulle
    {
        position: absolute;
        top: 50%;
        left: 10px;
        display: inline-flex;
        margin-top: -11px;
    }

    .jarvis .jarvis_bouton .jarvis_avatar
    {
        width: 54px;
        height: 58px;
        transform-origin: 50% 100%;
    }

    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:active .jarvis_avatar
    {
        transform: scale(1.12);
    }

    /* Panneau ouvert calé sur la zone réellement visible (variables posées par jarvis.js quand le clavier s'ouvre) */
    .jarvis[data-ouvert="1"]
    {
        top: var(--jarvis_haut_visible, 0px);
        bottom: auto;
        height: var(--jarvis_hauteur_visible, 100dvh);
    }

    .jarvis[data-ouvert="1"] .jarvis_panneau
    {
        height: var(--jarvis_hauteur_visible, 100dvh);
    }

    /* En-tête compact : une seule ligne, avatar de 40 px, boutons de 36 px */
    .jarvis_entete
    {
        align-items: center;
        gap: 8px;
        padding: 8px 10px;
    }

    .jarvis_entete .jarvis_avatar
    {
        width: 40px;
        height: 40px;
    }

    .jarvis_titre
    {
        font-size: var(--texte_s);
    }

    .jarvis_statut
    {
        margin-top: 2px;
    }

    .jarvis_entete .jarvis_action
    {
        width: 36px;
        height: 36px;
    }

    .jarvis_fil
    {
        gap: 10px;
        padding: 12px;
    }

    /* Pendant la saisie (clavier ouvert) : en-tête réduit au titre, mention repliée retirée, tout l'espace pour le fil */
    .jarvis_clavier .jarvis_entete
    {
        padding: 4px 10px;
    }

    .jarvis_clavier .jarvis_entete .jarvis_avatar
    {
        width: 30px;
        height: 30px;
    }

    .jarvis_clavier .jarvis_statut_ligne,
    .jarvis_clavier .jarvis_mention
    {
        display: none;
    }
}
/* JARVIS_RETOUCHES_697 ============================================ */

/* JARVIS_RETOUCHES_711 ============================================ */
/* 10/10/2026 19:29 (Claude, Dialogue n° 711 de JaxX : « L'animation est un peu violente au survol […]. L'image de l'avatar ne
   dépasse toujours pas du cadre de son bouton […] Elle doit être collée en bas du bouton et dépasser un petit peu comme si le
   bouton était derrière elle, un peu comme en version mobile ») : la miniature de 62 px ne dépassait que de quelques pixels ;
   elle passe à 84 px, collée en bas. Survol : plus de rebond (cubic-bezier 0.34, 1.56), agrandissement réduit, balancement
   de la bulle adouci. Les règles des sections précédentes restent en place. — A VALIDER PAR JaxX */
.jarvis .jarvis_bouton .jarvis_avatar
{
    transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1), filter 0.5s ease;
}

.jarvis .jarvis_bouton:hover .jarvis_icone_bulle,
.jarvis .jarvis_bouton:focus-visible .jarvis_icone_bulle
{
    animation: jarvis_bulle_douce 0.9s ease-in-out;
}

@keyframes jarvis_bulle_douce
{
    0%
    {
        transform: rotate(0deg);
    }

    40%
    {
        transform: rotate(-5deg);
    }

    100%
    {
        transform: rotate(0deg);
    }
}

@media (min-width: 901px)
{
    /* Miniature : 84 px de haut, collée en bas du bouton, le buste dépasse franchement par le haut */
    .jarvis .jarvis_bouton
    {
        padding-left: 84px;
    }

    .jarvis .jarvis_bouton .jarvis_avatar
    {
        left: 10px;
        bottom: 0;
        width: 66px;
        height: 84px;
    }

    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:focus-visible .jarvis_avatar
    {
        transform: scale(1.06);
    }
}

@media (max-width: 900px)
{
    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:active .jarvis_avatar
    {
        transform: scale(1.05);
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis .jarvis_bouton .jarvis_avatar
    {
        transition: none;
    }

    .jarvis .jarvis_bouton:hover .jarvis_icone_bulle,
    .jarvis .jarvis_bouton:focus-visible .jarvis_icone_bulle
    {
        animation: none;
    }
}
/* JARVIS_RETOUCHES_711 ============================================ */

/* JARVIS_FILIGRANE_710 ============================================ */
/* 10/10/2026 19:43 (Claude, Dialogue n° 710) : « il doit s'adapter à la hauteur de la fenêtre et être centré ».
 * Tous les filigranes ont désormais la silhouette sur toute la hauteur de l'image (versions _cadre) : on cale l'image
 * sur la hauteur du panneau, sous l'en-tête, centrée horizontalement, fondue vers le bas pour la zone de saisie.
 * Remplace le placement du n° 688 (62 % de la largeur, à droite, plafonné à 320 px). */
.jarvis_filigrane
{
    top: 58px;
    bottom: 0;
    left: 50%;
    right: auto;
    width: auto;
    max-width: none;
    height: calc(100% - 58px);
    transform: translateX(-50%);
    object-fit: contain;
    object-position: center bottom;
    -webkit-mask-image: linear-gradient(to bottom, #000000 70%, transparent 100%);
    mask-image: linear-gradient(to bottom, #000000 70%, transparent 100%);
}
/* JARVIS_FILIGRANE_710 ============================================ */

/* JARVIS_FILIGRANE_BAGUE_836 ====================================== */
/* 12/10/2026 (Antigravity, Dialogue n° 836 de JaxX « transition de bague en images pour le filigrane ») :
 * Transition 3D de bague circulaire rotative (cylinder / ring) entre l'ancien et le nouveau filigrane lors d'un
 * changement de thème. Perspective axiale 3D, rotation Y, décalage en profondeur Z et flou cinétique fluide. */
.jarvis_panneau
{
    perspective: 1400px;
    perspective-origin: 65% 50%;
}

.jarvis_filigrane
{
    transform-style: preserve-3d;
    backface-visibility: hidden;
    will-change: transform, opacity, filter;
    transform-origin: 65% 50%;
}

.jarvis_filigrane.jarvis_filigrane_bague_sortie
{
    animation: tchat_filigrane_bague_sortie 0.65s cubic-bezier(0.22, 1, 0.36, 1) forwards !important;
    pointer-events: none;
}

.jarvis_filigrane.jarvis_filigrane_bague_entree
{
    animation: tchat_filigrane_bague_entree 0.65s cubic-bezier(0.22, 1, 0.36, 1) forwards !important;
    pointer-events: none;
}

@keyframes tchat_filigrane_bague_sortie
{
    0%
    {
        transform: rotateY(0deg) translateZ(0);
        opacity: 0.26;
        filter: contrast(1.05) blur(0);
    }
    40%
    {
        opacity: 0.18;
        filter: contrast(1.05) blur(2px);
    }
    100%
    {
        transform: rotateY(-85deg) translateZ(-140px) scale(0.86);
        opacity: 0;
        filter: contrast(1.05) blur(6px);
    }
}

@keyframes tchat_filigrane_bague_entree
{
    0%
    {
        transform: rotateY(85deg) translateZ(-140px) scale(0.86);
        opacity: 0;
        filter: contrast(1.05) blur(6px);
    }
    60%
    {
        opacity: 0.20;
        filter: contrast(1.05) blur(2px);
    }
    100%
    {
        transform: rotateY(0deg) translateZ(0);
        opacity: 0.26;
        filter: contrast(1.05) blur(0);
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_filigrane.jarvis_filigrane_bague_sortie,
    .jarvis_filigrane.jarvis_filigrane_bague_entree
    {
        animation: none !important;
    }
}
/* JARVIS_FILIGRANE_BAGUE_836 ====================================== */

/* JARVIS_FILIGRANE_NET_972 ======================================== */
/* 13/10/2026 01:41 (Claude, Dialogue n° 972 « améliorer la qualité du Jarvis en filigrane ») :
 * au repos, le filigrane n'est plus un calque composité permanent (will-change et backface-visibility de la bague
 * le rendaient en texture adoucie), et il est centré sans translateX(-50 %) (demi-pixel flou). Le centrage par marges
 * auto évite aussi le saut horizontal pendant la bague, dont les images clés n'incluent pas le translateX.
 * La préparation 3D reste active seulement pendant la transition (classes _bague_sortie et _bague_entree). */
.jarvis_filigrane
{
    /* left: 0; */
    /* right: 0; */
    /* 13/10/2026 01:56 (n° 985 « Peux-tu le centrer dans la fenêtre ») : bornes à -100 % pour rester centré même quand
     * l'image est plus large que le panneau (avec 0, les marges auto devenaient négatives et l'image se calait à gauche) */
    left: -100%;
    right: -100%;
    margin: 0 auto;
    transform: none;
    backface-visibility: visible;
    will-change: auto;
    image-rendering: auto;
}

.jarvis_filigrane.jarvis_filigrane_bague_sortie,
.jarvis_filigrane.jarvis_filigrane_bague_entree
{
    backface-visibility: hidden;
    will-change: transform, opacity, filter;
}
/* JARVIS_FILIGRANE_NET_972 ======================================== */

/* JARVIS_APPARITION_719 =========================================== */
/* 10/10/2026 20:06 (Claude, n° 719) / 10/10/2026 20:48 (Antigravity, JaxX n° 734 « Diminuer aussi la vitesse d'apparition des dialogues dans Jarvis ») :
   apparition progressive ralentie et soyeuse, décalage feutré de 140 ms entre chaque bulle (au lieu de 70 ms),
   durées d'animation portées à 0.70s - 0.90s avec cubic-bezier(0.16, 1, 0.3, 1). */
.jarvis_fil .jarvis_entree
{
    --jarvis_sens: -1;
    animation-name: jarvis_entree_douce;
    animation-duration: 0.72s;
    animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
    animation-fill-mode: both;
    animation-delay: 0.35s;
}

.jarvis_fil .jarvis_bulle_visiteur.jarvis_entree
{
    --jarvis_sens: 1;
}

.jarvis_fil .jarvis_entree[data-apparition="1"]
{
    animation-delay: 0.49s;
}

.jarvis_fil .jarvis_entree[data-apparition="2"]
{
    animation-delay: 0.63s;
}

.jarvis_fil .jarvis_entree[data-apparition="3"]
{
    animation-delay: 0.77s;
}

.jarvis_fil .jarvis_entree[data-apparition="4"]
{
    animation-delay: 0.91s;
}

.jarvis_fil .jarvis_entree[data-apparition="5"]
{
    animation-delay: 1.05s;
}

.jarvis_fil .jarvis_entree[data-apparition="6"]
{
    animation-delay: 1.19s;
}

.jarvis_fil .jarvis_entree[data-apparition="7"]
{
    animation-delay: 1.33s;
}

.jarvis_fil .jarvis_entree[data-apparition="8"]
{
    animation-delay: 1.47s;
}

.jarvis_fil .jarvis_entree[data-apparition="9"]
{
    animation-delay: 1.61s;
}

.jarvis_fil .jarvis_entree[data-apparition="10"]
{
    animation-delay: 1.75s;
}

.jarvis_fil .jarvis_entree[data-apparition="11"]
{
    animation-delay: 1.89s;
}

.jarvis_fil .jarvis_entree[data-apparition="12"]
{
    animation-delay: 2.03s;
}

.jarvis_fil .jarvis_entree[data-apparition="13"]
{
    animation-delay: 2.17s;
}

html.theme_champagne .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_champagne;
    animation-duration: 0.85s;
}

html.theme_atelier .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_atelier;
    animation-duration: 0.78s;
}

html.theme_minimaliste .jarvis_fil .jarvis_entree,
html.theme_suisse .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_suisse;
    animation-duration: 0.65s;
    animation-timing-function: cubic-bezier(0.25, 1, 0.5, 1);
}

html.theme_cyberpunk .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_glitch;
    animation-duration: 0.58s;
    animation-timing-function: steps(2, end);
}

html.theme_matrix .jarvis_fil .jarvis_entree,
html.theme_matrice .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_matrix;
    animation-duration: 0.75s;
    animation-timing-function: cubic-bezier(0.25, 1, 0.5, 1);
}

html.theme_IAslop .jarvis_fil .jarvis_entree,
html.theme_futur2026 .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_morphose;
    animation-duration: 0.85s;
}

html.theme_obsidian .jarvis_fil .jarvis_entree
{
    animation-name: jarvis_entree_obsidienne;
    animation-duration: 0.90s;
    animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
}

@keyframes jarvis_entree_douce
{
    from
    {
        opacity: 0;
        transform: translateY(10px) scale(0.98);
    }
    to
    {
        opacity: 1;
        transform: none;
    }
}

@keyframes jarvis_entree_champagne
{
    0%
    {
        opacity: 0;
        transform: translateY(8px);
        filter: blur(3px) brightness(1.25);
    }
    60%
    {
        opacity: 1;
        filter: blur(0) brightness(1.12);
    }
    100%
    {
        opacity: 1;
        transform: none;
        filter: none;
    }
}

@keyframes jarvis_entree_atelier
{
    from
    {
        opacity: 0;
        transform: translateX(calc(var(--jarvis_sens) * 16px)) rotate(calc(var(--jarvis_sens) * -0.8deg));
    }
    to
    {
        opacity: 1;
        transform: none;
    }
}

@keyframes jarvis_entree_suisse
{
    from
    {
        opacity: 0;
        clip-path: inset(0 0 100% 0);
        transform: translateY(6px);
    }
    to
    {
        opacity: 1;
        clip-path: inset(0 0 0 0);
        transform: none;
    }
}

@keyframes jarvis_entree_glitch
{
    0%
    {
        opacity: 0;
    }
    15%
    {
        opacity: 1;
        clip-path: inset(38% 0 34% 0);
        transform: translateX(calc(var(--jarvis_sens) * 8px)) skewX(-6deg);
    }
    35%
    {
        opacity: 1;
        clip-path: inset(8% 0 62% 0);
        transform: translateX(calc(var(--jarvis_sens) * -4px)) skewX(4deg);
    }
    55%
    {
        opacity: 1;
        clip-path: inset(0 0 18% 0);
        transform: translateX(calc(var(--jarvis_sens) * 2px));
    }
    75%
    {
        opacity: 1;
        clip-path: inset(0 0 0 0);
        transform: translateX(calc(var(--jarvis_sens) * -1px));
    }
    100%
    {
        opacity: 1;
        clip-path: inset(0 0 0 0);
        transform: none;
    }
}

@keyframes jarvis_entree_matrix
{
    0%
    {
        opacity: 0;
        transform: translateY(-18px);
        filter: brightness(1.9);
    }
    55%
    {
        opacity: 1;
        filter: brightness(1.35);
    }
    100%
    {
        opacity: 1;
        transform: none;
        filter: none;
    }
}

@keyframes jarvis_entree_morphose
{
    0%
    {
        opacity: 0;
        transform: scale(0.9);
        filter: blur(8px) saturate(1.6);
    }
    70%
    {
        opacity: 1;
        transform: scale(1.01);
        filter: blur(0) saturate(1.2);
    }
    100%
    {
        opacity: 1;
        transform: none;
        filter: none;
    }
}

@keyframes jarvis_entree_obsidienne
{
    from
    {
        opacity: 0;
        transform: scale(1.04);
        filter: brightness(0.35);
    }
    to
    {
        opacity: 1;
        transform: none;
        filter: none;
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_fil .jarvis_entree
    {
        animation: none;
    }
}
/* JARVIS_APPARITION_719 =========================================== */

/* JARVIS_DOUCEUR_OUVERTURE_730 ================================== */
/* 10/10/2026 20:47 (Antigravity, Dialogue n° 730 de JaxX : « Rend l'animation d'ouverture de Jarvis et du releveur de son bouton plus lente. L'animation doit être douce pas brut ») :
 * 1. Ouverture & fermeture du volet : portée de 320ms à 650ms avec un cubic-bezier(0.16, 1, 0.3, 1) très progressif.
 * 2. Poussée de la page, du header et de l'admin panneau synchronisée sur 650ms.
 * 3. Releveur du bouton et de l'avatar : transition ralentie de 0.3s/0.5s à 0.75s avec montée soyeuse (translateY(-3px)).
 * 4. Déroulement du texte survol : ralenti à 0.7s sans secousse.
 * Règle Allman stricte, sans style inline. — A VALIDER PAR JaxX */
:root
{
    --jarvis_volet_duree: 650ms;
    --jarvis_volet_easing: cubic-bezier(0.16, 1, 0.3, 1);
}

body,
.header_principal,
.adm_panneau
{
    transition-duration: var(--jarvis_volet_duree) !important;
    transition-timing-function: var(--jarvis_volet_easing) !important;
}

.jarvis[data-ouvert="1"] .jarvis_panneau
{
    animation: jarvis_volet_entree var(--jarvis_volet_duree) var(--jarvis_volet_easing) both !important;
}

.jarvis[data-ouvert="1"][data-fermeture="1"] .jarvis_panneau
{
    animation: jarvis_volet_sortie var(--jarvis_volet_duree) var(--jarvis_volet_easing) both !important;
}

/* Bouton Jarvis : releveur fluide, doux et progressif */
.jarvis_bouton
{
    transition: transform 0.65s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.65s cubic-bezier(0.16, 1, 0.3, 1), filter 0.65s ease;
}

.jarvis:not([data-ouvert="1"]) .jarvis_bouton:hover
{
    transform: translateY(-3px);
}

/* Avatar de Jarvis : élévation douce et délicate */
.jarvis .jarvis_bouton .jarvis_avatar
{
    transition: transform 0.75s cubic-bezier(0.16, 1, 0.3, 1), filter 0.75s ease;
}

@media (min-width: 901px)
{
    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:focus-visible .jarvis_avatar
    {
        transform: scale(1.06) translateY(-2px);
    }
}

@media (max-width: 900px)
{
    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:active .jarvis_avatar
    {
        transform: scale(1.05) translateY(-2px);
    }
}

.jarvis_bouton_survol
{
    transition: max-width 0.7s cubic-bezier(0.16, 1, 0.3, 1), margin-left 0.7s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.5s ease, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_bouton,
    .jarvis .jarvis_bouton .jarvis_avatar,
    .jarvis_bouton_survol
    {
        transition: none;
    }
}
/* JARVIS_DOUCEUR_OUVERTURE_730 ================================== */

/* JARVIS_RELEVEUR_758 ============================================= */
/* 11/10/2026 03:09 (Claude, Dialogue 2027_B2B n° 758 de JaxX : « L'animation au releveur est encore trop rapide pour le bouton
   d'ouverture de Jarvis j'aimerais qu'elle soit un peu plus lente à 0,8 par exemple ») : durées portées à 0,8 s (avant, n° 730 :
   0,65 s pour le bouton, 0,75 s pour l'avatar, 0,7 s pour « Des questions ? »). La courbe cubic-bezier(0.16, 1, 0.3, 1) du n° 730
   faisait l'essentiel du mouvement dans les 150 premières millisecondes : elle est remplacée par une courbe douce au départ comme
   à l'arrivée. Les règles du n° 730 restent en place ; celles-ci, placées après, l'emportent. — A VALIDER PAR JaxX */
:root
{
    --jarvis_releveur_duree: 0.8s;
    --jarvis_releveur_easing: cubic-bezier(0.45, 0, 0.25, 1);
}

.jarvis_bouton
{
    transition: transform var(--jarvis_releveur_duree) var(--jarvis_releveur_easing), box-shadow var(--jarvis_releveur_duree) var(--jarvis_releveur_easing), filter var(--jarvis_releveur_duree) ease;
}

.jarvis .jarvis_bouton .jarvis_avatar
{
    transition: transform var(--jarvis_releveur_duree) var(--jarvis_releveur_easing), filter var(--jarvis_releveur_duree) ease;
}

.jarvis_bouton_survol
{
    transition: max-width var(--jarvis_releveur_duree) var(--jarvis_releveur_easing), margin-left var(--jarvis_releveur_duree) var(--jarvis_releveur_easing), opacity 0.6s ease, transform var(--jarvis_releveur_duree) var(--jarvis_releveur_easing);
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_bouton,
    .jarvis .jarvis_bouton .jarvis_avatar,
    .jarvis_bouton_survol
    {
        transition: none;
    }
}
/* JARVIS_RELEVEUR_758 ============================================= */

/* JARVIS_LENTEUR_734 ============================================== */
/* 10/10/2026 20:49 (Claude, Dialogue 2027_B2B n° 734 de JaxX : « Diminuer aussi la vitesse d'apparition des dialogues dans
   Jarvis ») : mêmes animations que la section JARVIS_APPARITION_719, en plus lent. Anciennes valeurs (n° 719) :
   - écart entre deux échanges 0,07 s (premier à 0,12 s) → 0,12 s (premier à 0,2 s) ;
   - durées : défaut 0,46 → 0,75 s ; Champagne 0,55 → 0,9 s ; Chêne fumé 0,5 → 0,8 s ; Minimaliste / Suisse 0,4 → 0,65 s ;
     Cyberpunk 0,42 → 0,7 s ; Matrix 0,5 → 0,8 s ; IA Slop / Futur 2026 0,6 → 0,95 s ; Obsidienne 0,65 → 1,05 s.
   Correctif : avec « réduire les animations », les règles par thème (html.theme_…) l'emportaient sur le animation: none
   de la section 719 ; le dernier bloc ci-dessous coupe l'animation pour tous les thèmes. — A VALIDER PAR JaxX */
.jarvis_fil .jarvis_entree
{
    animation-duration: 0.75s;
    animation-delay: 0.2s;
}

.jarvis_fil .jarvis_entree[data-apparition="1"]
{
    animation-delay: 0.32s;
}

.jarvis_fil .jarvis_entree[data-apparition="2"]
{
    animation-delay: 0.44s;
}

.jarvis_fil .jarvis_entree[data-apparition="3"]
{
    animation-delay: 0.56s;
}

.jarvis_fil .jarvis_entree[data-apparition="4"]
{
    animation-delay: 0.68s;
}

.jarvis_fil .jarvis_entree[data-apparition="5"]
{
    animation-delay: 0.80s;
}

.jarvis_fil .jarvis_entree[data-apparition="6"]
{
    animation-delay: 0.92s;
}

.jarvis_fil .jarvis_entree[data-apparition="7"]
{
    animation-delay: 1.04s;
}

.jarvis_fil .jarvis_entree[data-apparition="8"]
{
    animation-delay: 1.16s;
}

.jarvis_fil .jarvis_entree[data-apparition="9"]
{
    animation-delay: 1.28s;
}

.jarvis_fil .jarvis_entree[data-apparition="10"]
{
    animation-delay: 1.40s;
}

.jarvis_fil .jarvis_entree[data-apparition="11"]
{
    animation-delay: 1.52s;
}

.jarvis_fil .jarvis_entree[data-apparition="12"]
{
    animation-delay: 1.64s;
}

.jarvis_fil .jarvis_entree[data-apparition="13"]
{
    animation-delay: 1.76s;
}

html.theme_champagne .jarvis_fil .jarvis_entree
{
    animation-duration: 0.9s;
}

html.theme_atelier .jarvis_fil .jarvis_entree
{
    animation-duration: 0.8s;
}

html.theme_minimaliste .jarvis_fil .jarvis_entree,
html.theme_suisse .jarvis_fil .jarvis_entree
{
    animation-duration: 0.65s;
}

html.theme_cyberpunk .jarvis_fil .jarvis_entree
{
    animation-duration: 0.7s;
}

html.theme_matrix .jarvis_fil .jarvis_entree,
html.theme_matrice .jarvis_fil .jarvis_entree
{
    animation-duration: 0.8s;
}

html.theme_IAslop .jarvis_fil .jarvis_entree,
html.theme_futur2026 .jarvis_fil .jarvis_entree
{
    animation-duration: 0.95s;
}

html.theme_obsidian .jarvis_fil .jarvis_entree
{
    animation-duration: 1.05s;
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_fil .jarvis_entree,
    html[class] .jarvis_fil .jarvis_entree
    {
        animation: none;
    }
}
/* JARVIS_LENTEUR_734 ============================================== */

/* JARVIS_AVATAR_SURVOL_762 ======================================== */
/* 11/10/2026 04:46 (Claude, Dialogue n° 762 de JaxX : « si on survole l'avatar du chat, il s'agrandit un peu et il réduit l'opacité
   des messages de Jarvis à 0,2 ») : au survol de l'avatar de l'en-tête du panneau ouvert, l'avatar grossit légèrement et
   les messages de Jarvis (accueil et réponses) passent à 0,2 d'opacité ; les messages du visiteur ne changent pas. — A VALIDER PAR JaxX */
.jarvis_entete .jarvis_avatar
{
    position: relative;
    z-index: 1;
    transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}

.jarvis_entete .jarvis_avatar:hover
{
    transform: scale(1.2);
}

/* 11/10/2026 04:59 (Claude, Dialogue n° 767 de JaxX : « mettre en transparence aussi tous les messages qu'il y a à l'intérieur du chat ») :
   tous les éléments du fil (messages de Jarvis, du visiteur, accueil) passent à 0,2 d'opacité. Anciens sélecteurs (n° 762) :
.jarvis_panneau .jarvis_bulle_agent,
.jarvis_panneau .jarvis_accueil
.jarvis_panneau:has(.jarvis_entete .jarvis_avatar:hover) .jarvis_bulle_agent,
.jarvis_panneau:has(.jarvis_entete .jarvis_avatar:hover) .jarvis_accueil
*/
.jarvis_panneau .jarvis_fil > *
{
    transition: opacity 0.4s ease;
}

.jarvis_panneau:has(.jarvis_entete .jarvis_avatar:hover) .jarvis_fil > *
{
    opacity: 0.2;
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_entete .jarvis_avatar,
    .jarvis_panneau .jarvis_fil > *
    {
        transition: none;
    }
}
/* JARVIS_AVATAR_SURVOL_762 ======================================== */


/* JARVIS_AVATAR_TRANSITION_932 ==================================== */
/* 13/10/2026 (Antigravity, Dialogue n° 932 de JaxX : « Il doit y avoir une transition pour les images de Jarvis ») :
 * Transition animée fluide lors de la permutation des avatars et images de Jarvis au changement de thème. */
.jarvis_avatar img,
.jarvis_declencheur_avatar img
{
    transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.25s ease, filter 0.25s ease;
    will-change: transform, opacity;
}

.jarvis_image_transition_sortie
{
    transform: scale(0.68) rotate(-8deg) !important;
    opacity: 0 !important;
    filter: blur(4px) !important;
    transition: transform 0.2s cubic-bezier(0.4, 0, 1, 1), opacity 0.2s ease, filter 0.2s ease !important;
}

.jarvis_image_transition_entree
{
    animation: jarvis_avatar_entree 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards !important;
}

@keyframes jarvis_avatar_entree
{
    0%
    {
        transform: scale(1.22) rotate(6deg);
        opacity: 0;
        filter: blur(4px);
    }
    100%
    {
        transform: scale(1) rotate(0deg);
        opacity: 1;
        filter: blur(0);
    }
}
/* JARVIS_AVATAR_TRANSITION_932 ==================================== */

/* JARVIS_BOUTON_JARVIS_942_963 ==================================== */
/* 13/10/2026 (Antigravity, Dialogues n° 942 & n° 963 de JaxX :
   - Avatar grand modèle (buste complet) émergeant au-dessus du bouton bleu ;
   - Largeur optimisée et compactée : réduction des marges superflues (bulle à 8px, avatar à 28px, texte à 88px) ;
   - Icône de discussion à gauche tournée (queue orientée vers Jarvis / vers la droite) ;
   - En état ouvert, transformation en croix fermer de la même couleur que le texte). */
@media (min-width: 901px)
{
    .jarvis .jarvis_bouton
    {
        position: relative !important;
        overflow: visible !important;
        padding-left: 88px !important;
        padding-right: 14px !important;
        min-height: 42px !important;
        display: inline-flex !important;
        align-items: center !important;
    }

    .jarvis:not([data-ouvert="1"])
    {
        right: 0 !important;
        bottom: 0 !important;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton
    {
        right: 0 !important;
        bottom: 0 !important;
        border-width: 1px 0 0 1px !important;
        border-radius: min(var(--rayon_bouton, 16px), 24px) 0 0 0 !important;
    }

    /* Icône de discussion à gauche de l'avatar : queue tournée vers Jarvis (n° 963) */
    .jarvis .jarvis_bouton .jarvis_icone_bulle
    {
        position: absolute !important;
        top: 50% !important;
        left: 8px !important;
        transform: translateY(-50%) !important;
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        width: 20px !important;
        height: 20px !important;
        margin: 0 !important;
        z-index: 4 !important;
        color: inherit !important;
    }

    .jarvis .jarvis_bouton .jarvis_icone_svg_ouvrir
    {
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        color: inherit !important;
        transform: scaleX(-1) !important; /* Rotation miroir : queue orientée vers Jarvis */
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_icone_svg_fermer
    {
        display: none !important;
    }

    /* Avatar grand modèle compacté émergeant au-dessus du bouton bleu */
    .jarvis .jarvis_bouton .jarvis_avatar
    {
        position: absolute !important;
        left: 28px !important;
        bottom: 0 !important;
        top: auto !important;
        width: 58px !important;
        height: 74px !important;
        overflow: visible !important;
        border-radius: 0 !important;
        background: transparent !important;
        pointer-events: none !important;
        transform-origin: 50% 100% !important;
        z-index: 3 !important;
        transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1) !important;
    }

    .jarvis .jarvis_bouton .jarvis_avatar img
    {
        display: block !important;
        width: 100% !important;
        height: 100% !important;
        object-fit: contain !important;
        object-position: 50% 100% !important;
        transform: none !important;
        filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.4)) !important;
    }

    .jarvis .jarvis_bouton:hover .jarvis_avatar,
    .jarvis .jarvis_bouton:focus-visible .jarvis_avatar
    {
        transform: scale(1.08) translateY(-2px) !important;
    }

    /* État ouvert : bouton solidaire du flanc gauche du volet */
    .jarvis[data-ouvert="1"] .jarvis_bouton
    {
        display: inline-flex !important;
        position: absolute !important;
        right: 100% !important;
        bottom: 0 !important;
        z-index: 1001 !important;
        border-width: 1px 0 0 1px !important;
        border-radius: min(var(--rayon_bouton, 16px), 24px) 0 0 0 !important;
        padding-left: 88px !important;
        padding-right: 14px !important;
        min-height: 42px !important;
    }

    .jarvis[data-ouvert="1"] .jarvis_icone_svg_ouvrir
    {
        display: none !important;
    }

    /* Icône fermer (croix) : STRICTEMENT de la même couleur que le texte (currentColor / hérité) */
    .jarvis[data-ouvert="1"] .jarvis_icone_svg_fermer
    {
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        color: currentColor !important;
        transform: none !important;
    }
}

@media (max-width: 900px)
{
    .jarvis:not([data-ouvert="1"]) .jarvis_bouton
    {
        position: relative !important;
        padding-left: 82px !important;
        padding-right: 12px !important;
        min-height: 40px !important;
        overflow: visible !important;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton .jarvis_icone_bulle
    {
        position: absolute !important;
        top: 50% !important;
        left: 6px !important;
        transform: translateY(-50%) !important;
        display: inline-flex !important;
        width: 18px !important;
        height: 18px !important;
        z-index: 4 !important;
        color: inherit !important;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton .jarvis_icone_svg_ouvrir
    {
        transform: scaleX(-1) !important;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton .jarvis_avatar
    {
        position: absolute !important;
        left: 26px !important;
        bottom: 0 !important;
        top: auto !important;
        width: 52px !important;
        height: 66px !important;
        overflow: visible !important;
        border-radius: 0 !important;
        background: transparent !important;
        pointer-events: none !important;
        transform-origin: 50% 100% !important;
        z-index: 3 !important;
    }

    .jarvis:not([data-ouvert="1"]) .jarvis_bouton .jarvis_avatar img
    {
        display: block !important;
        width: 100% !important;
        height: 100% !important;
        object-fit: contain !important;
        object-position: 50% 100% !important;
        transform: none !important;
        filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4)) !important;
    }
}
/* JARVIS_BOUTON_JARVIS_942_963 ==================================== */


/* JARVIS_AUDIO_SPECTROGRAMME_948 ================================== */
/* 13/10/2026 (Antigravity, Dialogue n° 948 de JaxX :
   - Un seul icône : haut-parleur au repos, égaliseur/spectrogramme animé en cours de lecture ;
   - Surbrillance soignée du message pendant la lecture vocale). */
.jarvis_ecouter
{
    position: relative;
    overflow: hidden;
}

.jarvis_ecouter .jarvis_spectrogramme_vocal
{
    margin-left: 0 !important;
    opacity: 1 !important;
    height: 12px !important;
    gap: 2px !important;
    display: inline-flex !important;
    align-items: flex-end !important;
    pointer-events: none !important;
}

.jarvis_ecouter .jarvis_spectrogramme_vocal span
{
    width: 2px !important;
    background: var(--accent) !important;
    box-shadow: 0 0 4px var(--accent_halo) !important;
}

/* Surbrillance du message en cours de lecture vocale */
.jarvis_bulle.jarvis_bulle_audio_active
{
    border-color: var(--accent) !important;
    box-shadow: 0 0 16px var(--accent_halo), 0 2px 10px rgba(0, 0, 0, 0.3) !important;
    transition: border-color 0.3s ease, box-shadow 0.3s ease !important;
}

/* .jarvis_bulle.jarvis_bulle_audio_active p,
.jarvis_bulle.jarvis_bulle_audio_active li
{
    color: var(--encre_primaire) !important;
    text-shadow: 0 0 2px var(--accent_halo) !important;
} */
/* 13/10/2026 03:58 (Claude, Dialogue n° 1049 de JaxX) : le texte de la bulle lue garde sa couleur normale ; seuls le
   cadre et le halo de la bulle signalent la lecture */
.jarvis_bulle.jarvis_bulle_audio_active p,
.jarvis_bulle.jarvis_bulle_audio_active li
{
    text-shadow: 0 0 2px var(--accent_halo);
}
/* JARVIS_AUDIO_SPECTROGRAMME_948 ================================== */

/* JARVIS_FONDS_1225 =============================================== */
/* 14/10/2026 01:15 (Claude, Dialogue n° 1225 de JaxX : « je voudrais que ce soit un background images et que tu changes
 * simplement la valeur de URL pour que la transition soit plus douce tu peux mettre un point 8 sur le filigrane et un
 * point 6 sur la miniature ») : le filigrane et les miniatures de Jarvis sont des images de fond. Au changement de thème,
 * theme.js ne change que les variables --jarvis_filigrane_url et --jarvis_avatar_url de #jarvis ; le navigateur fait
 * le fondu enchaîné entre l'ancienne et la nouvelle image (Chrome, Edge, Safari ; Firefox bascule sans fondu).
 * Remplace la bague du n° 836 (theme.js ne pose plus ses classes) et la permutation des img du n° 932. */
.jarvis_filigrane
{
    display: block;
    top: 58px;
    bottom: 0;
    left: 0;
    right: 0;
    width: auto;
    max-width: none;
    height: auto;
    margin: 0;
    transform: none;
    background-image: var(--jarvis_filigrane_url, none);
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center bottom;
    transition: background-image 0.8s ease-in-out, opacity 0.35s ease, filter 0.35s ease;
}

/* Cadrage des anciennes img : zoom léger calé en haut (n° 540) */
.jarvis_avatar_fond
{
    display: block;
    width: 100%;
    height: 100%;
    background-image: var(--jarvis_avatar_url, none);
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center center;
    transform: scale(1.12);
    transform-origin: 55% 0%;
    transition: background-image 0.6s ease-in-out, transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), filter 0.25s ease;
}

/* Bouton : Jarvis entier, calé en bas, avec son ombre portée (n° 942 / 963) */
.jarvis .jarvis_bouton .jarvis_avatar_fond
{
    background-size: contain;
    background-position: 50% 100%;
    transform: none;
    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));
}

@media (min-width: 901px)
{
    .jarvis .jarvis_bouton .jarvis_avatar_fond
    {
        filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.4));
    }
}

@media (max-width: 900px)
{
    .jarvis:not([data-ouvert="1"]) .jarvis_bouton .jarvis_avatar_fond
    {
        filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4));
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_filigrane,
    .jarvis_avatar_fond
    {
        transition: none;
    }
}
/* JARVIS_FONDS_1225 =============================================== */

/* JARVIS_MEDIAS_1257 ============================================== */
/* 14/10/2026 02:13 (Claude, Dialogue n° 1257 de JaxX) : liens en nouvel onglet, images du site, cartes d'aperçu
   et visionneuse floutée (règle 14, n° 1233). Ajout seul, variables du thème uniquement. — A VALIDER PAR JaxX */

.jarvis_bulle .jarvis_lien_exterieur::after
{
    content: "\2197";
    display: inline-block;
    margin-left: 2px;
    font-size: 0.8em;
    text-decoration: none;
}

/* Images de la réponse */
.jarvis_images
{
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 6px;
    margin: 8px 0 4px;
}

.jarvis_images_seule
{
    grid-template-columns: minmax(0, 1fr);
}

.jarvis_media_declencheur
{
    display: block;
    width: 100%;
    margin: 0;
    padding: 0;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_carte, 6px);
    background: var(--fond_second);
    overflow: hidden;
    cursor: zoom-in;
    line-height: 0;
}

.jarvis_media_declencheur img
{
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 10;
    object-fit: cover;
    transition: transform var(--duree, 0.25s) var(--easing, ease);
}

.jarvis_images_seule .jarvis_media_declencheur img
{
    aspect-ratio: auto;
    max-height: 260px;
}

.jarvis_media_declencheur:hover img
{
    transform: scale(1.03);
}

.jarvis_media_declencheur:focus-visible
{
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

/* 20/10/2026 16:55 (règle n° 29) : limite atteinte, compte à rebours, lien pour écrire et rappel */
.jarvis_quota
{
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 6px 12px;
}

.jarvis_quota_compteur
{
    font-variant-numeric: tabular-nums;
    color: var(--accent);
}

.jarvis_quota_liens
{
    display: inline-flex;
    flex-wrap: wrap;
    gap: 6px;
}

.jarvis_quota_lien
{
    display: inline-block;
    padding: 3px 10px;
    border: 1px solid var(--accent);
    border-radius: 999px;
    background: transparent;
    color: var(--accent);
    font: inherit;
    font-size: 0.92em;
    text-decoration: none;
    cursor: pointer;
}

.jarvis_quota_lien:hover,
.jarvis_quota_lien:focus-visible
{
    background: var(--accent);
    color: var(--fond_second);
}

/* Cartes d'aperçu des pages du site */
.jarvis_apercus
{
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin: 8px 0 4px;
}

.jarvis_apercu
{
    display: grid;
    grid-template-columns: 96px minmax(0, 1fr);
    align-items: stretch;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_carte, 6px);
    background: color-mix(in srgb, var(--fond_second) 70%, transparent);
    overflow: hidden;
    transition: border-color var(--duree, 0.25s) var(--easing, ease);
}

.jarvis_apercu:hover,
.jarvis_apercu:focus-within
{
    border-color: var(--accent);
}

.jarvis_apercu_sans_visuel
{
    grid-template-columns: minmax(0, 1fr);
}

.jarvis_apercu .jarvis_apercu_visuel
{
    border: 0;
    border-radius: 0;
    height: 100%;
}

/* 20/10/2026 16:20 (directive de JaxX) : visuel d'une carte = lien vers la page liée, mêmes dimensions que l'ancien bouton */
.jarvis_apercu .jarvis_apercu_visuel_lien
{
    display: block;
    margin: 0;
    padding: 0;
    background: var(--fond_second);
    overflow: hidden;
    cursor: pointer;
    line-height: 0;
}

.jarvis_apercu .jarvis_apercu_visuel_lien img
{
    display: block;
    width: 100%;
    object-fit: cover;
    transition: transform var(--duree, 0.25s) var(--easing, ease);
}

.jarvis_apercu .jarvis_apercu_visuel_lien:hover img
{
    transform: scale(1.03);
}

.jarvis_apercu .jarvis_apercu_visuel img
{
    height: 100%;
    min-height: 72px;
    aspect-ratio: auto;
    object-position: 75% 50%; /* visuels og du site : titre à gauche, photo à droite */
}

.jarvis_bulle .jarvis_apercu_lien
{
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    padding: 8px 10px;
    color: var(--encre);
    text-decoration: none;
}

.jarvis_bulle .jarvis_apercu_lien:focus-visible
{
    outline: 2px solid var(--accent);
    outline-offset: -2px;
}

.jarvis_apercu_titre
{
    font-weight: 600;
    font-size: var(--texte_s, 0.875rem);
    line-height: 1.3;
    color: var(--accent);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.jarvis_apercu_description
{
    font-size: var(--texte_xs, 0.75rem);
    line-height: 1.35;
    color: var(--encre_second);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.jarvis_apercu_domaine
{
    font-size: var(--texte_xs, 0.75rem);
    color: var(--encre_second);
    opacity: 0.8;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Visionneuse (ajoutée à body, au-dessus du panneau du tchat) */
.jarvis_visionneuse
{
    position: fixed;
    inset: 0;
    z-index: 10050;
    display: grid;
    grid-template-columns: 56px minmax(0, 1fr) 56px;
    grid-template-rows: 48px minmax(0, 1fr) auto;
    grid-template-areas:
        "compteur compteur fermer"
        "precedent figure suivant"
        "bandeau bandeau bandeau";
    align-items: center;
    background: rgba(0, 0, 0, 0.62);
    background: color-mix(in srgb, var(--surface, #000) 62%, transparent);
    color: var(--encre, #fff);
    font-family: var(--police_texte, inherit);
    animation: jarvis_visionneuse_apparition var(--duree, 0.25s) var(--easing, ease);
}

@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)))
{
    .jarvis_visionneuse
    {
        -webkit-backdrop-filter: blur(12px) saturate(120%);
        backdrop-filter: blur(12px) saturate(120%);
    }
}

.jarvis_visionneuse[hidden],
.jarvis_visionneuse [hidden]
{
    display: none !important;
}

html.jarvis_visionneuse_ouverte,
html.jarvis_visionneuse_ouverte body
{
    overflow: hidden;
}

@keyframes jarvis_visionneuse_apparition
{
    from
    {
        opacity: 0;
    }
    to
    {
        opacity: 1;
    }
}

.jarvis_visionneuse_compteur
{
    grid-area: compteur;
    justify-self: start;
    padding: 0 16px;
    font-size: var(--texte_s, 0.875rem);
    color: var(--encre_second, #ddd);
}

.jarvis_visionneuse_bouton
{
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    margin: 0;
    padding: 0;
    border: 1px solid var(--ligne, rgba(255, 255, 255, 0.3));
    border-radius: var(--rayon_bouton, 50%);
    background: color-mix(in srgb, var(--surface, #000) 75%, transparent);
    color: var(--encre, #fff);
    font: 400 28px / 1 var(--police_texte, sans-serif);
    cursor: pointer;
    transition: border-color var(--duree, 0.25s) var(--easing, ease), color var(--duree, 0.25s) var(--easing, ease);
}

.jarvis_visionneuse_bouton:hover,
.jarvis_visionneuse_bouton:focus-visible
{
    border-color: var(--accent);
    color: var(--accent);
    outline: none;
    box-shadow: 0 0 0 3px var(--accent_halo, transparent);
}

.jarvis_visionneuse_fermer
{
    grid-area: fermer;
    justify-self: end;
    margin-right: 8px;
}

.jarvis_visionneuse_precedent
{
    grid-area: precedent;
    justify-self: center;
}

.jarvis_visionneuse_suivant
{
    grid-area: suivant;
    justify-self: center;
}

.jarvis_visionneuse_figure
{
    grid-area: figure;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    height: 100%;
    min-height: 0;
    margin: 0;
    padding: 8px 0;
}

.jarvis_visionneuse_image
{
    display: block;
    max-width: 100%;
    max-height: calc(100% - 40px);
    object-fit: contain;
    border-radius: var(--rayon_carte, 6px);
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.45);
}

.jarvis_visionneuse_legende
{
    max-width: 60ch;
    font-size: var(--texte_s, 0.875rem);
    text-align: center;
    color: var(--encre, #fff);
}

.jarvis_visionneuse_bandeau
{
    grid-area: bandeau;
    display: flex;
    justify-content: safe center;
    gap: 6px;
    padding: 8px 16px 14px;
    overflow-x: auto;
    scrollbar-width: thin;
}

.jarvis_visionneuse_miniature
{
    flex: 0 0 auto;
    width: 64px;
    height: 44px;
    margin: 0;
    padding: 0;
    border: 2px solid transparent;
    border-radius: var(--rayon_input, 4px);
    background: var(--fond_second, #222);
    overflow: hidden;
    opacity: 0.6;
    cursor: pointer;
    transition: opacity var(--duree, 0.25s) var(--easing, ease), border-color var(--duree, 0.25s) var(--easing, ease);
}

.jarvis_visionneuse_miniature img
{
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.jarvis_visionneuse_miniature:hover,
.jarvis_visionneuse_miniature:focus-visible,
.jarvis_visionneuse_miniature_active
{
    opacity: 1;
    border-color: var(--accent);
    outline: none;
}

@media (max-width: 600px)
{
    .jarvis_apercu
    {
        grid-template-columns: 76px minmax(0, 1fr);
    }

    .jarvis_visionneuse
    {
        grid-template-columns: 0 minmax(0, 1fr) 0;
    }

    /* au téléphone : flèches posées sur l'image, le glissement du doigt reste possible */
    .jarvis_visionneuse_precedent,
    .jarvis_visionneuse_suivant
    {
        position: fixed;
        top: 50%;
        transform: translateY(-50%);
        z-index: 1;
        width: 40px;
        height: 40px;
        font-size: 24px;
    }

    .jarvis_visionneuse_precedent
    {
        left: 6px;
    }

    .jarvis_visionneuse_suivant
    {
        right: 6px;
    }

    .jarvis_visionneuse_figure
    {
        padding: 4px 8px;
    }

    .jarvis_visionneuse_miniature
    {
        width: 52px;
        height: 38px;
    }
}

@media (prefers-reduced-motion: reduce)
{
    .jarvis_visionneuse
    {
        animation: none;
    }

    .jarvis_media_declencheur img,
    .jarvis_apercu,
    .jarvis_visionneuse_bouton,
    .jarvis_visionneuse_miniature
    {
        transition: none;
    }

    .jarvis_media_declencheur:hover img
    {
        transform: none;
    }
}
/* JARVIS_MEDIAS_1257 ============================================== */

/* JARVIS_REPONDRE_1844 ============================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1844) : bouton « Répondre » sur chaque message, « Supprimer » pour GOD,
   citation du message visé (verre fumé léger, variables du tchat) */
.jarvis_bulle_actions
{
    display: inline-flex;
    align-items: center;
    gap: 8px; /* Séparation nette demandée par JaxX n° 1968 : « séparer un petit peu » */
    margin-left: auto;
}

.jarvis_action
{
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 24px;
    height: 24px;
    padding: 0 4px;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_p, 2px);
    background: transparent;
    color: var(--encre_second);
    font-size: var(--texte_xs);
    line-height: 1;
    cursor: pointer;
    transition: all 0.2s ease;
}

.jarvis_action:hover,
.jarvis_action:focus-visible
{
    border-color: var(--accent);
    color: var(--accent);
}

.jarvis_action_supprimer:hover,
.jarvis_action_supprimer:focus-visible
{
    border-color: #ef4444;
    color: #ef4444;
}

/* 26/10/2026 (Directive n° 1973 de JaxX) : agencement de l'en-tête (voix à gauche, répondre à droite) */
.jarvis_bulle_meta_gauche
{
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}

.jarvis_bulle_meta_droite
{
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-left: auto;
}

.jarvis_bulle_auteur
{
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* 26/10/2026 (Directive n° 1973 de JaxX) : bouton supprimer en bas à droite du message en float */
.jarvis_action_supprimer_flottant
{
    float: right;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    padding: 0;
    margin: 4px 0 2px 8px;
    clear: both;
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: var(--rayon_p, 4px);
    background: rgba(255, 255, 255, 0.04);
    color: rgba(255, 255, 255, 0.45);
    cursor: pointer;
    transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
}

.jarvis_action_supprimer_flottant:hover,
.jarvis_action_supprimer_flottant:focus-visible
{
    border-color: rgba(239, 68, 68, 0.65);
    color: #ef4444;
    background: rgba(239, 68, 68, 0.14);
    box-shadow: 0 0 10px rgba(239, 68, 68, 0.3);
    transform: translateY(-1px);
}

.jarvis_action_icone_svg
{
    display: block;
    width: 13px;
    height: 13px;
    flex-shrink: 0;
}

.jarvis_cite,
.jarvis_citation_cours
{
    display: block;
    width: 100%;
    margin: 0 0 6px;
    padding: 4px 8px;
    border: 0;
    border-left: 3px solid var(--accent);
    border-radius: var(--rayon_p, 2px);
    background: rgba(255, 255, 255, 0.08);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    color: inherit;
    font-size: var(--texte_xs);
    text-align: left;
    opacity: 0.9;
}

.jarvis_cite
{
    cursor: pointer;
}

.jarvis_citation_cours
{
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}

.jarvis_citation_cours > span
{
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.jarvis_bulle_visee
{
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}
/* 23/10/2026 (Antigravity & Claude #7, n° 1850 / 1858 JaxX) : boîte de confirmation verre fumé et toast de feedback */
/* 26/10/2026 (Dialogue n° 1973 de JaxX) : correction design boutons confirmation (largeur auto, nowrap, Allman) */
.jarvis_bulle_confirmation_active
{
    position: relative !important;
    min-height: 125px !important;
    overflow: hidden !important;
}

.jarvis_confirmer
{
    position: absolute;
    inset: 0;
    z-index: 25;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    padding: 14px 16px;
    border-radius: inherit;
    background: rgba(12, 16, 26, 0.96);
    -webkit-backdrop-filter: blur(14px);
    backdrop-filter: blur(14px);
    border: 1px solid rgba(239, 68, 68, 0.65);
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.75), inset 0 1px 0 rgba(255, 255, 255, 0.12);
    color: #f1f5f9;
    text-align: center;
    box-sizing: border-box;
    animation: jarvis_confirmer_popin 0.22s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

@keyframes jarvis_confirmer_popin
{
    from
    {
        opacity: 0;
        transform: scale(0.96);
    }
    to
    {
        opacity: 1;
        transform: scale(1);
    }
}

.jarvis_confirmer_entete
{
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin-bottom: 4px;
}

.jarvis_confirmer_icone
{
    font-size: 16px;
    color: #ef4444;
}

.jarvis_confirmer_titre
{
    font-size: var(--texte_sm, 13px);
    font-weight: 600;
    color: #ffffff;
    letter-spacing: 0.01em;
}

.jarvis_confirmer_texte
{
    margin: 0 0 12px;
    font-size: var(--texte_xs, 11px);
    color: rgba(255, 255, 255, 0.82);
    line-height: 1.35;
    max-width: 320px;
}

.jarvis_confirmer_actions
{
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    width: 100%;
}

.jarvis_confirmer .jarvis_action,
.jarvis_action_annuler,
.jarvis_action_supprimer_valider
{
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: auto !important;
    min-width: 90px !important;
    max-width: none !important;
    height: 32px !important;
    min-height: 32px !important;
    padding: 0 16px !important;
    font-size: var(--texte_xs, 12px) !important;
    font-weight: 600 !important;
    line-height: 1 !important;
    white-space: nowrap !important;
    word-break: normal !important;
    box-sizing: border-box !important;
    border-radius: var(--rayon_p, 4px) !important;
    cursor: pointer !important;
    transition: background 0.15s, border-color 0.15s, box-shadow 0.15s, transform 0.1s !important;
}

.jarvis_action_annuler
{
    background: rgba(255, 255, 255, 0.1) !important;
    border: 1px solid rgba(255, 255, 255, 0.3) !important;
    color: #f1f5f9 !important;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25) !important;
}

.jarvis_action_annuler:hover,
.jarvis_action_annuler:focus-visible
{
    background: rgba(255, 255, 255, 0.2) !important;
    border-color: rgba(255, 255, 255, 0.5) !important;
    color: #ffffff !important;
}

.jarvis_action_supprimer_valider
{
    background: linear-gradient(135deg, #ef4444, #dc2626) !important;
    border: 1px solid #dc2626 !important;
    color: #ffffff !important;
    box-shadow: 0 2px 10px rgba(239, 68, 68, 0.45) !important;
}

.jarvis_action_supprimer_valider:hover,
.jarvis_action_supprimer_valider:focus-visible
{
    background: linear-gradient(135deg, #f87171, #ef4444) !important;
    box-shadow: 0 4px 16px rgba(239, 68, 68, 0.65) !important;
    transform: translateY(-1px);
}

.jarvis_action_supprimer_valider:disabled,
.jarvis_action_annuler:disabled
{
    opacity: 0.6 !important;
    cursor: not-allowed !important;
    transform: none !important;
}

/* 26/10/2026 (Dialogue n° 1973 de JaxX) :
   - En-tête : icône vocale tout en haut à gauche, bouton répondre tout à droite
   - Corps : bouton supprimer en bas à droite en float */
.jarvis_bulle
{
    display: flow-root;
}

.jarvis_bulle_meta_gauche
{
    display: inline-flex;
    align-items: center;
    gap: 8px;
}

.jarvis_bulle_meta_gauche .jarvis_ecouter
{
    flex-shrink: 0;
}

.jarvis_action_supprimer_flottant
{
    float: right;
    clear: both;
    margin: 6px 0 2px 8px;
    width: 24px;
    height: 24px;
    min-width: 24px;
    padding: 0;
    border: 1px solid var(--ligne, rgba(255, 255, 255, 0.2));
    border-radius: var(--rayon_p, 4px);
    background: transparent;
    color: var(--encre_second, rgba(255, 255, 255, 0.5));
    font-size: var(--texte_xs, 11px);
    cursor: pointer;
    transition: color 0.15s, border-color 0.15s, background 0.15s, transform 0.1s;
}

.jarvis_action_supprimer_flottant:hover,
.jarvis_action_supprimer_flottant:focus-visible
{
    border-color: #ef4444;
    background: rgba(239, 68, 68, 0.15);
    color: #ef4444;
    transform: scale(1.05);
}

/* Toast de retour feedback (centré en haut de conversation) */
.jarvis_retour
{
    position: absolute;
    top: 14px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 1000;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 8px 18px;
    border-radius: var(--rayon_m, 6px);
    background: rgba(10, 26, 20, 0.94);
    -webkit-backdrop-filter: blur(14px);
    backdrop-filter: blur(14px);
    border: 1px solid rgba(16, 185, 129, 0.5);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.55), 0 0 16px rgba(16, 185, 129, 0.3);
    color: #ecfdf5;
    font-size: var(--texte_xs, 12px);
    font-weight: 500;
    white-space: nowrap;
    animation: jarvis_toast_entree 0.28s cubic-bezier(0.16, 1, 0.3, 1) forwards;
    pointer-events: auto;
}

.jarvis_retour_echec
{
    background: rgba(32, 12, 16, 0.94);
    border-color: rgba(239, 68, 68, 0.5);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.55), 0 0 16px rgba(239, 68, 68, 0.3);
    color: #fef2f2;
}

.jarvis_retour_icone
{
    font-weight: 700;
    font-size: 13px;
}

.jarvis_retour_succes .jarvis_retour_icone
{
    color: #10b981;
}

.jarvis_retour_echec .jarvis_retour_icone
{
    color: #ef4444;
}

.jarvis_retour_sortie
{
    animation: jarvis_toast_sortie 0.25s ease-in forwards !important;
}

@keyframes jarvis_toast_entree
{
    from
    {
        opacity: 0;
        transform: translate(-50%, -12px) scale(0.95);
    }
    to
    {
        opacity: 1;
        transform: translate(-50%, 0) scale(1);
    }
}

@keyframes jarvis_toast_sortie
{
    from
    {
        opacity: 1;
        transform: translate(-50%, 0) scale(1);
    }
    to
    {
        opacity: 0;
        transform: translate(-50%, -10px) scale(0.95);
    }
}

/* Disparition fluide de la bulle supprimée */
.jarvis_bulle_supprimee
{
    opacity: 0 !important;
    transform: scale(0.94) translateY(-10px) !important;
    max-height: 0 !important;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    border-width: 0 !important;
    overflow: hidden !important;
    transition: all 0.35s cubic-bezier(0.16, 1, 0.3, 1) !important;
}
/* JARVIS_VIDEO_1851 ================================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1851) : mini-lecteur YouTube (GOD) en verre fumé léger, bouton pour ouvrir dans YouTube */
.jarvis_video
{
    margin: 8px 0;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_p, 2px);
    background: rgba(0, 0, 0, 0.35);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    overflow: hidden;
}

.jarvis_video_ecran
{
    position: relative;
    aspect-ratio: 16 / 9;
    background: #000;
}

.jarvis_video_ecran iframe,
.jarvis_video_lecture
{
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    padding: 0;
    background: transparent;
    cursor: pointer;
}

.jarvis_video_lecture img
{
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.jarvis_video_triangle
{
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 52px;
    height: 36px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 10px;
    background: rgba(220, 38, 38, 0.92);
    color: #fff;
    font-size: 18px;
}

.jarvis_video_pied
{
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 6px 10px;
    padding: 6px 8px;
    font-size: var(--texte_xs);
}

.jarvis_video_titre
{
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.jarvis_video_ouvrir
{
    flex: 0 0 auto;
    padding: 3px 8px;
    border: 1px solid var(--ligne);
    border-radius: var(--rayon_p, 2px);
    color: var(--accent);
    text-decoration: none;
}

.jarvis_video_ouvrir:hover,
.jarvis_video_ouvrir:focus-visible
{
    border-color: var(--accent);
}
/* JARVIS_VIDEO_1851 ================================================ */

/* JARVIS_DEFILEMENT_1856 ===========================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1856) : « Jarvis rédige » fixe en bas, sans fond (voile de verre fumé à peine visible),
   et bouton fixe « Nouvelle réponse » quand le visiteur lit plus haut */
.jarvis_redige.jarvis_redige_hypnotique
{
    position: sticky;
    bottom: 4px;
    z-index: 3;
    background: rgba(0, 0, 0, 0.1);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    box-shadow: none;
}

.jarvis_nouveau
{
    display: block;
    position: relative;
    z-index: 4;
    width: fit-content;
    margin: -38px auto 8px;
    padding: 6px 14px;
    border: 1px solid var(--accent);
    border-radius: var(--rayon_carte, 2px);
    background: rgba(0, 0, 0, 0.45);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
    color: var(--accent);
    font-size: var(--texte_xs);
    cursor: pointer;
}

.jarvis_nouveau[hidden]
{
    display: none;
}
/* JARVIS_DEFILEMENT_1856 =========================================== */

/* JARVIS_REPONDRE_1844 ============================================ */

/* JARVIS_CONFIRMER_1858 ============================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1858) : boîte de confirmation sous l'en-tête de la bulle
   26/10/2026 (Antigravity, Dialogue anunaqi n° 1973) : unifié dans le bloc .jarvis_confirmer principal ci-dessus */
/* JARVIS_CONFIRMER_1858 ============================================ */

/* JARVIS_PORTEE_1862 ===============================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1862) : bouton « Toutes les images du chat / Images de ce message » de la visionneuse */
.jarvis_visionneuse_bouton.jarvis_visionneuse_portee
{
    position: absolute;
    top: 12px;
    left: 50%;
    transform: translateX(-50%);
    width: auto;
    height: auto;
    padding: 6px 14px;
    border-radius: 999px;
    font-size: 13px;
    line-height: 1.2;
    white-space: nowrap;
    background: rgba(0, 0, 0, 0.45);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    z-index: 3;
}

.jarvis_visionneuse_bouton.jarvis_visionneuse_portee[hidden]
{
    display: none;
}
/* JARVIS_PORTEE_1862 =============================================== */

/* JARVIS_ACTION_GOD_1866 ===========================================
   23/10/2026 (Claude #7, Dialogue anunaqi n° 1866) : carte « Action proposée » sous la réponse de Jarvis (GOD), verre fumé */
.jarvis_action_god
{
    margin-top: 10px;
    padding: 10px 12px;
    border: 1px solid var(--accent);
    border-radius: var(--rayon_carte, 2px);
    background: linear-gradient(135deg, rgba(255, 255, 255, 0.06), rgba(0, 0, 0, 0.35));
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
}

.jarvis_action_god_titre
{
    display: block;
    margin-bottom: 6px;
    color: var(--accent);
    font-size: var(--texte_xs);
}

.jarvis_action_god_ligne
{
    margin: 2px 0;
    font-size: var(--texte_xs);
    overflow-wrap: anywhere;
}

.jarvis_action_god_statut
{
    margin: 6px 0 0;
    font-size: var(--texte_xs);
    opacity: 0.85;
}

.jarvis_action_god_boutons
{
    display: flex;
    gap: 8px;
    justify-content: flex-end;
    margin-top: 8px;
}

.jarvis_action_god_executee
{
    border-color: #4caf7a;
}

.jarvis_action_god_echec,
.jarvis_action_god_refusee,
.jarvis_action_god_expiree
{
    border-color: #c9704a;
    opacity: 0.85;
}
/* JARVIS_ACTION_GOD_1866 =========================================== */

/* JARVIS_TITRES_1984 ==============================================
   26/10/2026 (Directive n° 1984 de JaxX) : Rendu soigné des titres markdown (#, ##, ###) dans les bulles */
.jarvis_bulle_titre
{
    margin: 10px 0 4px 0;
    font-weight: 700;
    line-height: 1.35;
    color: inherit;
}

.jarvis_bulle_titre_h2
{
    font-size: 1.15em;
    border-bottom: 1px solid rgba(255, 255, 255, 0.12);
    padding-bottom: 2px;
}

.jarvis_bulle_titre_h3
{
    font-size: 1.05em;
    opacity: 0.95;
}

.jarvis_bulle_titre_h4
{
    font-size: 0.95em;
    opacity: 0.9;
}
/* JARVIS_TITRES_1984 ============================================== */

/* JARVIS_GOD_HTML_STATUT_734_745 ==================================
   04/11/2026 (Antigravity, Jarvis n° 734 & 745 de JaxX) :
   - Badge numéro #N réservé au rôle GOD sur les questions et réponses
   - Styles du HTML riche assaini (code, ol, li, u) dans les bulles de Jarvis
   - Indicateur animé sur la bulle de la question en cours de traitement */
.jarvis_bulle_numero
{
    display: inline-flex;
    align-items: center;
    padding: 1px 6px;
    border: 1px solid color-mix(in srgb, var(--accent) 48%, transparent);
    border-radius: var(--rayon_p, 4px);
    background: color-mix(in srgb, var(--accent) 14%, transparent);
    color: var(--accent);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.92em;
    font-weight: 600;
    line-height: 1.3;
    letter-spacing: 0.02em;
    user-select: all;
    flex-shrink: 0;
}

.jarvis_bulle_visiteur .jarvis_bulle_numero
{
    border-color: color-mix(in srgb, currentColor 38%, transparent);
    background: rgba(0, 0, 0, 0.24);
    color: inherit;
}

.jarvis_bulle ol
{
    margin: 0 0 8px;
    padding-left: 20px;
}

.jarvis_bulle ul:last-child,
.jarvis_bulle ol:last-child
{
    margin-bottom: 0;
}

.jarvis_bulle li
{
    margin-bottom: 3px;
}

.jarvis_bulle li:last-child
{
    margin-bottom: 0;
}

.jarvis_bulle code
{
    padding: 1px 5px;
    border: 1px solid color-mix(in srgb, var(--ligne) 75%, transparent);
    border-radius: var(--rayon_p, 3px);
    background: rgba(0, 0, 0, 0.24);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.9em;
}

.jarvis_bulle u
{
    text-underline-offset: 2px;
}

.jarvis_bulle_visiteur.jarvis_bulle_question_en_cours
{
    box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 55%, transparent), 0 4px 16px rgba(0, 0, 0, 0.18);
}

.jarvis_statut_question
{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 6px;
    padding: 3px 9px;
    border-radius: 999px;
    border: 1px solid color-mix(in srgb, currentColor 28%, transparent);
    background: rgba(0, 0, 0, 0.24);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    font-size: var(--texte_xs, 11px);
    line-height: 1.25;
    opacity: 0.95;
    transition: opacity 0.25s ease, transform 0.25s ease;
}

.jarvis_statut_question_termine
{
    opacity: 0;
    transform: translateY(-3px) scale(0.96);
    pointer-events: none;
}

.jarvis_statut_pastille
{
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
    background: currentColor;
}

.jarvis_statut_en_cours .jarvis_statut_pastille
{
    background: #34d399;
    box-shadow: 0 0 8px rgba(52, 211, 153, 0.85);
    animation: jarvis_pulsation_question 1.25s ease-in-out infinite;
}

.jarvis_statut_attente .jarvis_statut_pastille
{
    background: #fbbf24;
    box-shadow: 0 0 6px rgba(251, 191, 36, 0.65);
    animation: jarvis_pulsation_question 1.9s ease-in-out infinite;
}

@keyframes jarvis_pulsation_question
{
    0%, 100%
    {
        transform: scale(0.85);
        opacity: 0.65;
    }
    50%
    {
        transform: scale(1.25);
        opacity: 1;
    }
}
.jarvis_ref_message
{
    display: inline-flex;
    align-items: center;
    padding: 0 5px;
    margin: 0 1px;
    border: 1px solid color-mix(in srgb, var(--accent) 55%, transparent);
    border-radius: var(--rayon_p, 4px);
    background: color-mix(in srgb, var(--accent) 16%, transparent);
    color: var(--accent);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.9em;
    font-weight: 600;
    line-height: 1.35;
    cursor: pointer;
    transition: background 0.15s ease, transform 0.1s ease;
}

.jarvis_ref_message:hover,
.jarvis_ref_message:focus-visible
{
    background: color-mix(in srgb, var(--accent) 30%, transparent);
    transform: translateY(-1px);
}

/* 04/11/2026 (Jarvis n° 783 de JaxX) : styles riches pour titres, citations, surlignage, souligné, barré et séparateurs */
.jarvis_bulle_titre
{
    margin: 4px 0 6px;
    font-weight: 700;
    line-height: 1.3;
    color: var(--accent);
}

.jarvis_bulle_titre_h2,
.jarvis_bulle_titre_h3
{
    font-size: 1.04em;
}

.jarvis_bulle_titre_h4
{
    font-size: 0.97em;
}

.jarvis_bulle u
{
    text-decoration: underline;
    text-decoration-color: color-mix(in srgb, var(--accent) 75%, currentColor);
    text-underline-offset: 3px;
}

.jarvis_bulle s,
.jarvis_bulle del
{
    opacity: 0.72;
    text-decoration: line-through;
    text-decoration-color: color-mix(in srgb, var(--accent) 65%, currentColor);
}

.jarvis_bulle mark
{
    padding: 0 5px;
    border-radius: var(--rayon_p, 3px);
    background: color-mix(in srgb, var(--accent) 22%, transparent);
    color: inherit;
}

.jarvis_bulle blockquote,
.jarvis_bulle_citation
{
    margin: 6px 0 8px;
    padding: 6px 10px;
    border-left: 3px solid var(--accent);
    border-radius: 0 var(--rayon_p, 6px) var(--rayon_p, 6px) 0;
    background: color-mix(in srgb, var(--accent) 9%, rgba(0, 0, 0, 0.18));
    font-style: italic;
}

.jarvis_bulle hr,
.jarvis_bulle_separateur
{
    border: 0;
    height: 1px;
    margin: 8px 0;
    background: linear-gradient(90deg, color-mix(in srgb, var(--accent) 55%, transparent), transparent);
}

/* 04/11/2026 (Jarvis n° 787 & 795 de JaxX) : surlignage vocal mot à mot identique au reste du site (SURLIGNAGE_1884)
   - Phrase en cours : teinte douce de l'accent (--jarvis_surlignage_phrase via ::highlight(jarvis_phrase))
   - Mot prononcé    : accent plein + texte contrasté (--jarvis_surlignage_mot via ::highlight(jarvis_mot), priorité 1)
   - Repli CSS automatique sur .jarvis_phrase_active si le navigateur ne supporte pas CSS.highlights */
.jarvis_bulle
{
    --jarvis_surlignage_mot       : var(--accent, #2563eb);
    --jarvis_surlignage_mot_texte : var(--accent_texte, #ffffff);
    --jarvis_surlignage_phrase    : rgba(37, 99, 235, 0.22);
}

@supports (background-color: color-mix(in srgb, red 50%, transparent))
{
    .jarvis_bulle
    {
        --jarvis_surlignage_phrase : color-mix(in srgb, var(--jarvis_surlignage_mot) 22%, transparent);
    }
}

::highlight(jarvis_phrase)
{
    background-color: var(--jarvis_surlignage_phrase, rgba(37, 99, 235, 0.22));
}

::highlight(jarvis_mot)
{
    background-color: var(--jarvis_surlignage_mot, #2563eb);
    color: var(--jarvis_surlignage_mot_texte, #ffffff);
}

#jarvis:not([data-jarvis-hl-api="1"]) .jarvis_bulle.jarvis_bulle_audio_active .jarvis_bloc_audio_actif
{
    border-radius: var(--rayon_p, 3px);
    background: color-mix(in srgb, var(--accent_halo, rgba(255, 255, 255, 0.08)) 65%, transparent);
    box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent_halo, rgba(255, 255, 255, 0.08)) 65%, transparent);
    transition: background 0.22s ease, box-shadow 0.22s ease;
}

#jarvis:not([data-jarvis-hl-api="1"]) .jarvis_bulle.jarvis_bulle_audio_active .jarvis_phrase.jarvis_phrase_active
{
    background: color-mix(in srgb, var(--accent) 26%, transparent);
    color: inherit;
    border-radius: var(--rayon_p, 3px);
    padding: 1px 4px;
    margin: -1px -4px;
    box-shadow: 0 1px 0 0 color-mix(in srgb, var(--accent) 65%, transparent), 0 0 10px color-mix(in srgb, var(--accent) 24%, transparent);
    -webkit-box-decoration-break: clone;
    box-decoration-break: clone;
    transition: background 0.18s ease, box-shadow 0.18s ease;
}

/* 04/11/2026 (Jarvis n° 791 de JaxX) : bouton interactif « Rafraîchir la page » dans une réponse de Jarvis */
.jarvis_bloc_action_inline
{
    margin: 8px 0 4px;
}

.jarvis_bouton_recharger
{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 2px 2px;
    padding: 5px 12px;
    border: 1px solid color-mix(in srgb, var(--accent) 65%, transparent);
    border-radius: var(--rayon_p, 6px);
    background: color-mix(in srgb, var(--accent) 18%, rgba(0, 0, 0, 0.28));
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    color: var(--encre, inherit);
    font-family: inherit;
    font-size: 0.92em;
    font-weight: 600;
    line-height: 1.3;
    cursor: pointer;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
    transition: background 0.18s ease, border-color 0.18s ease, transform 0.14s ease, box-shadow 0.18s ease;
}

.jarvis_bouton_recharger:hover,
.jarvis_bouton_recharger:focus-visible
{
    border-color: var(--accent);
    background: color-mix(in srgb, var(--accent) 32%, rgba(0, 0, 0, 0.32));
    box-shadow: 0 0 12px var(--accent_halo, rgba(255, 255, 255, 0.15));
    transform: translateY(-1px);
}

.jarvis_bouton_recharger_icone
{
    display: inline-flex;
    align-items: center;
    color: var(--accent);
}

.jarvis_bouton_recharger_en_cours .jarvis_icone_recharger
{
    animation: jarvis_rotation_recharger 0.75s linear infinite;
}

@keyframes jarvis_rotation_recharger
{
    from
    {
        transform: rotate(0deg);
    }
    to
    {
        transform: rotate(360deg);
    }
}
/* JARVIS_GOD_HTML_STATUT_734_745 ================================== */

/* CONTAINMENT_PANNEAU ================================================================================
   09/11/2026 (Claude, JaxXBot AnunaQi n° 2269, solution 3 de Jarvis n° 1161 de JaxX) : contre le lag de la Home 2027_B2B quand le volet
   est ouvert, le rendu et la peinture du panneau sont isolés du reste de la page. Le panneau avait déjà overflow: hidden, perspective
   et se ferme sur lui-même : rien n'est rogné de plus ; la visionneuse (jarvis_visionneuse) est ajoutée à body, hors du panneau.
   Pour annuler : supprimer ce bloc ou passer contain à none — A VALIDER PAR JaxX */
.jarvis_panneau
{
    contain: layout paint;
}
/* CONTAINMENT_PANNEAU ================================================================================ */
