:root {
  --color-dashboard: #6366F1;
  --color-dashboard-text: #FFFFFF;
  /* Module Opportunités (pipeline commercial / CRM) — teal « croissance », distinct des autres modules. */
  --color-crm: #0D9488;
  --color-crm-text: #FFFFFF;
  --color-documents: #3B82F6;
  --color-documents-text: #FFFFFF;
  --color-e-mails: #EF4444;
  --color-e-mails-text: #FFFFFF;
  --color-taches: #10B981;
  --color-taches-text: #FFFFFF;
  --color-dossiers: #F59E0B;
  --color-dossiers-text: #FFFFFF;
  --color-appels: #65A30D; /* lime — tranché des violets (contacts/dashboard) et des voisins de menu */
  --color-appels-text: #FFFFFF;
  --color-agenda: #06B6D4;
  --color-agenda-text: #FFFFFF;
  --color-financier: #2e7d5b; /* vert foncé = identité du module Financier (texte blanc) */
  --color-financier-text: #ffffff;
  --color-urgent: #DC2626;
  --color-urgent-text: #FFFFFF;
  --color-brouillons: #6B7280;
  --color-brouillons-text: #FFFFFF;
  --color-notes: #EC4899;
  --color-notes-text: #FFFFFF;
  --color-factures: #059669;
  --color-factures-text: #FFFFFF;
  --color-contacts: #7C3AED;
  --color-contacts-text: #FFFFFF;
  --color-temps-passe: #94b9f4;
  --color-temps-passe-text: #000000;
  /* Notes de frais. ⚠️ Un VERT aurait été le choix naturel — c'est de l'argent — mais le vert est
     déjà celui du Financier (#2e7d5b) et des factures (#059669) : la couleur aurait brouillé
     précisément la distinction que l'architecture cherche à tenir. Teinte choisie en mesurant sa
     distance aux treize couleurs de module existantes (la plus éloignée des candidates), et
     vérifiée à 8,02:1 avec le texte blanc du ruban. */
  --color-notesfrais: #9F1239;
  --color-notesfrais-text: #FFFFFF;
  /* Échéancier RH (migration 152). OCRE DORÉ, et non le fuchsia livré d'abord (#86198F) : mesuré
     sur la teinte de référence, il était loin de tout (ΔE 39,8) — mais le menu ne peint pas la
     teinte. Il la pose en PASTILLE assombrie de 15 % et mélangée à 55 % au fond indigo
     (of-commun.css) : une fois PEINT, le fuchsia n'était plus qu'à ΔE 21,8 des Notes de frais et
     24,9 du fond — deux pastilles violacées côte à côte, confondues (signalé le 2026-09-25).
     Mesuré sur la couleur PEINTE parmi dix-huit candidates : l'ocre est à 37,6 des Notes de frais,
     55,8 du fond, 19,2 du plus proche (les Dossiers, ambre plus clair) ; glyphe blanc 6,01:1 sur la
     pastille, ruban 4,92:1. ⚠️ Toute nouvelle teinte se mesure PEINTE, pas en valeur de référence. */
  --color-echeances: #A16207;
  --color-echeances-text: #FFFFFF;
  --color-tchat: #d96a02;
  --color-tchat-text: #FFFFFF;
  --color-documents-original: #3B82F6;
  --color-documents-original-text: #FFFFFF;
  --color-documents-pastel: #dce3ee;
  --color-documents-pastel-text: #000000;
  --color-documents-clair: #a6c2f1;
  --color-documents-clair-text: #000000;
  --color-documents-lumineux: #3280ff;
  --color-documents-lumineux-text: #FFFFFF;
  --color-documents-fonc: #004dcb;
  --color-documents-fonc-text: #FFFFFF;
  --color-documents-sombre: #00307f;
  --color-documents-sombre-text: #FFFFFF;
  --color-documents-tr-s-clair: #eff1f6;
  --color-documents-tr-s-clair-text: #000000;
  --color-documents-d-satur: #8694ab;
  --color-documents-d-satur-text: #000000;
  --color-e-mails-original: #EF4444;
  --color-e-mails-original-text: #FFFFFF;
  --color-e-mails-pastel: #eedddd;
  --color-e-mails-pastel-text: #000000;
  --color-e-mails-clair: #efaaaa;
  --color-e-mails-clair-text: #000000;
  --color-e-mails-lumineux: #ff3434;
  --color-e-mails-lumineux-text: #FFFFFF;
  --color-e-mails-fonc: #c50707;
  --color-e-mails-fonc-text: #FFFFFF;
  --color-e-mails-sombre: #800000;
  --color-e-mails-sombre-text: #FFFFFF;
  --color-e-mails-tr-s-clair: #f5efef;
  --color-e-mails-tr-s-clair-text: #000000;
  --color-e-mails-d-satur: #ab8888;
  --color-e-mails-d-satur-text: #000000;
  --color-taches-original: #10B981;
  --color-taches-original-text: #000000;
  --color-taches-pastel: #99ccbb;
  --color-taches-pastel-text: #000000;
  --color-taches-clair: #54deb0;
  --color-taches-clair-text: #000000;
  --color-taches-lumineux: #00e699;
  --color-taches-lumineux-text: #000000;
  --color-taches-fonc: #045f41;
  --color-taches-fonc-text: #FFFFFF;
  --color-taches-sombre: #001a11;
  --color-taches-sombre-text: #FFFFFF;
  --color-taches-tr-s-clair: #cfe2dc;
  --color-taches-tr-s-clair-text: #000000;
  --color-taches-d-satur: #54756a;
  --color-taches-d-satur-text: #FFFFFF;
  --color-dossiers-original: #F59E0B;
  --color-dossiers-original-text: #000000;
  --color-dossiers-pastel: #dfd1ba;
  --color-dossiers-pastel-text: #000000;
  --color-dossiers-clair: #ebc17b;
  --color-dossiers-clair-text: #000000;
  --color-dossiers-lumineux: #ffa101;
  --color-dossiers-lumineux-text: #000000;
  --color-dossiers-fonc: #9a6100;
  --color-dossiers-fonc-text: #FFFFFF;
  --color-dossiers-sombre: #4e3100;
  --color-dossiers-sombre-text: #FFFFFF;
  --color-dossiers-tr-s-clair: #ede8df;
  --color-dossiers-tr-s-clair-text: #000000;
  --color-dossiers-d-satur: #978669;
  --color-dossiers-d-satur-text: #000000;
  --color-appels-original: #65A30D;
  --color-appels-original-text: #FFFFFF;
  --color-appels-pastel: #ECFCCB;
  --color-appels-pastel-text: #000000;
  --color-appels-clair: #D9F99D;
  --color-appels-clair-text: #000000;
  --color-appels-lumineux: #84CC16;
  --color-appels-lumineux-text: #FFFFFF;
  --color-appels-fonc: #3F6212;
  --color-appels-fonc-text: #FFFFFF;
  --color-appels-sombre: #365314;
  --color-appels-sombre-text: #FFFFFF;
  --color-appels-tr-s-clair: #F7FEE7;
  --color-appels-tr-s-clair-text: #000000;
  --color-appels-d-satur: #8a9a6b;
  --color-appels-d-satur-text: #000000;
  --color-agenda-original: #06B6D4;
  --color-agenda-original-text: #000000;
  --color-agenda-pastel: #9fccd4;
  --color-agenda-pastel-text: #000000;
  --color-agenda-clair: #58d3e8;
  --color-agenda-clair-text: #000000;
  --color-agenda-lumineux: #00c4e6;
  --color-agenda-lumineux-text: #000000;
  --color-agenda-fonc: #006374;
  --color-agenda-fonc-text: #FFFFFF;
  --color-agenda-sombre: #002228;
  --color-agenda-sombre-text: #FFFFFF;
  --color-agenda-tr-s-clair: #cee0e4;
  --color-agenda-tr-s-clair-text: #000000;
  --color-agenda-d-satur: #587c82;
  --color-agenda-d-satur-text: #FFFFFF;
  --color-financier-original: #84CC16;
  --color-financier-original-text: #000000;
  --color-financier-pastel: #c2d3a8;
  --color-financier-pastel-text: #000000;
  --color-financier-clair: #b0df69;
  --color-financier-clair-text: #000000;
  --color-financier-lumineux: #8be600;
  --color-financier-lumineux-text: #000000;
  --color-financier-fonc: #497507;
  --color-financier-fonc-text: #FFFFFF;
  --color-financier-sombre: #1d2f01;
  --color-financier-sombre-text: #FFFFFF;
  --color-financier-tr-s-clair: #dbe2d0;
  --color-financier-tr-s-clair-text: #000000;
  --color-financier-d-satur: #75835f;
  --color-financier-d-satur-text: #FFFFFF;
  --color-urgent-original: #DC2626;
  --color-urgent-original-text: #FFFFFF;
  --color-urgent-pastel: #dcbfbf;
  --color-urgent-pastel-text: #000000;
  --color-urgent-clair: #df8989;
  --color-urgent-clair-text: #000000;
  --color-urgent-lumineux: #f70b0b;
  --color-urgent-lumineux-text: #FFFFFF;
  --color-urgent-fonc: #8c1010;
  --color-urgent-fonc-text: #FFFFFF;
  --color-urgent-sombre: #4a0505;
  --color-urgent-sombre-text: #FFFFFF;
  --color-urgent-tr-s-clair: #ece2e2;
  --color-urgent-tr-s-clair-text: #000000;
  --color-urgent-d-satur: #936f6f;
  --color-urgent-d-satur-text: #FFFFFF;
  --color-brouillons-original: #6B7280;
  --color-brouillons-original-text: #FFFFFF;
  --color-brouillons-pastel: #bcc0c8;
  --color-brouillons-pastel-text: #000000;
  --color-brouillons-clair: #97a3ba;
  --color-brouillons-clair-text: #000000;
  --color-brouillons-lumineux: #2f5ebc;
  --color-brouillons-lumineux-text: #FFFFFF;
  --color-brouillons-fonc: #283a5d;
  --color-brouillons-fonc-text: #FFFFFF;
  --color-brouillons-sombre: #0e182a;
  --color-brouillons-sombre-text: #FFFFFF;
  --color-brouillons-tr-s-clair: #dadbdd;
  --color-brouillons-tr-s-clair-text: #000000;
  --color-brouillons-d-satur: #70747b;
  --color-brouillons-d-satur-text: #FFFFFF;
  --color-notes-original: #EC4899;
  --color-notes-original-text: #000000;
  --color-notes-pastel: #eedde5;
  --color-notes-pastel-text: #000000;
  --color-notes-clair: #edadcd;
  --color-notes-clair-text: #000000;
  --color-notes-lumineux: #ff3599;
  --color-notes-lumineux-text: #FFFFFF;
  --color-notes-fonc: #c10b65;
  --color-notes-fonc-text: #FFFFFF;
  --color-notes-sombre: #7e023f;
  --color-notes-sombre-text: #FFFFFF;
  --color-notes-tr-s-clair: #f5eff2;
  --color-notes-tr-s-clair-text: #000000;
  --color-notes-d-satur: #aa8a9a;
  --color-notes-d-satur-text: #000000;
  --color-factures-original: #059669;
  --color-factures-original-text: #FFFFFF;
  --color-factures-pastel: #96cfbd;
  --color-factures-pastel-text: #000000;
  --color-factures-clair: #4de5b6;
  --color-factures-clair-text: #000000;
  --color-factures-lumineux: #00e69e;
  --color-factures-lumineux-text: #000000;
  --color-factures-fonc: #004d35;
  --color-factures-fonc-text: #FFFFFF;
  --color-factures-sombre: #001a12;
  --color-factures-sombre-text: #FFFFFF;
  --color-factures-tr-s-clair: #cee3dd;
  --color-factures-tr-s-clair-text: #000000;
  --color-factures-d-satur: #3f5c53;
  --color-factures-d-satur-text: #FFFFFF;
  --color-contacts-original: #7C3AED;
  --color-contacts-original-text: #FFFFFF;
  --color-contacts-pastel: #ddd6ea;
  --color-contacts-pastel-text: #000000;
  --color-contacts-clair: #bda1ec;
  --color-contacts-clair-text: #000000;
  --color-contacts-lumineux: #7728ff;
  --color-contacts-lumineux-text: #FFFFFF;
  --color-contacts-fonc: #4908b9;
  --color-contacts-fonc-text: #FFFFFF;
  --color-contacts-sombre: #2b0074;
  --color-contacts-sombre-text: #FFFFFF;
  --color-contacts-tr-s-clair: #f1eff5;
  --color-contacts-tr-s-clair-text: #000000;
  --color-contacts-d-satur: #8f82a5;
  --color-contacts-d-satur-text: #000000;
  --color-temps-passe-original: #94b9f4;
  --color-temps-passe-original-text: #000000;
  --color-temps-passe-pastel: #c8d9f2;
  --color-temps-passe-pastel-text: #000000;
  --color-temps-passe-clair: #b0c8f0;
  --color-temps-passe-clair-text: #000000;
  --color-temps-passe-lumineux: #6a9df2;
  --color-temps-passe-lumineux-text: #000000;
  --color-temps-passe-fonc: #3f6bbd;
  --color-temps-passe-fonc-text: #FFFFFF;
  --color-temps-passe-sombre: #1f3a7f;      
  --color-temps-passe-sombre-text: #FFFFFF;
  --color-temps-passe-tr-s-clair: #e0e6f3;
  --color-temps-passe-tr-s-clair-text: #000000;
  --color-temps-passe-d-satur: #6b7f9c;
  --color-temps-passe-d-satur-text: #FFFFFF;
  --color-tchat-original: #d96a02;
  --color-tchat-original-text: #FFFFFF;
  --color-tchat-pastel: #f2d6c9;
  --color-tchat-pastel-text: #000000;
  --color-tchat-clair: #f2b8a0;
  --color-tchat-clair-text: #000000;
  --color-tchat-lumineux: #ff8f5c;
  --color-tchat-lumineux-text: #000000;
  --color-tchat-fonc: #b34a00;
  --color-tchat-fonc-text: #FFFFFF;
  --color-tchat-sombre: #7f2d00;
  --color-tchat-sombre-text: #FFFFFF;
  --color-tchat-tr-s-clair: #f9e8e0;
  --color-tchat-tr-s-clair-text: #000000;
  --color-tchat-d-satur: #a67b6a;
  --color-tchat-d-satur-text: #000000;

  /* ── Teintes des blocs de la fiche contact qui ne prolongent AUCUN module ──────────────────
     Les autres blocs reprennent la couleur de leur module (Emails, Appels, Notes…) par sa
     variable ci-dessus. Ces deux-là n'ont pas de module derrière eux : leur teinte est CRÉÉE,
     dans la même famille que la palette.

     Elles vivent ICI, avec la palette, parce que DEUX rendus les emploient : la fenêtre de saisie
     (app/contacts/css/custom-styles-contacts.css) et l'onglet Récapitulatif (fiche_contact.php,
     page autonome qui les relit côté PHP via include/utils/palette.php). Recopiées de part et
     d'autre, elles auraient fini par diverger — et le repère de couleur aurait menti d'un écran
     à l'autre, ce qui est pire qu'une absence de couleur. */
  /* ── Encre atténuée : le texte secondaire (sous-titres, horodatages, mentions) ───────────────
     Huit feuilles écrivaient `var(--ct-text-muted, #8a929c)` — ou `#98a6ad` pour les
     notifications. Or `--ct-text-muted` N'EXISTE PAS dans ce thème : c'est la valeur de repli qui
     s'appliquait, toujours, dans les deux thèmes. Rien n'était cassé — juste une couleur figée qui
     ne suivait pas le thème, et un jeton fantôme que chaque copier-coller propageait.

     ⚠️ NE PAS POINTER VERS `--ct-secondary-color` : mesuré, cela AURAIT DÉGRADÉ le contraste
     (3,15 → 3,03 en clair, 3,35 → 3,22 en sombre). Les valeurs ci-dessous sont choisies pour n'être
     jamais moins lisibles qu'avant :
        clair  #767f88 sur blanc   → 4,07:1  (contre 3,15 avec l'ancien repli)
        sombre #a0adb5 sur #37404a → 4,58:1  (contre 3,35)
     Au passage, le repli des notifications tombait à 2,50:1 EN THÈME CLAIR — sous le plancher de
     3:1. Personne ne l'avait vu parce que la valeur avait été choisie pour le fond sombre, et
     qu'aucun jeton ne distinguait les deux thèmes. */
  --of-encre-attenuee: #767f88;

  --of-teinte-adresses: #0891B2;   /* cyan « carte » — distinct du bleu Documents */
  --of-teinte-liens: #8B5CF6;      /* violet clair : famille Contacts, sans se confondre avec l'Identité */

  /* Ton de l'action « rédiger un email » posée sur une ligne. Dans l'application c'est la classe
     `.text-primary` de Bootstrap (--ct-primary du thème) ; un rendu AUTONOME, lui, n'a pas Bootstrap
     et ne peut pas s'y référer. La valeur est donc redonnée ici — et un test
     (tests/verifier_recap_contact.php) refuse qu'elle s'écarte de --ct-primary : une copie
     surveillée vaut mieux qu'une copie oubliée quand la source ne peut pas être partagée. */
  --of-action-email: #727cf5;

  /* ── Repères d'ÉTAT métier, partagés entre le poste et le front mobile ───────────────────────
     Ces teintes disent un état, pas un module : « traité », « urgente ». Elles vivent ici pour la
     même raison que les deux précédentes — DEUX interfaces les emploient désormais, et l'écran du
     téléphone doit dire la même chose que celui du poste. Un utilisateur qui apprend qu'un liseré
     orange signifie « haute » sur son ordinateur ne peut pas découvrir qu'il signifie autre chose
     sur son téléphone : le repère de couleur est une convention, et une convention qui change
     selon l'appareil ne se retient pas.

     ⚠ Ce ne sont PAS les couleurs sémantiques du thème. `--ct-success` vaut #0acf97 (vert menthe)
     et `--ct-danger` #fa5c7c (rose) : s'y référer aurait paru plus propre et aurait donné DEUX
     verts et DEUX rouges différents d'un appareil à l'autre. Les valeurs ci-dessous sont celles
     que le poste affiche déjà, reprises telles quelles depuis app/emails/css/email_inbox.css et
     app/taches/css/taches.css — qui les référencent désormais au lieu de les redonner. */
  --of-etat-traite: #198754;       /* vert « traité » (emails, appels) — Bootstrap success d'origine */
  --of-prio-urgente: #dc3545;
  --of-prio-haute: #fd7e14;
  --of-prio-normale: #4dabf7;
  --of-prio-basse: #adb5bd;
}


