/*
 * ============================================================
 *  SIDEBAR  (menu de navigation)
 *  DevExpress XAF Blazor v25.x — Fluent mode
 *
 *  File structure
 *  ──────────────
 *  0.  Base / app shell (chaîne de hauteur, header masqué)
 *  1.  Design tokens (MERCALYS menu palette)
 *  2.  Sidebar — surface + header (logo)
 *  3.  Navigation filter (native XAF search field)
 *  4.  Navigation tree (items, states, separators, bullets)
 *  5.  Collapsed rail (manual click toggle, via sidebar.js + native XAF)
 *
 *  Override strategy for DevExpress components
 *  ────────────────────────────────────────────
 *  DevExpress Fluent theme relies on a two-level CSS variable chain:
 *    component variable  →  dxds token  →  value
 *  Adding !important on a property such as background-color has NO
 *  effect when the component reads its color from a CSS variable at
 *  render time.  The only reliable approach is to re-declare the
 *  component-level CSS variable on a scoped selector (.sidebar …)
 *  so the cascade resolves to our value first.
 *
 *  Example (navigation field background):
 *    .dxbl-text-edit reads its background from --dxbl-text-edit-bg
 *    → we re-declare --dxbl-text-edit-bg on .sidebar .dxbl-text-edit
 *
 *  When in doubt, search core.min.css for the component class and
 *  trace back the variable chain before writing overrides.
 * ============================================================
 */


@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&display=swap');


/* ============================================================
   0. BASE / APP SHELL
   Chaîne de hauteur indispensable : SANS ces règles, les conteneurs
   virtualisés DevExpress (TreeView de navigation, grilles) n'ont pas
   de hauteur bornée et lèvent « UnableToRequestItemsException » au
   démarrage, sur toutes les pages.
   ============================================================ */
html, body { height: 100%; }
app { display: block; height: 100%; }

/* Header applicatif MASQUÉ : la maquette n'a pas de bandeau supérieur sombre.
   La flèche RETOUR + le TITRE de vue sont rendus dans la zone de contenu
   (.main-pagebar, cf. template CustomApplicationWindowTemplateComponent.razor).
   Compte / réglages / déconnexion sont déplacés dans le menu. */
.app-header {
    display: none !important;
}


/* ============================================================
   1. DESIGN TOKENS — palette MERCALYS (menu)
   Toutes les couleurs, espacements, rayons et typo vivent ici.
   Aucune valeur brute (hex) ne doit apparaître hors de ce bloc.
   ============================================================ */
:root {
    /* ── Palette ──────────────────────────────────────────── */
    --sidebar-palette-teal-700:    #164147; /* surface sidebar               */
    --sidebar-palette-teal-600:    #1c4b52; /* fond de champ                 */
    --sidebar-palette-teal-550:    #24616a; /* fond de champ · survol        */
    --sidebar-palette-teal-525:    #2d6d76; /* bordure de champ · survol     */
    --sidebar-palette-teal-500:    #255a62; /* bordure de champ              */
    --sidebar-palette-white:       #fffefd; /* blanc                         */
    --sidebar-palette-charcoal-10: #f9f9f9; /* fond tooltip                  */
    --sidebar-palette-charcoal-20: #f3f3f3; /* bordure tooltip               */
    --sidebar-palette-charcoal-40: #e1e1e0; /* gris clair                    */
    --sidebar-palette-charcoal-60: #cdcdcb; /* gris moyen                    */
    --sidebar-palette-charcoal-70: #b9b9b6; /* gris soutenu                  */
    --sidebar-palette-lime-10:     #f1fbe4; /* lime très clair (hover item)  */
    --sidebar-palette-lime-20:     #ddf3d2; /* lime clair (pressed item)     */
    --sidebar-palette-lime-30:     #cff6b8; /* lime clair (focus champ)      */
    --sidebar-palette-lime-40:     #d4f9a3; /* lime (accent / sélection)     */
    --sidebar-palette-lime-50:     #bcea78; /* lime soutenu                  */

    /* ── Espacement / rayon ───────────────────────────────── */
    --sidebar-space-s:   8px;
    --sidebar-space-m:   10px;
    --sidebar-space-2xl: 20px;
    --sidebar-space-3xl: 24px; /* gap en-tête → zone nav (Figma : container gap-24) */
    --sidebar-radius-s:  4px;

    /* ── Typographie (Manrope = police de marque ; fallback Fluent) ── */
    --sidebar-font-family: "Manrope", var(--dxbl-text-edit-font-family-m, "Segoe UI", system-ui, sans-serif);
    --sidebar-font-size-xs: 10px;
    --sidebar-font-size-s:  12px;
    --sidebar-font-size-m:  14px; /* md/regular (tooltip) */
    --sidebar-font-weight-regular: 400;

    /* ── Rôles sémantiques (consommés par les composants) ─── */
    --sidebar-surface:     var(--sidebar-palette-teal-700);
    --sidebar-field-surface:       var(--sidebar-palette-teal-600);
    --sidebar-field-surface-hover: var(--sidebar-palette-teal-550);
    --sidebar-field-border:        var(--sidebar-palette-teal-500);
    --sidebar-field-border-hover:  var(--sidebar-palette-teal-525);
    --sidebar-field-border-focus:  var(--sidebar-palette-lime-30);
    --sidebar-text-on-dark:        var(--sidebar-palette-white);
    --sidebar-text-placeholder:    var(--sidebar-palette-charcoal-40);
    --sidebar-text-muted:          var(--sidebar-palette-charcoal-70);
    --sidebar-accent:              var(--sidebar-palette-lime-40);

    /* Navigation (item de sidebar) — états maquette :
       enable = transparent + blanc ; hover = lime/10 + teal ;
       pressed = lime/20 ; sélection = lime/40 + teal. */
    --sidebar-nav-item-text:             var(--sidebar-text-on-dark);
    --sidebar-nav-item-hover-surface:    var(--sidebar-palette-lime-10);
    --sidebar-nav-item-hover-text:       var(--sidebar-palette-teal-700);
    --sidebar-nav-item-pressed-surface:  var(--sidebar-palette-lime-20);
    --sidebar-nav-item-selected-surface: var(--sidebar-accent);
    --sidebar-nav-item-selected-text:    var(--sidebar-palette-teal-700);
    --sidebar-nav-subitem-text:          var(--sidebar-palette-charcoal-60);
    --sidebar-nav-section-text:          var(--sidebar-palette-charcoal-60); /* #cdcdcb — titres de module (Figma « Charcoal/70 » = #CDCDCB) */

    /* Infobulle (rail replié) — maquette Figma : carré clair, texte teal. */
    --sidebar-tooltip-surface: var(--sidebar-palette-charcoal-10);
    --sidebar-tooltip-border:  var(--sidebar-palette-charcoal-20);
    --sidebar-tooltip-text:    var(--sidebar-palette-teal-700);

    /* Recoloration des icônes d'items (img) au survol/sélection : le fond passe en
       clair -> l'icône doit virer en teal pour rester visible. Une <img> n'est pas
       recolorable via `color`, on passe donc par un `filter` (≈ teal #164147).
       À régénérer si la couleur d'accent change (outil « hex → css filter »). */
    --sidebar-nav-icon-active-filter:
        brightness(0) saturate(100%) invert(19%) sepia(34%) saturate(1093%) hue-rotate(140deg) brightness(94%) contrast(91%);
}


/* ============================================================
   2. SIDEBAR — surface + en-tête (logo)
   On cible la classe NATIVE `.sidebar` (rendue par XAF) — pas de classe
   custom — pour rester portable dans une app XAF native (autre équipe).
   Le thème DevExpress pose un défaut plus spécifique
   (`.dxbl-theme-fluent .app .sidebar`, 0,3,0) MAIS sans `!important` : nos
   règles `!important` le battent. Ce fichier est chargé EN DERNIER (après
   app-theme.css) pour gagner aussi la cascade face aux règles globales.
   ============================================================ */
