/*
 * Design system léger et réutilisable ("RS moderne") pour les interfaces publiques/formulaires
 * client (ex: rdv/index.php). Objectif : un seul jeu de variables (tokens) + composants de base
 * (cartes, puces, stepper, badges, état vide...) à réutiliser sur toute nouvelle interface,
 * plutôt que de réinventer un style à chaque écran.
 *
 * Usage : inclure ce fichier, ajouter la classe .rs-page-body sur <body>, puis utiliser les
 * classes .rs-* ci-dessous. Les variables (--rs-*) peuvent être surchargées localement (ex:
 * changer --rs-color-accent sur une page précise) sans dupliquer les règles.
 *
 * Ne pas renommer les classes existantes ici sans vérifier leurs usages JS (souvent des
 * sélecteurs jQuery en dur, ex: .rs-chip, .rs-stepper-item, .is-selected).
 */

:root {
    --rs-color-accent: #33A3DD;
    --rs-color-accent-dark: #1c7bab;
    --rs-color-accent-bg: #d8eefb;
    --rs-color-success: #54AE54;
    --rs-color-success-dark: #2f8f4e;
    --rs-color-success-bg: #eafaf0;
    --rs-color-danger: #d9534f;
    --rs-color-danger-dark: #8f3634;
    --rs-color-danger-bg: #fbecec;
    --rs-color-warning: #b98016;
    --rs-color-warning-dark: #8f620f;
    --rs-color-warning-bg: #fdf3e2;
    --rs-color-text: #22303c;
    --rs-color-muted: #6b7684;
    --rs-color-faint: #8a94a6;
    --rs-color-border: #e1e6ec;
    --rs-color-surface: #ffffff;
    --rs-color-surface-alt: #f7f9fb;
    --rs-color-nav-dark: #0d1b2a;
    /* Fond de page hors design system (css/style.css .panel-body, <body> de
       enTete.php/enTete2.php) : ces fichiers n'utilisent pas .rs-page-body, donc
       ce token existe pour qu'un futur thème sombre n'ait qu'une seule valeur à
       changer ici plutôt que plusieurs couleurs codées en dur dans 3 fichiers. */
    --rs-color-page-bg: #F4FAFF;
    /* Repris à 107px par défaut (65px bandeau + ~42px menu principal, valeur historique),
       mais réécrit en JS (voir enTete.php / enTete2.php) avec la hauteur réellement
       rendue de .zone-des-menus, qui varie selon les icônes conditionnelles par garage. */
    --rs-menu-total-height: 107px;

    --rs-radius-sm: 6px;
    --rs-radius-md: 10px;
    --rs-radius-pill: 999px;

    --rs-shadow-sm: 0 1px 3px rgba(20, 30, 40, 0.05);
    --rs-shadow-md: 0 4px 16px rgba(20, 30, 40, 0.08);

    --rs-transition: all .18s ease;
}

/* Thème sombre — préversion/test, activée en posant data-theme="dark" sur <html>
   (bouton de bascule : views/page/entete_bandeau_menu.php, choix persisté en
   localStorage). Ne recolore QUE les tokens --rs-* ci-dessus : tout ce qui est déjà
   construit avec ces variables (.rs-card, .rs-btn, .rs-table, .rs-input-outline,
   badges, alertes...) suit automatiquement, sans toucher aux fichiers consommateurs.
   Le reste de l'appli (Bootstrap 3 brut, fonds blancs/textes noirs codés en dur dans
   les ~90% de pages pas encore migrées vers le design system, couleurs métier
   inline) n'est délibérément PAS concerné : un thème sombre cohérent sur toute
   l'appli suppose que ces pages soient d'abord migrées vers les classes .rs-*. */
:root[data-theme="dark"] {
    --rs-color-accent: #4db8f0;
    --rs-color-accent-dark: #7cd3ff;
    --rs-color-accent-bg: #163348;
    --rs-color-success: #6bc96b;
    --rs-color-success-dark: #8fdb8f;
    --rs-color-success-bg: #16341f;
    --rs-color-danger: #e5837e;
    --rs-color-danger-dark: #f2a19d;
    --rs-color-danger-bg: #3a1f1e;
    --rs-color-warning: #dba338;
    --rs-color-warning-dark: #eec06a;
    --rs-color-warning-bg: #3a2e14;
    --rs-color-text: #e8edf2;
    --rs-color-muted: #a7b1bd;
    --rs-color-faint: #7b8695;
    --rs-color-border: #313c47;
    --rs-color-surface: #1b232c;
    --rs-color-surface-alt: #242e38;
    --rs-color-page-bg: #141a20;
    --rs-shadow-sm: 0 1px 3px rgba(0, 0, 0, .35);
    --rs-shadow-md: 0 4px 16px rgba(0, 0, 0, .45);
}
:root[data-theme="dark"] .rs-page-body {
    background: linear-gradient(180deg, #141a20 0%, #10151a 260px, #10151a 100%);
    color: var(--rs-color-text);
}
/* Exception délibérée à la règle "le thème sombre ne touche que les composants
   .rs-*" ci-dessus : .input-group-addon est du Bootstrap brut (fond gris clair
   #eee + bordure #ccc codés en dur dans bootstrap.min.css, jamais modifié
   directement) — resté clair sur fond sombre, il tranche fortement à côté d'un
   .form-control déjà recoloré ailleurs. */
:root[data-theme="dark"] .input-group-addon {
    background-color: var(--rs-color-surface-alt) !important;
    border-color: var(--rs-color-border) !important;
    color: var(--rs-color-text) !important;
}

/* Fond de page + typo par défaut, à poser sur <body> (class="rs-page-body"). */
.rs-page-body {
    background: linear-gradient(180deg, #eef4fa 0%, #f4f6f8 260px, #f4f6f8 100%);
    color: #33414e;
}

/* Conteneur centré, largeur confortable pour un formulaire mobile-first. */
.rs-page-shell {
    max-width: 640px;
    margin: 30px auto 50px;
    padding: 0 15px;
}

/* En-tête "marque" (logo + nom + sous-titre), centré. */
.rs-brand-header {
    text-align: center;
    margin-bottom: 24px;
}
.rs-brand-header img {
    max-height: 56px;
    margin-bottom: 10px;
}
.rs-brand-header-name {
    font-size: 18px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-brand-header-subtitle {
    color: var(--rs-color-faint);
    font-size: 13px;
    margin-top: 2px;
}

/* Stepper horizontal numéroté (étapes d'un parcours). */
.rs-stepper {
    display: flex;
    justify-content: space-between;
    margin: 20px 0 26px;
    padding: 0 5px;
}
.rs-stepper-item {
    flex: 1;
    text-align: center;
    position: relative;
    font-size: 12px;
    color: #a7afba;
    transition: var(--rs-transition);
}
.rs-stepper-item:not(:last-child)::after {
    content: '';
    position: absolute;
    top: 14px;
    left: 55%;
    width: 90%;
    height: 2px;
    background: var(--rs-color-border);
    z-index: 0;
    transition: background .25s ease;
}
.rs-stepper-item.actif:not(:last-child)::after,
.rs-stepper-item.complete:not(:last-child)::after {
    background: var(--rs-color-accent);
}
.rs-stepper-bubble {
    width: 28px;
    height: 28px;
    line-height: 28px;
    border-radius: 50%;
    background: var(--rs-color-border);
    color: var(--rs-color-faint);
    font-weight: 700;
    margin: 0 auto 6px;
    position: relative;
    z-index: 1;
    transition: var(--rs-transition);
    box-shadow: 0 0 0 4px #fff;
}
.rs-stepper-item.actif .rs-stepper-bubble {
    background: var(--rs-color-accent);
    color: #fff;
    box-shadow: 0 0 0 4px #fff, 0 2px 8px rgba(51, 163, 221, .35);
}
.rs-stepper-item.complete .rs-stepper-bubble {
    background: var(--rs-color-success);
    color: #fff;
}
.rs-stepper-item.actif {
    color: var(--rs-color-text);
    font-weight: 600;
}

/* Carte de contenu générique (section d'un formulaire, panneau...). */
.rs-card {
    background: var(--rs-color-surface);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
    padding: 26px;
    margin-bottom: 20px;
    animation: rs-fade-in .25s ease;
}
@keyframes rs-fade-in {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
}
.rs-card-title {
    font-size: 18px;
    font-weight: 700;
    color: var(--rs-color-text);
    margin-bottom: 4px;
}
.rs-card-title-sm {
    font-size: 15px;
}
/* Conteneur à utiliser autour d'un graphe placé directement dans une .rs-card (Chart.js
   sur <canvas>, ou CanvasJS sur un <div> cible selon le fichier). Deux précautions
   distinctes, pas de recouvrement entre elles :
   - largeur : les libs de graphes redimensionnent parfois le graphe à partir de mesures
     de son parent qui peuvent se dérégler (padding inclus dans le calcul...) et le rendent
     alors plus large que l'espace réellement disponible dans la carte, débordant de son
     cadre arrondi. max-width sur le <canvas> plafonne sa taille de rendu CSS quelle que
     soit la largeur qu'il s'est lui-même attribuée en style inline.
   - hauteur : ne JAMAIS mettre overflow:hidden ici — CanvasJS (contrairement à Chart.js)
     lit la hauteur CSS réelle du conteneur AU MOMENT DU RENDU pour dimensionner son
     graphe ; sans hauteur définie il mesure 0 et n'affiche rien du tout (testé : le graphe
     disparaissait complètement). min-height lui donne une hauteur garantie dès le départ,
     sans empêcher Chart.js de calculer la sienne via son propre ratio largeur/hauteur. */
.rs-chart-canvas-wrap {
    width: 100%;
    min-height: 320px;
    padding: 0;
    position: relative;
}
.rs-chart-canvas-wrap canvas {
    max-width: 100% !important;
}
.rs-subtitle {
    color: var(--rs-color-faint);
    font-size: 13px;
    margin-bottom: 18px;
}
.rs-help-text {
    color: var(--rs-color-faint);
    font-size: 12px;
    margin-top: 5px;
    margin-bottom: 0;
}

/* Grille de créneaux + bouton "pilule" sélectionnable. */
.rs-slot-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 5px;
}
.rs-slot-btn {
    border: 1px solid var(--rs-color-border);
    color: #33414e;
    background: #fff;
    border-radius: var(--rs-radius-pill);
    padding: 8px 16px;
    cursor: pointer;
    font-size: 13px;
    transition: var(--rs-transition);
}
.rs-slot-btn:hover {
    border-color: var(--rs-color-accent);
    transform: translateY(-1px);
    box-shadow: var(--rs-shadow-sm);
}
.rs-slot-btn.is-selected {
    background: var(--rs-color-accent);
    color: #fff;
    border-color: var(--rs-color-accent);
    box-shadow: 0 4px 12px rgba(51, 163, 221, .35);
}

/* Puce à cocher/radio déguisée en chip (choix visuel rapide). */
.rs-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-pill);
    padding: 8px 16px;
    margin: 0 8px 8px 0;
    font-size: 13px;
    color: #33414e;
    cursor: pointer;
    background: #fff;
    transition: var(--rs-transition);
}
.rs-chip:hover {
    border-color: var(--rs-color-accent);
    transform: translateY(-1px);
}
.rs-chip input {
    display: none;
}
.rs-chip.rs-chip-active {
    background: var(--rs-color-accent-bg);
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark);
    font-weight: 600;
}

/* Badges d'état (pastille arrondie). */
.rs-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--rs-radius-pill);
    font-size: 12px;
    font-weight: 600;
}
.rs-badge-info {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
.rs-badge-success {
    background: var(--rs-color-success-bg);
    color: var(--rs-color-success-dark);
}
.rs-badge-muted {
    background: #f2f3f5;
    color: var(--rs-color-faint);
}

/* État vide (liste/rubrique sans contenu). */
.rs-empty-state {
    text-align: center;
    padding: 30px 10px;
    color: var(--rs-color-faint);
}
.rs-empty-state i {
    font-size: 32px;
    color: #c8d0d8;
    margin-bottom: 10px;
    display: block;
}

/* Icône ronde (illustration d'étape, ex: scan carte grise). */
.rs-icon-circle {
    font-size: 34px;
    color: var(--rs-color-accent);
    background: var(--rs-color-accent-bg);
    width: 64px;
    height: 64px;
    line-height: 64px;
    text-align: center;
    border-radius: 50%;
    margin: 0 auto 15px;
}
.rs-icon-circle-success {
    color: var(--rs-color-success);
    background: var(--rs-color-success-bg);
}
.rs-icon-circle-warning {
    color: #d99a1b;
    background: #fef6e4;
}

/* Icône de confirmation (grande, centrée, sans fond). */
.rs-confirmation-icon {
    font-size: 48px;
    color: var(--rs-color-success);
    display: block;
    text-align: center;
    margin-bottom: 12px;
}

/* Champ piège anti-bot (honeypot), invisible mais présent dans le DOM/tabulation. */
.rs-honeypot {
    position: absolute;
    left: -9999px;
    top: -9999px;
}

/* Bouton principal pleine largeur (action de fin de formulaire). */
.rs-btn-block {
    width: 100%;
    padding: 13px;
    font-size: 15px;
    font-weight: 600;
    border-radius: var(--rs-radius-sm);
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
.rs-btn-block:hover {
    box-shadow: var(--rs-shadow-md);
    transform: translateY(-1px);
}

@media (max-width: 480px) {
    .rs-card {
        padding: 18px;
    }
    .rs-page-shell {
        padding: 0 10px;
        margin-top: 16px;
    }
}

/* Icône carrée sombre accolée à un titre de modale/section (ex: "+" avant "Prix Unitaire TTC"). */
.rs-modal-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    background: var(--rs-color-text);
    color: #fff;
    border-radius: var(--rs-radius-sm);
    font-size: 13px;
    margin-right: 10px;
    vertical-align: middle;
}

/* Carte d'affichage d'une valeur (montant éditable ou lecture seule), utilisée en grille
   dans les modales de calcul (ex: modal_pu_ttc.php) : libellé discret au-dessus, valeur en
   gros en dessous. */
.rs-value-card {
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 12px 16px;
    margin-bottom: 16px;
    transition: var(--rs-transition);
}
.rs-value-card:focus-within {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.rs-value-label {
    font-size: 12.5px;
    color: var(--rs-color-muted);
    margin-bottom: 6px;
}
.rs-value-required {
    color: var(--rs-color-danger);
    font-weight: 700;
}
.rs-value-amount {
    display: block;
    width: 100%;
    border: none;
    background: transparent;
    padding: 0;
    font-size: 21px;
    font-weight: 700;
    color: var(--rs-color-text);
    box-shadow: none;
}
.rs-value-amount:focus {
    outline: none;
    box-shadow: none;
}
.rs-value-amount:disabled {
    color: var(--rs-color-text);
    background: transparent;
    opacity: 1;
    -webkit-text-fill-color: var(--rs-color-text);
}
.rs-value-note {
    font-size: 11.5px;
    color: var(--rs-color-muted);
    font-style: italic;
    margin-top: 6px;
}
.rs-value-note s {
    color: #c0392b;
}

/* Cartes KPI d'un tableau de bord (ex: TDB Synthèse > Signatures OR) : ligne de cartes
   compactes avec un chiffre-clé, éventuellement un donut avec valeur centrée. */
.rs-tdb-kpi-row {
    display: flex;
    flex-wrap: wrap;
    gap: 15px;
    margin-bottom: 15px;
}
.rs-tdb-kpi-card {
    flex: 1 1 220px;
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    padding: 18px 20px;
}
.rs-tdb-kpi-label {
    font-size: 13px;
    color: var(--rs-color-muted);
    margin-bottom: 8px;
}
.rs-tdb-kpi-number {
    font-size: 28px;
    font-weight: 700;
    color: var(--rs-color-text);
    line-height: 1.2;
}
.rs-tdb-kpi-number-danger {
    color: var(--rs-color-danger);
}
.rs-tdb-kpi-sub {
    font-size: 12px;
    color: var(--rs-color-faint);
    margin-top: 4px;
}
.rs-tdb-donut-wrap {
    position: relative;
    width: 110px;
    height: 110px;
    margin: 0 auto 10px;
}
.rs-tdb-donut-value {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 20px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-tdb-donut-legend {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 6px 14px;
    font-size: 12.5px;
    color: var(--rs-color-text);
}
.rs-tdb-donut-legend-item {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    white-space: nowrap;
}
.rs-tdb-donut-legend-dot {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    display: inline-block;
}

/* Barre d'outils au-dessus d'un tableau (titre + filtres multi-select + export) : le
   titre reste sur sa propre ligne, les filtres se placent en dessous sur une ligne qui
   peut passer à la ligne suivante sur petit écran, chaque filtre ayant une largeur
   confortable pour afficher plusieurs "tags" sélectionnés (select2) sans s'écraser. */
.rs-tdb-table-toolbar {
    margin-bottom: 12px;
}
.rs-tdb-table-toolbar-title {
    margin: 0 0 10px;
}
.rs-tdb-table-toolbar-filters {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
}
/* Wrapper autour de chaque <select> (et non le <select> lui-même : select2 le
   remplace par son propre conteneur, qui doit hériter cette largeur via son option
   width: '100%' plutôt que porter la classe directement — sinon le select2-container
   ignore les règles flex ci-dessous et repasse en largeur 100% de la page). */
.rs-tdb-filter-select {
    flex: 1 1 260px;
    max-width: 380px;
    min-width: 220px;
}
.rs-tdb-toolbar-btn {
    flex: 0 0 auto;
}

/* Pastilles de statut (ex: colonne "Statuts" d'un tableau de dossiers OR) et texte
   coloré de nature de dossier (ex: colonne "Nature"). Palette fixe à 6 couleurs,
   réutilisable telle quelle pour tout nouveau tableau de dossiers. */
.rs-tdb-pill {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--rs-radius-pill);
    font-size: 11.5px;
    font-weight: 600;
    color: #fff;
    white-space: nowrap;
}
.rs-tdb-pill-orange { background: #b8860b; }
.rs-tdb-pill-blue   { background: #2f6fb0; }
.rs-tdb-pill-green  { background: #3fa34d; }
.rs-tdb-pill-red    { background: #8b2e2e; }
.rs-tdb-pill-purple { background: #7c4dab; }
.rs-tdb-pill-gray   { background: #8a94a6; }

.rs-tdb-nature-text {
    font-weight: 600;
    font-size: 12.5px;
}
.rs-tdb-nature-blue   { color: #2f6fb0; }
.rs-tdb-nature-red    { color: #c0392b; }
.rs-tdb-nature-green  { color: #3fa34d; }
.rs-tdb-nature-purple { color: #7c4dab; }
.rs-tdb-nature-gray   { color: #6b7684; }

/* Bandeau d'avertissement (information réglementaire/fiscale à ne pas manquer). */
.rs-alert-warning {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    background: #fef6e4;
    border: 1px solid #f2ddaa;
    border-radius: var(--rs-radius-md);
    padding: 14px 16px;
    color: #7a5b1e;
    font-size: 13px;
    line-height: 1.5;
}
.rs-alert-warning i {
    font-size: 17px;
    color: #d99a1b;
    margin-top: 2px;
}

/* ============================================================
   Menus applicatifs (niveaux 2/3) + sidenav mobile — modernisation.
   Ce bloc restylise les sélecteurs EXISTANTS de l'appli interne
   (#menu-nav, .zone-onglets, .sidenav...) plutôt que d'introduire de
   nouvelles classes .rs-*, pour ne pas avoir à toucher les ~110 pages
   qui les utilisent déjà (chacune inclut son propre sous_menu_*.php
   avec <ul class="nav nav-pills zone-onglets">). Il réutilise
   cependant les tokens --rs-* ci-dessus (couleurs, radius, ombres)
   pour rester cohérent avec le reste de la charte.
   Prérequis : ce fichier est chargé APRÈS css/style.css (voir
   views/page/enTete2.php) pour gagner la cascade sans multiplier les
   !important — seuls ceux nécessaires pour battre les styles inline
   (bandeau) ou les valeurs !important historiques de style.css/
   Bootstrap sont conservés.
   Le bandeau du haut (niveau 1) n'est volontairement pas retouché
   ici : trop d'éléments dynamiques/inline pour un premier passage
   sûr ; à traiter dans une itération dédiée si besoin.
   ============================================================ */

/* ---- Niveau 2 : menu principal (TDB, Clients, Devis/OR...) ---- */

#menu-nav.menu-niveau-2 {
    background: var(--rs-color-nav-dark) !important;
    box-shadow: 0 2px 10px rgba(0, 0, 0, .18);
    display: flex !important;
    align-items: center;
    flex-wrap: nowrap;
    gap: 10px;
    padding-right: 12px !important;
}
#menu-nav.menu-niveau-2 > * {
    float: none !important;
}
#menu-nav.menu-niveau-2 > ul.navbar-nav {
    flex: 1 1 auto;
    min-width: 0;
}

/* Bouton "..." qui regroupe tout ce qui était éparpillé en float:right (calculatrice,
   connexion "en tant que", Envoi lien Client, téléphone, logos partenaires, bas de
   page) : trop d'icônes indépendantes pour tenir proprement dans une barre de ~40px,
   même bien espacées — un seul menu déroulant est plus lisible. */
#menu-nav.menu-niveau-2 > .rs-menu-plus {
    flex: 0 0 auto;
}
#menu-nav.menu-niveau-2 .rs-menu-plus-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0 !important;
    margin: 0 !important;
    background: transparent;
    border: none;
    border-radius: var(--rs-radius-pill);
    color: rgba(255, 255, 255, .75);
    box-shadow: none;
    transition: var(--rs-transition);
}
#menu-nav.menu-niveau-2 .rs-menu-plus-toggle:hover,
#menu-nav.menu-niveau-2 .rs-menu-plus-toggle:focus {
    background: rgba(255, 255, 255, .1);
    color: #fff;
}
#menu-nav.menu-niveau-2 .rs-menu-plus-list {
    margin-top: 8px;
    padding: 6px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
}
#menu-nav.menu-niveau-2 .rs-menu-plus-list > li > a {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    border-radius: var(--rs-radius-sm);
    font-size: 13px;
    color: var(--rs-color-text);
}
#menu-nav.menu-niveau-2 .rs-menu-plus-list > li > a:hover,
#menu-nav.menu-niveau-2 .rs-menu-plus-list > li > a:focus {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
#menu-nav.menu-niveau-2 .rs-menu-plus-list > li > a i {
    width: 16px;
    text-align: center;
    color: var(--rs-color-muted);
}
#menu-nav.menu-niveau-2 .rs-menu-plus-list > li > a img {
    height: 16px;
}

#menu-nav .navbar-nav {
    display: flex;
    flex-wrap: nowrap;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
}
#menu-nav .navbar-nav::-webkit-scrollbar {
    display: none;
}
#menu-nav .navbar-nav > li {
    float: none;
    flex: 0 0 auto;
}

#menu-nav .navbar-nav > li > a.menu-barre {
    display: inline-flex;
    align-items: center;
    padding: 9px 16px 6px !important;
    font-size: 14px;
    line-height: 18px;
    font-weight: 600;
    color: rgba(255, 255, 255, .68);
    border-bottom: 3px solid transparent;
    border-radius: var(--rs-radius-sm) var(--rs-radius-sm) 0 0;
    white-space: nowrap;
    transition: color .18s ease, background-color .18s ease, border-color .18s ease;
}
#menu-nav .navbar-nav > li > a.menu-barre span {
    display: inline-flex;
    align-items: center;
}
#menu-nav .navbar-nav > li > a.menu-barre i {
    font-size: 15px;
}
#menu-nav .navbar-nav > li > a.menu-barre:hover,
#menu-nav .navbar-nav > li > a.menu-barre:focus {
    color: #fff;
    background-color: rgba(255, 255, 255, .07);
}
#menu-nav .navbar-nav > li.menu-active > a.menu-barre {
    color: #fff !important;
    background-color: rgba(51, 163, 221, .16) !important;
    border-bottom-color: var(--rs-color-accent);
}

/* ---- Niveau 3 : sous-menu contextuel (propre à chaque page) ---- */

.menu-niveau-3 .zone-onglets {
    margin-top: var(--rs-menu-total-height) !important;
    top: var(--rs-menu-total-height) !important;
}
.menu-niveau-3 ul.zone-onglets {
    background-color: var(--rs-color-surface-alt) !important;
    border-bottom: 1px solid var(--rs-color-border) !important;
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    overflow-x: auto;
    overflow-y: hidden;
    gap: 5px;
    padding: 6px 16px !important;
    scrollbar-width: thin;
}
.menu-niveau-3 ul.zone-onglets::-webkit-scrollbar {
    height: 6px;
}
.menu-niveau-3 ul.zone-onglets::-webkit-scrollbar-thumb {
    background: var(--rs-color-border);
    border-radius: var(--rs-radius-pill);
}
.menu-niveau-3 ul.zone-onglets hr {
    display: none;
}
.menu-niveau-3 ul.zone-onglets > li.onglets,
.menu-niveau-3 ul.zone-onglets > li.sousMenuGeneral {
    float: none;
    flex: 0 0 auto;
}
.menu-niveau-3 ul.zone-onglets > li.onglets > a,
.menu-niveau-3 ul.zone-onglets > li.sousMenuGeneral > a {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 5px 10px !important;
    border-radius: var(--rs-radius-pill) !important;
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface) !important;
    color: var(--rs-color-text) !important;
    font-size: 12px;
    font-weight: 500;
    white-space: nowrap;
    transition: var(--rs-transition);
}
.menu-niveau-3 ul.zone-onglets > li.onglets > a:hover,
.menu-niveau-3 ul.zone-onglets > li.sousMenuGeneral > a:hover {
    border-color: var(--rs-color-accent);
    transform: translateY(-1px);
}
.menu-niveau-3 ul.zone-onglets > li.onglets.active > a,
.menu-niveau-3 ul.zone-onglets > li.sousMenuGeneral.active > a {
    background: var(--rs-color-accent-bg) !important;
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark) !important;
    font-weight: 600 !important;
}
.menu-niveau-3 ul.zone-onglets .badge {
    font-size: 10.5px;
}