/* Custom styles for the document and contact lists */
.table tr.selected .view-document i {
    color: white !important;
}

.table tr.selected i.contact-physique {
    color: white !important;
}

.table tr.selected i.mdi-dots-vertical {
    color: white !important;
}

table.dataTable.fixedHeader-floating, table.dataTable.fixedHeader-locked {
    background-color: var(--ct-primary);
}

table.dataTable.fixedHeader-floating>:not(caption)>*>*, table.dataTable.fixedHeader-locked>:not(caption)>*>* {
    color: white !important;
}

.table td {
    padding: 0.75rem !important;
    vertical-align: middle !important;
}

#liste_documents thead tr, #liste_contacts thead tr {
    vertical-align: middle !important; 
}

.dropdown-item {
    padding: 0.25rem 1.5rem !important;
    cursor: pointer;
}
.dropdown-item:hover {
    background-color: #f8f9fa !important;
}
.dropdown-item:focus {
    background-color: #f8f9fa !important;
}
.dropdown-item:active {
    background-color: #f8f9fa !important;
}
.dropdown-item:focus, .dropdown-item:active {
    outline: none !important;
}

/* La conversation sélectionnée du tchat se stylait ICI, en bleu vif et texte blanc imposés par
   `!important`. Refonte du 2026-09-19 : tout le style du tchat vit dans
   app/tchat/css/tchat-window.css — une seule feuille, sans surenchère de spécificité. */