.sidebar {
    /* Largeur VERROUILLÉE (width + min + max + flex:0 0 auto). Sans ça, la sidebar
       n'avait qu'un min-width et grandissait en flex pour remplir l'espace libre
       quand la zone principale était vide — d'où l'élargissement au clic sur
       « Accueil » (dashboard vide). Le rail replié rétablit 70px (section 5, !important). */
    width: 210px;
    min-width: 210px;
    max-width: 210px;
    flex: 0 0 auto !important;
    background: var(--sidebar-surface) !important;
    /* Panneau teal plein, à ras bord : on annule bordure / coin arrondi /
       marge haute que le thème pose par défaut sur la sidebar. */
    border: none !important;
    border-radius: 0 !important;
    margin-top: 0 !important;
}

.sidebar a {
    text-decoration: none !important;
}

/* Ancien menu bas de sidebar. « Déconnexion » est désormais un sous-item de nav (sous
   « Mon compte », cf. Model.xafml + LogOffNavigationItemController). Ce conteneur ne sert
   plus qu'à héberger le <SettingsComponent /> (caché) qui fournit le tiroir de thème pour
   l'item « Apparence ». On le passe en display:contents : aucune emprise/box (donc plus de
   bloc épinglé en bas), tout en conservant les règles descendantes .theme-settings/.theme-button. */
.sidebar__menu {
    display: contents;
}

/* Sélecteur de thème NATIF (SettingsComponent) : rendu ici pour son tiroir latéral
   (.settings-bar, position:fixed) + sa logique, MAIS sans emprise visuelle. On masque son
   bouton gear par défaut et on neutralise son wrapper (display:contents). Le tiroir est
   ouvert par l'item de nav « Apparence » (sidebar.js relaie le clic sur .theme-button). */
.sidebar__menu .theme-settings { display: contents; }
.sidebar__menu .theme-button { display: none !important; }
/* Dropdowns DevExpress (langue, mode de taille) DANS le tiroir : leur liste est rendue dans
   le portail global <dxbl-popup-root> en fin de <body>, dont les cellules (dxbl-popup-cell)
   sont à z-index:0 -> la liste s'ouvre mais est peinte SOUS le tiroir (.settings-bar,
   z-index:1100 posé par XAF) = invisible et incliquable. On rehausse les cellules popup
   au-dessus du tiroir ; leur ordre relatif entre elles reste l'ordre DOM (valeur égale). */
dxbl-popup-cell { z-index: 1150 !important; }
/* Bouton de déconnexion CACHÉ : simple relais cliqué par sidebar.js au clic sur le
   sous-item de nav « Déconnexion » (cf. .sidebar__logoff-trigger dans le template). */
.sidebar__logoff-trigger { display: none !important; }

/* Ligne de menu = bouton nu, pleine largeur, icône SVG + libellé. L'icône est en
   currentColor -> elle suit la couleur du texte (blanc au repos, teal au survol),
   sans recoloration par filtre (contrairement aux <img> des items de nav). */
.sidebar__menu-item {
    display: flex;
    align-items: center;
    gap: 5px; /* = --dxbl-treeview-image-spacing (gap icône ↔ texte des items de nav) */
    /* Même gabarit que les items de nav (.dxbl-treeview-item-container) : boîte 160×35, retrait
       gauche 20px / droite 10px, box-sizing border-box pour que le padding reste DANS les 160px. */
    box-sizing: border-box;
    width: 160px;
    height: 35px;
    padding: 0 10px; /* gauche 10 / droite 10 (maquette) — aligné avec les items de nav */
    border: none;
    background: transparent;
    border-radius: var(--sidebar-radius-s);
    color: var(--sidebar-nav-item-text);
    font-family: var(--sidebar-font-family);
    font-size: var(--sidebar-font-size-m); /* 14px (maquette) */
    font-weight: var(--sidebar-font-weight-regular);
    line-height: 1.2;
    text-align: left;
    cursor: pointer;
}
.sidebar__menu-item:hover {
    background: var(--sidebar-nav-item-hover-surface);
    color: var(--sidebar-nav-item-hover-text);
}
.sidebar__menu-icon {
    width: 16px;
    height: 16px;
    flex: 0 0 auto;
}
.sidebar__menu-label {
    min-width: 0;
    overflow-wrap: break-word;
}

/* En-tête de la sidebar (logo MERCALYS). Le wordmark utilise une police
   propriétaire (Berlin Sans FB Demi), non chargeable côté web : on utilise
   le lockup exporté du Figma en image -> rendu fidèle (police comprise). */
.sidebar__brand {
    display: flex;
    align-items: center;
    gap: var(--sidebar-space-s);
    /* Côtés = 10px et haut = 20px (état d'origine). Bas = 14px : le gap Figma
       en-tête → recherche est de 24px TOTAL. Comme la zone de recherche porte déjà
       10px de padding-top, on met 14px ici (14 + 10 = 24) pour ne pas dépasser. */
    padding: var(--sidebar-space-2xl) var(--sidebar-space-m) 14px;
}
.sidebar__logo {
    height: 30px !important;
    width: auto !important;
    object-fit: contain;
    max-width: 100%;
    cursor: pointer; /* logo cliquable -> Accueil (géré dans sidebar.js) */
}
/* Lockup complet (déplié) vs cube seul (rail replié).
   Le cube SVG a preserveAspectRatio="none" -> dimensions fixes au ratio
   natif (26.76 × 31.11) pour éviter qu'il s'étire en largeur dans le rail. */
.sidebar__logo--mark {
    display: none !important;
    width: 26px !important;
    height: 30px !important;
}

/* Flèche de bascule pli/dépli (Figma : 14px, en bout de l'en-tête).
   Le clic est géré dans sidebar.js (un onclick inline serait bloqué par la CSP)
   et déclenche la bascule NATIVE XAF (pose/retire .collapse-toggle sur .app). */
.sidebar__collapse-btn {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--sidebar-text-on-dark);
    cursor: pointer;
}
.sidebar__chevron {
    /* Taille forcée en CSS (20px, maquette) : l'emporte sur les attributs
       width/height="14" du SVG inline -> ajustable sans recompiler le .razor. */
    width: 20px;
    height: 20px;
    transition: transform 0.15s ease;
}


/* ============================================================
   3. FILTRE DE NAVIGATION (champ de recherche natif XAF)
   On habille le champ « Filter… » NATIF de la navigation (il garde sa
   loupe et sa fonction de filtrage). Scopé à la sidebar : c'est le seul
   éditeur texte présent dans `.sidebar`.
   ============================================================ */

/* Gabarit du champ de recherche = MÊME que les items de nav : 160px de large, retrait gauche 20px
   (au lieu de s'étendre pleine largeur). Il s'aligne ainsi avec les boîtes « Accueil », « Produits »…
   Le rail replié (section 5) le repasse en carré 32px (!important, plus spécifique -> non impacté). */
.sidebar .dxbl-navigation-filter {
    box-sizing: border-box;
    width: 160px;
    margin-left: var(--sidebar-space-2xl);
    /* Le composant natif du filtre pose un style INLINE `border-bottom-width:1px !important`
       dont la couleur par défaut (jaune) débordait sous le champ. Le style inline ne fixe que
       la LARGEUR -> on force ici la COULEUR (et le style) de cette bordure basse sur le teal du
       champ pour qu'elle se fonde dans le cadre. */
    border-bottom-color: var(--sidebar-field-border) !important;
    border-bottom-style: solid !important;
}