/* ---- Groupes d'onglets niveau 3 en dropdown (.rs-onglets-group, ex: sous-menu
   Fournisseurs — cf. views/fournisseurs/menu_fournisseurs.php) : même gabarit pilule
   que .onglets ci-dessus, mais sur une classe dédiée (le <li> de groupe ne porte pas
   .onglets, volontairement — voir le commentaire dans menu_fournisseurs.php). Le
   .dropdown-menu est repositionné en position:fixed par JS à l'ouverture (cf.
   js/scripts.js) car .zone-onglets a overflow-x:auto et rognerait un dropdown
   classique en position:absolute. ---- */
.menu-niveau-3 ul.zone-onglets > li.rs-onglets-group {
    float: none;
    flex: 0 0 auto;
    position: relative;
}
.menu-niveau-3 ul.zone-onglets > li.rs-onglets-group > a.rs-onglets-group-toggle {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 5px 10px;
    border-radius: var(--rs-radius-pill);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    font-size: 12px;
    font-weight: 500;
    white-space: nowrap;
    cursor: pointer;
    transition: var(--rs-transition);
}
.menu-niveau-3 ul.zone-onglets > li.rs-onglets-group > a.rs-onglets-group-toggle:hover {
    border-color: var(--rs-color-accent);
    transform: translateY(-1px);
}
.menu-niveau-3 ul.zone-onglets > li.rs-onglets-group.rs-onglets-group-active > a.rs-onglets-group-toggle,
.menu-niveau-3 ul.zone-onglets > li.rs-onglets-group.open > a.rs-onglets-group-toggle {
    background: var(--rs-color-accent-bg);
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark);
    font-weight: 600;
}
.rs-onglets-group-menu {
    min-width: 240px;
    padding: 6px;
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-md) !important;
    box-shadow: var(--rs-shadow-md) !important;
    z-index: 1051;
}
.rs-onglets-group-menu > li > a {
    display: block;
    padding: 8px 12px !important;
    border-radius: var(--rs-radius-sm);
    font-size: 13px !important;
    color: var(--rs-color-text) !important;
    background: transparent !important;
    transition: var(--rs-transition);
}
.rs-onglets-group-menu > li > a:hover,
.rs-onglets-group-menu > li > a:focus {
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}
.rs-onglets-group-menu > li.active > a {
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
    font-weight: 600;
}

/* ---- Menu mobile (sidenav) ---- */

.sidenav {
    background-color: var(--rs-color-surface) !important;
    border-right: 1px solid var(--rs-color-border);
}
.sidenav li {
    color: var(--rs-color-text);
    transition: background-color .15s ease, color .15s ease;
}
.sidenav li a {
    color: var(--rs-color-text) !important;
}
.sidenav li:hover,
.sidenav li:focused {
    background-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
    font-size: 14px !important;
}
.sidenav .menu-child li:hover {
    font-size: 12px !important;
}
.sidenav .active {
    background-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
    font-weight: 700 !important;
    font-size: 14px !important;
    border-right: 3px solid var(--rs-color-accent);
}
ul .menu-child li:hover {
    background-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}

/* ---- Niveau 1 : bandeau du haut (logo, garage, recherche, notifications) ----
   Le <ul> de gauche portait un style inline "width:51% !important;position:absolute"
   (retiré dans enTete.php / enTete2.php) : tout le reste passe par ces règles, sans
   déplacer aucun bloc PHP existant (les icônes de notification dispersées — alerte,
   aide, tchat, GED, photo, Excellia — sont juste harmonisées visuellement via
   .lien-en-tete-right, qu'elles partagent déjà). */

#container-fluid-app.menu-niveau-1 {
    display: flex !important;
    align-items: center;
    flex-wrap: nowrap;
    gap: 16px;
    width: 100%;
    /* .rs-status-group (VDR/Pointage/horloge) est maintenant en position:absolute sous le
       groupe d'icônes (2e ligne) : plus rien dans le flux ne fait naturellement 72px de
       haut, donc on réserve explicitement cette hauteur pour ne pas la couper. */
    min-height: 72px;
}

/* Zone gauche : logo + sélecteur de garage */
#container-fluid-app.menu-niveau-1 > ul.navbar-nav:not(.nav-right) {
    position: static !important;
    display: flex !important;
    align-items: center;
    flex: 0 0 auto;
    gap: 4px;
}
#container-fluid-app.menu-niveau-1 > ul.navbar-nav:not(.nav-right) > li {
    float: none;
}
#container-fluid-app.menu-niveau-1 select.select-garage {
    margin-top: 0 !important;
    margin-left: 12px !important;
}
/* Le bandeau est maintenant aussi haut que la colonne recherche (2 lignes, ~72px),
   nettement plus que le logo (45px) : on l'agrandit un peu pour combler le vide
   visible au-dessus/en dessous plutôt que de le laisser flotter, minuscule, au milieu. */
#container-fluid-app.menu-niveau-1 .logo-img-gest-car-web {
    height: 56px !important;
    margin-top: 0 !important;
}
/* bloc "connecté depuis..." (include alert_utilisateur_entete.php) : ne doit plus imposer 33% de large */
#container-fluid-app.menu-niveau-1 > ul.navbar-nav:not(.nav-right) > li[style*="width: 33%"] {
    width: auto !important;
    float: none !important;
    margin-left: 16px !important;
}

/* Zone droite : recherche + notifications + utilisateur. On ne les colle plus au bord
   droit (ça créait un grand vide entre le sélecteur de garage et les zones de recherche) :
   tout reste groupé juste après le garage, et seul le tchat/l'utilisateur est repoussé
   à l'extrémité droite via une marge automatique (cf. plus bas). */
#container-fluid-app.menu-niveau-1 > ul.navbar-nav.nav-right {
    float: none !important;
    margin-right: 0 !important;
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    justify-content: flex-start;
}
#container-fluid-app.menu-niveau-1 .my-navbar-right {
    float: none !important;
    width: 100%;
}
#container-fluid-app.menu-niveau-1 .my-navbar-right > ul.navbar-nav.navbar-right {
    position: relative;
    display: flex !important;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: flex-start;
    gap: 8px;
    width: 100% !important;
}
#container-fluid-app.menu-niveau-1 .my-navbar-right > ul.navbar-nav.navbar-right > li {
    float: none;
}
/* pousse tout le groupe d'icônes d'action (notifications, GED, historique, Excellia,
   photo-flash, Note, capture, utilisateur...) à l'extrémité droite, comme un seul bloc
   compact — plutôt que de pousser uniquement le dernier élément (l'utilisateur), ce qui
   laissait un vide entre les icônes et lui. .rs-search-cluster est toujours présent :
   son premier voisin direct (le premier élément conditionnel du groupe qui s'affiche
   réellement) reçoit la marge auto, et tout le reste suit grâce au gap:8px déjà en place. */
#container-fluid-app.menu-niveau-1 .navbar-right > li.rs-search-cluster + li {
    margin-left: auto;
}
/* #zone_recharger_verifier_garage est un <span> toujours présent (rechargé en AJAX
   toutes les 5s), vide la plupart du temps : même vide, il comptait comme un élément
   flex à part entière et créait un espace fantôme entre les icônes de notification. */
#container-fluid-app.menu-niveau-1 #zone_recharger_verifier_garage:empty {
    display: none;
}
/* Les icônes alimentées en AJAX (photos en cours, notifs VDR/en cours...) reprennent
   le même gabarit que les autres dès qu'elles affichent un <a> — sans imposer de style
   sur leur contenu interne, injecté côté serveur et donc hors de contrôle ici. */
#container-fluid-app.menu-niveau-1 .navbar-right > li.notification_photos_travaux > a,
#container-fluid-app.menu-niveau-1 .navbar-right > li.information_notif_vdr > a,
#container-fluid-app.menu-niveau-1 .navbar-right > li.information_notif_en_cours > a {
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    min-width: 34px;
    height: 34px;
    padding: 0 8px !important;
    border-radius: var(--rs-radius-pill);
    color: rgba(0, 0, 0, .55) !important;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .navbar-right > li.notification_photos_travaux > a:hover,
#container-fluid-app.menu-niveau-1 .navbar-right > li.information_notif_vdr > a:hover,
#container-fluid-app.menu-niveau-1 .navbar-right > li.information_notif_en_cours > a:hover {
    background-color: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark) !important;
}

/* Icônes de notification/action (alerte, aide, tchat, GED, photo, Excellia, compte...) :
   certaines cumulent .lien-en-tete-right avec .btn.btn-default (Bootstrap), qui impose
   fond blanc + bordure grise par-dessus — d'où le mélange d'icônes "nues" et de petits
   boutons encadrés qu'on voit dans le bandeau. On neutralise .btn.btn-default pour que
   toutes ces icônes rendent pareil (bouton rond transparent, teinte accent au survol). */
#container-fluid-app.menu-niveau-1 .lien-en-tete-right,
#container-fluid-app.menu-niveau-1 #icone_notif_alert,
#container-fluid-app.menu-niveau-1 .navbar-right > li > a,
#container-fluid-app.menu-niveau-1 > div.el-desactive-masque-alert ~ div > a:not(.rapport_vdr):not(.rapport_pointage),
#container-fluid-app.menu-niveau-1 > div.el-desactive-masque-alert ~ div li > a {
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    min-width: 34px;
    height: 34px;
    padding: 0 8px !important;
    margin: 0 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    border-radius: var(--rs-radius-pill);
    color: rgba(0, 0, 0, .55) !important;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .lien-en-tete-right:hover,
#container-fluid-app.menu-niveau-1 #icone_notif_alert:hover,
#container-fluid-app.menu-niveau-1 .navbar-right > li > a:hover,
#container-fluid-app.menu-niveau-1 > div.el-desactive-masque-alert ~ div a:not(.rapport_vdr):not(.rapport_pointage):hover {
    background-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}
/* .recuperer_notifications se masque définitivement au clic (recupInfoEnteteDroite.js
   fait $(this).hide()) — un simple style inline sans !important, qui ne peut pas battre
   le display:inline-flex !important du reset générique ci-dessus. On rend la main au
   hide() dès que jQuery a effectivement posé le display:none inline. */
#container-fluid-app.menu-niveau-1 a.recuperer_notifications[style*="display: none"],
#container-fluid-app.menu-niveau-1 a.recuperer_notifications[style*="display:none"] {
    display: none !important;
}

#container-fluid-app.menu-niveau-1 li.rs-menu-plus ul.rs-menu-plus-list {
    margin-top: 8px;
    padding: 6px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
}
#container-fluid-app.menu-niveau-1 li.rs-menu-plus ul.rs-menu-plus-list > li > a {
    display: flex !important;
    align-items: center;
    gap: 8px;
    min-width: 0 !important;
    height: auto !important;
    padding: 8px 12px !important;
    border-radius: var(--rs-radius-sm) !important;
    font-size: 13px;
    color: var(--rs-color-text) !important;
    background: transparent !important;
}
#container-fluid-app.menu-niveau-1 li.rs-menu-plus ul.rs-menu-plus-list > li > a:hover {
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}
#container-fluid-app.menu-niveau-1 li.rs-menu-plus ul.rs-menu-plus-list > li > a img {
    height: 16px;
}
#container-fluid-app.menu-niveau-1 li.rs-menu-plus ul.rs-menu-plus-list > li > a i {
    width: 16px;
    text-align: center;
    color: var(--rs-color-muted);
}

/* Rangée utilitaire (horloge, VDR/Pointage, +Note, capture d'écran, logos partenaires...) :
   c'est le <div> juste après .el-desactive-masque-alert, sans classe dédiée pour l'accrocher */
#container-fluid-app.menu-niveau-1 > div.el-desactive-masque-alert ~ div {
    display: flex !important;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
    width: 100%;
    padding: 6px 0;
}

/* Colonne recherche : les 3 mini-recherches, alignées à gauche sur leur propre largeur
   (le bloc ne s'étire plus — .rs-status-group n'en fait plus partie visuellement, voir
   plus bas). */
#container-fluid-app.menu-niveau-1 li.rs-search-cluster {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
    flex: 0 0 auto;
    position: relative;
}
#container-fluid-app.menu-niveau-1 .rs-search-row {
    display: flex;
    align-items: center;
}

/* VDR / Pointage / horloge : sorti du flux de .rs-search-cluster et positionné en
   absolu pour se placer sur la 2e ligne du bandeau, calé à droite — donc juste sous le
   groupe d'icônes (notifications, GED, historique, Excellia, photo-flash, Note,
   capture, utilisateur), pas sous les champs de recherche. Ancré sur
   ul.navbar-nav.navbar-right (position:relative ci-dessus), pas sur .rs-search-cluster,
   pour ignorer sa propre largeur. */
#container-fluid-app.menu-niveau-1 .rs-status-group {
    position: absolute;
    top: 45px;
    right: 0;
    display: inline-flex;
    align-items: center;
    height: 34px;
    gap: 14px;
    
    border-radius: var(--rs-radius-pill);
    box-shadow: var(--rs-shadow-sm);
    padding: 0 16px;
}
#container-fluid-app.menu-niveau-1 .rs-status-item {
    display: inline-flex;
    align-items: center;
    gap: 7px;
}
#container-fluid-app.menu-niveau-1 .rs-status-label {
    font-size: 11px;
    font-weight: 700;
    color: var(--rs-color-muted);
    text-transform: uppercase;
    letter-spacing: .03em;
}
#container-fluid-app.menu-niveau-1 .rs-status-divider {
    width: 1px;
    height: 16px;
    background: var(--rs-color-border);
}
#container-fluid-app.menu-niveau-1 .rs-status-group .rapport_vdr,
#container-fluid-app.menu-niveau-1 .rs-status-group .rapport_pointage {
    margin: 0 !important;
    min-width: 20px !important;
    height: auto !important;
    padding: 2px 8px !important;
    font-size: 11px !important;
    font-weight: 700 !important;
    border-radius: var(--rs-radius-pill) !important;
}
#container-fluid-app.menu-niveau-1 .rs-status-group .rs-status-item:last-child {
    gap: 8px;
}
#container-fluid-app.menu-niveau-1 .rs-status-group .my-horloge {
    color: var(--rs-color-text);
    font-weight: 700;
    font-size: 13px;
    width: 62px;
    padding: 0 !important;
    border: none !important;
    background: transparent !important;
    box-shadow: none !important;
}
#container-fluid-app.menu-niveau-1 .rs-status-group .animated.fadeInRight {
    font-size: 12px;
    color: var(--rs-color-muted);
}

/* Sélecteur de garage : pilule au lieu du <select> gris brut */
#container-fluid-app.menu-niveau-1 .select-garage {
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-pill) !important;
    background-color: var(--rs-color-surface) !important;
    padding: 5px 16px !important;
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .select-garage:hover,
#container-fluid-app.menu-niveau-1 .select-garage:focus {
    border-color: var(--rs-color-accent) !important;
    outline: none;
}

/* Mini-recherches (Dossier/OR, Client, Véhicule) : un seul groupe en pilule au lieu
   d'un input-group Bootstrap gris/anguleux (libellé + champ + bouton loupe) */
#container-fluid-app.menu-niveau-1 .input-group {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-surface);
    overflow: hidden;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .input-group:focus-within {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
#container-fluid-app.menu-niveau-1 .input-group-addon {
    background: transparent !important;
    border: none !important;
    color: var(--rs-color-muted) !important;
    font-weight: 600 !important;
    font-size: 11px !important;
    padding: 0 0 0 14px !important;
}
#container-fluid-app.menu-niveau-1 .input_zone_recherche_entete,
#container-fluid-app.menu-niveau-1 .input-zone-de-recherche-general {
    border: none !important;
    box-shadow: none !important;
    background: transparent !important;
    height: 32px !important;
    font-size: 12.5px !important;
    padding: 0 8px !important;
}
#container-fluid-app.menu-niveau-1 .btn_recherche_partie_entete,
#container-fluid-app.menu-niveau-1 .btn-recherche-en-tete {
    border: none !important;
    background: transparent !important;
    height: 32px !important;
    color: var(--rs-color-muted);
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .btn_recherche_partie_entete:hover,
#container-fluid-app.menu-niveau-1 .btn-recherche-en-tete:hover {
    color: var(--rs-color-accent-dark);
}

/* Badges VDR / Pointage : petites pastilles rondes plutôt que des rectangles */
#container-fluid-app.menu-niveau-1 .rapport_vdr,
#container-fluid-app.menu-niveau-1 .rapport_pointage {
    border-radius: var(--rs-radius-pill) !important;
    box-shadow: none !important;
    vertical-align: middle;
}

/* Boutons "Note" et capture d'écran : ils utilisent les classes globales
   .btn-modifier/.bouton-modifier (boutons bleus pleins, utilisés partout dans
   l'appli — on n'y touche pas ailleurs), mais dans cette rangée d'icônes
   transparentes ils tranchaient. On les aligne ici sur le même langage
   (transparent, icône discrète, teinte accent au survol), sans rien changer
   pour ces mêmes classes en dehors du bandeau. */
#container-fluid-app.menu-niveau-1 .rs-note-btn,
#container-fluid-app.menu-niveau-1 .rs-screenshot-btn,
#container-fluid-app.menu-niveau-1 .rs-theme-toggle-btn {
    display: inline-flex !important;
    align-items: center;
    gap: 6px;
    height: 34px;
    padding: 0 12px !important;
    margin: 0 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    border-radius: var(--rs-radius-pill) !important;
    color: rgba(0, 0, 0, .65) !important;
    font: 600 12.5px inherit !important;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .rs-screenshot-btn,
#container-fluid-app.menu-niveau-1 .rs-theme-toggle-btn {
    width: 34px;
    padding: 0 !important;
    justify-content: center;
}
#container-fluid-app.menu-niveau-1 .rs-note-btn:hover,
#container-fluid-app.menu-niveau-1 .rs-note-btn:focus,
#container-fluid-app.menu-niveau-1 .rs-screenshot-btn:hover,
#container-fluid-app.menu-niveau-1 .rs-screenshot-btn:focus,
#container-fluid-app.menu-niveau-1 .rs-theme-toggle-btn:hover,
#container-fluid-app.menu-niveau-1 .rs-theme-toggle-btn:focus {
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}

/* Utilisateur connecté : pilule avec avatar (initiales) + nom + chevron,
   au lieu du texte brut + caret. */
#container-fluid-app.menu-niveau-1 .rs-user-chip {
    display: inline-flex !important;
    align-items: center;
    gap: 8px;
    height: 34px;
    padding: 0 10px 0 4px !important;
    border-radius: var(--rs-radius-pill);
}
#container-fluid-app.menu-niveau-1 .rs-user-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 999px;
    background: var(--rs-color-accent-dark);
    color: #fff;
    font-size: 11px;
    font-weight: 700;
    flex-shrink: 0;
}
#container-fluid-app.menu-niveau-1 .rs-user-name {
    font-size: 13px;
    font-weight: 600;
    color: var(--rs-color-text);
}

/* ============================================================
   Dropdowns du bandeau (tchat, notifications Excellia/photo,
   VDR, congés, compte utilisateur, "Liens utiles"...) : remise à
   plat générale. Bootstrap les laissait presque nus (angles droits,
   ombre plate, listes très serrées) — on leur donne la même charte
   que le reste (coins arrondis, ombre, options aérées + surlignées
   au survol), sans casser leur contenu souvent injecté en AJAX.
   Non !important sauf pour battre des styles inline existants.
   ============================================================ */
#container-fluid-app.menu-niveau-1 .dropdown-menu,
#menu-nav.menu-niveau-2 .dropdown-menu {
    background-color: var(--rs-color-surface) !important;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
    padding: 6px;
    margin-top: 8px;
}
#container-fluid-app.menu-niveau-1 .dropdown-menu > li > a,
#menu-nav.menu-niveau-2 .dropdown-menu > li > a {
    border-radius: var(--rs-radius-sm);
    padding: 8px 12px;
    font-size: 13px;
    color: var(--rs-color-text);
}
#container-fluid-app.menu-niveau-1 .dropdown-menu > li > a:hover,
#container-fluid-app.menu-niveau-1 .dropdown-menu > li > a:focus,
#menu-nav.menu-niveau-2 .dropdown-menu > li > a:hover {
    background-color: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
#container-fluid-app.menu-niveau-1 .dropdown-menu li.divider,
#menu-nav.menu-niveau-2 .dropdown-menu li.divider {
    margin: 4px 0;
    background-color: var(--rs-color-border);
}
/* En-têtes de section dans un dropdown (ex: "RENOUVELLEMENT VDR", "Photos en cours
   de travaux") : un <h4> brut Bootstrap tombait à plat, sans rapport visuel avec le
   reste de la liste — on le transforme en bandeau discret. */
#container-fluid-app.menu-niveau-1 .dropdown-menu h4 {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 13px;
    font-weight: 700;
    background: transparent !important;
    color: var(--rs-color-text) !important;
    padding: 8px 10px;
    margin: 0 0 4px;
    border-bottom: 1px solid var(--rs-color-border);
}
/* le badge de comptage dans ces en-têtes arrive parfois avec un positionnement/couleur
   codés en dur par l'AJAX (ex: top:inherit;right:30px;background:#d0e0e0) : on le
   remet dans le flux normal du <h4>, aligné à droite via margin-left:auto. */
#container-fluid-app.menu-niveau-1 .dropdown-menu h4 .badge {
    position: static !important;
    background-color: #e05353 !important;
    color: #fff !important;
    top: auto !important;
    right: auto !important;
}
#container-fluid-app.menu-niveau-1 .dropdown-menu h4 .badge {
    margin-left: auto;
}
#container-fluid-app.menu-niveau-1 .dropdown-menu h4 button {
    border: none;
    background: transparent;
    color: var(--rs-color-muted);
    padding: 4px 6px;
    border-radius: var(--rs-radius-sm);
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .dropdown-menu h4 button:hover {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}

/* Onglets "Tchat / Alertes / Messages Reçus" en tête du dropdown tchat : ils portaient
   des couleurs de bordure codées en dur (#92929269...) sans lien avec la charte. Les
   styles inline n'ont pas !important, donc on peut les recouvrir proprement. */
#container-fluid-app.menu-niveau-1 #refresh_chat-x .dropdown-menu .panelNotif {
    display: inline-flex !important;
    align-items: center;
    border: none !important;
    border-radius: var(--rs-radius-pill) !important;
    background: var(--rs-color-surface-alt) !important;
    color: var(--rs-color-muted) !important;
    font-size: 12.5px;
    font-weight: 600;
    padding: 7px 16px !important;
    margin: 0 6px 6px 0 !important;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 #refresh_chat-x .dropdown-menu .panelNotif.btn-primary {
    background: var(--rs-color-accent) !important;
    color: #fff !important;
}
#container-fluid-app.menu-niveau-1 #refresh_chat-x .dropdown-menu .panelNotif div {
    padding: 0;
}


/* Bannière "alerte utilisateur" (message configuré par un admin, ex. maintenance) :
   elle vivait dans un <li style="width:33%;float:right"> au milieu de la ligne
   logo/garage/recherche, avec un alert Bootstrap en width:100% — dès qu'un message
   un peu long arrivait, ça débordait par-dessus le reste du bandeau. Elle est
   maintenant une bannière à part, pleine largeur, sous la ligne principale
   (cf. .rs-alerte-utilisateur-wrap dans entete_bandeau_menu.php / views/page/
   alert_utilisateur_entete.php). */
#bandeau_entete .rs-alerte-utilisateur-wrap {
    width: 100%;
    padding: 0 24px 8px;
    box-sizing: border-box;
}
#bandeau_entete .rs-alerte-utilisateur {
    display: flex !important;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
    width: 100%;
    margin: 6px 0 0 !important;
    padding: 10px 16px !important;
    box-sizing: border-box;
    border-radius: var(--rs-radius-md) !important;
    background-image: none !important;
    background-color: #fdecea !important;
    border: 1px solid #f3b4ae !important;
    color: #7a1f1a !important;
    text-align: left !important;
    font-size: 13px;
}
#bandeau_entete .rs-alerte-utilisateur-icon {
    flex-shrink: 0;
    color: #c0392b;
}
#bandeau_entete .rs-alerte-utilisateur-texte {
    flex: 1 1 auto;
    min-width: 0;
}
#bandeau_entete .rs-alerte-utilisateur-btn {
    float: none !important;
    flex-shrink: 0;
    margin-left: auto !important;
}

/* Calculatrice flottante (#rs-calculator) : elle s'ouvrait en position:absolute
   collée à 5px du bord droit, ce qui la faisait apparaître à moitié hors écran /
   masquée par le bord du navigateur selon la résolution. Elle est déjà "draggable"
   (voir calculator.php, containment:"body") donc on a juste besoin d'une position
   par défaut fiable, toujours entièrement visible — d'où position:fixed calée sous
   le bandeau plutôt qu'un positionnement relatif à un ancêtre qui a changé plusieurs
   fois cette session. Pas d'overflow/max-height ici : ça découpait la calculatrice
   dès qu'on la faisait glisser hors de sa position de départ — "containment: body"
   suffit déjà à l'empêcher de sortir de l'écran. */