#tchat-messages-scroll {
  height: calc(100vh - 320px); /* Ajuste 320px selon la hauteur de ton header + footer + paddings */
  max-height: none;
  min-height: 0;
}

.no-resize {
  resize: none;
}

/* Dark mode styles for the compose modal */
.dark-mode .CodeMirror,
[data-bs-theme='dark'] .CodeMirror {
    background: #23272f !important;
    color: #f1f1f1 !important;
}
.dark-mode .CodeMirror-cursor,
[data-bs-theme='dark'] .CodeMirror-cursor {
    border-left: 1px solid #f1f1f1 !important;
}
.dark-mode .editor-toolbar,
[data-bs-theme='dark'] .editor-toolbar {
    background: #23272f !important;
    border-color: #444 !important;
}
.dark-mode .editor-toolbar button,
[data-bs-theme='dark'] .editor-toolbar button {
    color: #f1f1f1 !important;
}

/* ── Bandeau d'identité de module (remplace l'ancien .floating-chip flottant) ─────────────────
   L'ancienne version était en position:absolute dans une .page-title-box réservée à 74-84px de
   hauteur, dont l'essentiel restait vide. Le ruban garde la même forme (coin coupé, couleur du
   module) mais reste dans le flux normal, sur la même ligne que les actions de la page — la
   hauteur suit le contenu réel au lieu d'être figée. On garde la classe .page-title-box sur les
   pages (plusieurs la masquent en mode encapsulé/dossier via `.page-title-box{display:none}`) et
   on AJOUTE .module-ribbon-box comme modificateur, pour ne pas toucher son usage par défaut
   ailleurs. (dashboard.php était cité ici comme la page « sans ruban » : il en a un depuis sa
   réécriture — l'exemple ne vaut plus, la règle si.) */