.sidebar .dxbl-text-edit {
    --dxbl-text-edit-bg:                var(--sidebar-field-surface);
    --dxbl-text-edit-color:             var(--sidebar-text-on-dark);
    --dxbl-text-edit-placeholder-color: var(--sidebar-text-placeholder);

    --dxbl-text-edit-border-color:         var(--sidebar-field-border);
    --dxbl-text-edit-border-hovered-color: var(--sidebar-field-border-hover);  /* survol = teal clair */
    --dxbl-text-edit-border-active-color:  var(--sidebar-field-border);        /* focus = pas de changement de couleur */
    --dxbl-text-edit-border-width:  1px;
    --dxbl-text-edit-border-style:  solid;
    --dxbl-text-edit-border-radius: var(--sidebar-radius-s);
    --dxbl-text-edit-box-shadow:    none;

    --dxbl-text-edit-font-family: var(--sidebar-font-family);
    --dxbl-text-edit-font-size:   var(--sidebar-font-size-m); /* 14px (maquette) */
    --dxbl-text-edit-font-weight: var(--sidebar-font-weight-regular);

    /* Bouton loupe natif : transparent, icône claire */
    --dxbl-text-edit-btn-bg:                transparent;
    --dxbl-text-edit-btn-color:             var(--sidebar-text-placeholder);
    --dxbl-text-edit-btn-image-color:       var(--sidebar-text-placeholder);
    --dxbl-text-edit-btn-hover-bg:          transparent;
    --dxbl-text-edit-btn-hover-color:       var(--sidebar-text-on-dark);
    --dxbl-text-edit-btn-hover-image-color: var(--sidebar-text-on-dark);
}

/* Bouton de recherche natif (dxbl-btn-outline-secondary) : neutralise
   l'outline pour qu'il se fonde dans le champ teal. */
.sidebar .dxbl-text-edit .dxbl-btn-icon {
    border-color: transparent;
    background: transparent;
    --dxbl-btn-color: var(--sidebar-text-placeholder);
}

/* Maquette : texte à GAUCHE, loupe à DROITE. Le champ natif rend le bouton
   loupe AVANT l'input -> on réordonne (le conteneur .dxbl-text-edit est flex). */
.sidebar .dxbl-text-edit .dxbl-text-edit-input { order: 1; }
.sidebar .dxbl-text-edit .dxbl-btn-icon { order: 2; }

/* Fond du champ au survol (le thème n'expose pas de variable de fond hover). */
.sidebar .dxbl-text-edit:hover {
    --dxbl-text-edit-bg: var(--sidebar-field-surface-hover);
}

/* ── GARDE (cf. EXCEPTION en-tête) ──────────────────────────────────
   Le thème applicatif (app-theme.css) pose des propriétés
   en dur avec !important sur les champs globaux (.dxbl-text-edit, input…),
   ce qui repassait le champ de la sidebar sur fond blanc malgré les
   variables ci-dessus. On ré-impose ici l'apparence en propriétés directes,
   à spécificité supérieure (0,2,0 > 0,1,0) : gagne quel que soit l'ordre. */
.sidebar .dxbl-text-edit,
.sidebar .dxbl-input-editor,
.sidebar input[type="text"],
.sidebar input[type="search"] {
    background-color: var(--sidebar-field-surface) !important;
    border-color: var(--sidebar-field-border) !important;
    color: var(--sidebar-text-on-dark) !important;
    border-radius: var(--sidebar-radius-s) !important;
    font-family: var(--sidebar-font-family) !important;
    font-size: var(--sidebar-font-size-m) !important; /* 14px (maquette) */
}
.sidebar .dxbl-text-edit:hover {
    background-color: var(--sidebar-field-surface-hover) !important;
    border-color: var(--sidebar-field-border-hover) !important;
}
/* Pas de changement de couleur de bordure au clic/focus : on garde la
   bordure teal par défaut (la maquette ne prévoit pas d'état focus coloré). */
.sidebar .dxbl-text-edit:focus-within,
.sidebar .dxbl-text-edit.dx-state-focused {
    border-color: var(--sidebar-field-border) !important;
    box-shadow: none !important;
}
/* Input réel : fond transparent (le fond est porté par le conteneur).
   padding-left : la maquette inset le texte de 10px (--space/m) ; sans ça le texte
   « Rechercher » est collé au bord gauche du champ. */
.sidebar .dxbl-text-edit-input {
    background: transparent !important;
    color: var(--sidebar-text-on-dark) !important;
    font-family: var(--sidebar-font-family) !important;
    padding-left: var(--sidebar-space-m) !important; /* 10px */
}
/* Aucun contour/ombre/bordure de focus sur l'input réel ni sur le bouton loupe.
   Le thème global (app-theme.css §14) applique border-color: primary sur
   input[type=search]:focus -> c'est ce liseré teal interne qui apparaissait au
   clic. On force la bordure transparente sur l'input (le seul cadre visible est
   celui du conteneur .dxbl-text-edit). */
.sidebar .dxbl-text-edit-input,
.sidebar .dxbl-text-edit-input:focus,
.sidebar .dxbl-text-edit-input:focus-visible,
.sidebar input[type="search"]:focus,
.sidebar .dxbl-text-edit .dxbl-btn-icon:focus,
.sidebar .dxbl-text-edit .dxbl-btn-icon:focus-visible {
    border-color: transparent !important;
    outline: none !important;
    box-shadow: none !important;
}
/* Placeholder « Recherche » : blanc (Figma le rend en #fffefd). L'écart avec
   l'ancien charcoal-40 (#e1e1e0) est minime sur le teal ; on s'aligne exactement.
   Réversible -> repasser sur var(--sidebar-text-placeholder) si un placeholder
   plein blanc se confond trop avec une valeur saisie. */
.sidebar .dxbl-text-edit-input::placeholder {
    color: var(--sidebar-text-on-dark) !important;
}
/* Bouton loupe natif : se fond dans le champ (pas de boîte claire). */
.sidebar .dxbl-text-edit .dxbl-text-edit-btn,
.sidebar .dxbl-text-edit .dxbl-btn-icon,
.sidebar .dxbl-text-edit .dxbl-btn {
    background: transparent !important;
    border-color: transparent !important;
    color: var(--sidebar-text-placeholder) !important;
}
.sidebar .dxbl-text-edit .dxbl-text-edit-btn:hover,
.sidebar .dxbl-text-edit .dxbl-btn-icon:hover,
.sidebar .dxbl-text-edit .dxbl-btn:hover {
    background: rgba(255, 255, 255, 0.10) !important;
    color: var(--sidebar-text-on-dark) !important;
}


/* ============================================================
   4. ARBRE DE NAVIGATION (items, états, séparateurs, puces)
   ============================================================ */

/* Les variables --dxbl-treeview-* sont posées SUR LA RACINE du composant
   (.dxbl-treeview), pas sur l'ancêtre .sidebar : sinon DevExpress les
   redéfinit sur sa propre racine et sa déclaration l'emporte (sélection qui
   restait bleue). On y met aussi le fond transparent pour révéler le teal. */