.rs-calculator-popup {
    position: fixed !important;
    top: calc(var(--rs-menu-total-height, 107px) + 10px);
    right: 20px;
    z-index: 999999;
}

/* ============================================================
   Sous-onglets internes aux pages (ex: fiche Garage, TDB > Synthèse) :
   partout ailleurs dans l'appli, ce sont de simples <ul class="nav nav-tabs">
   Bootstrap sans aucun style dédié (bordure plate, fond gris de l'onglet actif).
   Plutôt que patcher chaque page une par une, on les aligne ici sur le même
   langage "pilule" que .zone-onglets — scopé au contenu principal des pages
   (.contenu-general / .conteneur-page-accueil) pour ne pas toucher des popups/
   modales qui utiliseraient aussi .nav-tabs dans un espace plus étroit.
   ============================================================ */
.contenu-general .nav.nav-tabs,
.conteneur-page-accueil .nav.nav-tabs,
.rs-bs-form-skin .nav.nav-tabs {
    border-bottom: 1px solid var(--rs-color-border);
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    padding-bottom: 6px;
}
.contenu-general .nav.nav-tabs > li,
.conteneur-page-accueil .nav.nav-tabs > li,
.rs-bs-form-skin .nav.nav-tabs > li {
    float: none;
}
.contenu-general .nav.nav-tabs > li > a,
.conteneur-page-accueil .nav.nav-tabs > li > a,
.rs-bs-form-skin .nav.nav-tabs > li > a {
    border: 1px solid transparent !important;
    border-radius: var(--rs-radius-pill) !important;
    margin-right: 0 !important;
    padding: 6px 14px !important;
    font-size: 12.5px;
    font-weight: 500;
    color: var(--rs-color-muted);
    background: transparent !important;
    transition: var(--rs-transition);
}
.contenu-general .nav.nav-tabs > li > a:hover,
.contenu-general .nav.nav-tabs > li > a:focus,
.conteneur-page-accueil .nav.nav-tabs > li > a:hover,
.conteneur-page-accueil .nav.nav-tabs > li > a:focus,
.rs-bs-form-skin .nav.nav-tabs > li > a:hover,
.rs-bs-form-skin .nav.nav-tabs > li > a:focus {
    background: var(--rs-color-accent-bg) !important;
    border-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark);
}
.contenu-general .nav.nav-tabs > li.active > a,
.contenu-general .nav.nav-tabs > li.active > a:hover,
.contenu-general .nav.nav-tabs > li.active > a:focus,
.conteneur-page-accueil .nav.nav-tabs > li.active > a,
.conteneur-page-accueil .nav.nav-tabs > li.active > a:hover,
.conteneur-page-accueil .nav.nav-tabs > li.active > a:focus,
.rs-bs-form-skin .nav.nav-tabs > li.active > a,
.rs-bs-form-skin .nav.nav-tabs > li.active > a:hover,
.rs-bs-form-skin .nav.nav-tabs > li.active > a:focus {
    background: var(--rs-color-accent-bg) !important;
    border-color: var(--rs-color-accent) !important;
    color: var(--rs-color-accent-dark) !important;
    font-weight: 600;
}

/* Groupe d'onglets en dropdown dans un <ul class="nav nav-tabs"> (ex: paramétrage
   Garage — views/parametres/garages/parametreVue.php, dropdown "Interfaces" qui
   remplace un seul onglet plat par la liste KINITIA/POWER/QAPTER/... de
   views/parametres/garages/interface.php), même principe que .rs-onglets-group du
   menu niveau 3 (cf. plus haut / menu_fournisseurs.php) : le <li> de groupe ne
   porte pas .onglet-parametre-garage, juste un déclencheur de dropdown avec le
   même gabarit pilule que les onglets voisins. .rs-onglets-group-menu (contenu du
   dropdown) est déjà stylé plus haut, sans scope — inchangé ici. Cette barre n'a
   pas d'overflow (elle wrap au lieu de scroller, cf. règles ci-dessus), donc le
   repositionnement position:fixed fait par js/scripts.js au clic sur
   .rs-onglets-group-toggle est ici accessoire mais reste safe (pas d'ancêtre
   overflow:hidden à contourner). */
.contenu-general .nav.nav-tabs > li.rs-onglets-group,
.conteneur-page-accueil .nav.nav-tabs > li.rs-onglets-group,
.rs-bs-form-skin .nav.nav-tabs > li.rs-onglets-group {
    float: none;
    position: relative;
}
.contenu-general .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle,
.conteneur-page-accueil .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle,
.rs-bs-form-skin .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle {
    border: 1px solid transparent !important;
    border-radius: var(--rs-radius-pill) !important;
    margin-right: 0 !important;
    padding: 6px 14px !important;
    font-size: 12.5px;
    font-weight: 500;
    color: var(--rs-color-muted);
    background: transparent !important;
    cursor: pointer;
    transition: var(--rs-transition);
}
.contenu-general .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle:hover,
.conteneur-page-accueil .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle:hover,
.rs-bs-form-skin .nav.nav-tabs > li.rs-onglets-group > a.rs-onglets-group-toggle:hover {
    background: var(--rs-color-accent-bg) !important;
    border-color: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark);
}
.contenu-general .nav.nav-tabs > li.rs-onglets-group.rs-onglets-group-active > a.rs-onglets-group-toggle,
.conteneur-page-accueil .nav.nav-tabs > li.rs-onglets-group.rs-onglets-group-active > a.rs-onglets-group-toggle,
.rs-bs-form-skin .nav.nav-tabs > li.rs-onglets-group.rs-onglets-group-active > a.rs-onglets-group-toggle,
.contenu-general .nav.nav-tabs > li.rs-onglets-group.open > a.rs-onglets-group-toggle,
.conteneur-page-accueil .nav.nav-tabs > li.rs-onglets-group.open > a.rs-onglets-group-toggle,
.rs-bs-form-skin .nav.nav-tabs > li.rs-onglets-group.open > a.rs-onglets-group-toggle {
    background: var(--rs-color-accent-bg) !important;
    border-color: var(--rs-color-accent) !important;
    color: var(--rs-color-accent-dark) !important;
    font-weight: 600;
}

/* Sélecteur de garage transformé par Select2 (uniquement pour les comptes
   multi-groupement) : Select2 remplace le <select> par son propre widget
   (.select2-container), qui n'hérite pas du style .select-garage posé sur
   l'élément d'origine (masqué) — d'où le rectangle à angles droits vu sur les
   comptes multi-groupement alors que les autres comptes gardent le <select>
   natif déjà arrondi. */
#container-fluid-app.menu-niveau-1 .select2-container {
    /* Select2 est display:inline-block (select2.min.css) : width:auto le fait
       s'ajuster à la longueur du nom du garage au lieu d'une largeur fixe qui
       tronquait prématurément les noms longs ("MULTIMECANIQUE STEENWE..."). Le
       min/max-width garde une taille raisonnable dans les deux sens (pas trop
       étroit pour un nom court, pas trop large pour un nom très long au point
       d'écraser les zones de recherche à côté). */
    width: auto !important;
    min-width: 200px !important;
    max-width: 340px !important;
}
#container-fluid-app.menu-niveau-1 .select2-container--default .select2-selection--single {
    height: 36px;
    display: flex;
    align-items: center;
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-pill) !important;
    background-color: var(--rs-color-surface) !important;
    padding: 0 16px;
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .select2-container--default.select2-container--open .select2-selection--single,
#container-fluid-app.menu-niveau-1 .select2-selection--single:hover {
    border-color: var(--rs-color-accent) !important;
}
#container-fluid-app.menu-niveau-1 .select2-selection__rendered {
    padding: 0 22px 0 0 !important;
    line-height: 34px !important;
    font-size: 13px;
    font-weight: 600;
    color: var(--rs-color-text) !important;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
#container-fluid-app.menu-niveau-1 .select2-selection__arrow {
    height: 34px !important;
    right: 10px !important;
}

/* Garde-fou général : Select2 calcule et pose lui-même en style inline une largeur (qui
   peut dépasser la colonne réellement disponible) et, pour le mode multiple, une hauteur
   figée au montage (avant l'ajout des tags qui, une fois passés à la ligne, ont besoin de
   plus de place). Ne dépend d'aucune des règles ci-dessous : s'applique à toute
   .select2-container, single ou multiple, sur n'importe quel écran. */
.select2-container {
    max-width: 100%;
    height: auto !important;
}

/* Select2 générique (non scopé au bandeau) : utilisé sur pas mal d'écrans TDB/Synthèse/
   Statistique (filtres "Nature", "Utilisateur", "Source", "Groupe d'organismes"...) qui,
   sans ceci, gardaient le rendu Select2 brut par défaut (angles droits, pas d'anneau au
   focus) pendant que le reste du filtre passait aux primitives .rs-input/.rs-input-outline.
   Rayon "md" (pas pilule) pour matcher .rs-input-outline, la variante utilisée dans un
   contexte de formulaire dense plutôt que le bandeau. Hauteur 34px = hauteur par défaut
   de .form-control/.input-group-addon Bootstrap 3 (voir plus bas pour la variante -sm). */
.select2-container--default .select2-selection--single {
    height: 34px;
    display: flex;
    align-items: center;
    border: 1px solid var(--rs-color-border) !important;
    border-radius: 0px 10px 10px 0px !important;
    background-color: var(--rs-color-surface) !important;
    padding: 0 12px;
    box-shadow: none;
    transition: var(--rs-transition);
}
.select2-container--default.select2-container--open .select2-selection--single,
.select2-container--default .select2-selection--single:hover {
    border-color: var(--rs-color-accent) !important;
}
.select2-container--default .select2-selection__rendered {
    padding: 0 20px 0 0 !important;
    line-height: 32px !important;
    font-size: 13px;
    color: var(--rs-color-text) !important;
}
.select2-container--default .select2-selection__arrow {
    height: 32px !important;
    right: 8px !important;
}
.select2-dropdown {
    border-color: var(--rs-color-border) !important;
    border-radius: var(--rs-radius-sm) !important;
    box-shadow: var(--rs-shadow-md) !important;
}
/* .select2-selection--single ci-dessus arrondit uniquement le côté droit (0 10px 10px 0),
   pensé pour un Select2 posé dans un .input-group avec un addon à gauche (le coin gauche
   plat vient alors butter contre l'addon). Le select "Prise en charge" de
   views/devisOr/devis/association_articles.php (.association-change) est un Select2 seul,
   sans .input-group ni addon : il doit garder une pilule complète sur ses 4 coins, comme
   n'importe quel .rs-input-outline hors input-group. Select2 insère son .select2-container
   juste après le <select> d'origine dans le DOM, d'où le sélecteur de fratrie ci-dessous —
   scopé à ce seul select pour ne pas toucher .select2-container--default (partagé par de
   nombreux filtres TDB/Synthèse/Statistique qui, eux, comptent sur l'arrondi côté droit). */
.association-change + .select2-container .select2-selection--single {
    border-radius: var(--rs-radius-md) !important;
}
/* Même cas que .association-change ci-dessus : le select "FOURNISSEUR" de
   views/devisOr/detailOR/ligne_fournisseur.php (.fournisseur_id, converti en Select2 par
   fournisseur.php) n'est dans aucun .input-group — pilule complète sur ses 4 coins plutôt
   que l'arrondi côté droit par défaut de .select2-container--default. */
.fournisseur_id + .select2-container .select2-selection--single {
    border-radius: var(--rs-radius-md) !important;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
    background-color: var(--rs-color-accent) !important;
}

/* Select2 en mode "multiple" (attribut multiple sur le <select> d'origine) : jusqu'ici
   seul le mode single (ci-dessus) était habillé — tous les filtres "multiple" (Groupe
   d'organismes, Organismes, Cabinets d'expertise, Marques...) restaient au rendu Select2
   brut, d'où un décalage visuel évident à côté d'un select2 single déjà stylé dans le même
   bandeau de filtres. Même langage (bordure/rayon/focus) que la variante single. */
.select2-container--default .select2-selection--multiple {
    /* Select2 pose sa propre hauteur en style inline au montage (capturée avant l'ajout
       des tags) ; height:auto en !important la neutralise pour laisser min-height + le
       contenu réel (donc les tags qui passent à la ligne) piloter la hauteur de la zone,
       au lieu qu'ils débordent hors d'une boîte restée figée à sa hauteur d'origine. */
    height: auto !important;
    min-height: 34px;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-md) !important;
    background-color: var(--rs-color-surface) !important;
    padding: 3px 6px;
    box-shadow: none;
    transition: var(--rs-transition);
}
.select2-container--default.select2-container--open .select2-selection--multiple,
.select2-container--default .select2-selection--multiple:hover {
    border-color: var(--rs-color-accent) !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
    padding: 0;
    max-width: 100%;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
    background-color: var(--rs-color-accent-bg);
    border: 1px solid var(--rs-color-accent);
    border-radius: var(--rs-radius-sm);
    color: var(--rs-color-accent-dark);
    margin: 0;
    padding: 1px 6px;
    font-size: 12.5px;
    max-width: 100%;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
    color: var(--rs-color-accent-dark);
    margin-right: 4px;
    border: none;
}
/* Le champ de recherche inline (<li class="select2-search--inline"><input ...></li>) reçoit
   sa largeur via un style="width:...px" posé en JS par Select2 lui-même (recalculé à
   chaque frappe, avec un fallback assez large) — sans contrainte ici, il ignore le
   flex-wrap du conteneur et étire toute la pastille hors de sa colonne. On le force à se
   comporter comme un élément flex normal (grandit/rétrécit, passe à la ligne s'il n'y a
   plus de place) plutôt que de suivre ce width inline. */
.select2-container--default .select2-search--inline {
    flex: 1 1 auto;
    min-width: 18px;
    max-width: 100%;
}
.select2-container--default .select2-search--inline .select2-search__field {
    width: 100% !important;
    min-width: 18px;
    max-width: 100%;
    box-sizing: border-box;
    margin-top: 0;
    font-size: 13px;
}

/* Select2 posé dans un .input-group Bootstrap (ex: <div class="input-group-addon">Libellé
   </div> + <select> devenu Select2) : Select2 remplace le <select> par un
   span.select2-container en display:inline-block, qui ne participe pas au display:table
   de .input-group — d'où un décalage vertical avec l'addon juste à côté (dont la hauteur
   de ligne, elle, vient du display:table-cell + vertical-align:middle de Bootstrap). On
   l'intègre à la même mise en page de table, comme le serait un .form-control classique. */
.input-group > .select2-container {
    display: table-cell;
    float: none;
    width: 100% !important;
    vertical-align: middle;
}
.input-group-sm .select2-container--default .select2-selection--single,
.input-group-sm .select2-container--default .select2-selection--multiple {
    height: 30px;
    min-height: 30px;
}
.input-group-sm .select2-container--default .select2-selection--single .select2-selection__rendered {
    line-height: 28px !important;
}
.input-group-sm .select2-container--default .select2-selection--single .select2-selection__arrow {
    height: 28px !important;
}

/* ============================================================
   Page de connexion + saisie du code de double authentification
   (views/page/login.php > zone_authentification.php / saisieCodeAuthentification.php) :
   remise à plat des champs et boutons dans le même langage que le reste
   (pilules, ombre douce, focus accent), sans toucher au fond vidéo de marque.
   Scopé à #page_content (conteneur commun au formulaire de login ET à l'écran
   de code, injecté par-dessus en AJAX) pour ne pas affecter .form-control/.btn
   ailleurs dans l'appli (classes Bootstrap génériques très réutilisées).
   ============================================================ */
#page_content .input-auth,
#page_content #codeAccesAuthentification {
    height: 30px !important;
    border: none !important;
    border-radius: var(--rs-radius-pill) !important;
    padding: 0 20px !important;
    font-size: 14px !important;
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
#page_content .input-auth:focus,
#page_content #codeAccesAuthentification:focus {
    outline: none;
    box-shadow: 0 0 0 3px rgba(51, 163, 221, .35) !important;
}
#page_content .input-group {
    position: relative;
}
#page_content .input-group .afficherMotdepasse {
    position: absolute;
    right: 6px;
    top: 50%;
    transform: translateY(-50%);
    z-index: 3;
    display: flex;
}
#page_content .afficherMotdepasse button {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: var(--rs-color-muted);
}
#page_content #passLoginGr {
    padding-right: 44px !important;
}
#page_content #btnAuthentification,
#page_content #checkCodeAccessAuthentification {
    display: block;
    background: var(--rs-color-accent) !important;
    color: #fff !important;
    border: none !important;
    border-radius: var(--rs-radius-pill) !important;
    font-weight: 600;
    font-size: 14px;
    box-shadow: var(--rs-shadow-md);
    transition: var(--rs-transition);
    cursor: pointer;
}
#page_content #btnAuthentification:hover,
#page_content #checkCodeAccessAuthentification:hover {
    background: var(--rs-color-accent-dark) !important;
    transform: translateY(-1px);
    color: #fff !important;
}
#page_content a[href="mdp_perdu.php"] {
    color: rgba(255, 255, 255, .85) !important;
    text-decoration: underline;
}
/* Code 2FA : le champ + le bouton "Se connecter" étaient assemblés en input-group
   Bootstrap avec un fond gris plat sur le libellé "Code" — passés en pilule pleine
   largeur, cohérente avec le reste des champs de la page. */
#page_content #codeAccesAuthentification.form-control {
    width: 100%;
}
#page_content .input-group-addon {
    border: none !important;
    background: transparent !important;
    color: rgba(255, 255, 255, .75);
}
#page_content #blockNePlusDemandeAppareil .input-group {
    background: var(--rs-color-surface);
    border-radius: var(--rs-radius-pill);
    box-shadow: var(--rs-shadow-sm);
    overflow: hidden;
    display: flex;
    align-items: center;
    padding: 8px 16px;
}
#page_content #blockNePlusDemandeAppareil .input-group-addon {
    padding: 0 !important;
    background: transparent !important;
    color: var(--rs-color-text) !important;
}
#page_content #blockNePlusDemandeAppareil label {
    color: var(--rs-color-text) !important;
    font-size: 12px !important;
    margin-left: 8px;
}
/* Le lien "Retour" (style inline float:unset) et le bouton "Se Connecter"
   (display:inherit -> inline-block, mais garde le float:left hérité de
   .btn-group > .btn de Bootstrap) mélangeaient flottant et flux normal dans
   un même groupe centré : l'ordre visuel devenait imprévisible et le bouton
   passait sur sa propre ligne. Passage en flex neutralise les floats et
   garantit l'ordre DOM (Retour puis Se Connecter) de gauche à droite. */
#page_content .btn-group {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}
#page_content .btn-group .btn {
    float: none !important;
    border-radius: var(--rs-radius-pill) !important;
    border: 1px solid rgba(255, 255, 255, .5) !important;
    background: transparent !important;
    color: #fff !important;
}
#page_content .btn-group #checkCodeAccessAuthentification {
    border: none !important;
    margin-left: 0;
}
#page_content .renvoyerCodeAuthentification {
    color: rgba(255, 255, 255, .85) !important;
    text-decoration: underline;
}

/* ============================================================
   Modales génériques (#modal_general, #modal_general_2, et toutes les
   variantes #modal_general_* réutilisées à travers l'appli — détail
   fournisseur, Darva, etc.) : remise à plat visuelle de la structure
   Bootstrap standard (.modal-content/-header/-body/-footer), globale
   et non scopée puisque toutes ces modales partagent la même structure
   Bootstrap partout dans l'appli — comme pour .dropdown-menu plus haut,
   c'est un reset purement visuel, aucune classe/comportement JS touché.
   ============================================================ */
.modal-content {
    border: none;
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
}
.modal-header {
    padding: 16px 20px;
    border-bottom: 1px solid var(--rs-color-border);
    border-top-left-radius: var(--rs-radius-md);
    border-top-right-radius: var(--rs-radius-md);
}
.modal-header .modal-title {
    font-size: 16px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.modal-header .close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    margin: -4px -4px 0 0;
    border-radius: var(--rs-radius-pill);
    color: var(--rs-color-muted);
    opacity: 1;
    text-shadow: none;
    transition: var(--rs-transition);
}
.modal-header .close:hover,
.modal-header .close:focus {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
    opacity: 1;
}
.modal-body {
    padding: 20px;
    color: var(--rs-color-text);
}
/* Champs de formulaire "nus" (.form-group > label + .form-control, hors .input-group)
   dans le contenu des modales : Bootstrap ne les stylait pas du tout (label gras brut,
   input à bords carrés). Scopé à .modal-body (déjà généralisé ci-dessus pour l'habillage
   du reste de la modale) plutôt qu'à .form-control/.form-group tout court, beaucoup trop
   utilisés hors modale (tableaux, formulaires de page) pour un changement aussi large.
   Aucune classe/comportement JS touché. */
.modal-body .form-group > label {
    display: block;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--rs-color-muted);
    margin-bottom: 6px;
}
.modal-body .form-control {
    border-color: var(--rs-color-border);
    box-shadow: none;
    color: var(--rs-color-text);
    transition: var(--rs-transition);
}
.modal-body .form-control:focus {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.modal-body .input-group-addon {
    background: var(--rs-color-surface-alt);
    border-color: var(--rs-color-border);
    color: var(--rs-color-muted);
    font-weight: 600;
}
/* Restauration de .has-error (état de validation Bootstrap standard, posé en JS
   sur le .form-group/.input-group parent — cf. js/agenda.js et consorts,
   $(...).parent("div").addClass("has-error")) : plusieurs surcharges .form-control
   ci-dessus et ailleurs dans ce fichier (.modal-body .form-control,
   .rs-bs-form-skin ... .form-control, .rs-atelier-toolbar .form-control...)
   partagent la même spécificité que la règle Bootstrap .has-error .form-control
   et, chargées après elle dans la cascade, l'emportaient silencieusement — la
   bordure rouge de validation ne s'affichait plus nulle part où l'une de ces
   classes s'applique. Plutôt que corriger chaque règle une par une (et devoir
   refaire ça à chaque nouvelle surcharge .form-control ajoutée plus tard), on
   réaffirme ici l'état Bootstrap d'origine avec !important : ne s'active que
   si .has-error est réellement posée (aucun risque de "rougir" un champ valide),
   valeurs reprises telles quelles de bootstrap.css. */
.has-error .form-control {
    border-color: #a94442 !important;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) !important;
}
.has-error .form-control:focus {
    border-color: #843534 !important;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483 !important;
}
.has-error .input-group-addon {
    color: #a94442 !important;
    background-color: #f2dede !important;
    border-color: #a94442 !important;
}
/* select2 (js/select2.config.js) remplace le <select> par son propre widget
   (.select2-container > .select2-selection), qui ne porte pas la classe
   .form-control — la règle .has-error .form-control ci-dessus ne le voit donc
   jamais. .has-error est posée par JS sur le même parent que le <select> caché
   (cf. js/scripts.js, $('.select2-hidden-accessible').parent('div').addClass(...)),
   qui est aussi l'ancêtre du widget select2 rendu juste à côté : on cible donc
   directement .select2-selection--single/--multiple, avec les mêmes couleurs
   Bootstrap que pour .form-control ci-dessus (rouge normal, rouge plus foncé +
   halo quand le select2 est ouvert/a le focus). */
.has-error .select2-container--default .select2-selection--single,
.has-error .select2-container--default .select2-selection--multiple {
    border-color: #a94442 !important;
}
.has-error .select2-container--default.select2-container--focus .select2-selection--single,
.has-error .select2-container--default.select2-container--open .select2-selection--single,
.has-error .select2-container--default.select2-container--focus .select2-selection--multiple,
.has-error .select2-container--default.select2-container--open .select2-selection--multiple {
    border-color: #843534 !important;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483 !important;
}
.modal-footer {
    padding: 14px 20px;
    border-top: 1px solid var(--rs-color-border);
    border-bottom-left-radius: var(--rs-radius-md);
    border-bottom-right-radius: var(--rs-radius-md);
}
.modal-footer .btn + .btn {
    margin-left: 8px;
}
.modal-backdrop.in {
    opacity: .55;
}

/* ============================================================
   Boutons Bootstrap génériques (.btn/.btn-default/.btn-primary/...) — même
   remise à plat "purement visuelle" que la section Modales ci-dessus, pour que
   les ~90% de pages qui n'utilisent pas encore .rs-btn (ajouté au cas par cas,
   cf. section Primitives plus bas) affichent quand même le même langage que
   .rs-btn : coins arrondis, ombre douce, léger soulèvement au survol. Chargé
   après bootstrap.min.css (fichier vendor, jamais modifié directement) donc
   cette règle l'emporte par ordre de cascade sur le rendu Bootstrap par défaut.
   Aucune couleur de variante n'est touchée (.btn-success reste vert, .btn-danger
   reste rouge, etc.) — seulement forme/ombre/transition, comme pour .rs-btn.
   Les boutons "composés" (.btn-group, .input-group-btn, coins de jonction en
   .btn-group>.btn:not(:first-child)...) ne sont pas explicitement exclus : les
   règles Bootstrap correspondantes ont une spécificité plus élevée que ce simple
   sélecteur .btn et continuent donc à imposer leurs propres coins/rayons de
   jonction par-dessus celui-ci, sans qu'on ait besoin de dupliquer cette logique
   ici (vérifié dans bootstrap.min.css avant d'écrire cette règle). */
.btn {
    border-radius: var(--rs-radius-pill);
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
.btn:hover,
.btn:focus {
    box-shadow: var(--rs-shadow-md);
    transform: translateY(-1px);
}
.btn:active {
    box-shadow: var(--rs-shadow-sm);
    transform: none;
}
.btn:disabled,
.btn[disabled],
.btn.disabled {
    box-shadow: none;
    transform: none;
}

/* ============================================================
   Primitives génériques réutilisables pour les prochaines interfaces
   (formulaires, tableaux...) — volontairement autonomes (pas besoin de
   Bootstrap), à poser directement sur n'importe quel <input>/<a>/<table>.
   ============================================================ */

/* Bouton plein, prêt à l'emploi (pas besoin de le combiner à .btn Bootstrap). */
.rs-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 5px 15px;
    border: none;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-accent);
    color: #fff;
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
}
.rs-btn:hover,
.rs-btn:focus {
    background: var(--rs-color-accent-dark);
    color: #fff;
    text-decoration: none;
    box-shadow: var(--rs-shadow-md);
    transform: translateY(-1px);
}
.rs-btn:disabled,
.rs-btn[disabled] {
    opacity: .5;
    cursor: not-allowed;
    box-shadow: none;
    transform: none;
}
/* .btn-sm (Bootstrap) n'a aucun effet sur .rs-btn : les deux classes ont la
   même spécificité et .rs-btn (chargé après bootstrap.css) l'emporte toujours,
   ce qui rend .rs-btn.btn-sm identique à .rs-btn partout où il est utilisé
   (expert.php, organisme.php, generalite.php, detail.php, relationClient.php...).
   On restaure ici un vrai gabarit "petit bouton" pour ce couple de classes. */