.page-title-box.module-ribbon-box {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  min-height: 52px;
  padding: 0.4rem 0;
  margin-bottom: 0.5rem;
}
/* Pages où un DataTable suit immédiatement le ruban (Documents, Contacts, Modèles) : le thème
   tire chaque wrapper DataTables de -.625rem (margin-top négatif global, cf. mémoire
   "temps-passe-module-plan" — piège déjà rencontré) pour le rapprocher de l'élément précédent.
   L'ancien bloc de 74-84px avait assez de vide résiduel sous le chip pour l'absorber sans y
   paraître ; le ruban compact, ajusté au plus près, a besoin d'un peu plus de marge pour ne pas
   se faire mordre par ce -10px. */
.page-title-box.module-ribbon-box.module-ribbon-box--dt {
  margin-bottom: 1rem;
}
.module-ribbon-box .page-title-right {
  float: none;
  margin: 0 0 0 auto;
  order: 2;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}
.module-ribbon {
  order: 1;
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  padding: 0.3em 1em;
  border-radius: 0 20px 20px 0;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.14);
  font-size: 1.05rem;
  font-weight: 700;
  white-space: nowrap;
}

/* En-têtes de modales à la couleur du module (uniformisation UI — passées en
   titleClass à showModal). On garde bg-danger (erreurs/suppressions) et bg-success
   (succès) pour leur valeur sémantique ; les modales neutres/informatives prennent
   la couleur du module. */