.sidebar .dxbl-treeview {
    background: transparent;

    /* Items */
    --dxbl-treeview-item-bg:        transparent;
    --dxbl-treeview-item-color:     var(--sidebar-nav-item-text);
    --dxbl-treeview-item-border-radius: var(--sidebar-radius-s);
    --dxbl-treeview-font-family:    var(--sidebar-font-family);
    --dxbl-treeview-font-size:      var(--sidebar-font-size-m); /* 14px (maquette) */

    /* Espacements maquette */
    /* Écart vertical entre items = 8px (maquette). LA bonne variable DevExpress est
       --dxbl-treeview-item-spacing (rendue en `padding-bottom` sur CHAQUE .dxbl-treeview-item-content) ;
       l'ancien --dxbl-treeview-item-spacing-y N'EXISTE PAS dans le thème Fluent -> il était inerte et
       l'écart restait au défaut (--dxds-spacing-20 = 2px). Ce padding-bottom sépare AUSSI le titre de
       module de sa 1ʳᵉ sous-page -> les 8px « nom du module → 1ʳᵉ page » sont couverts par la même règle. */
    --dxbl-treeview-item-spacing:   var(--sidebar-space-s); /* 8px entre items ET module → 1ʳᵉ page */
    /* Marge BASSE du champ de recherche natif (entre « Recherche » et le 1ᵉʳ item « Accueil ») = 8px,
       comme l'écart inter-items. Le défaut DevExpress (--dxbl-treeview-navigation-filter-bottom-spacing-m
       = spacing-80, 0.5rem ≈ 8px MAIS s'ajoutait à d'autres marges -> écart visuel ~16px). On force 8px. */
    --dxbl-treeview-navigation-filter-bottom-spacing: var(--sidebar-space-s);
    --dxbl-treeview-image-spacing:  5px;                 /* gap icône ↔ texte (5px) */
    --dxbl-treeview-text-padding-y: var(--sidebar-space-s); /* padding vertical item */
    --dxbl-treeview-item-content-indent: 0; /* indentation par niveau ANNULÉE : retour designer = items
        de même TAILLE (largeur) quel que soit le niveau. Les sous-pages restent repérables par leur PUCE
        (cf. règle .dxbl-treeview-item-container::before), pas par un retrait qui les rétrécirait. */

    /* Hover (fond lime/10, contenu teal) */
    --dxbl-treeview-item-hover-bg:    var(--sidebar-nav-item-hover-surface);
    --dxbl-treeview-item-hover-color: var(--sidebar-nav-item-hover-text);

    /* Sélection (page active) = pastille lime, texte teal */
    --dxbl-treeview-item-selection-bg:            var(--sidebar-nav-item-selected-surface);
    --dxbl-treeview-item-selection-color:         var(--sidebar-nav-item-selected-text);
    --dxbl-treeview-item-selection-focused-color: var(--sidebar-nav-item-selected-text);
    --dxbl-treeview-item-active-bg:               var(--sidebar-nav-item-selected-surface);
    --dxbl-treeview-item-active-color:            var(--sidebar-nav-item-selected-text);
    --dxbl-treeview-item-active-focused-bg:       var(--sidebar-nav-item-selected-surface);

    /* Bouton d'expansion (chevron). Au survol/sélection le fond passe en lime clair :
       le chevron doit donc devenir teal (un chevron blanc serait invisible sur lime). */
    --dxbl-treeview-btn-color:       var(--sidebar-text-placeholder);
    --dxbl-treeview-btn-hover-color: var(--sidebar-nav-item-selected-text);
    --dxbl-treeview-btn-bg:          transparent;
    --dxbl-treeview-btn-hover-bg:    transparent;
}

/* STRUCTURE (maquette) : niveau 1 = catégories/séparateurs (gris, sans icône) ;
   niveau 2 = items à ICÔNE (blanc) ; niveau 3+ = sous-items à PUCE (gris).

   Sous-items niveau 3+ : texte atténué au lieu du blanc.
   Isolement assumé : le TreeView Fluent n'expose pas de couleur par niveau. */
.sidebar .dxbl-treeview-item .dxbl-treeview-item .dxbl-treeview-item {
    --dxbl-treeview-item-color: var(--sidebar-nav-subitem-text);
}

/* Sous-items niveau 3+ : puce ronde à la place de l'icône du modèle.
   L'icône XAF est un <img class="xaf-nav-menu-item-icon"> — un élément REMPLACÉ :
   ::before/::after n'y fonctionnent pas et il n'a aucun enfant. On masque donc
   l'<img> et on dessine la puce sur le conteneur d'item (.dxbl-treeview-item-
   container, un vrai <div>/<a>), où les pseudo-éléments fonctionnent.
   Cible : conteneur ni niveau 1 (séparateur) ni niveau 2 (item à icône). */