.rs-btn.btn-sm {
    padding: 5px 14px;
    font-size: 13px;
    gap: 6px;
}
/* Même constat que .rs-btn.btn-sm ci-dessus : .btn-xs (Bootstrap) n'a aucun effet
   sur .rs-btn sans cette règle, .rs-btn (padding 12px 22px) l'emportant toujours.
   Gabarit "très petit bouton", plus compact que .btn-sm, pour les ~26 fichiers qui
   combinent déjà rs-btn et btn-xs (boutons d'action dans des tableaux/barres
   d'outils denses : listePriseEnCharge.php, ligne_fournisseur.php,
   filtre_suivi_atelier.php...). */
.rs-btn.btn-xs {
    padding: 2px 8px;
    font-size: 11px;
    gap: 4px;
}
/* .rs-btn posé sur un .input-group-addon (ex: les boutons "copier"
   #copied_text_rs de generalite.php/organisme.php/detail.php...) : le
   display:inline-flex de .rs-btn écrase le display:table-cell attendu par
   Bootstrap pour aligner l'addon avec le champ voisin dans un .input-group
   (display:table) — l'addon "flotte" hors de la ligne et décale les champs
   suivants. On restaure table-cell uniquement pour ce cas précis, sans
   toucher .rs-btn seul (boutons hors input-group) ni .input-group-addon seul
   (classe partagée par ~40 fichiers). */
.input-group-addon.rs-btn {
    display: table-cell !important;
    vertical-align: middle;
}
/* variante contour, pour un bouton secondaire sur fond sombre/image (ex: page de login) */
.rs-btn-ghost {
    background: transparent;
    color: #fff;
    border: 1px solid rgba(255, 255, 255, .6);
    box-shadow: none;
}
.rs-btn-ghost:hover,
.rs-btn-ghost:focus {
    background: rgba(255, 255, 255, .12);
    color: #fff;
}
.rs-btn-full {
    width: 100%;
}
/* variante neutre, pour une action secondaire sur fond clair (ex: page de formulaire
   au-dessus du fond de l'appli) — contour discret plutôt que la teinte accent pleine. */
.rs-btn-secondary {
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    border: 1px solid var(--rs-color-border);
    box-shadow: none;
}
.rs-btn-secondary:hover,
.rs-btn-secondary:focus {
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-text);
    border-color: var(--rs-color-accent);
    box-shadow: none;
    transform: none;
}
/* variantes pleines rouge/vert, pour les actions Annuler/Enregistrer d'un même bloc
   modifier/annuler/enregistrer habillé en .rs-btn (hors classes globales .bouton-modifier/
   .bouton-annuler/.bouton-enregistrer, volontairement non retouchées ailleurs dans l'appli). */
.rs-btn-danger {
    background: var(--rs-color-danger);
}
.rs-btn-danger:hover,
.rs-btn-danger:focus {
    background: var(--rs-color-danger-dark);
}
.rs-btn-success {
    background: var(--rs-color-success);
}
.rs-btn-success:hover,
.rs-btn-success:focus {
    background: var(--rs-color-success-dark);
}
/* Bouton plein teinte avertissement (ex: pop-up d'expiration de mot de passe).
   Placé après .rs-btn/.rs-btn-danger/.rs-btn-success : même spécificité (une
   classe), donc l'ordre dans la feuille tranche quand .rs-btn-warning est
   combiné à .rs-btn sur un même bouton (views/parametres/organisme/) — il doit
   passer APRES .rs-btn pour que le orange ne soit pas écrasé par l'accent bleu. */
.rs-btn-warning {
    background: #d99a1b;
    border-color: #d99a1b;
    color: #fff;
}
.rs-btn-warning:hover,
.rs-btn-warning:focus {
    background: #c28712;
    border-color: #c28712;
    color: #fff;
}

/* Champ de saisie autonome (pilule, ombre douce, anneau accent au focus). */
.rs-input {
    display: block;
    width: 100%;
    height: 44px;
    padding: 0 18px;
    border: none;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    font-size: 14px;
    box-shadow: var(--rs-shadow-sm);
    transition: var(--rs-transition);
    box-sizing: border-box;
}
.rs-input:focus {
    outline: none;
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg), 0 0 0 1px var(--rs-color-accent);
}
.rs-input::placeholder {
    color: var(--rs-color-faint);
}
/* variante bordée (radius-md, pas pilule) : mieux adaptée à un formulaire dense
   avec plusieurs champs les uns sous les autres (ex: page de paramétrage). */
.rs-input-outline {
    border-radius: var(--rs-radius-md);
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    box-shadow: none;
}
.rs-input-outline:focus {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
/* select.rs-input-outline (views/devisOr/detailOR/generalite.php et autres formulaires
   denses) : sans largeur définie par .rs-input-outline seul (contrairement à .rs-input),
   un <select> se dimensionne sur son option la plus longue et peut déborder de sa
   colonne/.input-group (ex: "VP - VOITURE PARTICULIERE (Y COMPRIS COMMERCIALE...)").
   On le contraint à ne jamais dépasser son conteneur, avec troncature "..." plutôt
   qu'un débordement brut du texte. */
select.rs-input-outline {
    max-width: 100%;
    box-sizing: border-box;
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}
.rs-input-label {
    display: block;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--rs-color-muted);
    margin-bottom: 6px;
}
/* rs-input-label est aussi repris (à la demande) comme classe du conteneur "Du ... Au ..."
   des filtres de date de views/tdb_synthese/, à la place de l'ancien .rs-tdb-daterange —
   un <div> (jamais un <label>/<span>), donc ce cas se distingue par le sélecteur d'élément.
   Il lui faut la même mise en page flex qu'avant (+ position:relative, obligatoire pour
   bootstrap-datetimepicker) et pas la typographie de libellé, qui reste portée par les
   <span class="rs-input-label"> "Du"/"Au" à l'intérieur. */
div.rs-input-label {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    position: relative;
    margin-bottom: 0;
    font-size: inherit;
    font-weight: inherit;
    color: inherit;
}

/* ============================================================
   Bandeau de recherche/filtre de dossiers (views/devisOr/filtre_recherche.php,
   partagé par le module Devis/OR et le module Fournisseurs — cf. $isDevisOR /
   $isFournisseur). Habillage uniquement avec les primitives ci-dessus
   (.rs-card/.rs-btn/.rs-input-outline/.rs-input-label) ; tous les id/name/class
   utilisés par js/DevisOr.js (recherche en direct, message d'erreur par champ...)
   sont conservés à l'identique.
   ============================================================ */
.rs-filtre-recherche-card {
    max-width: 980px;
    margin: 0 auto 20px;
}
/* Bandeau haut (fond accent-bg) pour les actions "Créer Nouveau Dossier"/"Scan
   carte grise" — les marges négatives ramènent le bandeau aux bords du .rs-card
   (padding:26px). Le rayon est posé ICI (pas d'overflow:hidden sur le .rs-card,
   qui couperait sinon le calendrier de #date_actu juste en dessous : le widget
   bootstrap-datetimepicker s'insère en sibling absolute du champ, pas dans le
   <body>, donc un ancêtre overflow:hidden le tronque — cf. .rs-filtre-recherche-actu
   plus bas, même raison). */
.rs-filtre-recherche-topbar {
    display: flex;
    justify-content: center;
    padding: 14px 26px;
    margin: -26px -26px 20px;
    border-radius: var(--rs-radius-md) var(--rs-radius-md) 0 0;
    background: var(--rs-color-accent-bg);
}
.rs-filtre-recherche-topbar .rs-btn-secondary {
    color: var(--rs-color-accent-dark);
    border-color: var(--rs-color-surface);
}
.rs-filtre-recherche-topbar .rs-btn-secondary:hover {
    border-color: var(--rs-color-accent);
}
.rs-filtre-recherche-head {
    text-align: center;
    margin-bottom: 14px;
}
.rs-filtre-recherche-title-row {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
}
.rs-filtre-recherche-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 34px;
    height: 34px;
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent);
    font-size: 15px;
}
.rs-filtre-recherche-title {
    margin: 0 0 4px;
    font-size: 21px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-filtre-recherche-result {
    font-size: 13px;
    color: var(--rs-color-muted);
}
.rs-filtre-recherche-result #resultat-recherche-label {
    font-weight: 700;
    color: var(--rs-color-accent-dark);
}
.rs-filtre-recherche-options {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 10px 18px;
    padding-bottom: 16px;
    margin-bottom: 16px;
    border-bottom: 1px solid var(--rs-color-border);
}
.rs-filtre-toggle {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    padding: 7px 14px;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    font-size: 13px;
    font-weight: 500;
    color: var(--rs-color-text);
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-filtre-toggle:hover {
    border-color: var(--rs-color-accent);
}
.rs-filtre-toggle input[type="checkbox"] {
    accent-color: var(--rs-color-accent);
    width: 15px;
    height: 15px;
    margin: 0;
    cursor: pointer;
}
/* Variante "nue" de .rs-filtre-toggle (sans pilule/bordure) pour une case à cocher
   qui doit rester une simple case cochée plutôt qu'un bouton toggle — cf. "Exclure
   de la recherche" dans views/devisOr/filtre_recherche.php. Classe séparée :
   .rs-filtre-toggle reste inchangée, réutilisée telle quelle ailleurs (TDB Synthèse
   VDR, marge pièces facture mois...). */
.rs-filtre-check {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    font-size: 13px;
    font-weight: 500;
    color: var(--rs-color-text);
    cursor: pointer;
}
.rs-filtre-check input[type="checkbox"] {
    accent-color: var(--rs-color-accent);
    width: 16px;
    height: 16px;
    margin: 0;
    cursor: pointer;
}
.rs-filtre-recherche-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    /* margin-left: auto; */
}
.rs-filtre-recherche-actions .rs-btn {
    padding: 9px 16px;
    font-size: 13px;
}
.rs-filtre-recherche-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(220px, 1fr));
    gap: 16px 24px;
}
.rs-filtre-field {
    min-width: 0;
}
.rs-filtre-input-group {
    position: relative;
    display: flex;
    align-items: stretch;
    gap: 0;
}
.rs-filtre-input-group .rs-input-outline {
    flex: 1 1 auto;
    min-width: 0;
    border-radius: var(--rs-radius-md);
    padding-right: 42px;
}
.rs-filtre-input-group.rs-filtre-input-group-sm {
    display: inline-flex;
    width: auto;
}
/* La loupe est maintenant incrustée dans le champ (icône seule, sans fond ni
   bordure propres) plutôt qu'un bouton accolé formant un "input group" à deux
   blocs — cf. views/devisOr/filtre_recherche.php. .rs-filtre-input-group garde
   position:relative (déjà posé plus haut) pour ce positionnement absolu. */
.rs-filtre-search-btn {
    position: absolute;
    top: 50%;
    right: 4px;
    transform: translateY(-50%);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: none;
    border-radius: var(--rs-radius-pill);
    background: transparent;
    color: var(--rs-color-muted);
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-filtre-search-btn:hover {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
.rs-filtre-hint {
    margin-top: 5px;
    font-size: 11px;
    color: var(--rs-color-danger);
}
.rs-filtre-recherche-extra {
    display: flex;
    justify-content: center;
    margin-top: 18px;
}
.rs-filtre-recherche-actu {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    gap: 12px;
    margin: 20px -26px -26px;
    padding: 14px 26px;
    border-radius: 0 0 var(--rs-radius-md) var(--rs-radius-md);
    background: var(--rs-color-accent-bg);
    text-align: center;
}
.rs-filtre-recherche-actu-link {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 15px;
    font-weight: 600;
    color: var(--rs-color-accent-dark);
    text-decoration: none;
    cursor: pointer;
}
.rs-filtre-recherche-actu-link:hover {
    text-decoration: underline;
}
.rs-filtre-recherche-fournisseur {
    display: flex;
    justify-content: center;
    margin-top: 18px;
}
.rs-filtre-recherche-fournisseur .rs-filtre-field {
    width: 100%;
    max-width: 420px;
}
@media (max-width: 700px) {
    .rs-filtre-recherche-grid {
        grid-template-columns: 1fr;
    }
    .rs-filtre-recherche-actions {
        margin-left: 0;
        justify-content: center;
        width: 100%;
    }
}

/* "Actualité du jour" (views/devisOr/devis/actu_jour.php) : remplace le contenu de
   #resultat_recherche_dossier au clic sur #consulter_actu_jour. Chaque ligne est un
   accordéon géré par js/DevisOr.js via des id (#zone_text_*, #open/close_contenu_actu_jour_*,
   #<data-zone>, [data-etat]) — on ne touche qu'à l'habillage, jamais à display/data-etat
   (laissés au JS, cf. .rs-actu-zone/.rs-actu-jour-loading ci-dessous : pas de display
   forcé en CSS, seulement position/couleurs). */
.rs-actu-jour-wrap {
    position: relative;
}
/* Pas de max-width ici : .rs-actu-zone (résultat déplié, table large injectée en
   AJAX par resultatRechercheDossier.php, cf. bas de fichier) est un DESCENDANT de
   .rs-actu-jour-card dans le HTML (actu_jour.php) — une limite posée sur la carte
   aurait aussi bridé ses résultats, pas seulement les lignes/compteurs. La carte
   prend donc toute la largeur de .rs-actu-jour-wrap (elle-même dans le flux normal
   de la page, pas de pleine-largeur "bleed" hors de son conteneur). */
.rs-actu-jour-card {
    padding: 10px;
}
.rs-actu-item + .rs-actu-item {
    border-top: 1px solid var(--rs-color-border);
}
.rs-actu-row {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 11px 12px;
    border-radius: var(--rs-radius-sm);
    color: var(--rs-color-muted);
    cursor: default;
    transition: var(--rs-transition);
}
.rs-actu-row.charger_contenu_actu_jour {
    cursor: pointer;
    color: var(--rs-color-text);
}
.rs-actu-row.charger_contenu_actu_jour:hover {
    background: var(--rs-color-accent-bg);
}
.rs-actu-chevrons {
    flex: 0 0 auto;
    width: 14px;
    color: var(--rs-color-faint);
    font-size: 12px;
}
.rs-actu-count {
    flex: 0 0 auto;
    min-width: 26px;
    padding: 2px 8px;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-muted);
    font-size: 12px;
    font-weight: 700;
    text-align: center;
}
.rs-actu-count.has-results {
    background: var(--rs-color-success-bg);
    color: var(--rs-color-success-dark);
}
.rs-actu-label {
    font-size: 14px;
}
.rs-actu-row.charger_contenu_actu_jour .rs-actu-label {
    font-weight: 500;
}
.rs-actu-zone {
    padding: 0 10px 10px 36px;
}
.rs-actu-jour-loading {
    position: absolute;
    inset: 0;
    z-index: 1;
    text-align: center;
}
.rs-actu-jour-loading img {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

/* Tableau : lignes espacées, en-tête discret, survol teinté — à poser directement
   sur un <table class="rs-table"> (idéalement enveloppée dans .rs-table-wrap pour
   le défilement horizontal sur mobile). */
.rs-table-wrap {
    overflow-x: auto;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
}
.rs-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
    background: var(--rs-color-surface);
}
.rs-table thead th {
    text-align: center;
    padding: 2px;
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-muted);
    font-weight: 700;
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: .03em;
    border: 1px solid var(--rs-color-border);
    white-space: nowrap;
}
.rs-table tbody td {
    /* padding: 12px 16px; */
    border-bottom: 1px solid var(--rs-color-border);
    color: var(--rs-color-text);
    vertical-align: middle;
}
.rs-table tbody tr:last-child td {
    border-bottom: none;
}
.rs-table tbody tr:hover td {
    background: var(--rs-color-accent-bg);
}
/* Champs éditables directement dans les cellules (ex: pièces en dépôt/stock) : le thème
   Bootstrap (yeti) remet border-radius à 0 sur .form-control, donc on le redonne ici
   pour rester cohérent avec le reste du design system, sans toucher au .form-control
   global (qui reste carré ailleurs dans l'appli non encore migrée). */
.rs-table-wrap input.form-control {
    border-radius: var(--rs-radius-sm);
}
/* Tableau "Prises en Charge & Vétustés Client" (views/devisOr/detailOR/listePriseEnCharge.php) :
   ~10 colonnes étroites (select, montants €/%, checkbox, actions) avec le padding
   généreux par défaut de .rs-table (12px 16px) dépassent la largeur du fieldset et
   forcent un scroll horizontal. Padding réduit ici, scopé à ce tableau (.tableau-pec-dossier)
   pour ne pas retoucher .rs-table lui-même (partagé par ~40 fichiers). */
.tableau-pec-dossier.rs-table thead th,
.tableau-pec-dossier.rs-table tbody td {
    padding: 6px 8px;
}

/* Résultats de recherche de dossiers (views/devisOr/resultatRechercheDossier.php,
   sous filtre_recherche.php / actu_jour.php sur les pages Devis/OR et Fournisseurs).
   Habillage via les primitives .rs-table/.rs-table-wrap ci-dessus + quelques ajouts
   ci-dessous ; le HTML/JS (popovers, data-click/data-onglets/data-numdev pour ouvrir
   un dossier, id="tr_<num_dev>", couleurs de ligne selon avoir/épave/annulé/organisme
   posées en inline-style par la logique métier de ligne_atelier...) reste inchangé,
   la colonne "Total HT"/"Total TTC" et les <td style="height:1px"> avec un enfant
   height:70/80% (zone cliquable pleine hauteur) ne doivent pas être retouchés. */
.rs-resultat-recherche-wrap {
    margin-top: 20px;
}
.rs-resultat-recherche-table.rs-table {
    font-size: 12.5px;
}
/* Survol en surimpression semi-transparente plutôt qu'un fond plein : une ligne
   avoir/épave/annulée a déjà un fond posé en inline-style par la logique métier
   (cf. $back_ground_epave/$color_avoir) — un fond plein l'aurait effacé au survol. */
.rs-resultat-recherche-table.rs-table tbody tr:hover td {
    background: rgba(51, 163, 221, .08);
}
.rs-resultat-recherche-table thead th {
    white-space: normal;
}
.rs-resultat-recherche-table .plaque {
    box-shadow: none;
}
.rs-resultat-recherche-empty {
    background: var(--rs-color-danger-bg);
    color: var(--rs-color-danger);
    border: none;
    border-radius: var(--rs-radius-md);
    font-weight: 600;
    padding: 16px;
}
.rs-resultat-recherche-extension {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
    border: 1px solid var(--rs-color-accent);
    border-radius: var(--rs-radius-pill);
    font-weight: 600;
    padding: 8px 18px;
}
.rs-resultat-recherche-extension:hover {
    background: var(--rs-color-accent);
    color: #fff;
}
.rs-resultat-recherche-total {
    background: var(--rs-color-nav-dark) !important;
    color: #fff !important;
}
.rs-resultat-recherche-total td {
    border: none !important;
    font-weight: 700;
    padding: 12px 16px;
}

/* Tableau de bord — "Objectif en cours" (views/tableau_de_bord/objectif_en_cours.php).
   La majorité du contenu visuel (jauges, courbe, récap marges, CA mensuel...) est
   injectée en AJAX par js/TDB.js dans des <div id="..."> vides — on ne touche ni ne
   renomme aucun de ces id, seul l'habillage des éléments statiques de ce fichier
   change (boutons, bandeau amortissement, bandeaux "+ de détails"). .hide()/.show()
   restent utilisés par TDB.js sur #afficher_amortissement_masse_salariale /
   #amortissement_masse_salariale : pas de display forcé en CSS ici. */
.rs-tdb-toolbar {
    margin: 16px 15px 20px;
}
.rs-tdb-toolbar-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
.rs-tdb-toolbar-actions .rs-btn {
    padding: 9px 16px;
    font-size: 13px;
}
.rs-tdb-amortissement {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 14px;
    padding-top: 14px;
    border-top: 1px solid var(--rs-color-border);
    font-size: 13px;
    color: var(--rs-color-text);
}
.rs-tdb-amortissement img {
    width: 20px;
}
.rs-tdb-amortissement-value {
    font-weight: 700;
    color: var(--rs-color-accent-dark);
}
.rs-tdb-amortissement-warning {
    flex-basis: 100%;
    font-size: 12.5px;
}
.rs-tdb-expand {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin: 10px 0 0;
    padding: 10px 16px;
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
    border: 1px solid var(--rs-color-accent);
    border-radius: var(--rs-radius-md);
    font-weight: 600;
    font-size: 13px;
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-tdb-expand:hover {
    background: var(--rs-color-accent);
    color: #fff;
}

/* Cartes des 4 jauges CA (views/tableau_de_bord/jauge_tdb.php) : Bootstrap
   .panel.panel-default nu à la base — les jauges elles-mêmes sont dessinées sur
   <canvas> par une lib tierce (couleurs passées en JS, cf. rsGaugeColors dans ce
   même fichier), on n'habille ici que la carte/l'en-tête autour. */
.rs-tdb-gauge-panel {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    overflow: hidden;
}
.rs-tdb-gauge-heading {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 10px 14px;
    background: var(--rs-color-surface-alt);
    border-bottom: 1px solid var(--rs-color-border);
    color: var(--rs-color-text);
    font-size: 12px;
    font-weight: 700;
}
.rs-tdb-gauge-info a {
    color: var(--rs-color-muted);
}
.rs-tdb-gauge-info a:hover {
    color: var(--rs-color-accent);
}
.rs-tdb-gauge-body {
    padding: 12px 12px 16px;
}
.rs-tdb-gauge-value {
    margin-top: 4px;
    font-size: 14px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-tdb-gauge-eye {
    margin-left: 4px;
    border-radius: var(--rs-radius-pill);
}
.rs-tdb-gauge-rdv {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 14px;
}

/* Courbe CA annuelle (views/tableau_de_bord/courbe_tdb.php) : même carte que les
   jauges (.rs-tdb-gauge-panel/-heading/-body, réutilisées telles quelles), plus
   l'habillage du pied de carte (#zone-ca-productif-tdb, rempli en JS par
   charger_courbe() — cf. js/TDB.js). L'ancien panel-body avait un
   "padding-top:-20px" (jamais appliqué, une valeur négative de padding est invalide
   CSS) et un "margin-top:-40px" — un rattrapage pour un en-tête plus haut qu'avant :
   supprimé, il aurait fait chevaucher le canvas sur le nouvel en-tête, plus compact. */
.rs-tdb-courbe-heading {
    font-size: 13px;
    white-space: normal;
    text-align: left;
}
.rs-tdb-courbe-footer {
    padding: 10px 14px;
    background: var(--rs-color-surface-alt);
    border-top: 1px solid var(--rs-color-border);
    font-size: 12.5px;
    color: var(--rs-color-muted);
}

/* Compteurs "H MO Facturées" (views/tableau_de_bord/content_compteur_heure_mo.php) —
   même carte de jauge que jauge_tdb.php (.rs-tdb-gauge-*, réutilisées telles quelles). */
.rs-tdb-hmo-footnote {
    margin: 4px 0 15px;
    padding: 10px 14px;
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    font-size: 12.5px;
    font-weight: 600;
    color: var(--rs-color-text);
}

/* Récapitulatifs de marge (views/tdb/marge_pieces_facture_mois.php,
   marge_mo_facture_mois.php, marge_peinture_facture_mois.php) et le tableau
   d'énergie (views/tdb/tableau_consommation_energie.php), tous injectés dans
   #zone_recapitulatif_marge_* / #zone_consommation_energie (objectif_en_cours.php).
   Ex-<fieldset><legend style="background-color:#ccc">, remplacé par une carte ; les
   tableaux passent par .rs-table (réutilisé), mais leurs lignes d'en-tête sont des
   <th> DANS le <tbody> (pas de <thead>) — d'où le rs-tdb-marge-table tbody th
   ci-dessous, en plus de .rs-table qui ne cible que thead th. */
.rs-tdb-marge-card {
    padding: 0;
    overflow: hidden;
}
.rs-tdb-marge-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 8px;
    padding: 12px 16px;
    background: var(--rs-color-surface-alt);
    border-bottom: 1px solid var(--rs-color-border);
}
.rs-tdb-marge-title,
.rs-tdb-marge-objectif {
    display: flex;
    align-items: center;
    gap: 6px;
}
.rs-tdb-marge-title h5 {
    margin: 0;
    font-size: 14px;
    color: var(--rs-color-text);
}
.rs-tdb-marge-objectif h6 {
    margin: 0;
    font-size: 12px;
    font-weight: 600;
    color: var(--rs-color-muted);
}
.rs-tdb-marge-title i,
.rs-tdb-marge-objectif i {
    color: var(--rs-color-faint);
    font-size: 12px;
}
.rs-tdb-marge-filter {
    padding: 10px 16px 0;
}
.rs-tdb-marge-table-wrap {
    border: none;
    border-radius: 0;
    margin: 0;
}
.rs-tdb-marge-table.rs-table {
    font-size: 12.5px;
}
.rs-tdb-marge-table.rs-table tbody th {
    padding: 10px 12px;
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-muted);
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .02em;
    border-bottom: 1px solid var(--rs-color-border);
}
.rs-tdb-marge-table.rs-table tbody td {
    padding: 9px 12px;
    font-size: 12.5px;
}
.rs-tdb-marge-taux {
    border-radius: var(--rs-radius-sm);
    font-weight: 700;
}
.rs-tdb-marge-taux-ok {
    background: var(--rs-color-success-bg) !important;
    color: var(--rs-color-success-dark) !important;
}
.rs-tdb-marge-taux-ko {
    background: var(--rs-color-danger-bg) !important;
    color: var(--rs-color-danger) !important;
}
.rs-tdb-marge-warning {
    margin-top: 10px;
    border-radius: var(--rs-radius-sm);
}