.modal-header.bg-documents { background-color: var(--color-documents) !important; color: var(--color-documents-text) !important; }
.modal-header.bg-contacts { background-color: var(--color-contacts) !important; color: var(--color-contacts-text) !important; }

/* Menu d'actions « … » des listes Contacts/Documents : en thème sombre les libellés
   en .text-secondary étaient trop sombres sur le fond foncé du menu. On les éclaircit
   (le rouge de « Supprimer » est conservé pour sa valeur sémantique). */
html[data-bs-theme="dark"] .dropdown-actions-contacts .dropdown-item:not(.text-danger),
html[data-bs-theme="dark"] .dropdown-actions-docs .dropdown-item:not(.text-danger),
html[data-bs-theme="dark"] .dropdown-actions-contacts .dropdown-item:not(.text-danger) i,
html[data-bs-theme="dark"] .dropdown-actions-docs .dropdown-item:not(.text-danger) i {
  color: #c8cfe7 !important;
}
/* Menu d'actions par ligne (« … » vertical) des listes Contacts/Documents : mêmes
   libellés .text-secondary trop sombres en thème sombre. On ne cible QUE .text-secondary
   pour préserver les items à couleur de module (Créer une tâche, Générer un document)
   et le rouge de Supprimer. */
html[data-bs-theme="dark"] .dropdown-menu-contacts .dropdown-item.text-secondary,
html[data-bs-theme="dark"] .dropdown-menu-docs .dropdown-item.text-secondary,
html[data-bs-theme="dark"] .dropdown-menu-contacts .dropdown-item.text-secondary i,
html[data-bs-theme="dark"] .dropdown-menu-docs .dropdown-item.text-secondary i {
  color: #c8cfe7 !important;
}