.sidebar .dxbl-treeview-item-container:not([aria-level="1"]):not([aria-level="2"]) > .xaf-nav-menu-item-icon {
    /* !important : XAF impose l'affichage de l'icône via sa propre feuille. */
    display: none !important;
}
.sidebar .dxbl-treeview-item-container:not([aria-level="1"]):not([aria-level="2"])::before {
    content: "";
    flex: 0 0 auto;
    align-self: center;
    /* On conserve l'emprise de l'icône (16px + marge) pour aligner le texte du
       sous-item sous celui du niveau parent ; la puce de 4px est centrée via un
       masque radial et hérite de la couleur de l'item (currentColor). */
    width: 16px;
    height: 16px;
    margin-right: var(--sidebar-space-s); /* 8px */
    background-color: currentColor;
    -webkit-mask: radial-gradient(circle at center, #000 2px, transparent 2.5px);
            mask: radial-gradient(circle at center, #000 2px, transparent 2.5px);
}

/* ----- Catégories = séparateurs non cliquables (façon maquette) -------------
   Les groupes de 1er niveau deviennent de simples titres de section gris : pas
   d'icône, pas de chevron, pas de surface de survol. Le niveau 1 = enfant direct
   du <ul data-is-root>. Ils sont maintenus dépliés par NavigationMenuController
   (dépliage CSS impossible : DevExpress ne rend pas dans le DOM les enfants d'une
   catégorie repliée -> rien à révéler côté CSS). */
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content {
    background: transparent !important;
    /* Maquette : l'écart avant un titre de section = 8px, soit l'espacement standard
       entre items (--dxbl-treeview-item-spacing). On n'ajoute donc PAS de marge/padding
       supplémentaire (un margin-top:12px + padding-top:4px éloignait trop, ex. Accueil
       très loin d'« Exploitation »). */
    margin-top: 0;
    padding-top: 0;
}
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content .xaf-nav-link span {
    color: var(--sidebar-nav-section-text) !important;
    font-size: var(--sidebar-font-size-xs);  /* 10px, façon maquette */
    font-weight: 400;
}
/* Pas d'icône (dossier) ni de chevron sur les séparateurs. */
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content > .dxbl-treeview-item-container > .xaf-nav-menu-item-icon,
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content > .dxbl-btn {
    display: none !important;
}
/* Séparateurs : pas de surbrillance au survol (ce sont des titres). Scopé à
   `.has-children` pour ne PAS toucher Accueil (niveau 1 sans enfants). */
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content > .dxbl-treeview-item-container,
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content > .dxbl-treeview-item-container:hover {
    background: transparent !important;
    /* Titres de section (validé designer) : AUCUNE interaction, NON repliables. Le
       clic sur la ligne repliait le groupe (le chevron est masqué mais le <a> conteneur
       agissait encore comme bascule) -> pointer-events:none rend le titre totalement
       inerte : plus aucun clic ne passe, donc plus de repli, et curseur normal au survol. */
    pointer-events: none !important;
    cursor: default !important;
    /* Un titre de catégorie est un simple LABEL : il ne doit PAS hériter du gabarit des items
       cliquables (min-height 35px + 8px de padding vertical, pensés pour les pages/sous-pages).
       Sans ce reset, le bloc « Exploitation » faisait ~43px de haut pour un texte de ~15px.
       On le laisse hugger son texte ; l'écart de 8px avant l'item suivant vient de
       --dxbl-treeview-item-spacing (padding-bottom du item-content), conservé. */
    min-height: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

/* Pas de soulignement sur les items de nav. GOTCHA CSS : les items navigables
   sont des <a> (.dxbl-treeview-item-container) ; un `text-decoration:underline`
   porté par le <a> est peint à travers ses descendants et ne peut PAS être
   annulé sur l'enfant -> il FAUT neutraliser sur le <a> lui-même (et au survol). */
.sidebar .dxbl-treeview-item-container,
.sidebar .dxbl-treeview-item-container:hover,
.sidebar .dxbl-treeview-item-container:focus,
.sidebar .xaf-nav-link,
.sidebar .xaf-nav-link span,
.sidebar .xaf-nav-link:hover,
.sidebar .xaf-nav-link:hover span {
    text-decoration: none !important;
}

/* Chevron d'expansion à DROITE de l'item (façon maquette) au lieu de la gauche.
   Le bouton est le .dxbl-btn enfant direct du contenu d'item.

   GARDE : le reset bouton global d'app-theme.css (section 4) applique
   `box-shadow`, `border-radius` et `padding` en `!important` à TOUT `.dxbl-btn`.
   Sur le chevron d'expansion, combiné au fond/bordure par défaut du bouton,
   cela dessine une boîte blanche à ombre sur le teal de la sidebar. La variable
   `--dxbl-treeview-btn-bg: transparent` ne peut pas battre ces propriétés posées
   en dur -> on ré-impose un bouton nu (transparent, sans bordure ni ombre). */
.sidebar .dxbl-treeview-item-content > .dxbl-btn,
.sidebar .dxbl-treeview-item-content > .dxbl-btn:hover,
.sidebar .dxbl-treeview-item-content > .dxbl-btn:focus,
.sidebar .dxbl-treeview-item-content > .dxbl-btn:focus-visible,
.sidebar .dxbl-treeview-item-content > .dxbl-btn:active,
.sidebar .dxbl-treeview-item-content > .dxbl-btn.dx-state-active {
    order: 10;
    margin-left: auto;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    outline: none !important;
}

/* Icône chevron à 12×12 (maquette) : le reset bouton global d'app-theme.css
   force `.dxbl-btn .dxbl-image` à 16px en `!important` -> on redimensionne ici.
   Le chevron RESTE visible ; il pointe vers le bas quand le groupe est replié,
   vers le haut quand il est déplié. */
.sidebar .dxbl-treeview-item-content > .dxbl-btn .dxbl-image {
    width: 12px !important;
    height: 12px !important;
    flex-shrink: 0;
    aspect-ratio: 1 / 1;
}

/* Couleur du chevron à l'état normal : BLANC, visible sur le fond teal de la
   sidebar (sans fond de bouton, un chevron quasi-blanc/gris clair par défaut
   se perdait -> le bouton semblait disparaître). L'icône est un SVG <use> :
   on force `color` ET `fill` (l'état sélectionné/lime le repasse en teal,
   géré plus bas). */
.sidebar .dxbl-treeview-item-content > .dxbl-btn .dxbl-image,
.sidebar .dxbl-treeview-item-content > .dxbl-btn .dxbl-image use {
    color: var(--sidebar-text-on-dark) !important;
    fill: var(--sidebar-text-on-dark) !important;
}
/* État REPOS uniquement (boîte transparente = teal) -> chevron BLANC. Le survol et la sélection,
   où la boîte 160px passe en lime clair sous le chevron, sont gérés plus bas (chevron -> teal). */

/* Libellés : RETOUR À LA LIGNE autorisé, PAS d'ellipsis « … » (choix utilisateur).
   Un libellé long (« Identifiant de connecteur », « Statut de synchronisation »…)
   passe sur deux lignes plutôt que d'être tronqué. On retire donc le `nowrap` +
   `text-overflow:ellipsis` + `overflow:hidden` qui forçaient la troncature.
   Le flex reste pour que le lien occupe la largeur ; `overflow-wrap:break-word`
   gère les très longs mots isolés. */
.sidebar .dxbl-treeview-item-text-container,
.sidebar .dxbl-text {
    min-width: 0;
}
.sidebar .xaf-nav-link {
    flex: 1 1 auto;
    min-width: 0;
}
.sidebar .xaf-nav-link span {
    display: block;
    white-space: normal;
    overflow-wrap: break-word;
    /* Figma : line-height 100% (1.0). On retient 1.2 : un 1.0 strict rogne les
       diacritiques FR (É, ç) et les libellés sur 2 lignes. Compromis fidèle + sûr. */
    line-height: 1.2;
    /* Plafond à 38px (maquette designer) = 2 lignes max ; au-delà on tronque (overflow hidden).
       Avec les 8px de padding vertical du conteneur -> item = 54px max sur 2 lignes. */
    max-height: 38px;
    overflow: hidden;
}

/* Hauteur d'item = HUG (maquette Figma « … × 54 Hug ») : le libellé peut passer sur 2 lignes.
   On combine : padding vertical 8px (validé designer) + texte plafonné à 38px (cf.
   .xaf-nav-link span, max-height) + min-height:35px.
     - libellé sur 1 ligne  -> 35px (min-height, uniforme)
     - libellé sur 2 lignes -> 8 + 38 + 8 = 54px
   (Ancien choix : hauteur FIXE 35px pour uniformité stricte, mais elle ROGNAIT les libellés
   sur 2 lignes -> abandonné. Le léger risque de variation sub-pixel entre libellés courts est
   accepté.) Le rail replié (section 5) reforce 32px en !important -> non impacté. */
.sidebar .dxbl-treeview-item-container {
    /* min-height (plancher uniforme) au lieu de height fixe : les libellés courts font 35px,
       les longs grandissent (jusqu'à 54px avec le cap texte). Contenu centré verticalement. */
    min-height: 35px;
    align-items: center;
    /* Largeur FIXE 160px (maquette « 160 × 35 ») : le conteneur (qui porte le fond de
       survol/sélection) fait 160px pour TOUS les items, quel que soit le niveau.
       ALIGNÉ À GAUCHE (maquette) : margin-left:0 + margin-right:auto -> la boîte est collée au bord
       gauche du volet et l'espace libre est rejeté à droite. (Un `margin:auto` la CENTRAIT, ce qui
       décalait nom de module et items vers la droite -> régression d'alignement.)
       ⚠️ GOTCHA SPÉCIFICITÉ : DevExpress pose `flex: 1 1 auto` via
       `.dxbl-treeview .dxbl-treeview-item>.dxbl-treeview-item-content>.dxbl-treeview-item-container`
       (spécificité 0,4,0) -> il battait notre `.sidebar .dxbl-treeview-item-container` (0,2,0) et le
       `flex-grow:1` restait actif, ÉTIRANT le conteneur à toute la ligne (~170px). `width:160px`
       seul ne suffit pas (il ne fixe que le flex-basis ; flex-grow l'élargit par-dessus). D'où le
       `!important` sur flex (flex-grow:0) : sans grossissement, le conteneur tient ses 160px exacts. */
    flex: 0 0 160px !important;
    width: 160px !important;
    /* Retrait gauche 20px = le padding de la sidebar (maquette : sidebar p-20 -> liseré teal autour
       du contenu). Sans lui, la boîte 160 touchait le bord (« collée à gauche » au survol). margin-right
       auto rejette l'espace restant à droite. Appliqué aussi aux labels de section (mêmes conteneurs)
       et au bouton Déconnexion -> tout reste aligné sur la même colonne. */
    margin-left: var(--sidebar-space-2xl);
    margin-right: auto;
    /* Padding interne de l'item (maquette Figma : gauche 10, droite 10) -> l'icône/texte est
       inseté de 10px du bord gauche de la boîte. box-sizing:border-box pour que le padding
       reste DANS les 160px. Le texte s'aligne ainsi avec celui du champ de recherche
       (margin-left 20px du champ + padding-left 10px de l'input = 30px ; ici 20 + 10 = 30). */
    box-sizing: border-box !important;
    /* Padding : 8px vertical (Figma -> avec le cap texte 38px, donne 35px sur 1 ligne / 54px sur 2),
       10px horizontal. Le niveau 4+ surcharge padding-left à 30px (règle aria-level plus spécifique). */
    padding-top: 8px !important;
    padding-bottom: 8px !important;
    padding-left: 10px !important;
    padding-right: 10px !important;
    /* Curseur « main » : signale au survol que la zone (toute la boîte, pas juste le
       texte) est cliquable. Les séparateurs de catégorie le repassent en défaut. */
    cursor: pointer;
}
/* !important + couverture du lien interne ET du chevron : un module (« Produit ») est un
   <a> SANS href (il déplie au lieu de naviguer) -> curseur `auto` par défaut, et le thème
   DevExpress pose sa propre règle plus spécifique. On force donc le curseur main sur toute
   la boîte cliquable. (Les titres de catégorie ont pointer-events:none -> non concernés.) */
.sidebar .dxbl-treeview-item-container,
.sidebar .dxbl-treeview-item-container .xaf-nav-link,
.sidebar .dxbl-treeview-item-container .xaf-navigation-link-click-area,
.sidebar .dxbl-treeview-item-content > .dxbl-btn {
    cursor: pointer !important;
}
/* Indentation PAR NIVEAU (maquette « Design System PIM », propriété « niveau ») : chaque
   palier de sous-item est décalé de +10px pour montrer sa dépendance au groupe parent.
     - aria-level 2 (design niveau 1, icône, ex. Produits)          -> 10px (base, plus haut)
     - aria-level 3 (design niveau 2, puce + chevron, ex. GenCode)  -> 20px
     - aria-level 4+ (design niveau 3, puce profonde, Palettisation) -> 30px
   Spécificités : [aria-level] = 0,3,0 ; les 3 :not = 0,5,0 -> tous > base (0,2,0). */
.sidebar .dxbl-treeview-item-container[aria-level="3"] {
    padding-left: 20px !important;
}
.sidebar .dxbl-treeview-item-container:not([aria-level="1"]):not([aria-level="2"]):not([aria-level="3"]) {
    padding-left: 30px !important;
}
/* La ligne d'item occupe toute la largeur de la zone de nav et sert de repère de position
   (position: relative) pour caler le chevron en absolu. */
.sidebar .dxbl-treeview-item-content {
    width: 100%;
    position: relative;
}
/* Chevron des modules SORTI DU FLUX (absolu) : sinon, en flux, il décalait la boîte 160px et
   cassait l'alignement (pages sans chevron vs modules avec). La boîte est décalée de 20px à gauche
   (retrait teal) et fait 160 -> son bord droit est à 20+160 = 180px du gauche du volet. On pose le
   chevron EN RETRAIT de 10px (= padding-right de la boîte) : bord droit à 170px du gauche, soit
   `right: 100% - 170px` depuis le bord droit du volet. (À garder synchro avec margin-left + largeur.) */
.sidebar .dxbl-treeview-item-content > .dxbl-btn {
    position: absolute;
    right: calc(100% - 170px);
    top: 0;
    /* Hauteur calée sur la boîte d'item (35px), PAS `bottom:0` : .dxbl-treeview-item-content porte en
       plus 8px de padding-bottom (= l'écart inter-items, cf. --dxbl-treeview-item-spacing) -> un
       `bottom:0` étirerait le chevron sur 43px et le décalerait ~4px sous le centre du libellé.
       35px le recentre exactement sur la boîte 160×35. */
    height: 35px;
    margin: 0 !important;
    /* z-index : le chevron (absolu) PRÉCÈDE le <a> dans le DOM ; sans empilement explicite, le <a>
       (position:relative, z auto) et son FOND lime de survol/sélection se peignent PAR-DESSUS et
       masquent le chevron. z-index:1 le ramène devant la boîte. */
    z-index: 1;
}
/* Le volet de nav (treeview + scroll viewer) limitait la largeur utile à ~150px via ses paddings
   horizontaux par défaut (DevExpress) -> les items de 160px étaient rognés. On annule ces paddings
   pour libérer la place. */
.sidebar .dxbl-treeview,
.sidebar .dxbl-scroll-viewer,
.sidebar .dxbl-scroll-viewer > .dxbl-scroll-viewer-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}
/* L'élément réellement mesuré (la zone du lien, icône + texte) forcé à 160px, box-sizing inclus
   pour que padding éventuel ne le repasse pas sous 160. */
/* .xaf-navigation-link-click-area = overlay de capture de clic VIDE, rendu par XAF en
   position:absolute inset:0 À L'INTÉRIEUR du <a>.dxbl-treeview-item-container. Il épouse donc
   automatiquement la boîte 160×35 du conteneur -> on NE force AUCUNE largeur ici. (Forcer width:160
   le faisait déborder ; width:100% suivait la largeur réelle du conteneur — qui était fausse à cause
   du flex-grow corrigé plus haut.) C'est cet overlay que les DevTools mesurent : il lit 160 une fois
   le conteneur revenu à 160. */

/* Espacement vertical = 8px PARTOUT (maquette). L'écart entre items est déjà donné par
   --dxbl-treeview-item-spacing (8px) ; ici on neutralise tout retrait vertical que DevExpress
   poserait sur la LISTE IMBRIQUÉE des sous-pages, afin que l'écart « nom du module → 1ʳᵉ sous-page »
   reste lui aussi 8px (et pas davantage). No-op si aucune marge n'est posée. */
.sidebar .dxbl-treeview-item ul:not([data-is-root]),
.sidebar .dxbl-treeview-item-nodes {
    margin-top: 0 !important;
    padding-top: 0 !important;
    margin-bottom: 0 !important;
    padding-bottom: 0 !important;
}
/* Exception : les titres de SECTION (catégories niveau 1 : « Exploitation », « Tiers »…) ne sont
   pas des items navigables -> ils gardent leur taille compacte (sélecteur plus spécifique). */
.sidebar ul[data-is-root] > .dxbl-treeview-item.has-children > .dxbl-treeview-item-content > .dxbl-treeview-item-container {
    height: auto;
    /* Le label de section s'aligne sur le BORD GAUCHE de la boîte (hover/sélection), PAS sur la colonne
       des icônes (maquette). On annule donc le padding-left:20px des items : le texte démarre au bord
       gauche de la boîte (= margin-left commun de 20px), 20px à gauche des icônes. */
    padding-left: 0 !important;
}

/* Fond de SÉLECTION (item actif) = la boîte 160px (comme le survol et la maquette), PAS la ligne
   pleine largeur. DevExpress peint le fond de sélection sur la LIGNE (.dxbl-treeview-item-content,
   width:100%) -> l'item actif paraissait « collé » sur toute la largeur. On rend la ligne
   transparente et on porte le lime sur le conteneur 160px actif (qui est déjà centré/insetté comme
   les autres items). */
.sidebar .dxbl-treeview-item-content {
    background-color: transparent !important;
}
.sidebar .dxbl-treeview-item-container.dxbl-active {
    background-color: var(--sidebar-nav-item-selected-surface) !important;
}

/* Ombre portée de l'item actif (Figma « standard shadow » : 0 4 10, #00000008). */
.sidebar .dxbl-treeview-item-container.dxbl-active {
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03);
}

/* Pas de liseré de focus au clic. La maquette ne définit que 4 états d'item
   (enable / hover / pressed / selected) : AUCUN état « focus ». Le TreeView Fluent
   dessine pourtant un liseré (outline + box-shadow) au clic et à la navigation clavier.
   On le neutralise, scopé à la sidebar. NB accessibilité : l'item sélectionné reste
   identifiable par sa pastille lime, donc le repère visuel n'est pas perdu. */
.sidebar .dxbl-treeview-item-container:focus,
.sidebar .dxbl-treeview-item-container:focus-visible,
.sidebar .xaf-nav-link:focus,
.sidebar .xaf-nav-link:focus-visible {
    outline: none !important;
    box-shadow: none !important;
}
/* On réaffirme l'ombre de l'item sélectionné : sans ça, un item à la fois actif ET
   focusé perdrait son ombre à cause du `box-shadow: none` ci-dessus. */
.sidebar .dxbl-treeview-item-container.dxbl-active:focus,
.sidebar .dxbl-treeview-item-container.dxbl-active:focus-visible {
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03) !important;
}