/* Cartes stat "+ de Détails sur les CA" (views/tableau_de_bord/ca_mensuel.php,
   views/tdb/info_tdb_or.php — injectées dans #zone_ca_mensuel / #info_tdb_or).
   Ex-<div class="list-group"><a class="list-group-item" style="background-color:#néon">,
   avec un "margin-top:-35px" pour recoller visuellement l'en-tête et le corps (2
   list-group séparés) — remplacé par une seule carte, un accent de couleur discret en
   bordure gauche plutôt qu'un fond plein saturé. .rs-tdb-stat-header doit rester
   position:relative : #date_encours_client / .date_info_tdb_or (datetimepicker) sont
   dedans et la lib exige un ancêtre positionné (même bug déjà rencontré sur
   filtre_recherche.php). Les zones dépliables (#detail_nouveau_or, etc.) restent
   togglées par $.css('display', ...) en JS (js/TDB.js) : pas de display forcé ici. */
.rs-tdb-stat-card {
    height: 100%;
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-left: 4px solid var(--rs-color-accent);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    /* PAS de overflow:hidden ici : #date_encours_client / .date_info_tdb_or
       (bootstrap-datetimepicker) insèrent leur popup calendrier comme SIBLING de
       l'<input> (cf. js/bootstrap-datetimepicker.min.js, c.after(o)), donc à
       l'intérieur de cette carte — un overflow:hidden le découperait/le rendrait
       invisible dès qu'il dépasse la hauteur de la carte (même famille de bug que
       l'overflow-x:auto de .zone-onglets rencontré ailleurs dans l'appli). Les coins
       hauts sont arrondis directement sur .rs-tdb-stat-header à la place. */
}
.rs-tdb-stat-card--accent1 { border-left-color: var(--rs-color-accent); }
.rs-tdb-stat-card--accent2 { border-left-color: var(--rs-color-warning); }
.rs-tdb-stat-card--accent3 { border-left-color: #b06fd6; }
.rs-tdb-stat-card--accent4 { border-left-color: var(--rs-color-success); }
.rs-tdb-stat-header {
    position: relative;
    border-top-left-radius: var(--rs-radius-md);
    border-top-right-radius: var(--rs-radius-md);
    padding: 12px 14px;
    background: var(--rs-color-surface-alt);
    border-bottom: 1px solid var(--rs-color-border);
    font-size: 13px;
    color: var(--rs-color-text);
}
.rs-tdb-stat-header--wide {
    padding: 12px 14px 8px;
}
.rs-tdb-stat-header-title {
    font-size: 13px;
    margin-bottom: 6px;
}
.rs-tdb-stat-info {
    float: right;
    color: var(--rs-color-muted);
}
.rs-tdb-stat-date {
    display: inline-block;
    width: 100px;
    padding: 3px 8px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    font-size: 12px;
    font-weight: 600;
}
.rs-tdb-stat-daterange {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    color: var(--rs-color-muted);
    margin-bottom: 8px;
}
.rs-tdb-stat-columns {
    display: grid;
    grid-template-columns: 1fr 46px 46px 52px;
    gap: 4px;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: var(--rs-color-muted);
    text-align: right;
}
.rs-tdb-stat-body {
    padding: 12px 14px;
    font-size: 13px;
    color: var(--rs-color-text);
}
.rs-tdb-stat-body--metric {
    padding: 8px 14px 12px;
}
.rs-tdb-stat-metric-row {
    display: grid;
    grid-template-columns: 1fr 46px 46px 52px;
    gap: 4px;
    align-items: center;
    padding: 6px 0;
    border-top: 1px solid var(--rs-color-border);
    font-size: 12.5px;
}
.rs-tdb-stat-metric-label,
.rs-tdb-stat-metric-value {
    margin: 0;
}
.rs-tdb-stat-metric-value {
    text-align: right;
}
p.rs-tdb-stat-metric-label.afficher_detail_info_tdb_or,
p.rs-tdb-stat-metric-value.afficher_detail_info_tdb_or {
    cursor: pointer;
    color: var(--rs-color-accent-dark);
}
p.rs-tdb-stat-metric-label.afficher_detail_info_tdb_or:hover,
p.rs-tdb-stat-metric-value.afficher_detail_info_tdb_or:hover {
    text-decoration: underline;
}
.rs-tdb-stat-figure {
    color: var(--rs-color-danger);
    font-weight: 700;
}
.rs-tdb-stat-figure-dark {
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-tdb-stat-sub {
    margin: 6px 0 0;
    color: var(--rs-color-muted);
}
.rs-tdb-stat-footer {
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px solid var(--rs-color-border);
}

/* Détail "Groupe d'organisme" (views/tdb/detail_info_tdb_or.php), déplié dans
   #detail_nouveau_or/#detail_nouveau_devis/#detail_livraison (cf. .rs-tdb-stat-* juste
   au-dessus). Texte blanc à l'origine (pensé pour l'ancien fond néon plein) : devenu
   invisible sur la carte blanche — recoloré ici. */
.rs-tdb-stat-detail-table.rs-table {
    font-size: 12px;
    margin: 4px 0 0;
}
.rs-tdb-stat-detail-table.rs-table tbody td {
    padding: 6px 8px;
}
.rs-tdb-stat-detail-table .afficher_detail_info_tdb_or_par_groupe_organisme {
    cursor: pointer;
}
.rs-tdb-stat-detail-table .afficher_detail_info_tdb_or_par_groupe_organisme:hover td {
    background: var(--rs-color-accent-bg);
}
.rs-tdb-stat-detail-subrow {
    padding: 0 !important;
    border-bottom: none !important;
}

/* Détail "temps alloués" (views/tableau_de_bord/tdb_temps_alloue.php, injecté dans
   #zone_temps_alloue_tdb). Table simple, pas d'interaction JS sur la structure —
   seul #total_ca_mo_detail est lu (jamais réécrit) par js/TDB.js. */
.rs-tdb-temps-alloue-table.rs-table thead th {
    white-space: normal;
}
.rs-tdb-temps-alloue-table.rs-table tbody th {
    padding: 9px 16px;
    font-size: 12.5px;
    color: var(--rs-color-text);
    border-bottom: 1px solid var(--rs-color-border);
    vertical-align: middle;
}
.rs-tdb-temps-alloue-table.rs-table tfoot th {
    padding: 12px 16px;
    background: var(--rs-color-nav-dark);
    color: #fff;
    border-bottom: none;
    border-top: 1px solid var(--rs-color-border);
}
.rs-tdb-temps-alloue-table .rs-tdb-temps-alloue-total {
    background: var(--rs-color-accent-bg);
}
.rs-tdb-temps-alloue-table .rs-tdb-temps-alloue-camo {
    background: var(--rs-color-success-bg);
}
.rs-tdb-temps-alloue-table tfoot .rs-tdb-temps-alloue-total,
.rs-tdb-temps-alloue-table tfoot .rs-tdb-temps-alloue-camo {
    background: var(--rs-color-nav-dark);
    color: #fff;
}

/* Bandeau "Heures de présences / pointage / manquantes / ratio" (tableau_de_bord.php,
   views/tableau_de_bord/info_pointage_compagnon.php) : 4 <input disabled> dans un
   .input-group, remplacés par de simples pastilles en lecture seule (pas de saisie
   possible côté utilisateur de toute façon). $couleur_fond_heure_pointage_manquante
   reste posée en inline-style (logique métier, conservée telle quelle). */
.rs-tdb-pointage-item {
    height: 100%;
    padding: 8px 12px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-surface-alt);
}
.rs-tdb-pointage-label {
    display: block;
    font-size: 11px;
    font-weight: 600;
    color: var(--rs-color-muted);
    text-transform: uppercase;
    letter-spacing: .02em;
    margin-bottom: 4px;
}
.rs-tdb-pointage-value {
    font-size: 15px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-tdb-pointage-footnote {
    margin-top: 8px;
    font-size: 11px;
    color: var(--rs-color-muted);
}

/* Filtre Année/Mois/Jours (tableau_de_bord.php) : ex-.input-group/.input-group-addon,
   remplacé par les primitives .rs-input/.rs-input-outline + .rs-input-label — même
   #annee_TDB_recherche/#mois_TDB_recherche/#jour_TDB_recherche et classe .filtre_tDB
   lues par js/TDB.js (change), rien d'autre ne change. */
.rs-tdb-filtre-periode {
    margin-top: 2px;
}
.rs-tdb-filtre-periode .rs-input-label {
    margin-bottom: 3px;
}
.rs-tdb-filtre-periode select.rs-input {
    height: 32px;
    padding: 0 10px;
    font-size: 12.5px;
}

/* Tableau Réalisation (views/tableau_de_bord/tableau_realisation.php) : 20 colonnes,
   plusieurs d'entre elles colorées en fond plein sur TOUTES les lignes (N-1, OBJ
   LISSE, CA REALISE, dossiers livrés non facturés, CA Prévisionnel) — c'est un vrai
   code couleur (repérer une colonne d'un coup d'œil en descendant le tableau), donc
   conservé, juste avec des teintes de la palette au lieu du RVB brut d'origine
   (#e23428, #2879e2, #f3fb29, rgba(60,0,60,.5)...). Les "opacity:0,5" d'origine
   étaient une virgule au lieu d'un point (valeur CSS invalide, donc déjà sans effet)
   — pas besoin de les reprendre. */
.rs-tdb-real-table.rs-table th,
.rs-tdb-real-table.rs-table td {
    padding: 7px 8px;
    font-size: 12px;
}
.rs-tdb-real-n1 {
    background: #6b3f6b !important;
    color: #fff !important;
}
.rs-tdb-real-objlisse {
    background: var(--rs-color-warning) !important;
    color: #fff !important;
}
.rs-tdb-real-realise {
    background: var(--rs-color-accent) !important;
    color: #fff !important;
}
.rs-tdb-real-dossierslivres {
    background: #fdf1a8 !important;
    color: var(--rs-color-text) !important;
}
.rs-tdb-real-prev {
    background: var(--rs-color-surface-alt) !important;
    color: var(--rs-color-text) !important;
}
.rs-tdb-real-moyenne td,
.rs-tdb-real-moyenne th {
    font-style: italic;
    color: var(--rs-color-muted);
}
/* Popover "détail des dossiers" au clic sur une cellule "CA Dossiers livrés non
   facturés" — jQuery .show()/.hide() (cf. js/scripts.js) : ne pas forcer display ici,
   uniquement le positionnement/l'habillage, repris à l'identique de l'ancien
   inline-style pour ne rien changer au comportement. */
.rs-tdb-real-popover {
    position: absolute;
    z-index: 1;
    margin-top: 27px;
    margin-left: 0;
    background: var(--rs-color-surface);
    border-radius: var(--rs-radius-sm);
    box-shadow: var(--rs-shadow-md);
}

/* Panneau "Désactiver / Masquer les alertes" : c'était 2 pastilles indépendantes en
   position:absolute (right:152px / right:2px) mesurées depuis .zone-des-menus, donc
   plus du tout alignées avec l'icône "Alertes actives" une fois celle-ci déplacée
   dans le menu "...". Le panneau est maintenant niché dans le <li> "Alertes actives"
   lui-même (.rs-alert-actions-anchor) et s'ouvre juste à côté, en flyout vers la
   gauche — ça évite le coin en haut à droite de l'écran où s'affichent aussi les
   notifications toast (ex. "Relance Facture"). Le déclenchement (afficher/masquer
   selon .exist-notif-alert) reste géré par le JS existant (js/scripts.js) — rien à
   changer côté comportement, juste l'habillage/positionnement. */
#container-fluid-app.menu-niveau-1 li.rs-alert-actions-anchor {
    position: relative !important;
}
#container-fluid-app.menu-niveau-1 .el-desactive-masque-alert {
    display: none;
    position: absolute !important;
    top: 0 !important;
    left: auto !important;
    right: 100% !important;
    margin-right: 8px !important;
    z-index: 999999 !important;
    width: 220px !important;
    height: auto !important;
    background: var(--rs-color-surface) !important;
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-md) !important;
    box-shadow: var(--rs-shadow-md) !important;
    padding: 6px !important;
    transition: none !important;
}
#container-fluid-app.menu-niveau-1 .el-desactive-masque-alert .action_alerte {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 12px;
    border-radius: var(--rs-radius-sm);
    font-size: 13px;
    font-weight: 500;
    color: var(--rs-color-text);
    cursor: pointer;
    transition: var(--rs-transition);
}
#container-fluid-app.menu-niveau-1 .el-desactive-masque-alert .action_alerte:hover {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
#container-fluid-app.menu-niveau-1 .el-desactive-masque-alert .action_alerte i {
    width: 16px;
    text-align: center;
    color: var(--rs-color-muted);
}

/* "Alertes actives" (#icone_notif_alert) : coloré en rouge d'alerte dès que le JS lui
   ajoute .exist-notif-alert (des alertes existent), gris discret sinon — l'icône seule
   ne donnait aujourd'hui aucune indication visuelle de cet état. */
#container-fluid-app.menu-niveau-1 #icone_notif_alert.exist-notif-alert {
    color: #e05353 !important;
}

/* ============================================================
   Toast "alerte utilisateur" (ex. "Relance Facture") — afficherAlerteUser(),
   js/scripts.js, contenu rendu par views/devisOr/devis/notification_alert_utilisateur.php.
   toastr fournit juste la coquille (#toast-container, .toast, .toast-progress) ; on
   neutralise son habillage par défaut (icône en background-image + padding-left:50px,
   opacity:0.8, ombre grise brute) pour un vrai composant carte, et on stylise le
   contenu (.rs-alert-toast-*). La couleur de fond reste posée en inline-style par le JS
   (data.color, configurable par garage) : on ne la touche pas, seulement son écrin. */
#toast-container > .toast.pause_alert_user {
    width: 320px;
    padding: 14px 16px;
    margin: 0 0 10px;
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
    opacity: 1;
    background-image: none !important;
    filter: none !important;
}
#toast-container > .toast.pause_alert_user:hover {
    box-shadow: var(--rs-shadow-md);
    opacity: 1;
}
.rs-alert-toast-head {
    display: flex;
    align-items: center;
    gap: 8px;
}
.rs-alert-toast-icon {
    flex: 0 0 auto;
    color: var(--rs-color-danger);
    font-size: 15px;
}
.rs-alert-toast-title {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 14px;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-alert-toast-open {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border: none;
    border-radius: var(--rs-radius-pill);
    background: rgba(255, 255, 255, .6);
    color: var(--rs-color-text);
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-alert-toast-open:hover {
    background: #fff;
    color: var(--rs-color-accent-dark);
}
.rs-alert-toast-message {
    margin: 8px 0 12px;
    font-size: 13px;
    line-height: 1.4;
    color: var(--rs-color-text);
}
.rs-alert-toast-actions {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
}
.rs-alert-toast-label {
    margin-right: auto;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: rgba(34, 48, 60, .55);
}
.rs-alert-toast-btn {
    display: inline-flex;
    align-items: center;
    padding: 5px 12px;
    border-radius: var(--rs-radius-pill);
    font-size: 12px;
    font-weight: 600;
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-alert-toast-btn-neutral {
    background: rgba(255, 255, 255, .6);
    color: var(--rs-color-text);
}
.rs-alert-toast-btn-neutral:hover {
    background: #fff;
}
.rs-alert-toast-btn-danger {
    background: var(--rs-color-danger);
    color: #fff;
}
.rs-alert-toast-btn-danger:hover {
    background: #8f3634;
}

/* ============================================================
   Chat privé (messages.php, ouvert en popup ~450-500x550 depuis haut_small.php /
   chat_refresh.php — cf. window.open(...)) : refonte de la fenêtre autonome, plus
   des bulles de message.php. #refresh_element / #description / #emoticons / le
   formulaire "Chat" (Message, Envoyer, Destinataire) gardent leurs id/name exacts,
   utilisés par le JS existant (rechargement AJAX toutes les 60s, ajout d'émoticône
   au clic) — seul l'habillage change.
   ============================================================ */
.rs-chat-body {
    display: flex;
    flex-direction: column;
    height: 100vh;
    margin: 0;
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-text);
}
.rs-chat-shell {
    display: flex;
    flex-direction: column;
    height: 100vh;
    min-height: 0;
}
.rs-chat-header {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 16px;
    background: var(--rs-color-surface);
    border-bottom: 1px solid var(--rs-color-border);
    box-shadow: var(--rs-shadow-sm);
}
.rs-chat-avatar {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
    font-size: 16px;
}
.rs-chat-header-name {
    font-size: 15px;
    font-weight: 700;
    color: var(--rs-color-text);
    line-height: 1.25;
}
.rs-chat-header-sub {
    font-size: 11px;
    color: var(--rs-color-muted);
}
.rs-chat-messages {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overflow-x: hidden;
    padding: 14px;
}

/* Bulles de message (générées par message.php) */
.rs-chat-msg {
    /* display: flex; 
    align-items: flex-end; */
    gap: 8px;
    max-width: 82%;
    margin-bottom: 12px;
}
.rs-chat-msg-mine {
    margin-left: auto;
    flex-direction: row-reverse;
}
.rs-chat-msg-avatar {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-faint);
    font-size: 13px;
}
.rs-chat-msg-bubble {
    min-width: 0;
    padding: 8px 12px;
    border-radius: var(--rs-radius-md);
    background: var(--rs-color-surface);
    box-shadow: var(--rs-shadow-sm);
}
.rs-chat-msg-mine .rs-chat-msg-bubble {
    background: var(--rs-color-accent);
    color: #fff;
}
.rs-chat-msg-theirs.rs-chat-msg-unread .rs-chat-msg-bubble {
    background: var(--rs-color-accent-bg);
}
.rs-chat-msg-author {
    font-size: 11px;
    font-weight: 700;
    margin-bottom: 2px;
    opacity: .8;
}
.rs-chat-msg-text {
    font-size: 13px;
    line-height: 1.4;
    word-break: break-word;
}
.rs-chat-msg-text img {
    height: 16px;
    vertical-align: text-bottom;
}
.rs-chat-msg-meta {
    display: block;
    margin-top: 4px;
    font-size: 10px;
    text-align: right;
    opacity: .75;
}
.rs-chat-msg-mine .rs-chat-msg-meta {
    color: rgba(255, 255, 255, .85);
}

/* Zone de saisie */
.rs-chat-composer {
    flex: 0 0 auto;
    border-top: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    padding: 10px 12px;
}
.rs-chat-emoji-panel {
    display: none;
    flex-wrap: wrap;
    gap: 4px;
    max-height: 120px;
    overflow-y: auto;
    padding: 8px;
    margin-bottom: 8px;
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
}
.rs-chat-emoji-panel.is-open {
    display: flex;
}
.rs-chat-emoji-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: var(--rs-radius-sm);
    transition: var(--rs-transition);
}
.rs-chat-emoji-btn:hover {
    background: var(--rs-color-accent-bg);
}
.rs-chat-emoji-btn img {
    width: 16px;
    height: 16px;
}
.rs-chat-input-row {
    display: flex;
    align-items: flex-end;
    gap: 8px;
}
.rs-chat-emoji-toggle {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border: 1px solid var(--rs-color-border);
    border-radius: 50%;
    background: var(--rs-color-surface);
    color: var(--rs-color-muted);
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-chat-emoji-toggle:hover,
.rs-chat-emoji-toggle.is-active {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
    border-color: var(--rs-color-accent);
}
.rs-chat-textarea {
    flex: 1 1 auto;
    min-width: 0;
    height: 34px;
    max-height: 90px;
    padding: 7px 14px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    background: var(--rs-color-surface-alt);
    font-size: 13px;
    color: var(--rs-color-text);
    resize: none;
    transition: var(--rs-transition);
}
.rs-chat-textarea:focus {
    outline: none;
    border-color: var(--rs-color-accent);
    background: var(--rs-color-surface);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.rs-chat-send {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border: none;
    border-radius: 50%;
    background: var(--rs-color-accent);
    color: #fff;
    cursor: pointer;
    transition: var(--rs-transition);
}

/* ============================================================
   Suivi Atelier (atelier.php, views/atelier/ligne_atelier.php) — REHABILLAGE CSS
   UNIQUEMENT : le HTML/JS reste inchangé (tri des colonnes, scroll infini, drag&drop
   calendrier, popovers, extraction Excel...), c'est un tableau natif bien trop gros
   (~2000 lignes de logique métier par ligne) pour être restructuré sans risque.
   Point d'attention : le bandeau outils (.rs-atelier-toolbar, ex-.well) est
   position:fixed avec height:35px en dur, le thead (.en-tete-tableau) est
   position:fixed avec margin-top:33px en dur, et le tbody (#conteneur-atelier) est
   position:absolute avec margin-top:75px en dur — cette somme figée (35+40≈75) ne
   doit JAMAIS être perturbée ici (ne pas toucher height/padding/line-height de la
   toolbar ou du thead), sous peine de décaler tout le tableau. Tout le reste
   (couleurs, rayons, bordures, badges, barres de progression) est libre.
   ============================================================ */

/* ---- Bandeau outils (views/suivi_atelier/filtre_suivi_atelier.php) ----
   Hauteur/position inchangées (cf. note ci-dessus) : uniquement de la couleur. */
.rs-atelier-toolbar {
    background: var(--rs-color-surface) !important;
    border-bottom: 1px solid var(--rs-color-border) !important;
    box-shadow: var(--rs-shadow-sm);
}
.rs-atelier-toolbar .input-group-addon {
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    color: var(--rs-color-muted);
    font-size: 11px;
    font-weight: 600;
}
.rs-atelier-toolbar .form-control {
    border: 1px solid var(--rs-color-border);
    box-shadow: none;
}
.rs-atelier-toolbar .form-control:focus {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 2px var(--rs-color-accent-bg);
    z-index: auto;
}
.rs-atelier-toolbar a.btn-primary {
    background: var(--rs-color-accent);
    border-color: var(--rs-color-accent);
}
.rs-atelier-toolbar a.btn-primary:hover {
    background: var(--rs-color-accent-dark);
    border-color: var(--rs-color-accent-dark);
}
.rs-atelier-toolbar .btn-default {
    background: var(--rs-color-surface);
    border-color: var(--rs-color-border);
    color: var(--rs-color-text);
}
.rs-atelier-toolbar .btn-default:hover {
    background: var(--rs-color-surface-alt);
}
/* Pilules de comptage ("X Dossiers en atelier", "X Facturé non livré"...) */
.chargement-liste-par-dossier-suivi-atelier.btn.btn-primary {
    background: var(--rs-color-accent-bg) !important;
    border: 1px solid var(--rs-color-accent) !important;
    color: var(--rs-color-accent-dark) !important;
    border-radius: var(--rs-radius-pill) !important;
    font-weight: 600;
    padding: 4px 10px !important;
    margin-right: 4px;
    transition: var(--rs-transition);
}
.chargement-liste-par-dossier-suivi-atelier.btn.btn-primary:hover {
    background: var(--rs-color-accent) !important;
    color: #fff !important;
}
.information-suivi-atelier-modal.btn-info {
    background: var(--rs-color-surface-alt) !important;
    border: 1px solid var(--rs-color-border) !important;
    color: var(--rs-color-muted) !important;
    border-radius: var(--rs-radius-pill) !important;
    box-shadow: none !important;
}

/* ---- En-tête du tableau (thead sticky) ----
   Hauteur/position inchangées (cf. note en tête de section) : uniquement de la couleur. */
#tablefloat thead.en-tete-tableau {
    background-color: var(--rs-color-nav-dark) !important;
}
#tablefloat thead.en-tete-tableau a {
    color: #fff;
}
#tablefloat thead .td-recherche-atelier {
    background: var(--rs-color-nav-dark) !important;
}
#tablefloat thead .td-recherche-atelier .form-control {
    border: none;
    border-radius: var(--rs-radius-sm) 0 0 var(--rs-radius-sm);
    font-size: 11px;
}
#tablefloat thead .td-recherche-atelier .input-group-addon {
    background: #fff;
    border: none;
    border-radius: 0 var(--rs-radius-sm) var(--rs-radius-sm) 0;
}