/* Survol en thème sombre : forcer un fond SOMBRE (par défaut Bootstrap met un fond clair
   → texte clair illisible). Vaut pour les deux menus (« … Actions » et menu de ligne). */
html[data-bs-theme="dark"] .dropdown-actions-contacts .dropdown-item:hover,
html[data-bs-theme="dark"] .dropdown-actions-docs .dropdown-item:hover,
html[data-bs-theme="dark"] .dropdown-menu-contacts .dropdown-item:hover,
html[data-bs-theme="dark"] .dropdown-menu-docs .dropdown-item:hover {
  background-color: rgba(255, 255, 255, 0.12) !important;
}
/* Au survol : libellés neutres en blanc (les items à couleur de module et « Supprimer »
   gardent leur teinte, lisible sur fond sombre). */
html[data-bs-theme="dark"] .dropdown-actions-contacts .dropdown-item:not(.text-danger):hover,
html[data-bs-theme="dark"] .dropdown-actions-docs .dropdown-item:not(.text-danger):hover,
html[data-bs-theme="dark"] .dropdown-actions-contacts .dropdown-item:not(.text-danger):hover i,
html[data-bs-theme="dark"] .dropdown-actions-docs .dropdown-item:not(.text-danger):hover i,
html[data-bs-theme="dark"] .dropdown-menu-contacts .dropdown-item.text-secondary:hover,
html[data-bs-theme="dark"] .dropdown-menu-docs .dropdown-item.text-secondary:hover,
html[data-bs-theme="dark"] .dropdown-menu-contacts .dropdown-item.text-secondary:hover i,
html[data-bs-theme="dark"] .dropdown-menu-docs .dropdown-item.text-secondary:hover i {
  color: #ffffff !important;
}