/* Cale d'indentation NATIVE DevExpress (une par niveau, rendue DANS la boîte avant
   l'icône/puce). Même avec --dxbl-treeview-item-content-indent:0 elle pouvait conserver
   une largeur résiduelle -> l'écart « bord de boîte → icône » dépassait les 10px de
   padding-left. On la supprime en déplié (elle n'était masquée qu'en rail replié).
   L'indentation VOULUE des sous-items profonds (niveau 4+) reste portée par padding-left. */
.sidebar .dxbl-treeview-item-indent {
    display: none !important;
}

/* Icône (img de niveau 2) : au hover/sélection, le fond devient lime clair ->
   une icône blanche serait invisible. La maquette la veut TEAL. L'icône est un
   <img> (élément remplacé) : on la recolore via `filter` (≈ #164147 teal). */
.sidebar .dxbl-treeview-item-container:hover > .xaf-nav-menu-item-icon,
.sidebar .dxbl-treeview-item-container.dxbl-active > .xaf-nav-menu-item-icon {
    filter: var(--sidebar-nav-icon-active-filter);
}

/* Chevron des modules quand la BOÎTE est CLAIRE (survol lime/10 OU sélection lime/40) : le passer en
   TEAL pour qu'il reste visible.
   ⚠️ INVERSION vs l'ancien layout : avant, le <a> ne faisait pas 160px et le chevron, poussé à droite,
   restait sur le fond TEAL de la sidebar -> on le gardait BLANC. Désormais la boîte fait 160px et le
   chevron est calé sur SON bord droit (z-index:1, donc DESSUS la boîte) -> au survol/sélection il est
   sur du LIME clair et doit virer TEAL. Au repos (boîte transparente = teal) il reste BLANC (règle par
   défaut plus haut). Le chevron est un <use> SVG -> on force color ET fill. */
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container:hover),
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container.dxbl-active) {
    --dxbl-treeview-btn-color: var(--sidebar-nav-item-selected-text);
}
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container:hover) > .dxbl-btn .dxbl-image,
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container:hover) > .dxbl-btn .dxbl-image use,
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container.dxbl-active) > .dxbl-btn .dxbl-image,
.sidebar .dxbl-treeview-item-content:has(> .dxbl-treeview-item-container.dxbl-active) > .dxbl-btn .dxbl-image use {
    color: var(--sidebar-nav-item-selected-text) !important;
    fill: var(--sidebar-nav-item-selected-text) !important;
}