/* ---- Corps du tableau : chaque dossier est son propre <tbody> — on les sépare
   visuellement comme des cartes plutôt qu'un bloc continu de lignes. ---- */
#conteneur-atelier > tbody + tbody > tr > td {
    border-top: 10px solid var(--rs-color-surface-alt) !important;
}
#tablefloat.table-striped > tbody > tr {
    background: var(--rs-color-surface);
}
#conteneur-atelier td {
    border-color: var(--rs-color-border) !important;
    padding: 7px 6px !important;
}
#conteneur-atelier .width-numeroOr,
#conteneur-atelier .width-client {
    font-size: 12px;
}

/* Badges d'étapes (EAD / PEC-CC / PRE / VE / CT / DIAG / SECU / CLIM / ADAS...) et
   pastilles de pointage (T1/T2/T3/M1/M2/M3) dans la colonne Actions & Progression. */
#tablefloat .width-actionProgression .badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 30px;
    padding: 4px 7px;
    border-radius: var(--rs-radius-sm);
    font-size: 10px;
    font-weight: 700;
    box-shadow: none;
    border: none;
}
#tablefloat .width-actionProgression .badge.btn-success { background: var(--rs-color-success) !important; }
#tablefloat .width-actionProgression .badge.btn-danger { background: var(--rs-color-danger) !important; }
#tablefloat .width-actionProgression .badge.btn-warning { background: var(--rs-color-warning) !important; }
#tablefloat .width-actionProgression .badge.btn-primary { background: var(--rs-color-accent) !important; }

/* Barre de progression totale (0% / X% / "Dispo" / "X% - Passer en dispo") */
#tablefloat .width-actionProgression .progress {
    background: var(--rs-color-surface-alt);
    border-radius: var(--rs-radius-pill);
    height: 18px;
    box-shadow: none;
    overflow: hidden;
}
#tablefloat .width-actionProgression .progress-bar {
    font-size: 10px;
    line-height: 18px;
    font-weight: 700;
}
#tablefloat .progress-bar-success { background-color: var(--rs-color-success) !important; }
#tablefloat .progress-bar-warning { background-color: var(--rs-color-warning) !important; }
#tablefloat .progress-bar-danger { background-color: var(--rs-color-danger) !important; }

/* Grilles internes (EAD/PEC-CC, T1-T3/M1-M3, D/MEC/R/C/M/A/P/REM/DSF) : bordures plus
   douces + petit effet hover pour repérer la colonne survolée. */
#tablefloat .width-actionProgression table.table-bordered {
    border-color: var(--rs-color-border);
    background: var(--rs-color-surface-alt);
}
#tablefloat .width-actionProgression table.table-bordered td,
#tablefloat .width-actionProgression table.table-bordered th {
    border-color: var(--rs-color-border) !important;
    vertical-align: middle;
}
#tablefloat .width-actionProgression table.table-bordered .form-group:hover {
    background: var(--rs-color-accent-bg);
}

/* Colonnes du calendrier (icônes de dépose/prévisionnel par jour) */
#tablefloat .width-calendrier a,
#tablefloat .width-calendrier button {
    border-radius: var(--rs-radius-sm);
    transition: var(--rs-transition);
}
#tablefloat .width-calendrier a:hover {
    background: var(--rs-color-accent-bg);
}

/* Bandeau "Véhicule disponible depuis..." qui remplace le calendrier une fois le
   dossier dispo (fond coloré dynamique conservé tel quel — cf. $couleur_dispo_non_facture
   dans ligne_atelier.php, logique métier). On habille juste le contenu. */
#tablefloat .width-calendrier[colspan="8"] {
    padding: 10px 14px !important;
    border-radius: var(--rs-radius-md);
    font-style: normal !important;
    line-height: 1.5;
}
#tablefloat .width-calendrier[colspan="8"] .Livre-atelier-confirm {
    display: inline-flex;
    align-items: center;
    padding: 5px 14px;
    margin: 4px 0;
    border: 1px solid rgba(255, 255, 255, .7);
    border-radius: var(--rs-radius-pill);
    background: rgba(255, 255, 255, .18);
    color: #fff !important;
    font-weight: 600;
    font-size: 12px;
    cursor: pointer;
    transition: var(--rs-transition);
}
#tablefloat .width-calendrier[colspan="8"] .Livre-atelier-confirm:hover {
    background: rgba(255, 255, 255, .32);
}
#tablefloat .width-calendrier[colspan="8"] .enregistrement-note-etat-dossier-atelier {
    width: 100%;
    margin-top: 6px;
    padding: 6px 10px;
    border: 1px solid rgba(255, 255, 255, .5);
    border-radius: var(--rs-radius-sm);
    background: rgba(255, 255, 255, .92);
    color: var(--rs-color-text);
    font-style: normal;
}

/* Immatriculation, boutons d'action miniatures, interrupteur "confirmé" : gabarit
   commun (arrondi + transition) sans changer leurs couleurs déjà porteuses de sens. */
#conteneur-atelier .btn.btn-xs {
    border-radius: var(--rs-radius-sm);
}
#conteneur-atelier .badge.badge-sm {
    border-radius: var(--rs-radius-sm);
}
.rs-chat-send:hover {
    background: var(--rs-color-accent-dark);
}
/* Choix de méthode (ex: méthode de double authentification) : ligne sélectionnable avec radio
   + contenu extensible (ex: moncompte.php, section 2FA). */
.rs-method-row {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 10px 14px;
    margin-bottom: 8px;
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-method-row:hover {
    border-color: var(--rs-color-accent);
}
.rs-method-row.rs-method-active {
    border-color: var(--rs-color-accent);
    background: var(--rs-color-accent-bg);
}
.rs-method-row input[type="radio"] {
    margin-top: 3px;
    flex: none;
}
.rs-method-row-copy {
    flex: 1;
    min-width: 0;
    font-size: 13px;
    color: var(--rs-color-text);
}
.rs-method-row-disabled {
    opacity: .55;
    cursor: not-allowed;
}
.rs-method-row-disabled:hover {
    border-color: var(--rs-color-border);
}

/* ============================================================
   Tableau de bord — onglets secondaires (tableau_de_bord.php) : Congés à valider,
   OR en atelier, Synthèse RDV, Récapitulatif Chiffres clés mensuel, Indicateur de
   charge. Reskin CSS, structure/JS inchangés.
   ============================================================ */

/* Congés à valider (views/tableau_de_bord/conges_a_valider.php) */
.rs-tdb-conges-alert {
    font-size: 13px;
    border-radius: var(--rs-radius-md);
}
.rs-tdb-conges-table.rs-table {
    font-size: 11px;
}
.rs-tdb-conges-table.rs-table thead th,
.rs-tdb-conges-table.rs-table tbody td {
    padding: 6px 8px;
}

/* OR en atelier (views/tableau_de_bord/or_en_atelier.php) */
.rs-tdb-or-atelier {
    border-right: 1px solid var(--rs-color-border);
}

/* Champ de dates "Du ... Au ..." réutilisé par accueil_synthese_rdv.php et
   accueil_indicateur_charge.php (bootstrap-datetimepicker : position:relative
   obligatoire sur le conteneur direct, cf. leçon apprise sur filtre_recherche.php /
   objectif_en_cours.php plus haut dans ce fichier). */
.rs-tdb-daterange {
    position: relative;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
}
/* Le "Du"/"Au" utilise .rs-input-label (cohérence avec les autres libellés de filtre) ;
   annule juste son margin-bottom, pensé pour un libellé au-dessus d'un champ, hors de
   propos dans cette ligne flex où le libellé est à côté du champ. */
.rs-tdb-daterange .rs-input-label {
    margin-bottom: 0;
}
.rs-tdb-daterange-input {
    width: 100px;
    padding: 5px 8px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    font-size: 12.5px;
}
.rs-tdb-synthese-rdv-filtre {
    align-items: center;
    margin-bottom: 8px;
}

/* Indicateur de charge (views/tableau_de_bord/accueil_indicateur_charge.php) */
.rs-tdb-indicateur-charge-note {
    font-size: 12.5px;
    color: var(--rs-color-muted);
}
.rs-tdb-indicateur-charge-warning {
    color: var(--rs-color-danger);
    font-weight: 600;
}

/* Récapitulatif Chiffres clés mensuel (views/tableau_de_bord/recapitulatif_chiffres_cle_mensuel.php) */
.rs-tdb-recap-table.rs-table {
    font-size: 12.5px;
}
.rs-tdb-recap-table.rs-table thead th,
.rs-tdb-recap-table.rs-table tbody td,
.rs-tdb-recap-table.rs-table tbody th {
    padding: 7px 10px;
}
.rs-tdb-recap-subtotal {
    background: var(--rs-color-surface-alt) !important;
}
.rs-tdb-recap-subtotal-final {
    border-bottom: 2px solid var(--rs-color-text) !important;
}

/* Indicateur de charge — tableau détaillé (views/tableau_de_bord/tableau_indicateur_charge_agenda.php)
   et son bouton de synchro (boutonInitialisationTempsPasseIndicateurCharge.php).
   Table volontairement PAS enveloppée dans .rs-table-wrap : .conteneur_detail_heure_effectue
   (position:absolute, cf. le <style> dans tableau_indicateur_charge_agenda.php) et les
   popovers Bootstrap sont des descendants de ce tableau — un overflow-x:auto les
   aurait rognés (même famille de bug que tableau_realisation.php plus haut). Les
   couleurs conditionnelles ($couleur_semaine_passe, les barres de progression) restent
   en inline-style, logique métier non touchée. */
.rs-tdb-charge-highlight {
    background-color: var(--rs-color-accent-bg) !important;
}
.rs-tdb-sync-btn {
    float: right;
    padding: 9px 16px;
    font-size: 13px;
}

/* Tableaux "détail par Type Cession / Conciergerie / Tag" (views/tdb_synthese/detail_cession.php,
   detail_conciergerie.php, detail_tag.php) : 3 fichiers identiques au pixel près (seule la
   variable PHP itérée change). Même code couleur par colonne que .rs-tdb-real-* plus haut,
   conservé (CA / Heure / Total ligne), juste remplacé par des classes réutilisables au lieu du
   RVB brut (#98EECC, #79E0EE, #FBFFDC, #D0F5BE) et des jetons pour les bandeaux #cecece. La
   couleur conditionnelle du total ligne ($couleur_police, color:red si écart d'arrondi) reste
   en inline-style, logique métier non touchée. */
.rs-tdb-detail-header {
    background-color: var(--rs-color-surface-alt) !important;
}
.rs-tdb-detail-ca-total {
    background-color: #98EECC !important;
}
.rs-tdb-detail-ca {
    background-color: #79E0EE !important;
}
.rs-tdb-detail-heure {
    background-color: #FBFFDC !important;
}
.rs-tdb-detail-total-ligne {
    background-color: #D0F5BE !important;
}

/* Panneaux "panel panel-default" génériques de la synthèse véhicule/VDR
   (detail_stat_vehicule.php, resultat_stat_vehicule.php, resultat_stat_VDR.php) : les
   classes bootstrap panel/panel-heading/panel-body/panel-collapse/collapse sont
   conservées telles quelles (comportement d'accordéon Bootstrap au clic sur
   .accordion-toggle, data-toggle="collapse"), ces classes ne font qu'habiller par-dessus.
   Pas d'overflow:hidden ici : certains de ces panneaux contiennent leur propre zone
   overflow:auto (.tableFixHead) et/ou des popovers Bootstrap.
   Repris tel quel dans client.php (les 8 panneaux accordéon de la fiche client :
   info_client, contacts_client, info_vehicule_client, situation_client, show_ca,
   devis_en_cours, cession_valide, facture_client) — même gabarit d'accordéon, même
   consigne (classes bootstrap conservées, uniquement habillées). Les sous-panneaux
   imbriqués non collapsables de client.php (Permis, VIP, préteur VDR, etc. — bordure
   noire 1px + hauteur fixe 9.5rem en inline-style) n'utilisent PAS .rs-tdb-panel
   (le padding aurait débordé de leur hauteur fixe) : seul .rs-card-title-sm est ajouté
   sur leur panel-heading pour la typo, sans toucher au panel-body ni à l'enveloppe.

   Habillage "sobre" — choisi par l'utilisateur après comparaison de 3 pistes sur une
   maquette (liseré d'accent / sobre / informatif, cf. artifact "En-têtes Fiche Client").
   Plus de bandeau gris plein sur l'en-tête ni d'ombre sur la carte (jugés "pas très
   beaux" sur la fiche client) : l'en-tête repose sur le même fond blanc que le corps,
   un survol suffit à signaler qu'il est cliquable, et le filet de séparation n'est posé
   qu'en haut de .rs-tdb-panel-body — invisible tant que le <div class="collapse"> est
   fermé (display:none de Bootstrap le masque avec lui), donc pas besoin de détecter
   l'état ouvert/fermé en CSS pour ne montrer le filet qu'à l'ouverture. */
.rs-tdb-panel {
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: none;
    margin-bottom: 20px;
}
.rs-tdb-panel-header {
    background: transparent;
    border-bottom: none;
    border-radius: var(--rs-radius-md) var(--rs-radius-md) 0 0;
    padding: 14px 18px;
    transition: background-color .15s ease;
}
.rs-tdb-panel-header:hover {
    background: var(--rs-color-surface-alt);
}
.rs-tdb-panel-header .panel-title {
    margin: 0;
    font-size: 14px;
    font-weight: 600;
    letter-spacing: .01em;
    color: var(--rs-color-text);
}
.rs-tdb-panel-header .glyphicon,
.rs-tdb-panel-header .fa {
    color: var(--rs-color-faint);
}
.rs-tdb-panel-body {
    padding: 14px 18px 18px;
    border-top: 1px solid var(--rs-color-border);
}

/* Filet de sécurité pour un bug Bootstrap .collapse pré-existant (pas lié à
   l'habillage .rs-tdb-panel ci-dessus, signalé sur #panel_situation_client de
   client.php) : à la fermeture, collapse.js anime height jusqu'à 0 en inline-style
   puis doit retirer cet inline-style (le CSS .collapse (sans .in) suffit alors à
   masquer via display:none). Si ce nettoyage n'a pas lieu — ici parce que
   #div_recharger_situation_client, imbriqué dans le panneau, est réécrit par un
   appel AJAX (js/Clients.js) pendant l'animation, ce qui interrompt l'événement
   transitionend attendu par collapse.js — l'élément reste visible avec un inline
   style="display:block;height:0px", et son contenu déborde par-dessus les
   panneaux suivants. collapse.js pose aria-expanded="false" sur l'élément fermé
   AVANT ce nettoyage, donc ce sélecteur force le masquage correct quel que soit
   l'état de l'inline-style, sans jamais gêner l'ouverture (aria-expanded="true"
   ne matche pas cette règle). */
.panel-collapse[aria-expanded="false"] {
    display: none !important;
}

/* ============================================================
   Reskin générique Bootstrap .input-group/.input-group-addon/.form-control : couleurs
   seulement (bordures, fonds, focus), jamais la structure — pas besoin de réécrire chaque
   champ en .rs-input. id/name/disabled et les classes de bascule lecture/édition JS
   (inputModificationRCS, mes-inputs-*, param-compta, param-export-compta...) restent
   strictement inchangés partout où c'est utilisé.
   Scopé à .rs-bs-form-skin (classe ajoutée sur le conteneur racine de chaque fichier,
   réutilisée telle quelle d'une page à l'autre, ex: tout le module Paramètres du garage —
   views/parametres/garages/info_general_rcs.php, parametrage_reglement.php,
   assurance_garage.php, compta.php, export_comptabilite*.php, configuration_mail.php — et
   au-delà, ex: demande_conges.php, ainsi que client.php sur <form id="validateMyFormClient">,
   le panneau "Situation client" et le panneau CA — quasiment tous les champs de la fiche
   client sont en .input-group/.input-group-addon, donc une seule classe sur le conteneur
   racine de chaque section suffit à recolorer l'ensemble sans retoucher chaque champ)
   pour ne pas déborder sur les ~250 autres pages qui
   partagent .bouton-modifier/.bouton-annuler/.bouton-enregistrer — classes globales
   volontairement non retouchées ici (cf. plus haut, ".btn-modifier/.bouton-modifier ...
   utilisés partout dans l'appli — on n'y touche pas ailleurs"). */
.rs-bs-form-skin .input-group-addon {
    background: var(--rs-color-surface-alt);
    border-color: var(--rs-color-border);
    color: var(--rs-color-muted);
    font-weight: 600;
}
.rs-bs-form-skin .input-group .form-control {
    border-color: var(--rs-color-border);
    box-shadow: none;
    color: var(--rs-color-text);
    transition: var(--rs-transition);
}
.rs-bs-form-skin .input-group .form-control:focus {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.rs-bs-form-skin .input-group .form-control[disabled] {
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    cursor: default;
}

/* Sidebar verticale de sous-navigation (views/parametres/garages/configuration_envoie.php
   "Messagerie/SMS", interface.php "Interfaces") : remplace des boîtes bordées ad-hoc
   (bordure #cecece, rayons disparates, parfois un <li> par boîte séparée avec 30px de
   marge) par une seule liste dans une carte — .selection-config-envoie/.selection-config-
   interface + .activee restent les classes lues par js/parametrage.js (click + bascule
   active), inchangées. */
.rs-garage-sidebar-nav {
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    padding: 10px;
    margin-top: 20px;
}
.rs-garage-sidebar-nav .nav-pills > li {
    width: 100%;
}
.rs-garage-sidebar-nav .nav-pills > li + li {
    margin-top: 2px;
}
.rs-garage-sidebar-nav .nav-pills > li > a {
    display: block;
    border-radius: var(--rs-radius-sm);
    padding: 9px 12px;
    font-size: 13px;
    font-weight: 500;
    color: var(--rs-color-text);
    transition: var(--rs-transition);
}
.rs-garage-sidebar-nav .nav-pills > li > a:hover,
.rs-garage-sidebar-nav .nav-pills > li > a:focus {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
.rs-garage-sidebar-nav .nav-pills > li.activee > a {
    background: var(--rs-color-accent) !important;
    color: #fff !important;
}

/* ============================================================
   Écran de pointage "Déplacer un véhicule" (pointage_adm.php) : liste compacte
   choisie après comparaison de 2 pistes sur une maquette (fiches véhicule / liste
   compacte, cf. artifact "Écran de Pointage Déplacement"). Ce fichier construit son
   HTML par echo PHP direct (pas de vue séparée) — seules les classes/chaînes de
   sortie changent, tous les name/value/onclick/type="submit" du formulaire (chaîne
   de POST successifs qui pilote le pointage) restent identiques. Réutilise .plaque
   existant (style.css) pour l'immatriculation plutôt que d'inventer un composant
   plaque de plus.
   ============================================================ */
.rs-pointage-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 20px;
    flex-wrap: wrap;
    margin: 0 0 22px;
}
.rs-pointage-question {
    font-size: 19px;
    font-weight: 700;
    margin: 0;
    text-align: left;
    color: var(--rs-color-text);
}
.rs-pointage-search {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}
.rs-pointage-search input {
    font-size: 15px;
    font-weight: 600;
    padding: 10px 14px;
    width: 168px;
    max-width: 100%;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-text);
}
.rs-pointage-search input:focus {
    outline: none;
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.rs-pointage-list {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    overflow: hidden;
    margin-bottom: 16px;
}
.rs-pointage-row {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 13px 16px;
    background: var(--rs-color-surface);
    border: none;
    border-bottom: 1px solid var(--rs-color-border);
    cursor: pointer;
    width: 100%;
    text-align: left;
    font-family: inherit;
    font-size: 13.5px;
    color: var(--rs-color-text);
    transition: var(--rs-transition);
}
.rs-pointage-list .rs-pointage-row:last-child {
    border-bottom: none;
}
.rs-pointage-row:hover,
.rs-pointage-row:focus {
    background: var(--rs-color-accent-bg);
    outline: none;
}
.rs-pointage-row:disabled,
.rs-pointage-row[disabled] {
    cursor: not-allowed;
    opacity: .45;
}
.rs-pointage-row:disabled:hover {
    background: var(--rs-color-surface);
}
.rs-pointage-row-or {
    flex: 0 0 auto;
    font-weight: 700;
    font-size: 12.5px;
    color: var(--rs-color-accent-dark);
    background: var(--rs-color-accent-bg);
    padding: 4px 9px;
    border-radius: var(--rs-radius-sm);
    min-width: 64px;
    text-align: center;
}
.rs-pointage-row .plaque {
    width: auto;
    flex: 0 0 auto;
}
.rs-pointage-row-vehicule {
    flex: 1 1 auto;
    min-width: 0;
}
.rs-pointage-row-chevron {
    flex: 0 0 auto;
    color: var(--rs-color-faint);
    font-size: 16px;
}
.rs-pointage-vdr-btn {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 15px 18px;
    background: var(--rs-color-success-bg);
    color: var(--rs-color-success-dark);
    border: 1.5px dashed var(--rs-color-success);
    border-radius: var(--rs-radius-md);
    cursor: pointer;
    font-size: 14px;
    font-weight: 700;
    transition: var(--rs-transition);
}
.rs-pointage-vdr-btn:hover {
    background: var(--rs-color-success);
    color: #fff;
}
.rs-pointage-status-btn {
    width: 100%;
    padding: 18px;
    font-size: 18px;
    font-weight: 700;
    border-radius: var(--rs-radius-md);
}

/* ============================================================
   Barre d'outils du Planning VDR (planning_vdr.php) : réorganisée en 3 rangées après
   validation sur maquette (artifact "Barre Planning VDR") — navigation, puis
   actions + recherche, puis filtre + légende. ids/data-* onclick et la légende de
   couleurs métier restent strictement inchangés, seuls l'agencement et l'habillage
   changent. Le <table> d'origine devient un <div> : à la différence du planning
   lui-même juste en dessous (encapsulé dans .tableFixHead avec position:sticky sur
   son thead), cette barre n'a pas ce besoin de sticky, donc aucune perte de
   comportement à ne plus être un <table>.
   ============================================================ */
.rs-planning-vdr-toolbar {
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    margin-bottom: 14px;
    overflow: hidden;
}
.rs-pvt-row {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    padding: 14px 20px;
}
.rs-pvt-row + .rs-pvt-row {
    border-top: 1px solid var(--rs-color-border);
}
.rs-pvt-row.alt {
    background: var(--rs-color-surface-alt);
}
.rs-pvt-nav-group {
    display: flex;
    align-items: center;
    gap: 6px;
}
.rs-pvt-nav-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 12px;
    border-radius: var(--rs-radius-sm);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    color: var(--rs-color-text) !important;
    font-size: 12.5px;
    font-weight: 600;
    white-space: nowrap;
    transition: var(--rs-transition);
}
.rs-pvt-nav-btn:hover {
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark) !important;
    text-decoration: none;
}
.rs-pvt-count {
    font-weight: 700;
    font-size: 12.5px;
    color: var(--rs-color-accent-dark);
    background: var(--rs-color-accent-bg);
    padding: 6px 11px;
    border-radius: var(--rs-radius-pill);
    white-space: nowrap;
}
.rs-pvt-spacer {
    flex: 1 1 auto;
}
.rs-pvt-select {
    font-size: 13px;
    font-weight: 600;
    border-radius: var(--rs-radius-sm);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-text) !important;
}
.rs-pvt-today {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--rs-color-accent-dark) !important;
    white-space: nowrap;
    font-style: normal !important;
}
.rs-pvt-action-group {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.rs-pvt-action-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 8px 13px;
    border-radius: var(--rs-radius-sm);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    color: var(--rs-color-text) !important;
    font-size: 12.5px;
    font-weight: 600;
    white-space: nowrap;
    transition: var(--rs-transition);
}
.rs-pvt-action-btn:hover {
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark) !important;
    background: var(--rs-color-accent-bg);
    text-decoration: none;
}
.rs-pvt-action-btn.rs-pvt-lock {
    color: var(--rs-color-warning-dark) !important;
    border-color: #e8d3ab;
}
.rs-pvt-action-btn.rs-pvt-lock:hover {
    background: var(--rs-color-warning-bg);
    border-color: var(--rs-color-warning);
}
.rs-pvt-search-group {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-left: auto;
}
.rs-pvt-search-group input {
    font-size: 13px;
    padding: 8px 12px;
    border-radius: var(--rs-radius-sm);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface-alt);
    color: var(--rs-color-text);
    width: 150px;
}
.rs-pvt-search-group input:focus {
    outline: none;
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
    background: var(--rs-color-surface);
}
.rs-pvt-eye {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: var(--rs-radius-sm);
    border: 1px solid var(--rs-color-border);
    background: transparent !important;
    color: var(--rs-color-muted);
    cursor: pointer;
}
.rs-pvt-eye:hover,
.rs-pvt-eye.rs-pvt-eye-active {
    border-color: var(--rs-color-accent);
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark);
}
.rs-pvt-eye .icone_affiche_doublon_vdr {
    font-size: 14px;
}
.rs-pvt-legend {
    display: flex;
    gap: 7px;
    flex-wrap: wrap;
    margin-left: auto;
}
.rs-pvt-chip {
    display: inline-flex;
    align-items: center;
    padding: 5px 11px;
    border-radius: var(--rs-radius-pill);
    font-size: 11.5px;
    font-weight: 600;
    color: #3a2f1f;
    white-space: nowrap;
}