/* ── Généralisation app-wide des menus « … » en thème sombre ─────────────────
   Les règles ci-dessus ne couvraient que Contacts/Documents. On généralise à TOUS
   les menus déroulants (couvre le menu « … » des colonnes du Kanban / Tâches et tout
   futur menu) : au repos, on éclaircit les libellés .text-secondary (trop sombres sur
   fond foncé) ; au survol, on rétablit un fond SOMBRE — car le survol global plus haut
   force un fond clair (#f8f9fa !important) qui, en thème sombre, rend le libellé clair
   illisible. .text-danger (Supprimer/Archiver) garde sa sémantique rouge. */
html[data-bs-theme="dark"] .dropdown-item.text-secondary,
html[data-bs-theme="dark"] .dropdown-item.text-secondary i {
  color: #c8cfe7 !important;
}
html[data-bs-theme="dark"] .dropdown-item:hover,
html[data-bs-theme="dark"] .dropdown-item:focus,
html[data-bs-theme="dark"] .dropdown-item:active {
  background-color: rgba(255, 255, 255, 0.12) !important;
}
html[data-bs-theme="dark"] .dropdown-item:not(.text-danger):hover,
html[data-bs-theme="dark"] .dropdown-item:not(.text-danger):hover i {
  color: #ffffff !important;
}