/* ============================================================
   DESTINATION vs GROUPE (items dépliables)
   Pattern sidebar moderne : un item qui OUVRE une page ≠ un groupe
   qui ne fait que déplier. Discriminant fiable = le <a> d'une
   destination porte un vrai href (ViewId) ; un groupe pur n'en a pas.
   Scopé aux seuls items dépliables (li.has-children) pour ne toucher
   ni les feuilles (sans chevron) ni les catégories de tête (niveau 1).
   Propriétés non destructrices uniquement (transform/spacing/decoration).
   ============================================================ */

/* GROUPE pur (déplie seulement) : libellé en EN-TÊTE DE SECTION
   (majuscules + interlettrage + gris atténué), comme « PARAMÈTRES ».
   -> lit comme un rangement, pas comme une destination. */
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container:not([href]) .xaf-nav-link span,
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container[href=""] .xaf-nav-link span,
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container[href="#"] .xaf-nav-link span {
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.9em;
    color: var(--sidebar-palette-charcoal-70) !important;
}

/* DESTINATION (ouvre une page) qui a AUSSI des enfants : effet « lien » au survol.
   Fond lime léger + libellé souligné + curseur main. (La BARRE D'ACCENT lime à gauche a été
   RETIRÉE à la demande : repère « cliquable » jugé indésirable.)
   N'altère pas l'état sélectionné (pastille lime), géré plus haut. */
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container[href]:not([href=""]):not([href="#"]) {
    cursor: pointer;
    transition: background-color .15s ease, text-decoration-color .15s ease;
}
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container[href]:not([href=""]):not([href="#"]):not(.dxbl-active):hover {
    /* Fond lime CLAIR (et non un voile transparent) : le texte au survol passe en teal
       foncé, il lui faut un fond clair pour rester lisible. */
    background-color: var(--sidebar-nav-item-hover-surface) !important; /* lime-10 #f1fbe4 */
}
.sidebar li.has-children > .dxbl-treeview-item-content > a.dxbl-treeview-item-container[href]:not([href=""]):not([href="#"]):not(.dxbl-active):hover .xaf-nav-link span {
    color: var(--sidebar-nav-item-hover-text) !important; /* teal-700, lisible sur lime clair */
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* Alignement d'Accueil. Accueil est le SEUL item de niveau 1 sans enfants (les autres
   items de niveau 1 sont des catégories-séparateurs : « Exploitation », « Tiers »…).
   XAF l'indente donc un cran de moins que les items à icône de niveau 2 (« Produits »,
   « Commandes »…), ce qui le faisait déborder à gauche. La maquette les veut alignés
   (même colonne d'icônes) : on rattrape un cran d'indentation sur le contenu d'Accueil.
   Cible : enfant direct de la racine, sans .has-children -> uniquement Accueil. */
.sidebar ul[data-is-root] > .dxbl-treeview-item:not(.has-children) > .dxbl-treeview-item-content {
    padding-left: 0; /* indentation par niveau = 0 -> Accueil n'a plus besoin de compensation (sinon décalé à droite). */
}

/* ----- Scrollbar NATIF masqué dans la sidebar --------------------------------
   Le scroll interne du menu s'affiche ici via le scrollbar NATIF du navigateur,
   et le poste affiche les scrollbars « classiques » Windows AVEC boutons-flèches
   ▲▼ (laids et hors maquette). On masque ce scrollbar natif partout dans la
   sidebar SANS supprimer le défilement (molette/tactile conservés). Le scrollbar
   custom DevExpress (élément DOM, fin, sans flèches) n'est pas un scrollbar natif
   et n'est donc pas affecté. */
.sidebar *::-webkit-scrollbar {
    width: 0 !important;
    height: 0 !important;
}
.sidebar *::-webkit-scrollbar-button {
    display: none !important;
    width: 0 !important;
    height: 0 !important;
}
.sidebar * {
    scrollbar-width: none !important;        /* Firefox */
    -ms-overflow-style: none !important;     /* anciens Edge/IE */
}


/* ============================================================
   5. RAIL REPLIÉ (bascule manuelle au clic — pas au survol)
   La bascule est NATIVE XAF : le hamburger (masqué avec le header) pose
   `.collapse-toggle` sur `.app` et XAF persiste l'état. sidebar.js relaie le
   clic de la flèche vers ce hamburger, et déplie le rail quand on clique
   dedans (clic sur un item = navigue ET déplie).
   Le défaut XAF masque la sidebar repliée (`.collapse-toggle .sidebar
   {display:none}`) -> on le bat ici pour en faire un rail d'icônes 70px.
   ============================================================ */
.collapse-toggle .sidebar {
    display: flex !important;
    width: 70px !important;
    min-width: 70px !important;
}

/* Icônes seules, libellés masqués. */
.collapse-toggle .sidebar .dxbl-treeview-item-text-container,
.collapse-toggle .sidebar .dxbl-treeview-item-text {
    display: none !important;
}
/* Chaque item = carré 32×32 centré (le fond de sélection/hover devient un
   carré lime, façon maquette). */
.collapse-toggle .sidebar .dxbl-treeview-item-content {
    /* !important sur taille + centrage : sans ça les défauts DevExpress l'emportent
       et l'icône reste callée à gauche (le carré recherche, lui, est déjà forcé). */
    width: 32px !important;
    min-width: 32px !important;
    max-width: 32px !important;
    height: 32px !important;
    padding: 0 !important;
    margin: 0 auto var(--sidebar-space-s) !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    border-radius: var(--sidebar-radius-s);
}
/* Le contenu (div) contient un <a.dxbl-treeview-item-container> qui PORTE le fond de
   sélection (lime) ET l'icône. On le force en CARRÉ 32px centré : sinon le fond lime
   s'étire en rectangle (plus large que 32px) et l'icône reste callée à gauche. */
.collapse-toggle .sidebar .dxbl-treeview-item-container {
    width: 32px !important;
    min-width: 32px !important;
    max-width: 32px !important;
    height: 32px !important;
    /* min-height reset : en déplié le conteneur a min-height:35px (hug 2 lignes) ; sans ce reset
       il forcerait le carré du rail à 35px au lieu de 32 (min-height > height l'emporte). */
    min-height: 32px !important;
    margin: 0 auto !important;
    /* Padding REMIS À 0 : en déplié le conteneur a padding-left:20/right:10 (!important) ; sans ce
       reset il subsiste en replié et pousse l'icône hors du centre du carré 32px. */
    padding: 0 !important;
    align-items: center !important;
    justify-content: center !important;
    border-radius: var(--sidebar-radius-s) !important;
}
.collapse-toggle .sidebar .dxbl-treeview-item-indent { display: none !important; }
.collapse-toggle .sidebar .dxbl-treeview-item-content > .dxbl-btn { display: none !important; }
.collapse-toggle .sidebar .about-info { display: none !important; }
/* En rail : ANNULE l'indentation par niveau des sous-items (20px niveau 3, 30px niveau 4+).
   En déplié elle marque la dépendance au parent ; en replié elle décalerait la puce hors du
   centre du carré 32px. On couvre TOUS les sous-items (aria-level 3+) via :not(1):not(2).
   Spécificité 0,5,0 -> >= aux règles d'indentation dépliées, et postérieure en source -> gagne. */
.collapse-toggle .sidebar .dxbl-treeview-item-container:not([aria-level="1"]):not([aria-level="2"]) {
    padding-left: 0 !important;
}

/* Menu bas en rail : libellés masqués, chaque ligne = carré 32×32 centré (icône seule),
   aligné avec les items de nav et le carré recherche. */
/* padding: reset du retrait gauche 20px (état déplié) -> sinon le menu bas est
   décalé à droite et la Déconnexion n'est plus alignée avec les icônes de nav. */
.collapse-toggle .sidebar .sidebar__menu {
    align-items: center;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
.collapse-toggle .sidebar .sidebar__menu-label { display: none !important; }
.collapse-toggle .sidebar .sidebar__menu-item {
    width: 32px !important;
    min-width: 32px;
    padding: 0 !important;
    gap: 0;
    justify-content: center;
}

/* CENTRAGE des icônes/puces en rail. Le texte étant masqué, le gap icône↔texte
   (--dxbl-treeview-image-spacing, 5px) et la marge droite de la puce (8px) restaient
   et décalaient l'icône/puce vers la GAUCHE du carré 32px. On les met à 0 pour un
   centrage parfait, aligné avec le carré recherche. */
.collapse-toggle .sidebar .dxbl-treeview {
    --dxbl-treeview-image-spacing: 0;
}
.collapse-toggle .sidebar .xaf-nav-menu-item-icon {
    margin-right: 0 !important;
}
.collapse-toggle .sidebar .dxbl-treeview-item-container::before {
    margin-right: 0 !important;
}

/* Filtre en rail = carré recherche 32px façon maquette : on garde le FOND teal + la
   BORDURE du champ (la maquette montre un carré bordé, pas une loupe nue), on masque
   l'input et on centre la loupe dans le carré. !important : on force taille + centrage
   contre les valeurs par défaut de DevExpress (sinon la loupe restait en haut à gauche
   dans une boîte trop large). */
.collapse-toggle .sidebar .dxbl-navigation-filter {
    width: 32px;
    margin: 0 auto var(--sidebar-space-s);
}
.collapse-toggle .sidebar .dxbl-navigation-filter .dxbl-text-edit-input {
    display: none !important;
}
.collapse-toggle .sidebar .dxbl-navigation-filter .dxbl-text-edit {
    width: 32px !important;
    min-width: 32px !important;
    max-width: 32px !important;
    height: 32px !important;
    min-height: 32px !important;
    padding: 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
}
/* Bouton loupe : remplit le carré et centre l'icône (pas de largeur/padding propres). */
.collapse-toggle .sidebar .dxbl-navigation-filter .dxbl-btn,
.collapse-toggle .sidebar .dxbl-navigation-filter .dxbl-btn-icon,
.collapse-toggle .sidebar .dxbl-navigation-filter .dxbl-text-edit-btn {
    width: 100% !important;
    height: 100% !important;
    min-width: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
}

/* En-tête en rail (maquette Figma) : le lockup complet ET le cube logo sont masqués ;
   à leur place on affiche la FLÈCHE DE RÉOUVERTURE (>) centrée en haut du rail. */
.collapse-toggle .sidebar .sidebar__logo--full,
.collapse-toggle .sidebar .sidebar__logo--mark { display: none !important; }
.collapse-toggle .sidebar .sidebar__brand {
    justify-content: center;
    padding-left: 0;
    padding-right: 0;
}
/* Flèche affichée en rail, centrée, pointant à DROITE (>) = « rouvrir la sidebar ».
   Le clic est relayé vers la bascule native XAF par sidebar.js (même handler qu'en déplié).
   margin-left:0 annule le margin-left:auto de l'état déplié -> centrage réel dans le rail.
   La taille (20×20) est portée par .sidebar__chevron, identique dans les deux états. */
.collapse-toggle .sidebar .sidebar__collapse-btn {
    display: inline-flex !important;
    margin-left: 0 !important;
}
.collapse-toggle .sidebar .sidebar__chevron {
    transform: scaleX(-1); /* le chevron « < » (repli) devient « > » (réouverture) */
}


/* ============================================================
   6. INFOBULLE (tooltip stylé des items de nav, déplié + replié)
   Rendu par sidebar.js dans un élément flottant ancré au <body> (HORS de
   .sidebar) : c'est volontaire, sinon le scroll du TreeView le rognerait.
   Il ne peut donc PAS être scopé sous .sidebar. Position calculée en JS
   (fixed, à droite de la sidebar) ; apparence = maquette Figma (node 1027-2148) :
   carré clair, texte teal, ombre « standard ». Remplace l'infobulle native
   (sombre) de XAF, retirée au survol par sidebar.js.
   ============================================================ */
.sidebar-tooltip {
    position: fixed;
    transform: translateY(-50%);          /* centré sur le milieu de l'item */
    z-index: 1100;
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.1s ease;

    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: var(--sidebar-space-s);          /* 8px */
    border-radius: var(--sidebar-radius-s);   /* 4px */
    border: 1px solid var(--sidebar-tooltip-border);
    background: var(--sidebar-tooltip-surface);
    box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.03); /* « standard shadow » Figma */

    color: var(--sidebar-tooltip-text);
    font-family: var(--sidebar-font-family);
    font-size: var(--sidebar-font-size-m);    /* 14px (md/regular) */
    font-weight: var(--sidebar-font-weight-regular);
    white-space: nowrap;
}
.sidebar-tooltip--visible {
    opacity: 1;
    visibility: visible;
}