/* ============================================================
   Colonnes figées (Nb / ID Interne / VDR) du planning VDR — évite de perdre la
   ligne en cours de lecture au défilement horizontal (30+ colonnes de jours),
   proposé et validé sur maquette (artifact "Grille Planning VDR"). CSS pur
   (position:sticky), aucun impact sur le glisser-déposer des cellules de
   disponibilité (ligne_planing.php / ligne_planing_vdr_semaine.php) ni sur les
   couleurs métier de ces cellules. Largeurs harmonisées et appliquées de façon
   identique dans les 3 fichiers d'en-tête (jours_mois_vdr.php,
   jours_mois_vdr_semaine.php, jours_mois_vdr_semaine_pied.php) et sur les lignes
   de données (ligne_planing.php) pour que le décalage "left" s'aligne
   correctement entre en-tête et corps. Pas de !important sur le fond : certaines
   lignes/cellules portent un style inline métier (VDR prêté par un autre garage,
   VDR en priorité...) qui doit rester visible même dans ces colonnes figées.
   ============================================================ */
.rs-vdr-fixed-nb {
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--rs-color-surface);
    min-width: 34px;
    max-width: 120px;
    width: 34px;
}
.rs-vdr-fixed-id {
    position: sticky;
    left: 34px;
    z-index: 2;
    background: var(--rs-color-surface);
}
.rs-vdr-fixed-vdr {
    position: sticky;
    left: 109px;
    z-index: 2;
    background: var(--rs-color-surface);
    min-width: 120px;
    max-width: 120px;
    width: 120px;
    box-shadow: 2px 0 6px -2px rgba(20, 30, 45, .18);
}
thead .rs-vdr-fixed-nb,
thead .rs-vdr-fixed-id,
thead .rs-vdr-fixed-vdr,
tfoot .rs-vdr-fixed-nb,
tfoot .rs-vdr-fixed-id,
tfoot .rs-vdr-fixed-vdr {
    z-index: 4;
    background: var(--rs-color-surface-alt);
}

/* Grille du planning VDR (planning_vdr.php) : position:sticky sur les <td> ne
   fonctionne dans aucun navigateur tant que la table est en border-collapse:collapse
   (limitation CSS connue — les bordures fusionnées empêchent tout positionnement
   sticky des cellules). C'est cette règle globale de bootstrap.css (table {
   border-collapse: collapse }) qui empêchait .rs-vdr-fixed-nb/-id/-vdr de se figer au
   défilement horizontal. On repasse cette seule table en border-collapse:separate ;
   border-spacing reste à 0 pour ne pas ajouter d'espace entre cellules (juste un léger
   doublement visuel des bordures 1px, chaque cellule dessinant à nouveau les siennes).
   Important : ne PAS retirer de bordures cellule par cellule (haut/gauche à 0 par
   ex.) pour "recoller" au rendu collapse — cette grille a des colspan très différents
   d'une ligne d'en-tête à l'autre (Nb/ID/VDR en colspan 1, jours en colspan 1 ou 10,
   heures en colspan 1) et l'algorithme de calcul automatique des largeurs de colonnes
   se base sur les bordures de chaque cellule pour aligner les colonnes entre les
   lignes ; des bordures asymétriques faisaient recalculer une largeur totale de table
   plus étroite que le conteneur, supprimant la scrollbar horizontale. On garde donc
   les 4 bordures identiques sur toutes les cellules (comme avant), seul le modèle de
   bordure change. */
.rs-vdr-grid-table {
    border-collapse: separate;
    border-spacing: 0;
}

/* ============================================================
   Contrat de prêt (form_pret.php + views/vehicules/ligne_info_client.php),
   validé sur maquette (artifact "Contrat de Prêt") : sections nommées au lieu
   d'un mur de <hr>, formulaire allégé, pied de page réorganisé. Tous les
   id/name/data-* classes JS existants (information-vdr, action_confirm_pret,
   choix_permis, dropdownGEDPret, delete-pret, enregistrer-pret...) restent
   strictement inchangés : seules les classes .rs-pret-* sont ajoutées par-dessus
   pour l'habillage, jamais en remplacement.
   ============================================================ */
.rs-pret-section-label {
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--rs-color-faint);
    margin: 0 0 10px;
}
.rs-pret-lock-btn {
    width: 42px;
    height: 34px;
    border-radius: var(--rs-radius-md);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface-alt);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-top: 4px;
}
/* bloc "Période du prêt" : remplace le <table>-like row de 6 colonnes par un
   encart distinct, avec le même séparateur pointillé qu'avant (posé désormais
   en classe plutôt qu'en style inline) entre le triplet départ et le triplet
   retour. */
.rs-pret-periode {
    background: var(--rs-color-surface-alt);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 16px 18px 12px;
}
.rs-pret-periode-divider {
    border-left: 1px dashed var(--rs-color-border);
}
.rs-pret-periode label {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 11.5px;
    font-weight: 700;
    color: var(--rs-color-muted);
    margin-bottom: 4px;
}
.rs-pret-periode input[type="text"],
.rs-pret-periode input[type="number"] {
    background: var(--rs-color-surface);
}
/* pastille de confirmation/annulation VDR (.action_confirm_pret) : les variantes
   "à confirmer" gardent .btn.btn-success + l'animation flash (action requise,
   doit rester visible), la variante "déjà confirmé, cliquer pour annuler" (sans
   classe .btn dans le PHP d'origine) devient une pastille discrète au lieu d'un
   simple lien texte bleu perdu dans la page. */
.rs-pret-confirm-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 14px;
    border-radius: var(--rs-radius-pill);
    font-size: 12px;
    font-weight: 600;
    margin-top: 8px;
}
a.rs-pret-confirm-pill.action_confirm_pret {
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
a.rs-pret-confirm-pill.action_confirm_pret:hover {
    background: var(--rs-color-accent);
    color: #fff;
    text-decoration: none;
}
.rs-pret-confirm-pill.btn-success {
    border-radius: var(--rs-radius-pill);
}
/* carte "Conducteur 1 / Conducteur 2" (views/vehicules/ligne_info_client.php) */
.rs-pret-cond-card {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 16px 18px;
    background: var(--rs-color-surface);
}
.rs-pret-cond-head {
    font-size: 13px;
    font-weight: 700;
    color: var(--rs-color-text);
}
/* Les <input> de conducteur restent des .input-group Bootstrap classiques (JS/
   sélecteurs inchangés) mais chaque input-group-addon "icône seule" est
   remplacé par un vrai <label> visible au-dessus du champ : on neutralise donc
   ici l'ancien addon (plus de fond gris carré) et on garde uniquement l'input,
   qui reprend l'habillage .rs-input-outline. */
.rs-pret-cond-card .rs-input-label {
    font-size: 11px;
    margin-bottom: 4px;
}
/* le formulaire empile beaucoup de champs dans une carte assez étroite : on
   resserre l'espacement vertical entre lignes (.row.rows a margin-top:10px par
   défaut, cf. <style> en tête de form_pret.php) uniquement à l'intérieur de la
   carte conducteur, sans toucher au reste du formulaire. */
.rs-pret-cond-card .row.rows {
    margin-top: 6px;
}
.rs-pret-cond-card .input-group-addon.rs-pret-addon-hidden {
    display: none;
}
.rs-pret-cond-card .input-group.rs-pret-solo > .form-control {
    border-radius: var(--rs-radius-sm) !important;
}
.rs-pret-permis-row {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-top: 4px;
}
/* bandeau jaune "infos client mises à jour" : mêmes classes JS
   (notification_client_maj_vdr_conducteur_1/2, display:block|none piloté en JS),
   seul le fond inline #F6F54D trop vif est retiré au profit de .rs-alert-warning. */
.rs-pret-cond-card .rs-alert-warning {
    margin-top: 14px;
}
/* bloc "Dépôt & documents" */
.rs-pret-depot-box {
    display: flex;
    align-items: center;
    gap: 10px;
    height: 42px;
    border-radius: var(--rs-radius-md);
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    padding: 0 6px 0 14px;
}
.rs-pret-depot-box input[type="number"] {
    border: none;
    background: transparent;
    height: 100%;
    width: 100%;
    font-family: "IBM Plex Mono", monospace;
    font-weight: 600;
}
.rs-pret-depot-box input[type="number"]:focus {
    outline: none;
}
/* pied de page : groupe impression/GED à gauche en puces compactes, groupe
   d'actions (Enregistrer / Enregistrer & quitter / Supprimer) à droite avec une
   vraie hiérarchie visuelle (avant : 2 gros boutons carrés colorés identiques
   en poids visuel aux boutons d'impression).
   Retour utilisateur : garder des couleurs proches de l'existant (vert Contrat
   Garage / bleu Contrat Organisme / prune GED Prêt) pour ne pas trop dépayser —
   .rs-pret-print-btn ne fixe donc plus de background/color/border : seules la
   taille et la forme (pilule compacte, icône+texte sur une ligne) sont posées
   par-dessus .btn-success/.btn-info/.bouton-ged, qui gardent leur couleur et
   leur comportement :hover d'origine. */
.rs-pret-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    width: 100%;
}
.rs-pret-print-group {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}
.rs-pret-print-btn {
    display: inline-flex !important;
    align-items: center;
    gap: 8px;
    padding: 9px 16px !important;
    border-radius: var(--rs-radius-pill) !important;
    font-size: 12.5px !important;
    font-weight: 600;
    text-decoration: none;
    line-height: 1.3;
    transition: var(--rs-transition);
}
.rs-pret-print-btn:hover,
.rs-pret-print-btn:focus {
    text-decoration: none;
    filter: brightness(1.08);
}
.rs-pret-print-btn i,
.rs-pret-print-btn .fa {
    font-size: 15px;
}
.rs-pret-action-group {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}
.rs-pret-action-danger {
    background: transparent !important;
    color: var(--rs-color-danger-dark) !important;
    border: 1px solid var(--rs-color-danger-bg) !important;
    box-shadow: none !important;
}
.rs-pret-action-danger:hover,
.rs-pret-action-danger:focus {
    background: var(--rs-color-danger-bg) !important;
    color: var(--rs-color-danger-dark) !important;
}
@media (max-width: 900px) {
    .rs-pret-periode-divider {
        border-left: none;
        border-top: 1px dashed var(--rs-color-border);
        padding-top: 12px;
        margin-top: 8px;
    }
    .rs-pret-footer {
        flex-direction: column;
        align-items: stretch;
    }
}

/* ============================================================
   .fieldset-or / .legend-or — composant partagé par ~40 fichiers (devisOr,
   agenda, fournisseurs, paramètres...), repéré via form_pret.php/
   ajout_pret_generalite.php. Rendu HTML4 par défaut d'origine : bordure 3D
   "groove" + bandeau plein gris #bbb sur le <legend>. Remplacé ici par le même
   vocabulaire "sobre" que .rs-tdb-panel (carte blanche, bordure fine, filet de
   séparation sous l'en-tête plutôt qu'un bandeau plein) — cf. artifact
   "En-têtes Fiche Client" déjà validé pour ce même choix ailleurs dans l'appli.
   Pur CSS, aucune balise/markup à modifier dans les fichiers consommateurs :
   .legend-or est utilisé tantôt avec du texte simple (<span>), tantôt comme
   ligne de champs (<div class="col-sm-3">/<div class="col-sm-9"> à l'intérieur,
   ex: ajout_pret_generalite.php "Conducteur 1"/select) — les deux usages restent
   compatibles, seuls le fond/la bordure/la typo changent. Quelques fichiers
   posent un style inline ponctuel (hauteur fixe, position:fixed, display:none
   sur un fieldset masqué...) : ces overrides gardent la priorité et continuent
   de fonctionner par-dessus cette base. */
.fieldset-or {
    display: block;
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: none;
    padding: 0 16px 16px;
    margin-top: 20px;
}
.legend-or {
    display: block;
    width: 100%;
    box-sizing: border-box;
    height: auto;
    padding: 10px 0;
    margin: 0 0 14px;
    background: rgb(187, 187, 187);
    border-bottom: 1px solid var(--rs-color-border);
    font-size: 14px;
    font-weight: 700;
    color: var(--rs-color-text);
}
/* Groupe d'actions d'un .legend-or (ex: "Véhicule client" de
   views/devisOr/detailOR/generalite.php : Afficher historique Facturé/GED/
   Désassocier/Modifier-Enregistrer-Annuler) : ces boutons étaient chacun en
   float:right individuel, ce qui les empile bien en colonne à droite mais ne
   garantit pas un passage à la ligne propre (gap régulier, alignement vertical)
   quand ils ne tiennent pas tous sur une ligne. .rs-legend-actions les regroupe
   dans un flex wrap, tout en gardant le float:right sur le conteneur lui-même
   pour rester positionné à droite du titre comme avant (pas de <legend> flex
   global : .legend-or est partagé par ~40 fichiers, on ne touche pas sa CSS). */
.rs-legend-actions {
    float: right;
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    /*gap: 8px;*/
    max-width: 100%;
}
.rs-legend-actions > * {
    float: none !important;
}

/* ============================================================
   Assistant tactile de Pointage (pointage.php + views/atelier/liste_compagnon.php,
   liste_dossier.php, recherche_dossier.php, selection_operation.php) — validé sur
   maquette (artifact "Pointage Atelier"). Kiosque : boutons de très grande taille
   pour un usage tactile en atelier, avec un code couleur métier riche (rouge
   #e23428 = pointage en cours, bordure bleue #337ab7 = travail prioritaire,
   liseré or = client VIP, flash rouge = livraison impérative...). Ces couleurs
   posées en style inline par le PHP (dynamiques, dépendantes des données) ne sont
   JAMAIS touchées : seules forme/ombre/typo sont ajoutées par-dessus les boutons
   existants, sans jamais modifier leurs dimensions (hauteur/largeur posées en
   inline, importantes pour la cible tactile) ni leurs data-* classes JS
   (pointage_compagnon, pointage_sur_or, depointage_compagnon, effectuer_pointage,
   ordonner_dossier_par_compagnon, liste_or_pdf...). */
/* Alignement gauche/droite : la barre du haut (pointage.php) est posée dans
   <div class="row"><div class="col-sm-12">...</div></div> — la marge négative
   du .row est donc compensée par le padding de la colonne. Le contenu de
   chaque étape (liste_compagnon.php, liste_dossier.php, selection_operation.php)
   est injecté directement dans #partie_conteneur (`.partie_conteneur` en CSS,
   HTML l'utilise comme classe), SANS colonne englobante — ses propres <div
   class="row"> débordaient donc de 15px de plus que la barre du haut de chaque
   côté (d'où le bouton "Retour" qui semblait décroché vers la droite). Même
   compensation ici, appliquée une fois pour toutes les étapes plutôt que dans
   chaque fichier. */
.partie_conteneur {
    padding: 0 15px;
}
.rs-pointage-topbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    padding: 8px 4px 14px;
}
.rs-pointage-brand {
    font-size: 19px;
    font-weight: 800;
    color: var(--rs-color-accent-dark);
}
.rs-pointage-topbar-actions {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    /* .dropdown-menu (#gens_chat) est en position:absolute sans wrapper
       .dropdown ni ancêtre positionné dans le markup d'origine — sans ce
       position:relative, elle se recale sur le containing block initial
       (le coin haut-gauche de la page) au lieu de s'ouvrir sous le bouton
       chat, qui est le premier enfant de ce conteneur. */
    position: relative;
}
.rs-pointage-pill-btn {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    border-radius: var(--rs-radius-pill) !important;
    border: 1px solid var(--rs-color-border) !important;
    background: var(--rs-color-surface) !important;
    color: var(--rs-color-text) !important;
    font-weight: 600;
    text-decoration: none;
    transition: var(--rs-transition);
}
.rs-pointage-pill-btn:hover,
.rs-pointage-pill-btn:focus {
    border-color: var(--rs-color-accent) !important;
    color: var(--rs-color-accent-dark) !important;
    background: var(--rs-color-accent-bg) !important;
    text-decoration: none;
}
.rs-pointage-pill-btn.btn-danger {
    background: var(--rs-color-danger) !important;
    color: #fff !important;
    border-color: var(--rs-color-danger) !important;
}
.rs-pointage-pill-btn.btn-danger:hover {
    background: var(--rs-color-danger-dark) !important;
    color: #fff !important;
}
/* Étape 1 — cartes compagnon : bouton principal (business colors inline
   conservées) + colonne d'icônes latérale (trier / PDF), au lieu de 3 boutons
   carrés collés côte à côte. */
.rs-pointage-card {
    display: flex;
    align-items: stretch;
    border-radius: var(--rs-radius-md);
    overflow: hidden;
    box-shadow: var(--rs-shadow-sm);
    border: 1px solid var(--rs-color-border);
    margin-bottom: 8px;
    background: var(--rs-color-surface);
}
.rs-pointage-card-main {
    flex: 1 1 auto;
    width: auto !important;
    height: auto !important;
    margin: 0 !important;
    border-radius: 0 !important;
    border: none !important;
    text-align: left !important;
    font-weight: 700 !important;
    box-shadow: none !important;
}
.rs-pointage-card-side {
    display: flex;
    flex-direction: column;
    width: 46px;
    border-left: 1px solid var(--rs-color-border);
    flex: 0 0 auto;
}
.rs-pointage-card-side .btn {
    flex: 1 1 auto;
    height: auto !important;
    margin: 0 !important;
    border-radius: 0 !important;
    border: none !important;
    background: var(--rs-color-surface-alt) !important;
    box-shadow: none !important;
}
.rs-pointage-card-side .btn + .btn {
    border-top: 1px solid var(--rs-color-border) !important;
}
.rs-pointage-card-side .btn:hover {
    background: var(--rs-color-accent-bg) !important;
    color: var(--rs-color-accent-dark) !important;
}
/* Étape 2 — cartes dossier/OR + pied PDF, et grille d'opérations rapides */
.rs-pointage-dossier {
    border-radius: var(--rs-radius-md) !important;
    box-shadow: var(--rs-shadow-sm) !important;
    font-weight: 600 !important;
    text-align: left !important;
}
.rs-pointage-dossier:hover {
    box-shadow: var(--rs-shadow-md) !important;
}
/* variante utilisée quand la carte est immédiatement suivie d'un pied PDF
   (.rs-pointage-pdf-foot, liste_dossier.php) : coins bas carrés pour que la
   jonction avec le pied soit nette, au lieu d'un arrondi complet sur la carte
   qui créait un petit décalage visuel avec les coins carrés du pied posé juste
   en dessous. Les cartes de recherche_dossier.php (sans pied PDF) gardent
   .rs-pointage-dossier seule, arrondie sur les 4 coins. */
.rs-pointage-dossier-foot {
    border-radius: var(--rs-radius-md) var(--rs-radius-md) 0 0 !important;
}
.rs-pointage-pdf-foot {
    display: flex;
    border: 1px solid var(--rs-color-border);
    border-top: none;
    border-radius: 0 0 var(--rs-radius-md) var(--rs-radius-md);
    margin-top: 0;
    margin-bottom: 8px;
    overflow: hidden;
}
.rs-pointage-pdf-foot a {
    flex: 1;
    text-align: center;
    padding: 6px 0;
    text-decoration: none !important;
    background: var(--rs-color-surface-alt);
    height: auto !important;
    margin-bottom: 0 !important;
}
.rs-pointage-pdf-foot a:first-child {
    border-right: 1px solid var(--rs-color-border);
}
.rs-pointage-pdf-foot a:hover {
    background: var(--rs-color-accent-bg) !important;
}
.rs-pointage-op-btn {
    border-radius: var(--rs-radius-md) !important;
    box-shadow: var(--rs-shadow-sm) !important;
    font-weight: 600 !important;
}
.rs-pointage-op-btn:hover {
    box-shadow: var(--rs-shadow-md) !important;
}
/* l'immat est affichée avec le composant .plaque existant (css/style.css),
   déjà réutilisé ailleurs dans l'app (pointage_adm.php) — pas de nouvelle
   classe. .plaque a cependant width:100% par défaut (pensé pour une cellule
   dédiée) : ici elle est mêlée au reste du texte du bouton (nom client, N° OR,
   marque/modèle...), donc on neutralise cette largeur pour qu'elle se
   comporte comme un badge en ligne plutôt qu'une bande pleine largeur. */
.rs-pointage-dossier .badge {
    margin-right: 8px;
}
.rs-pointage-dossier .plaque,
.rs-pointage-card .plaque {
    width: auto;
    display: inline-flex;
    align-items: center;
    vertical-align: middle;
}
/* Étape 3 — tuiles opération */
.rs-pointage-tile {
    border-radius: var(--rs-radius-md) !important;
    box-shadow: var(--rs-shadow-sm) !important;
    font-weight: 700 !important;
    transition: var(--rs-transition);
}
.rs-pointage-tile:hover {
    box-shadow: var(--rs-shadow-md) !important;
    transform: translateY(-1px);
    border-color: var(--rs-color-accent) !important;
}
.rs-pointage-tile i.fa {
    color: var(--rs-color-faint);
    margin-right: 6px;
}

/* ============================================================
   Stats Pointage (stats_pointage.php, stats_pointage_adm.php,
   views/atelier/stat_pointage_par_college.php, stat_pointage_total.php,
   voir_mo_stat.php) — validé sur maquette (artifact "Stats Pointage"). Tableaux
   mensuels très larges (jusqu'à 31 colonnes de jours) par catégorie d'opération,
   avec code couleur métier (label-success = case remplie cliquable, label-danger
   = ligne TOTAL, couleur de congé posée dynamiquement en style inline par
   $dataVendeurConges) : ces couleurs métier ne sont jamais touchées, seules
   forme/typo/alignement changent. Le week-end/jour férié (#D8D9DA en dur dans
   le PHP) est remplacé par var(--rs-color-surface-alt) directement dans les
   fichiers PHP (valeur CSS valide en inline style), pas de changement ici. */
.rs-stat-filters {
    display: flex;
    align-items: flex-end;
    gap: 16px;
    flex-wrap: wrap;
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 14px 18px;
    box-shadow: var(--rs-shadow-sm);
    margin-bottom: 18px;
}
.rs-stat-filters .input-group-addon {
    display: block;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--rs-color-muted);
    background: transparent !important;
    border: none !important;
    padding: 0 0 5px !important;
}
.rs-stat-filters .form-control {
    border-radius: var(--rs-radius-sm) !important;
    border: 1px solid var(--rs-color-border) !important;
    background: var(--rs-color-surface-alt) !important;
    box-shadow: none !important;
}
/* Variante "libellé sur la même ligne que le champ" du filtre Mois/Année de
   stats_pointage.php (filtre_pointage_mois / filtre_pointage_semaine) : le
   défaut .rs-stat-filters .input-group-addon empile le libellé au-dessus
   (utile pour stats_pointage_adm.php), donc on ne le change pas globalement,
   on ajoute cette classe en plus sur les .input-group concernés. */
.rs-stat-filters .input-group.rs-stat-inline-group {
    display: flex;
    align-items: center;
    gap: 8px;
}
.rs-stat-filters .input-group.rs-stat-inline-group .input-group-addon {
    display: inline-block;
    flex: 0 0 auto;
    width: auto !important;
    padding: 0 !important;
    white-space: nowrap;
    overflow: visible;
    text-transform: none;
}
.rs-stat-filters .input-group.rs-stat-inline-group .form-control {
    width: auto;
}
.rs-stat-filters-actions {
    display: flex;
    gap: 8px;
    margin-left: auto;
}
.rs-stat-filters-actions .btn {
    border-radius: var(--rs-radius-pill) !important;
    box-shadow: none !important;
}
/* le bouton "Recherche" de stats_pointage_adm.php est en .btn-danger (rouge) :
   seule la variante neutre .btn-default (Excel/PDF de stats_pointage.php) est
   recolorée en pilule blanche, les variantes sémantiques (danger/success...)
   gardent leur couleur, seule la forme (pilule) est reprise via la règle
   au-dessus. */
.rs-stat-filters-actions .btn-default {
    border: 1px solid var(--rs-color-border) !important;
    background: var(--rs-color-surface) !important;
}
.rs-stat-filters-actions .btn-default:hover {
    border-color: var(--rs-color-accent) !important;
    background: var(--rs-color-accent-bg) !important;
}
/* Navigation "Semaine précédente/suivante" du filtre semaine de stats_pointage.php :
   remplace l'ancien trio de <span class="input-group-addon"> (chevrons + libellé)
   par des boutons ronds + un libellé centré, hors du balisage .input-group/.input-group-addon
   pour ne pas hériter du style "libellé au-dessus du champ" de .rs-stat-filters ci-dessus. */