/* ── Centrage des fenêtres modales (vertical + horizontal), app-wide ──────────
   Toutes les modales Bootstrap sont centrées H+V. On centre via le CONTENEUR .modal
   en flex + marges auto sur le dialogue, SANS min-height plein écran (l'ancien
   « min-height: calc(100% - margin*2) » provoquait un scroll parasite quand la marge
   réelle du dialogue ne correspondait pas au fallback). Si le contenu dépasse la
   hauteur de l'écran, la modale défile depuis le haut (pas de rognage). Le mode plein
   écran (.modal-fullscreen*) est exclu. ------------------------------------- */
.modal.show {
  display: flex !important;
}
.modal.show > .modal-dialog:not([class*="modal-fullscreen"]) {
  margin: auto;
  min-height: 0;
  width: 100%;
}

/* ── Correctif menu "Condensé" — grand vide en bas des pages courtes ──────────
   Le thème vendor (app.css) fixe .content-page à min-height: 2000px (variable
   --ct-leftbar-condensed-height) dès que data-sidenav-size=condensed, quelle que soit la
   hauteur réelle du contenu — valeur figée, sans rapport avec le nombre d'items du menu
   OrgaFlex. Le menu condensé est déjà position:fixed (top:0/bottom:0 sur .leftside-menu),
   il n'a donc pas besoin que .content-page atteigne 2000px. Symptôme : sur une page au
   contenu volontairement calé sur la fenêtre (ex. Agenda), un vide apparaît entre le bas
   du contenu et le footer (footer en position:absolute; bottom:0 de .content-page, donc
   plaqué au bas de ce min-height artificiel). On réaligne sur le min-height par défaut
   (identique aux autres tailles de menu). Même sélecteur que le thème pour l'emporter à
   spécificité égale (règle chargée après app.min.css). */
html[data-sidenav-size=condensed]:not([data-layout=topnav]) .wrapper .content-page {
  min-height: calc(100vh - var(--ct-topbar-height) - 2px);
}

/* ── Case à cocher « tout sélectionner » mal centrée en en-tête DataTables (Documents, Contacts)
   DataTables 2.x enveloppe le contenu de chaque en-tête dans .dt-column-header (flex,
   justify-content:space-between) > .dt-column-title, en réservant systématiquement 30px de
   padding-right sur les DEUX (header ET title) pour la flèche de tri — même sur une colonne non
   triable comme celle-ci (orderable:false). Résultat : la case, en display:block dans .dt-column-title,
   reste collée à gauche de cet espace réduit au lieu d'être centrée comme dans les <td> du corps du
   tableau (qui n'ont pas cette enveloppe). On neutralise ce padding et le rendu space-between
   uniquement pour l'en-tête contenant #select-all (même id sur Documents et Contacts). */
th:has(#select-all) .dt-column-header {
  justify-content: center !important;
  padding-right: 0 !important;
}
th:has(#select-all) .dt-column-title {
  padding-right: 0 !important;
}
th:has(#select-all) .dt-column-order {
  display: none !important;
}

/* En-têtes personnalisés (datatable-utils.js setupSearchInputs) : le titre est désormais dans un
   <span class="dt-column-title"> — obligatoire pour que DataTables 2.x lise column().title(), sans
   quoi l'export Excel plante. Mais le padding-right:30px de .dt-column-title (réservé à la flèche de
   tri) créerait ici un vide entre le titre et le champ de recherche voisin : notre en-tête gère sa
   propre mise en page (flex + gap-2), on retire donc ce padding. Apparence inchangée. */
.custom-header-cell > .dt-column-title {
  padding-right: 0;
}

/* ── Encre atténuée, thème sombre ─────────────────────────────────────────────────────────────
   Un PAS PROPRE, pas un éclaircissement automatique : la valeur est choisie contre le fond des
   cartes du thème sombre (#37404a) et mesurée à 4,58:1. */
html[data-bs-theme="dark"] {
  --of-encre-attenuee: #a0adb5;
}