.rs-stat-week-nav {
    display: flex;
    align-items: center;
    gap: 10px;
}
.rs-stat-week-nav-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    border: 1px solid var(--rs-color-border);
    border-radius: 50%;
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    cursor: pointer;
    transition: var(--rs-transition);
}
.rs-stat-week-nav-btn:hover,
.rs-stat-week-nav-btn:focus {
    border-color: var(--rs-color-accent);
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}
.rs-stat-week-nav-label {
    min-width: 260px;
    text-align: center;
    font-weight: 700;
    color: var(--rs-color-text);
}
.rs-stat-section {
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-sm);
    overflow: hidden;
    margin-bottom: 18px;
}
.rs-stat-section.total {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 1px var(--rs-color-accent-bg), var(--rs-shadow-sm);
}
.rs-stat-section-head {
    padding: 12px 18px;
    border-bottom: 1px solid var(--rs-color-border);
    font-size: 13px;
    font-weight: 800;
    letter-spacing: .03em;
    text-transform: uppercase;
    color: var(--rs-color-text);
}
.rs-stat-section.total .rs-stat-section-head {
    color: var(--rs-color-accent-dark);
}
.rs-stat-scroll {
    overflow-x: auto;
    padding: 4px;
}
table.rs-stat-table {
    font-size: 11px !important;
    border: none !important;
}
table.rs-stat-table > thead > tr > th,
table.rs-stat-table > tbody > tr > td,
table.rs-stat-table > tr > th,
table.rs-stat-table > tr > td {
    border-color: var(--rs-color-border) !important;
    vertical-align: middle !important;
}
table.rs-stat-table > thead > tr > th {
    background: var(--rs-color-surface-alt) !important;
    color: var(--rs-color-muted);
    font-weight: 700;
    text-transform: uppercase;
    font-size: 10px;
}
table.rs-stat-table td:first-child,
table.rs-stat-table th:first-child {
    text-align: left !important;
    position: sticky;
    left: 0;
    background: var(--rs-color-surface);
    font-weight: 600;
    min-width: 140px;
    border-right: 2px solid var(--rs-color-border) !important;
    z-index: 1;
}
table.rs-stat-table thead th:first-child {
    background: var(--rs-color-surface-alt) !important;
}
table.rs-stat-table .label-success {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 32px;
    padding: 3px 7px;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-success-bg) !important;
    color: var(--rs-color-success-dark) !important;
    font-family: "IBM Plex Mono", monospace;
}
a.voir_mo_stat:hover .label-success {
    background: var(--rs-color-success) !important;
    color: #fff !important;
}
table.rs-stat-table .label-danger {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 32px;
    padding: 3px 7px;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-danger) !important;
    color: #fff !important;
    font-family: "IBM Plex Mono", monospace;
}
table.rs-stat-table tr:last-child td {
    background: var(--rs-color-accent-bg) !important;
    border-top: 2px solid var(--rs-color-accent) !important;
}
/* voir_mo_stat.php : fenêtre de détail des heures d'un compagnon */
.rs-vms-export {
    border-radius: var(--rs-radius-pill) !important;
    padding: 7px 16px !important;
}
table.rs-vms-detail {
    font-size: 12.5px !important;
}
table.rs-vms-detail > thead > tr > td,
table.rs-vms-detail > thead > tr > th {
    background: var(--rs-color-surface-alt) !important;
    color: var(--rs-color-muted);
    font-size: 10.5px;
    text-transform: uppercase;
    font-weight: 700;
    border-color: var(--rs-color-border) !important;
}
table.rs-vms-detail > tbody > tr > td {
    border-color: var(--rs-color-border) !important;
    vertical-align: middle !important;
}
table.rs-vms-detail .form-control {
    border-radius: var(--rs-radius-sm) !important;
    border: 1px solid var(--rs-color-border) !important;
    background: var(--rs-color-surface-alt) !important;
    box-shadow: none !important;
}
.rs-vms-recap-title {
    font-size: 13px;
    font-weight: 700;
    color: var(--rs-color-text);
    margin: 20px 0 10px;
}
table.rs-vms-recap {
    border: 1px solid var(--rs-color-border) !important;
    border-radius: var(--rs-radius-md);
    overflow: hidden;
}
table.rs-vms-recap > thead > tr > th {
    background: var(--rs-color-surface-alt) !important;
    color: var(--rs-color-muted);
    font-size: 11px;
    text-transform: uppercase;
    font-weight: 700;
    border: none !important;
}
table.rs-vms-recap > tbody > tr > td {
    border-color: var(--rs-color-border) !important;
    border-left: none !important;
    border-right: none !important;
}
table.rs-vms-recap > tbody > tr > td:last-child {
    text-align: right;
    font-weight: 700;
    font-family: "IBM Plex Mono", monospace;
}

.rs-filtres-btn-commenting {
    padding: 1px 8px 4px 8px !important;
}

/* ============================================================
   Barre de filtres des factures (views/factures/filtres_statique_factures.php,
   partagée par factures.php / facture.php / facture_periodique.php) : remplace
   l'ancien input-group Bootstrap (Du/Au/Recherche/Type facture/Relevé) par les
   primitives .rs-input/.rs-input-outline/.rs-input-label/.rs-btn, dans un
   gabarit dense (toolbar au milieu d'une liste, pas un formulaire pleine page)
   — même esprit que .rs-tdb-filtre-periode plus haut. Le bouton Filtres associé
   (#rs_toggle_filtres_facture) reste sur .rs-filtres-btn (cf. css/style.css),
   déjà utilisé ailleurs pour ce même composant (badge + panneau à bascule).
   ============================================================ */
.rs-facture-filtre-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
}
.rs-facture-filtre-bar .rs-input-label {
    margin-bottom: 0;
}
.rs-facture-filtre-bar .rs-input {
    height: 32px;
    font-size: 12.5px;
}
.rs-facture-filtre-bar select.rs-input {
    padding: 0 10px;
    width: 230px;
}
.rs-facture-filtre-bar input[type="text"].rs-input,
.rs-facture-filtre-bar input[type="search"].rs-input {
    width: 200px;
    padding: 0 14px;
}
.rs-facture-filtre-bar #date_debut_recherche,
.rs-facture-filtre-bar #date_fin_recherche {
    width: 110px;
}
.rs-facture-filtre-bar .rs-btn {
    padding: 7px 14px;
    font-size: 12.5px;
}

/* Panneau de filtres avancés des factures (views/factures/filtre_facture.php,
   chargé en AJAX dans #zone_filtre_facture, basculé par #rs_toggle_filtres_facture
   ci-dessus) : même gabarit dense que .rs-facture-filtre-bar (hauteur 32px), sur
   des champs empilés label au-dessus au lieu d'une ligne label-à-côté. */
.rs-facture-filtre-panel .rs-input {
    height: 32px;
    font-size: 12.5px;
}
.rs-facture-filtre-panel select.rs-input {
    padding: 0 10px;
}
.rs-facture-filtre-panel input.rs-input {
    padding: 0 12px;
}
.rs-facture-filtre-panel .rs-btn {
    padding: 7px 14px;
    font-size: 12.5px;
}

/* ============================================================
   Modale "Envoi de mail" (form_mail_2.php, popup_mail.php,
   views/mail/envoi_mail.php) — le reste des champs réutilise les
   primitives .rs-input/.rs-input-outline/.rs-input-label/.rs-filtre-toggle/
   .rs-bs-form-skin déjà en place ; seul le cadre autour du corps CKEditor
   est une addition propre à cette modale (rien à styler côté CKEditor
   lui-même, juste le conteneur qui l'entoure dans le DOM). */
.rs-mail-editor-frame {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    padding: 6px;
    background: var(--rs-color-surface);
    margin-top: 4px;
}

   /*Liste des devis (views/devisOr/listeDevis.php) : barre de filtres du
   panneau résultat (checkbox "devis annulés" + Du/Au + recherche libre +
   Rechercher), même gabarit dense que .rs-facture-filtre-bar, et tableau
   habillé via .rs-table (cf. plus haut) sans toucher au HTML/JS métier
   (popovers, data-click/data-onglets/data-numdev, id="tr_<num_dev>", couleur
   de ligne "document_cancel" posée en inline-style, <td style="height:1px">
   cliquable en pleine hauteur) — même esprit que .rs-resultat-recherche-table
   pour views/devisOr/resultatRechercheDossier.php. */
.rs-devis-filtre-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
}
.rs-devis-filtre-bar .rs-input-label {
    margin-bottom: 0;
}
.rs-devis-filtre-bar .rs-input {
    height: 32px;
    font-size: 12.5px;
}
.rs-devis-filtre-bar #date_debut_recherche,
.rs-devis-filtre-bar #date_fin_recherche {
    width: 110px;
}
.rs-devis-filtre-bar input[type="search"].rs-input:not(#date_debut_recherche):not(#date_fin_recherche) {
    width: 220px;
    padding: 0 14px;
}
.rs-devis-filtre-bar .rs-btn {
    padding: 7px 14px;
    font-size: 12.5px;
}
.rs-liste-devis-wrap {
    margin-top: 10px;
}
.rs-liste-devis-table.rs-table {
    font-size: 12.5px;
}
/* Survol en surimpression semi-transparente plutôt qu'un fond plein : une ligne
   "document annulé" a déjà un fond gris posé en inline-style — un fond plein
   l'aurait effacé au survol (même raison que .rs-resultat-recherche-table). */
.rs-liste-devis-table.rs-table tbody tr:hover td {
    background: rgba(51, 163, 221, .08);
}
.rs-liste-devis-table.rs-table thead th {
    white-space: normal;
}

/* ============================================================
   Bandeau Darva (views/devisOr/listeDossierDarva.php) : bouton "historique des
   récupérations" (icône + dropdown), sur le même bandeau sombre (#515151) que
   .panel-heading de listeDevis.php — donc hover en surimpression blanche plutôt
   que la teinte accent claire (pensée pour fond clair), même idiome que
   .rs-note-btn/.rs-screenshot-btn du bandeau principal. Items du dropdown
   remplis en AJAX par controllers/CDR_HistoriqueRecup_darva.php.
   ============================================================ */
.rs-darva-historique-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    margin: 0 10px 0 5px;
    vertical-align: middle;
    border-radius: var(--rs-radius-pill);
    color: #fff;
    transition: var(--rs-transition);
}
.rs-darva-historique-toggle:hover,
.rs-darva-historique-toggle:focus {
    background: rgba(255, 255, 255, .15);
    color: #fff;
}
.rs-darva-historique-toggle .glyphicon {
    font-size: 20px;
}
.rs-darva-historique-menu {
    min-width: 320px;
    max-width: 380px;
    padding: 6px;
    margin-top: 8px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
}
.rs-darva-historique-item {
    padding: 8px 10px;
    border-radius: var(--rs-radius-sm);
    color: var(--rs-color-text);
    font-size: 12.5px;
    transition: var(--rs-transition);
}
.rs-darva-historique-item:hover {
    background: var(--rs-color-accent-bg);
}
.rs-darva-historique-item h6 {
    margin: 0;
    font-weight: 400;
}

/* Radios de sélection (organisme/client/devis/expert) de views/devisOr/darva/
   darva_view.php : chaque <input type="radio"> garde son <label for="..."> séparé
   existant (souvent un lien externe + plusieurs infos), donc pas de bascule vers
   .rs-chip (qui masque le radio natif et suppose un <label> englobant simple) —
   juste la teinte accent native du navigateur, sans toucher au HTML/JS métier. */
.rs-darva-view-radio {
    accent-color: var(--rs-color-accent);
    width: 15px;
    height: 15px;
    cursor: pointer;
    vertical-align: middle;
}

/* Filtres de la consultation des paiements Darva (views/comptabilite/reglement/
   liste_paiement_darva.php) : Organisme/Etat/Dossier/Facture/Du/Au/Ordre
   d'affichage partagent déjà .filtre_recherche_paiement_darva (lue par
   js/Comptabilite.js) — réutilisée ici pour une hauteur identique, sans
   dépendre du rendu par défaut de chaque <select>/<input>. */
.filtre_recherche_paiement_darva.rs-input-outline {
    height: 34px;
    font-size: 12.5px;
    box-sizing: border-box;
}
/* input[type="search"] (Du/Au) garde par défaut son propre rendu natif
   (-webkit-appearance: searchfield sous Chrome/Edge), qui ignore une partie du
   height/padding personnalisé et le fait paraître plus petit que les <select>
   voisins malgré une hauteur CSS identique — on désactive ce rendu natif pour
   qu'il suive exactly le même box model que les autres champs de la ligne. */
input[type="search"].filtre_recherche_paiement_darva.rs-input-outline {
    -webkit-appearance: none;
    appearance: none;
}

/* ============================================================
   Barre de filtres "OR en attente de RDV" (views/devisOr/listeOrEnAttente.php
   + liste_OR_en_attente_RDV/filtre_or_en_attente_rdv.php, y compris son
   sous-include Buttonfilter_listeOr.php) : harmonise tous les champs
   (recherche, selects, dates, checkbox) et boutons de cette barre avec la
   charte "RS moderne" plutôt que le rendu Bootstrap brut. Scopé à
   .rs-filtre-or-toolbar (posé sur .zone-select-2-filtre) et
   .rs-toolbar-actions (rangée Filtre / Rechercher / Récupération Darva) pour
   ne rien changer en dehors de cette barre. ============================================================ */

.rs-filtre-or-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
}
.rs-filtre-or-toolbar .rs-input-label {
    margin-bottom: 4px;
}
.rs-filtre-or-toolbar .rs-input-outline {
    height: 34px !important;
    font-size: 12.5px;
    box-sizing: border-box;
    color: var(--rs-color-text);
}
.rs-filtre-or-toolbar .rs-input-outline::placeholder {
    color: var(--rs-color-faint);
}
.rs-filtre-or-toolbar .rs-input-outline:hover {
    border-color: var(--rs-color-accent);
}
.rs-filtre-or-toolbar .input-group {
    height: 34px;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-sm);
    background: var(--rs-color-surface);
    overflow: hidden;
    transition: var(--rs-transition);
}
.rs-filtre-or-toolbar .input-group:hover {
    border-color: var(--rs-color-accent);
}
.rs-filtre-or-toolbar .input-group:focus-within {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}
.rs-filtre-or-toolbar .input-group .rs-input-outline {
    height: 100% !important;
    border: none !important;
    box-shadow: none !important;
    border-radius: 0 !important;
}
.rs-filtre-or-toolbar .input-group-addon {
    height: 100%;
    display: inline-flex;
    align-items: center;
    background: var(--rs-color-surface-alt) !important;
    border: none !important;
    color: var(--rs-color-muted) !important;
    font-weight: 600;
    font-size: 11.5px;
}
.rs-filtre-or-toolbar input[type="checkbox"] {
    accent-color: var(--rs-color-accent);
    cursor: pointer;
}
.rs-filtre-or-toolbar .btn,
.rs-toolbar-actions .btn {
    border-radius: var(--rs-radius-sm);
    transition: var(--rs-transition);
    box-shadow: none;
}
.rs-filtre-or-toolbar .btn:hover,
.rs-toolbar-actions .btn:hover {
    transform: translateY(-1px);
    box-shadow: var(--rs-shadow-sm);
}
.rs-filtre-or-toolbar .btn-default {
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
}
.rs-filtre-or-toolbar .btn-default:hover,
.rs-filtre-or-toolbar .btn-default:focus {
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark);
}
.rs-filtre-or-toolbar .dropdown-menu {
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-md);
    box-shadow: var(--rs-shadow-md);
    padding: 6px;
    min-width: 260px;
}

.rs-filtre-or-toolbar .dropdown-menu > li.divider {
    margin: 4px 0;
    background-color: var(--rs-color-border);
}

/* Rangée d'actions au-dessus de la barre de filtres (bandeau gris) : bouton
   Filtre (nouveau, bascule l'affichage de .rs-filtre-or-toolbar), Rechercher
   (déplacé depuis filtre_or_en_attente_rdv.php) puis Récuperation Darva,
   dans cet ordre de gauche à droite. */
.rs-toolbar-actions {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex-wrap: wrap;
    gap: 8px;
    padding: 6px 10px;
}
.rs-toolbar-actions .rs-btn-filtre {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    height: 32px;
    padding: 0 16px;
    font-size: 12.5px;
    font-weight: 600;
    border: 1px solid var(--rs-color-border);
    border-radius: var(--rs-radius-pill) !important;
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
}
.rs-toolbar-actions .rs-btn-filtre:hover,
.rs-toolbar-actions .rs-btn-filtre:focus {
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark);
}
.rs-toolbar-actions .rs-btn-filtre.active {
    background: var(--rs-color-accent-bg);
    border-color: var(--rs-color-accent);
    color: var(--rs-color-accent-dark);
}
.rs-toolbar-actions .rs-btn-filtre-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: var(--rs-radius-pill);
    background: var(--rs-color-accent);
    color: #fff;
    font-size: 11px;
    font-weight: 700;
    line-height: 18px;
}
.rs-toolbar-actions #bouton_recherche_liste_or.rs-btn-recherche-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0 !important;
    border-radius: 50% !important;
    border: 1px solid var(--rs-color-border);
    background: var(--rs-color-surface);
    color: var(--rs-color-text);
    font-size: 13px;
}
.rs-toolbar-actions #bouton_recherche_liste_or.rs-btn-recherche-icon:hover,
.rs-toolbar-actions #bouton_recherche_liste_or.rs-btn-recherche-icon:focus {
    border-color: var(--rs-color-accent);
    background: var(--rs-color-accent-bg);
    color: var(--rs-color-accent-dark);
}

/* Ligne "X Dossier(s) Standard..." (rechargée en AJAX dans
   #zone_information_nombre_haut) + avertissement "6 derniers mois" : sur la
   même ligne, l'avertissement poussé à droite via la grille Bootstrap
   (col-sm-7 / col-sm-5 text-right) posée dans listeOrEnAttente.php. */
.rs-info-nombre-row {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
}

/* Filtres "Etat"/"Nature" en mode multiple (views/devisOr/liste_Dossier_en_attente/
   filtre_dossier_en_attente.php, views/devisOr/liste_tous_OR/filtre_tous_or.php) :
   select2 fait grossir la pastille au-delà des 34px des autres champs de la même
   barre dès qu'il affiche son placeholder ("Sélec. Etat"/"Sélec. Nature") — on la
   plafonne à 34px UNIQUEMENT tant qu'aucun tag n'est encore sélectionné (:not(:has(...))
   redevient faux dès le premier choix), pour ne jamais couper l'affichage des tags
   réellement sélectionnés (un max-height fixe en toutes circonstances les clippait
   hors de la zone visible - la sélection semblait alors ne "rien afficher"). */
.rs-filtre-or-toolbar #recherche_etat + .select2-container .select2-selection--multiple:not(:has(.select2-selection__choice)),
.rs-filtre-or-toolbar #recherche_naturedossier + .select2-container .select2-selection--multiple:not(:has(.select2-selection__choice)) {
    height: 34px !important;
    min-height: 34px !important;
    max-height: 34px;
    padding: 2px 6px !important;
}

/* Boutons export PDF/Xls (même fichier) : restent sur une seule ligne sous le bouton
   Rechercher plutôt que de passer chacun sur sa propre ligne. */
.rs-export-buttons-row {
    display: flex;
    flex-wrap: nowrap;
    justify-content: center;
    gap: 6px;
    margin-top: 6px;
}
.rs-export-buttons-row .rs-btn {
    height: 30px;
    padding: 0 8px;
    font-size: 12px;
    white-space: nowrap;
}

/* Bandeau en-tête Devis/OR (views/devisOr/detailOR/en-tete-devis-or.php et
   en-tete-devis-or-loading.php) : les boutons Retour/Actions/Interfaces/
   Impression/Envoi par mail/GED doivent tenir dans le même gabarit que les
   onglets du sous-menu juste au-dessus (.zone-onglets, ~25px), sans que le
   padding par défaut de .rs-btn (5px 15px) ne fasse déborder la pilule.
   Règle posée ici (plutôt que dans le <style> local de ces deux fichiers,
   chargé via un fragment mis en cache côté navigateur) pour être certain
   qu'elle soit bien prise en compte au rechargement. */
.btn-en-tete-xx.rs-btn {
    box-sizing: border-box;
    padding: 6px;
    font-size: 12px;
}
.btn-en-tete-xx.rs-btn img {
    max-height: 13px;
    width: auto;
    vertical-align: middle;
}

.rs-btn-icon-action-atelier {
    padding: 2px 5px;
    white-space: nowrap;
}

.rs-btn-icon-action-atelier-image {
    padding: 5px 7px;
}

.rs-btn-dossier {
    padding: 10px 15px;
}

.legend-fieldset {
    border-radius: 20px;
    padding: 6px 10px;
    background-color: #e8e8e8;
    padding-left: 22px;
}

.rs-input-outline-border-right {
    border-radius: var(--rs-radius-md);
    background: var(--rs-color-surface);
    border: 1px solid var(--rs-color-border);
    box-shadow: none;
    border-radius: 0px 10px 10px 0px !important;
}
.rs-input-outline-border-right:focus {
    border-color: var(--rs-color-accent);
    box-shadow: 0 0 0 3px var(--rs-color-accent-bg);
}

.rs-no-border {
    border-radius: 0px !important;
}
/* Le champ .rs-no-border (ex: id="societe") est aplati car un .input-group-addon
   le suit (ex: le bouton "copier"). Cet addon doit alors porter lui-même le coin
   arrondi qui cape la pilule à droite du groupe — sinon les deux (champ plat +
   addon carré) forment un rectangle plat au lieu d'une pilule. On cible le
   DERNIER .input-group-addon qui suit un .rs-no-border (~ plutôt que + : gère le
   cas d'un addon intermédiaire optionnel avant l'addon "copier", ex: le lien
   tel:... conditionnel des champs téléphone — seul le tout dernier addon (visible
   au clic) doit être arrondi, pas celui du milieu). Scopé à .rs-no-border pour ne
   pas re-styler tous les .input-group-addon de l'appli (classe partagée par
   ~40 fichiers) — n'affecte que les champs déjà marqués par ce travail.
   Deuxième sélecteur : cas Ville-user-gen où le .suggestionsBox (dropdown
   d'autosuggestion, positionné en absolute) suit l'addon "copier" dans le DOM,
   ce qui lui fait perdre :last-child alors qu'il reste visuellement le dernier
   élément de la pilule — ciblé directement par son id (dupliqué sur toute la
   page, mais valide en sélecteur CSS malgré le HTML non conforme). */
.rs-no-border ~ .input-group-addon:last-child,
.rs-no-border ~ .input-group-addon#copied_text_rs {
    border-radius: 0px 10px 10px 0px !important;
}
/* Cas inverse : un .input-group sans addon à gauche mais avec un addon à
   droite (ex: les champs montant "0 €" d'expert.php, input suivi de son
   addon "€", sans icône avant) — .rs-no-border seul aplatit aussi le côté
   gauche du champ, qui est pourtant le bord extérieur du groupe et devrait
   rester arrondi. Cette classe se pose EN PLUS de .rs-no-border (qui reste
   nécessaire pour que l'addon de droite soit ciblé par le sélecteur
   ci-dessus) et ne réintroduit l'arrondi que côté gauche. */
.rs-input-outline-border-left {
    border-radius: 10px 0px 0px 10px !important;
}

.btn {
    border-radius: 9px !important;
}

.input-group-addon {
    border-radius: 10px 0px 0px 10px !important;
}
/* La règle .input-group-addon ci-dessus suppose l'addon toujours en première
   position (arrondi à gauche, plat à droite contre le champ qui suit) — c'est
   le cas pour un addon unique devant un input/select. Mais un input-group à
   deux addons SANS champ texte entre eux (ex: la pastille checkbox + label
   "Tout cocher" de views/GED/liste_dossier_ged.php, .rs-checkbox-pill) a besoin
   de l'inverse pour son dernier addon : celui-ci est le bord DROIT réel de la
   pilule et doit donc être arrondi à droite, pas à gauche. Spécificité plus
   élevée (.rs-checkbox-pill .input-group-addon:last-child) l'emporte sur la
   règle générique ci-dessus sans la modifier (partagée par ~40 fichiers). */
.rs-checkbox-pill .input-group-addon:last-child {
    border-radius: 0px 10px 10px 0px !important;
}
/* Champ "OR" de atelier.php (barre d'outils du suivi atelier) : le lien de tri
   (flèches haut/bas) qui suit le champ n'est pas un .input-group-addon, donc
   .input-group (display:table par défaut) ne le traite plus comme une cellule
   solidaire de l'input une fois que ce dernier a perdu .form-control (qui
   déclenchait ce comportement côté Bootstrap) — les deux flèches passent à la
   ligne sous "OR" faute de place. Flex + nowrap gardent input et flèches sur
   une seule ligne, quelle que soit la largeur disponible dans cette colonne
   étroite (5%). */
.rs-or-search-group {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
}
.rs-or-search-group .tri_filtre_suivi_atelier {
    flex-shrink: 0;
}

/* "Dernières note(s) saisie(s)" (views/factures/dernieres_notes_bulles.php),
   inclus comme <li> dans la ligne d'onglets ul.zone-onglets (factures.php,
   facture.php, facture_periodique.php, uniquement quand !isset($_REQUEST['Client']),
   seul cas où ces onglets existent) plutôt que dans la barre de filtres —
   margin-left:auto le pousse à droite de la même ligne que les onglets, dans
   le flex déjà posé sur ul.zone-onglets (cf. plus haut dans ce fichier). Quand
   Client est défini (fiche client), le bloc reste affiché dans le partial
   filtres_statique_factures.php faute d'onglets où l'accrocher. */
.rs-notes-bulles-item {
    font-size: 11px;
    white-space: nowrap;
}