@import '_content/Blazor.Bootstrap/Blazor.Bootstrap.7t9tbfaemk.bundle.scp.css';
@import '_content/KDCockpit.Dashboards.Widgets/KDCockpit.Dashboards.Widgets.mpr0wmw5hl.bundle.scp.css';
@import '_content/KDCockpit.Viewers.ForgeAps/KDCockpit.Viewers.ForgeAps.lipefrs4bf.bundle.scp.css';
@import '_content/KDCockpit.WebComponents/KDCockpit.WebComponents.e0newv0ibb.bundle.scp.css';

/* /Features/Account/Pages/Login.razor.rz.scp.css */
/* Repli du formulaire de mot de passe, quand l'installation passe par un fournisseur d'identité.
   Proposé sans être mis en avant : le bouton SSO reste le chemin évident, mais la porte locale doit rester
   trouvable — c'est la seule entrée le jour où le SSO ne répond plus. */

.local-login-fold > summary[b-n6i6ydf4wt] {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    cursor: pointer;
    font-size: .875rem;
    color: var(--bs-secondary-color, #6c757d);
    /* Le triangle natif jure avec le reste de la page : on le remplace par un chevron. */
    list-style: none;
}

.local-login-fold > summary[b-n6i6ydf4wt]::-webkit-details-marker {
    display: none;
}

.local-login-fold > summary[b-n6i6ydf4wt]::before {
    content: "\203A";
    display: inline-block;
    transition: transform .15s ease;
}

.local-login-fold[open] > summary[b-n6i6ydf4wt]::before {
    transform: rotate(90deg);
}

.local-login-fold > summary:hover[b-n6i6ydf4wt] {
    color: var(--bs-primary, #0d6efd);
    text-decoration: underline;
}

.local-login-fold[open] > summary[b-n6i6ydf4wt] {
    margin-bottom: 1rem;
}
/* /Features/Alarms/Console/Components/AlarmCategoryPanel.razor.rz.scp.css */
/* Cartes de statut cliquables (filtre par statut : Active / Acquittée / Clôturée).
   Les effets visuels ciblent la .card interne (rendue par CardExtended) via ::deep,
   pour épouser exactement son border-radius. */
.status-card[b-a32aswvlqf] {
    cursor: pointer;
}

    .status-card[b-a32aswvlqf]  .card {
        transition: border-color .15s ease, box-shadow .15s ease;
    }

    /* Survol d'une carte inactive : légère élévation pour signaler qu'elle est cliquable. */
    .status-card:not(.active):hover[b-a32aswvlqf]  .card {
        box-shadow: 0 2px 12px rgba(0, 0, 0, .10);
    }

    /* Carte active (filtre courant) : fine bordure primary (1px). */
    .status-card.active[b-a32aswvlqf]  .card {
        border-color: var(--primary-color);
    }
/* /Features/Alarms/Console/Components/AlarmGroupCard.razor.rz.scp.css */
/* En-tête de groupe : titre à gauche ; pastilles de sévérité et bouton d'ouverture à droite.
   Même principe que la ligne d'alarme (AlarmRowCard.razor.css) : quand il ne reste plus 14rem au
   titre, le bloc de droite passe dessous, calé à droite, et se replie à son tour s'il reste trop
   large (groupe aux nombreuses sévérités). Tant que tout tient sur une ligne, rien ne bouge. */
.alarm-group-header[b-xohgdjn676] {
    flex-wrap: wrap;
    row-gap: .5rem;
}

.alarm-group-title[b-xohgdjn676] {
    flex: 1 1 14rem;
}

.alarm-group-actions[b-xohgdjn676] {
    flex-wrap: wrap;
    justify-content: flex-end;
    margin-left: auto;
}
/* /Features/Alarms/Console/Components/AlarmRowCard.razor.rz.scp.css */
/* Ligne d'alarme : identité (sévérité, titre, emplacement) à gauche ; durée, état et actions à droite.
   Quand les deux ne tiennent pas côte à côte (téléphone, colonne étroite), le bloc de droite passe
   dessous, calé à droite, au lieu de sortir de l'écran. Tant qu'ils tiennent, rien ne bouge. */
.alarm-row[b-8dmo033w1g] {
    flex-wrap: wrap;
    row-gap: .25rem;
}

/* La base décide du passage à la ligne : le bloc de droite descend quand il ne reste plus 22rem à
   l'identité, la place d'un emplacement courant (« Bâtiment · Niveau · Pièce »).
   min-width: 0 laisse le bloc rétrécir sous la largeur de son texte. Sans lui, la ligne d'emplacement
   (text-truncate, donc sans retour à la ligne) impose sa largeur et ne se tronque jamais ; la classe
   min-w-0 qui devait le faire n'existe pas dans Bootstrap 5. */
.alarm-row-identity[b-8dmo033w1g] {
    flex: 1 1 22rem;
    min-width: 0;
}

.alarm-row-text[b-8dmo033w1g] {
    min-width: 0;
}

.alarm-row-meta[b-8dmo033w1g] {
    margin-left: auto;
}
/* /Features/Alarms/Details/AlarmDetails.razor.rz.scp.css */
/* =====================================================================
   Carte DIAGNOSTIC (colonne droite d'AlarmDetails)
   Liste d'outils d'analyse + accès au système métier. Chaque entrée est
   une ligne cliquable « icône encadrée + titre + sous-titre », regroupée
   sous un en-tête de section. Rendu propre à cet écran → CSS scopé.
   ===================================================================== */

.diag[b-4ra6wgabqe] {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

/* En-tête de section (Outils d'analyse / Système métier) */
.diag-section[b-4ra6wgabqe] {
    margin: 14px 0 4px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.07em;
    text-transform: uppercase;
    color: var(--gray-color);
}

    .diag-section:first-child[b-4ra6wgabqe] {
        margin-top: 0;
    }

/* Ligne cliquable (bouton d'action ou lien externe) */
.diag-item[b-4ra6wgabqe] {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    padding: 8px;
    border: 0;
    border-radius: 10px;
    background: transparent;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: background-color 0.15s ease;
}

    .diag-item:hover:not(:disabled)[b-4ra6wgabqe] {
        background-color: rgba(var(--gray-color-rgb), 0.1);
        text-decoration: none;
    }

    .diag-item:disabled[b-4ra6wgabqe] {
        opacity: 0.5;
        cursor: default;
    }

/* Icône dans un carré arrondi */
.diag-item-icon[b-4ra6wgabqe] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    border-radius: 10px;
    background: var(--page-bg-color);
    border: 1px solid var(--lightgray-color);
    font-size: 20px;
    color: var(--blue-color);
}

/* Bloc texte : titre + sous-titre empilés */
.diag-item-body[b-4ra6wgabqe] {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.diag-item-title[b-4ra6wgabqe] {
    font-weight: 600;
    line-height: 1.25;
    color: var(--blue-color);
}

.diag-item-sub[b-4ra6wgabqe] {
    font-size: 12px;
    line-height: 1.3;
    color: var(--gray-color);
}
/* /Features/Explorers/Bim/Components/ExplorerBimSavedViewsPanel.razor.rz.scp.css */
/* Hôte 3D du panneau « Vues » partagé : seul l'écart au bord du panneau du rail est propre au BIM (les autres
   panneaux forge-aps-* portent le leur). Tout le reste vit dans ExplorerSavedViewsPanel.razor.css. */

.bim-sv[b-kexj1am3t8] {
    padding: 10px 10px 14px;
}
/* /Features/Explorers/Bim/ExplorerBimIndex.razor.rz.scp.css */
/* Repli affiché sous l'overlay « chaud » de l'explorateur BIM (visible seulement quand l'overlay n'est
   pas ouvert, ex. aucun BOS courant). Le vrai chrome vit dans ExplorerBimViewerHost. */
.ex-bim-hint[b-1vznyzxm9i] {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    color: var(--bs-secondary-color, #6c757d);
    font-size: .95rem;
}
/* /Features/Explorers/Bim/ExplorerBimRailPanel.razor.rz.scp.css */
/* Explorateur BIM — panneau du rail. Le chrome (rail + panneau + viewport) est porté par le composant
   réutilisable RailNav ; cette feuille garde le wrapper de remplissage (.ex-bim-root) et les PRIMITIVES DE
   CONTENU du panneau (héritées de l'ancien ForgeApsControlPanel, noms de classes conservés car scopés). */

/* La palette des explorateurs (--ex-*) est déclarée une fois, dans tokens.css (« Palette des
   explorateurs ») — plus de copie locale à garder synchrone. */
/* Remplit le corps de l'hôte et donne sa taille au RailNav (height/width:100%). */
.ex-bim-root[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
    display: flex;
}

/* Corps d'onglet : le défilement et le padding sont fournis par .railnav-panel-body ; on garde juste
   l'espacement vertical entre blocs. */
.forge-aps-tab-content[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .25rem;
}

/* En-tête FIXE du panneau (chips d'ensembles + contrôles d'étage). Collé en haut du corps scrollable
   (.railnav-panel-body, overflow-y:auto) → reste visible pendant le scroll de la liste. Déborde le padding
   14px du corps (marges négatives) pour un fond pleine largeur qui couvre les lignes qui défilent dessous. */
.forge-aps-panel-head[b-gac6a82gsf] {
    position: sticky;
    /* -14px = même valeur que la marge négative supérieure ci-dessous. Sans ça (top:0), le collage épingle la
       MARGE (pas le fond) au bord du scrollport → le fond démarre 14px plus bas et laisse défiler les lignes
       dans cette bande. En collant à -14px, le fond est épinglé pile au bord et couvre les lignes qui passent. */
    top: -14px;
    z-index: 4;
    display: flex;
    flex-direction: column;
    gap: .35rem;
    margin: -14px -14px .25rem;
    padding: 14px 14px .5rem;
    background: var(--kd-surface);
    border-bottom: 1px solid var(--bs-border-color, #dee2e6);
}

.forge-aps-empty[b-gac6a82gsf] {
    padding: .5rem;
    color: var(--bs-secondary-color, #6c757d);
    font-size: .825rem;
    text-align: center;
}

/* Onglet Étages */
.forge-aps-floor-item[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    width: 100%;
    padding: .4rem .6rem;
    border: 1px solid transparent;
    border-radius: .375rem;
    background: transparent;
    color: var(--bs-body-color, #212529);
    font-size: .875rem;
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease, border-color .12s ease;
}

.forge-aps-floor-item:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-floor-item.is-active[b-gac6a82gsf] {
    background: var(--bs-primary-bg-subtle, #cfe2ff);
    border-color: var(--bs-primary-border-subtle, #9ec5fe);
    font-weight: 600;
}

/* Multi-étages : icône de case à cocher (carré vide → coché) + accent bleu quand coché. */
.forge-aps-floor-check .ph[b-gac6a82gsf] {
    font-size: 1rem;
    color: var(--bs-secondary-color, #6c757d);
}

.forge-aps-floor-item.is-active .ph[b-gac6a82gsf] {
    color: var(--ex-accent);
}

/* Bascule « Multi-étages » (mode Complet) : active la sélection en plage ; sinon clic = aller à l'étage. */
.forge-aps-multitoggle[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    margin-bottom: .5rem;
    padding: .35rem .6rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .375rem;
    background: transparent;
    color: var(--bs-body-color, #212529);
    font-size: .8125rem;
    text-align: left;
    cursor: pointer;
}

    .forge-aps-multitoggle:hover[b-gac6a82gsf] {
        background: var(--bs-tertiary-bg, #f1f3f5);
    }

    .forge-aps-multitoggle .ph[b-gac6a82gsf] {
        font-size: 1rem;
        color: var(--bs-secondary-color, #6c757d);
    }

    .forge-aps-multitoggle.is-active[b-gac6a82gsf] {
        background: var(--bs-primary-bg-subtle, #cfe2ff);
        border-color: var(--bs-primary-border-subtle, #9ec5fe);
        font-weight: 600;
    }

        .forge-aps-multitoggle.is-active .ph[b-gac6a82gsf] {
            color: var(--ex-accent);
        }

.forge-aps-hint[b-gac6a82gsf] {
    margin: 0 0 .4rem;
    font-size: .75rem;
    color: var(--bs-secondary-color, #6c757d);
}

/* Onglet Modèles */
.forge-aps-model-group + .forge-aps-model-group[b-gac6a82gsf] {
    margin-top: .5rem;
}

.forge-aps-model-group-title[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    font-size: .7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6c757d);
    padding: .25rem;
    border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
    margin-bottom: .15rem;
}

.forge-aps-model-group-count[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .65rem;
    font-weight: 700;
    color: var(--bs-secondary-color, #6c757d);
    background: var(--bs-tertiary-bg, #f1f3f5);
    border-radius: .75rem;
    padding: .05rem .4rem;
}

.forge-aps-model-item[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .35rem .5rem;
}

/* Séparateur discret entre chaque modèle (liste plate de l'onglet Modèles). */
.forge-aps-model-item + .forge-aps-model-item[b-gac6a82gsf] {
    border-top: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .08));
}

.forge-aps-model-item:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-model-info[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: .05rem;
}

.forge-aps-model-name[b-gac6a82gsf] {
    font-size: .8rem;
    color: var(--bs-body-color, #212529);
    overflow-wrap: anywhere;
    line-height: 1.25;
}

.forge-aps-model-item.is-hidden .forge-aps-model-name[b-gac6a82gsf] {
    color: var(--bs-secondary-color, #6c757d);
    text-decoration: line-through;
}

/* Chips de disciplines sous le nom du modèle (onglet Modèles). */
.forge-aps-model-chips[b-gac6a82gsf] {
    display: flex;
    flex-wrap: wrap;
    gap: .2rem;
    margin-top: .15rem;
}

.forge-aps-model-chip[b-gac6a82gsf] {
    font-size: .62rem;
    font-weight: 600;
    line-height: 1;
    padding: .15rem .4rem;
    border-radius: .75rem;
    color: var(--bs-secondary-color, #6c757d);
    background: var(--bs-tertiary-bg, #f1f3f5);
    border: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
    white-space: nowrap;
}

.forge-aps-model-item.is-hidden .forge-aps-model-chip[b-gac6a82gsf] {
    opacity: .55;
}

/* Filtre par discipline (badges cliquables, calqués sur le filtre de sévérité 2D) — onglet Modèles. */
.forge-aps-model-filters[b-gac6a82gsf] {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    margin-bottom: .5rem;
}

.forge-aps-model-filter[b-gac6a82gsf] {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .2rem .55rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 100px;
    background: var(--bs-body-bg, #fff);
    color: var(--bs-body-color, #212529);
    font-size: .7rem;
    font-weight: 600;
    cursor: pointer;
    transition: background-color .12s ease, border-color .12s ease;
}

.forge-aps-model-filter:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-model-filter.is-active[b-gac6a82gsf] {
    border-color: var(--bs-body-color, #212529);
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-model-filter-count[b-gac6a82gsf] {
    color: var(--bs-secondary-color, #6c757d);
    font-weight: 400;
    font-variant-numeric: tabular-nums;
}

.forge-aps-model-toggle[b-gac6a82gsf] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.85rem;
    height: 1.85rem;
    border: 0;
    border-radius: .375rem;
    background: transparent;
    color: var(--bs-secondary-color, #6c757d);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}

.forge-aps-model-toggle:hover:not(:disabled)[b-gac6a82gsf] {
    background: var(--bs-secondary-bg, #e9ecef);
    color: var(--bs-body-color, #212529);
}

.forge-aps-model-item:not(.is-hidden) .forge-aps-model-toggle[b-gac6a82gsf] {
    color: var(--bs-primary, #0d6efd);
}

.forge-aps-model-toggle:disabled[b-gac6a82gsf] {
    opacity: .5;
    cursor: default;
}

/* Onglet Vues — vue 3D chargée par maquette */
.forge-aps-views-toolbar[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .25rem;
}

.forge-aps-views-hint-inline[b-gac6a82gsf] {
    display: inline-flex;
    align-items: center;
    font-size: .8rem;
    color: var(--bs-secondary-color, #6c757d);
}

.forge-aps-views-disc[b-gac6a82gsf] {
    font-size: .72rem;
    color: var(--bs-secondary-color, #6c757d);
    padding: 0 .25rem .15rem;
}

/* En-tête de maquette repliable (clic = replier/déplier la liste de ses vues). */
.forge-aps-view-group-header[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    padding: .3rem .25rem;
    margin-bottom: .15rem;
    border: 0;
    border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
    background: transparent;
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease;
}

.forge-aps-view-group-header:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-view-caret[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .9rem;
    color: var(--bs-secondary-color, #6c757d);
    transition: transform .12s ease;
    transform: rotate(90deg);   /* déplié : chevron vers le bas */
}

.forge-aps-view-group-header.is-collapsed .forge-aps-view-caret[b-gac6a82gsf] {
    transform: none;            /* replié : chevron vers la droite */
}

.forge-aps-view-group-name[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: anywhere;
    font-size: .78rem;
    font-weight: 600;
    line-height: 1.2;
    color: var(--bs-body-color, #212529);
}

/* Vue cliquable : bouton plein largeur (clic = afficher cette vue via displayView). */
.forge-aps-view-item[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    padding: .3rem .5rem;
    border: 0;
    border-radius: .375rem;
    background: transparent;
    text-align: left;
    font-size: .8rem;
    color: var(--bs-secondary-color, #6c757d);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}

.forge-aps-view-item:hover:not(:disabled)[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
    color: var(--bs-body-color, #212529);
}

/* Vue désactivée et NON chargée (viewer pas prêt) → grisée ; la vue chargée reste pleinement lisible. */
.forge-aps-view-item:disabled:not(.is-loaded)[b-gac6a82gsf] {
    opacity: .5;
    cursor: default;
}

.forge-aps-view-item .ph[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: 1rem;
}

/* Vue réellement streamée : texte plein + pastille bleue (--ex-accent, cf. badges de mode). */
.forge-aps-view-item.is-loaded[b-gac6a82gsf] {
    color: var(--bs-body-color, #212529);
    cursor: default;
}

.forge-aps-view-item.is-loaded .ph[b-gac6a82gsf] {
    color: var(--ex-accent);
}

.forge-aps-view-name[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: anywhere;
    line-height: 1.2;
}

.forge-aps-view-badge[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .62rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--ex-accent);
    background: var(--bs-primary-bg-subtle, #cfe2ff);
    border-radius: .75rem;
    padding: .05rem .4rem;
}

/* Onglet Feuilles : champ de filtre (largeur seulement : le rendu du champ vient de .form-control). */
.forge-aps-sheets-filter[b-gac6a82gsf] {
    margin-bottom: .35rem;
}

.forge-aps-sheets-filter .form-control[b-gac6a82gsf] {
    width: 100%;
}

/* Maquette repliable imbriquée sous l’en-tête de discipline (léger retrait). */
.forge-aps-sheets-model[b-gac6a82gsf] {
    padding-left: .35rem;
}

.forge-aps-sheets-model + .forge-aps-sheets-model[b-gac6a82gsf] {
    margin-top: .15rem;
}

/* Feuille affichée à côté de la 3D : texte plein et icône d’accent, comme la vue chargée de l’onglet Vues. */
.forge-aps-view-item.is-open[b-gac6a82gsf] {
    background: var(--kd-rail-pill-bg-active);
    color: var(--kd-text-strong);
    font-weight: 600;
}

.forge-aps-view-item.is-open .ph[b-gac6a82gsf] {
    color: var(--kd-rail-fg-active);
}

/* Section « Étage affiché » en tête : un filet la sépare de la liste complète, qui la répète. */
.forge-aps-sheets-current[b-gac6a82gsf] {
    padding-bottom: .35rem;
    margin-bottom: .5rem;
    border-bottom: 1px solid var(--kd-border);
}

/* Multi-étages : en-tête d'un étage dans la section « Étages affichés » — un cran sous le titre de la section. */
.forge-aps-sheets-floor-head[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    margin: .35rem 0 .1rem;
    padding: 0 .25rem;
    font-size: var(--kd-fs-sm);
    font-weight: 700;
    color: var(--kd-rail-fg-active);
}

/* Discipline sous le nom, dans la section « Étage affiché » (les feuilles de plusieurs maquettes s'y mêlent). */
.forge-aps-sheet-discipline[b-gac6a82gsf] {
    display: block;
    font-size: var(--kd-fs-sm);
    font-weight: 400;
    color: var(--kd-text-muted);
}

/* Étage de la feuille, en pastille ; celle de l'étage affiché en 3D prend l'accent du rail. */
.forge-aps-sheet-floor[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .65rem;
    font-weight: 700;
    color: var(--kd-text);
    background: var(--kd-page-bg);
    border: 1px solid var(--kd-border);
    border-radius: var(--kd-radius-lg);
    padding: 0 .4rem;
    white-space: nowrap;
}

.forge-aps-sheet-floor.is-current[b-gac6a82gsf] {
    color: var(--kd-rail-fg-active);
    background: var(--kd-rail-pill-bg-active);
    border-color: transparent;
}

/* Type de vue (déduit du nom de la feuille) — pastille neutre en fin de ligne. */
.forge-aps-sheet-type[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .6rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: var(--kd-text-muted);
    background: var(--kd-page-bg);
    border-radius: var(--kd-radius-lg);
    padding: .05rem .4rem;
    white-space: nowrap;
}

/* Onglet Options (Disciplines / Alarmes) */
.forge-aps-options[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    padding: .25rem;
}

.forge-aps-switch[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .5rem;
    cursor: pointer;
    user-select: none;
}

.forge-aps-switch input[b-gac6a82gsf] {
    position: absolute;
    width: 0;
    height: 0;
    opacity: 0;
}

.forge-aps-switch-track[b-gac6a82gsf] {
    position: relative;
    flex: 0 0 auto;
    width: 2.1rem;
    height: 1.15rem;
    border-radius: 1rem;
    background: var(--bs-secondary-bg, #e9ecef);
    transition: background-color .15s ease;
}

.forge-aps-switch-track[b-gac6a82gsf]::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: calc(1.15rem - 4px);
    height: calc(1.15rem - 4px);
    border-radius: 50%;
    background: var(--kd-surface);
    box-shadow: 0 1px 2px rgba(0, 0, 0, .25);
    transition: transform .15s ease;
}

.forge-aps-switch input:checked + .forge-aps-switch-track[b-gac6a82gsf] {
    background: var(--bs-primary, #0d6efd);
}

.forge-aps-switch input:checked + .forge-aps-switch-track[b-gac6a82gsf]::after {
    transform: translateX(calc(2.1rem - 1.15rem));
}

.forge-aps-switch input:focus-visible + .forge-aps-switch-track[b-gac6a82gsf] {
    outline: 2px solid var(--bs-primary, #0d6efd);
    outline-offset: 2px;
}

.forge-aps-switch-text[b-gac6a82gsf] {
    font-size: .875rem;
    color: var(--bs-body-color, #212529);
}

.forge-aps-option-hint[b-gac6a82gsf] {
    padding-left: .1rem;
    font-size: .75rem;
    color: var(--bs-secondary-color, #6c757d);
}

.forge-aps-option-group[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .35rem;
    margin-top: .5rem;
    padding-top: .6rem;
    border-top: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
}

.forge-aps-option-title[b-gac6a82gsf] {
    font-size: .7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6c757d);
}

/* Onglet Alarmes */
.forge-aps-alarm-toolbar[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
}

.forge-aps-alarm-count[b-gac6a82gsf] {
    display: inline-flex;
    align-items: center;
    font-size: .8rem;
    color: var(--bs-secondary-color, #6c757d);
}

.forge-aps-alarm-refresh[b-gac6a82gsf] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.85rem;
    height: 1.85rem;
    border: 0;
    border-radius: .375rem;
    background: transparent;
    color: var(--bs-secondary-color, #6c757d);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}

.forge-aps-alarm-refresh:hover:not(:disabled)[b-gac6a82gsf] {
    background: var(--bs-secondary-bg, #e9ecef);
    color: var(--bs-body-color, #212529);
}

.forge-aps-alarm-refresh:disabled[b-gac6a82gsf] {
    opacity: .5;
    cursor: default;
}

.forge-aps-alarm-detail[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .15rem;
    margin-top: .25rem;
    padding-top: .5rem;
    border-top: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
}

.forge-aps-alarm-detail-head[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .15rem;
}

.forge-aps-alarm-detail-name[b-gac6a82gsf] {
    font-size: .85rem;
    font-weight: 600;
    color: var(--bs-body-color, #212529);
    word-break: break-word;
}

.forge-aps-alarm-close[b-gac6a82gsf] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    border: 0;
    border-radius: .375rem;
    background: transparent;
    color: var(--bs-secondary-color, #6c757d);
    cursor: pointer;
}

.forge-aps-alarm-close:hover[b-gac6a82gsf] {
    background: var(--bs-secondary-bg, #e9ecef);
    color: var(--bs-body-color, #212529);
}

.forge-aps-alarm-row[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .35rem .4rem;
    border-radius: .375rem;
    text-decoration: none;
    color: var(--bs-body-color, #212529);
    transition: background-color .12s ease;
}

.forge-aps-alarm-row:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-alarm-dot[b-gac6a82gsf] {
    flex: 0 0 auto;
    width: .7rem;
    height: .7rem;
    border-radius: 50%;
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .1) inset;
}

.forge-aps-alarm-title[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    font-size: .8rem;
    line-height: 1.2;
    overflow-wrap: anywhere;
}

.forge-aps-alarm-time[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .72rem;
    color: var(--bs-secondary-color, #6c757d);
    white-space: nowrap;
}

/* Onglet Objet — en-tête « Types d'équipement » (icône + libellé + étage courant à droite), calqué sur le 2D. */
.forge-aps-virt-header[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 6px;
    font-size: .7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--ex-text-2);
}

.forge-aps-virt-header > i[b-gac6a82gsf] {
    font-size: 15px;
    color: var(--bs-secondary-color, #9499a1);
}

.forge-aps-virt-floor[b-gac6a82gsf] {
    margin-left: auto;
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
    color: var(--bs-secondary-color, #aab0b8);
    font-variant-numeric: tabular-nums;
}

/* Onglet Objet — équipements virtualisés */
.forge-aps-virt[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .35rem;
    padding-bottom: .5rem;
    margin-bottom: .35rem;
    border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
}

/* Sélecteur du mode de mise en évidence (Coloration / Pastilles) : contrôle segmenté */
.forge-aps-virt-modes[b-gac6a82gsf] {
    display: flex;
    flex: 0 0 auto;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .375rem;
    overflow: hidden;
}

.forge-aps-virt-mode[b-gac6a82gsf] {
    flex: 1 1 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .35rem;
    padding: .35rem .5rem;
    border: 0;
    border-right: 1px solid var(--bs-border-color, #dee2e6);
    background: transparent;
    color: var(--bs-body-color, #212529);
    font-size: .8125rem;
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}

    .forge-aps-virt-mode:last-child[b-gac6a82gsf] {
        border-right: 0;
    }

    .forge-aps-virt-mode i[b-gac6a82gsf] {
        font-size: 1rem;
    }

    .forge-aps-virt-mode:hover:not(:disabled)[b-gac6a82gsf] {
        background: var(--bs-tertiary-bg, #f1f3f5);
    }

    .forge-aps-virt-mode.is-active[b-gac6a82gsf] {
        background: var(--ex-accent);
        color: var(--ex-on-accent);
        font-weight: 600;
    }

    .forge-aps-virt-mode:disabled[b-gac6a82gsf] {
        opacity: .5;
        cursor: not-allowed;
    }

.forge-aps-virt-types[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .1rem;
    margin-top: .25rem;
    padding-top: .4rem;
    border-top: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
}

.forge-aps-virt-type[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .15rem .25rem;
    border-radius: .375rem;
    cursor: pointer;
    font-size: .8rem;
}

.forge-aps-virt-type:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-virt-type input[b-gac6a82gsf] {
    accent-color: #14b8a6;
    cursor: pointer;
}

.forge-aps-virt-type-label[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: anywhere;
    color: var(--bs-body-color, #212529);
}

.forge-aps-virt-type-count[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .72rem;
    font-weight: 600;
    color: var(--bs-secondary-color, #6c757d);
}

/* Recherche par nom (onglets Objet / Espaces) → centrage + sélection au clic d'un résultat */
.forge-aps-search[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .4rem;
    padding-bottom: .5rem;
    margin-bottom: .35rem;
    border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, .1));
}

.forge-aps-search-row[b-gac6a82gsf] {
    display: flex;
    gap: .35rem;
}

.forge-aps-search-input[b-gac6a82gsf] {
    flex: 1 1 auto;
    min-width: 0;
    padding: .35rem .5rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .375rem;
    background: var(--bs-body-bg, #fff);
    color: var(--bs-body-color, #212529);
    font-size: .85rem;
}

.forge-aps-search-input:disabled[b-gac6a82gsf] {
    opacity: .5;
    cursor: default;
}

.forge-aps-search-btn[b-gac6a82gsf] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .375rem;
    background: var(--bs-tertiary-bg, #f1f3f5);
    color: var(--bs-body-color, #212529);
    cursor: pointer;
    transition: background-color .12s ease;
}

.forge-aps-search-btn:hover:not(:disabled)[b-gac6a82gsf] {
    background: var(--bs-secondary-bg, #e9ecef);
}

.forge-aps-search-btn:disabled[b-gac6a82gsf] {
    opacity: .5;
    cursor: default;
}

.forge-aps-search-results[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .1rem;
    max-height: 14rem;
    overflow-y: auto;
}

.forge-aps-search-item[b-gac6a82gsf] {
    display: flex;
    flex-direction: column;
    gap: .05rem;
    width: 100%;
    padding: .35rem .5rem;
    border: 1px solid transparent;
    border-radius: .375rem;
    background: transparent;
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease;
}

.forge-aps-search-item:hover[b-gac6a82gsf] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.forge-aps-search-item-name[b-gac6a82gsf] {
    font-size: .85rem;
    color: var(--bs-body-color, #212529);
    overflow-wrap: anywhere;
    line-height: 1.2;
}

.forge-aps-search-item-sub[b-gac6a82gsf] {
    font-size: .72rem;
    color: var(--bs-secondary-color, #6c757d);
}

/* Constat « pas de volume dans la maquette » : informatif, pas une erreur — d'où le ton neutre plutôt qu'un
   bandeau d'alerte. Il reste affiché tant que la cible ne change pas. */
.forge-aps-notice[b-gac6a82gsf] {
    display: flex;
    align-items: flex-start;
    gap: .4rem;
    margin-top: .5rem;
    padding: .45rem .55rem;
    border: 1px solid var(--kd-border);
    border-radius: var(--kd-radius);
    background: var(--kd-page-bg);
    font-size: .75rem;
    line-height: 1.35;
    color: var(--kd-text-muted);
}

    .forge-aps-notice i[b-gac6a82gsf] {
        flex: 0 0 auto;
        margin-top: .1rem;
        font-size: .9rem;
    }

/* Historique de recherche (état vide) : en-tête + bouton d'effacement. Les lignes, elles, réutilisent
   .forge-aps-search-item — une entrée d'historique se clique comme un résultat. */
.forge-aps-recent-header[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .35rem;
    margin-top: .35rem;
    font-size: .72rem;
    font-weight: 600;
    color: var(--kd-text-muted);
}

.forge-aps-recent-clear[b-gac6a82gsf] {
    flex: 0 0 auto;
    padding: 0;
    border: 0;
    background: none;
    line-height: 1;
    color: var(--kd-text-muted);
    cursor: pointer;
}

.forge-aps-recent-clear:hover[b-gac6a82gsf] {
    color: var(--kd-danger);
}

/* Résultat qui ne mène nulle part : l'équipement existe au référentiel mais n'a pas d'élément dans la
   maquette. Éteint plutôt que masqué — sinon la recherche répondrait « rien trouvé » d'un équipement qui
   existe bel et bien. Même traitement que le picto grisé de l'Explorateur Patrimoine. */
.forge-aps-search-item--off[b-gac6a82gsf] {
    cursor: default;
    opacity: .55;
}

.forge-aps-search-item--off:hover[b-gac6a82gsf] {
    background: transparent;
}

.forge-aps-search-item--off .forge-aps-search-item-sub[b-gac6a82gsf] {
    display: flex;
    align-items: center;
    gap: .25rem;
}

/* Mot d'avertissement d'un onglet restreint par une isolation (« seuls les équipements de … »). Même jaune
   que le bandeau de la vue : c'est le même mode anormal, dit à deux endroits. Le gris d'une aide ordinaire
   ne suffisait pas — le panneau semblait normal alors qu'il ne montrait qu'une part de l'étage. */
.forge-aps-isolation-note[b-gac6a82gsf] {
    display: flex;
    align-items: flex-start;
    gap: .4rem;
    margin-bottom: .5rem;
    padding: .4rem .5rem;
    border: 1px solid var(--kd-warning);
    border-radius: var(--kd-radius);
    background: var(--kd-warning-bg);
    color: var(--kd-warning-text);
    font-size: .75rem;
    line-height: 1.3;
}

.forge-aps-isolation-note .ph[b-gac6a82gsf] {
    flex: 0 0 auto;
    margin-top: .05rem;
    font-size: .9rem;
}
/* /Features/Explorers/Bim/ExplorerBimViewerHost.razor.rz.scp.css */
/* Hôte « chaud » du viewer 3D Forge (explorateur BIM), DOCKÉ dans la zone de contenu de l'app (pas un modal
   plein écran) : sous la barre supérieure et à droite du menu latéral (largeur responsive à l'épinglage).
   Fermé : conteneur gardé dimensionné mais invisible/inerte — surtout PAS display:none, qui détruirait
   le contexte WebGL et la géométrie GPU qu'on veut garder « au chaud ».

   ⚠️ L'hôte est monté dans Routes.razor, en frère du Router, donc hors du layout : son position:fixed
   se cale sur le viewport et non sur .page-container. Ses bords se posent donc ici à la main (menu à
   gauche, rail d'outils à droite, bandeau applicatif en bas), là où les autres écrans héritent
   simplement du padding de .content. */

.forge-host[b-u5yvp6fqtl] {
    position: fixed;
    /* Le shell est bord à bord et la page 3D est un écran à rail (.kd-bleed) : l'hôte part du HAUT
       DE LA FENÊTRE, comme le menu et le rail d'outils.
       Il valait --kd-content-top du temps où la zone de contenu s'ouvrait d'une gouttière : l'hôte
       aurait laissé 10 px de fond de page au-dessus de la maquette. Puis --kd-forge-top-offset, un
       décalage que l'appelant posait en ligne pour son bandeau de page — retiré le 25/09/2026 avec
       le chemin d'ouverture qui le posait, et qui valait donc toujours zéro. */
    top: 0;
    left: var(--sidebar-unpinned-widthcalc, 70px);  /* menu replié */
    /* ⚠️ PAS 0 : l'hôte est en z-index 700, le rail d'outils en 500. À right:0 il
       passait PAR-DESSUS le rail, qui devenait inatteignable dès qu'un modèle
       était ouvert. Il s'arrête donc au rail, comme .card-maximized.
       Exception : l'essai de panneaux en surimpression (RailNav.Panel2Overlay) le passe à 0 ET monte
       le rail au-dessus de lui — les deux ensemble, dans app.css (bloc du rail d'outils). */
    right: var(--kd-tools-offset);
    /* Le bandeau applicatif (cf. --app-dock-bar-height, app.css catégorie 25) est en position fixe
       au-dessus de cet hôte (z-index 1050 contre 700) : sans cette marge, il recouvre le bas du
       canvas 3D. */
    bottom: var(--app-dock-bar-height, 0px);
    display: flex;
    flex-direction: column;                          /* bandeau/sélecteur (haut) + corps (rail + canvas) */
    background: var(--bs-body-bg, #fff);
}

/* body.menu-pin = menu épinglé (classe par défaut sur <body>) → la zone de contenu démarre plus à droite. */
body.menu-pin .forge-host[b-u5yvp6fqtl] {
    left: var(--sidebar-pinned-width, 250px);
}

/* ⚠️ Régime mobile (≤ 575 px, le même seuil que app.css § 28) : le menu devient un TIROIR et
   .page-container repasse à `margin-left: 0`, mais --kd-shell-offset — que lisent les deux `left`
   ci-dessus via leurs ponts — garde sa valeur bureau. L'hôte partait donc à 72 px du bord et
   laissait voir la page derrière lui. Même remède que .card-maximized. Les deux sélecteurs sont
   repris pour battre `body.menu-pin .forge-host` à spécificité égale. */
@media (max-width: 575px) {
    .forge-host[b-u5yvp6fqtl],
    body.menu-pin .forge-host[b-u5yvp6fqtl] {
        left: 0;
        transition: transform var(--kd-shell-transition);
    }

    /* Le tiroir POUSSE le contenu (app.css § 28, `body.sidebar-open .page-container`). L'hôte, monté
       hors de .page-container, ne suivait pas : en z-index 700, il restait en place par-dessus le
       tiroir ouvert. Il reçoit la même poussée ; `body.sidebar-open { overflow-x: hidden }` couvre
       déjà ce qui sort à droite. */
    body.sidebar-open .forge-host[b-u5yvp6fqtl] {
        transform: translate3d(var(--kd-sidebar-w-expanded), 0, 0);
    }
}

.forge-host.open[b-u5yvp6fqtl] {
    z-index: 700;          /* au-dessus du contenu de page, sous le header/menu/toasts/popups */
    visibility: visible;
    opacity: 1;
}

.forge-host.closed[b-u5yvp6fqtl] {
    z-index: -1;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
}

/* La CROIX DE FERMETURE (.forge-host-close) a disparu le 25/09/2026, avec le chemin d'ouverture
   qu'elle servait : le viewer posé en surimpression au-dessus d'une autre page, qu'aucun écran ne
   demandait. Sur /explorer-bim, le viewer EST la page — le fermer ne révélerait rien.
   Elle avait pourtant l'air vivante, au point d'être alignée sur la ligne de tête quelques heures
   plus tôt : un bouton stylé, un libellé traduit, un champ `_showClose`… et pas un appelant. */

/* La barre « sélecteur de portée » (.forge-host-testbar) et son combo (.forge-host-combo, déjà mort) ont
   disparu : le sélecteur est rendu dans les outils de la barre supérieure (cf. .razor). L'overlay n'a donc
   plus qu'un bandeau optionnel — celui du mode diagnostic — au-dessus de son corps. */

/* Corps : le rail (ExplorerBimRailPanel → RailNav) occupe toute la place. */
.forge-host-body[b-u5yvp6fqtl] {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: row;
}

.forge-host-empty[b-u5yvp6fqtl] {
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    color: var(--bs-secondary-color, #6c757d);
}

/* Le viewer remplit le viewport du rail ; z-index:0 CONFINE son empilement interne (canvas, voiles en
   z-index 2 à 5, visionneuse 2D en 6) sous les outils flottants du rail (.railnav-viewport-tools,
   z-index 3), ses voisins dans le même viewport. ⚠️ À garder : sans lui, ces calques passeraient
   par-dessus les pastilles Campus / Bâtiment / Étage. */
.forge-host[b-u5yvp6fqtl]  .forge-aps-root {
    height: 100%;
    width: 100%;
    z-index: 0;
}
/* /Features/Explorers/Files/ExplorerFilesIndex.razor.rz.scp.css */
/* Explorateur de documents : ce qui n'est pas déjà dans les primitives partagées des explorateurs (app.css § 23)
   ni dans le DataTable. */

/* ---- Vue ---- */

/* Le tableau occupe la vue et défile en lui-même (DataTable). ⚠️ LE RETRAIT HAUT N'EST PAS DÉCORATIF, comme dans
   le Patrimoine : le fil d'Ariane flotte à 12 px du haut sur une rangée de 30 px ; sans lui, il recouvrirait
   l'en-tête du tableau. */
.exf-grid[b-d95yu8p2yg] {
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
    display: flex;
    flex-direction: column;
    padding: calc(12px + 30px + 12px) 14px 12px;
}

/* Un état expliqué (source, KD Convergence, connecteur, échec) : un encart en tête de la vue, pas au milieu d'un vide. */
.exf-state[b-d95yu8p2yg] {
    flex: 1 1 auto;
    padding: 12px;
}

/* La colonne Nom est élastique : elle prend la place que les autres laissent, et c'est elle qui cède quand il en
   manque — le nom se termine alors par des points de suspension, entier dans l'info-bulle. Sans ça, le nom le plus
   long imposait sa largeur (cellules en nowrap) et le tableau débordait : 4 px en 1440 × 900, arbre ouvert.
   max-width: 0 retire à la cellule la largeur de son contenu, width: 100 % lui donne l'espace libre, min-width la
   garde lisible. Posé sur l'en-tête et les cellules (DataTableColumn.CssClass), rendus par le DataTable : ::deep. */
.exf-grid[b-d95yu8p2yg]  .exf-col--name {
    width: 100%;
    max-width: 0;
    min-width: 180px;
}

/* Nom d'un élément dans le tableau : le glyphe de son format, puis le nom, coupé à la largeur de la colonne. */
.exf-grid[b-d95yu8p2yg]  .exf-name {
    display: flex;
    align-items: center;
    gap: 7px;
    min-width: 0;
}

    .exf-grid[b-d95yu8p2yg]  .exf-name i {
        flex: 0 0 auto;
        font-size: 16px;
        color: var(--kd-text-muted);
    }

.exf-grid[b-d95yu8p2yg]  .exf-name--folder i {
    color: var(--kd-primary);
}

.exf-grid[b-d95yu8p2yg]  .exf-name-label {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

.exf-grid[b-d95yu8p2yg]  .exf-name--folder .exf-name-label {
    font-weight: 600;
}

/* ---- Fil d'Ariane (RailNav.ViewportTools) ----
   Même gabarit que les pastilles flottantes du Patrimoine et des portées 2D / 3D : 30 px, bordure, fond de carte. */
.exf-crumbs[b-d95yu8p2yg] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    max-width: 100%;
    height: 30px;
    padding: 0 8px;
    border: 1px solid var(--kd-border);
    border-radius: var(--kd-radius-lg);
    background: var(--kd-surface);
    font-size: var(--kd-fs-12);
    line-height: 1;
    white-space: nowrap;
}

.exf-crumb[b-d95yu8p2yg] {
    min-width: 0;
    max-width: 220px;
    padding: 0 3px;
    border: none;
    background: transparent;
    font: inherit;
    color: var(--kd-primary-text);
    overflow: hidden;
    text-overflow: ellipsis;
    cursor: pointer;
}

    .exf-crumb:hover[b-d95yu8p2yg] {
        text-decoration: underline;
    }

.exf-crumb--current[b-d95yu8p2yg] {
    font-weight: 600;
    color: var(--kd-text);
    cursor: default;
}

    .exf-crumb--current:hover[b-d95yu8p2yg] {
        text-decoration: none;
    }

.exf-crumbs-sep[b-d95yu8p2yg],
.exf-crumbs-ic[b-d95yu8p2yg] {
    flex: 0 0 auto;
    font-size: 11px;
    color: var(--kd-text-muted);
}

.exf-crumbs-ic[b-d95yu8p2yg] {
    font-size: 13px;
}

.exf-crumbs-clear[b-d95yu8p2yg] {
    display: inline-flex;
    margin-left: 2px;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--kd-text-muted);
    cursor: pointer;
}

    .exf-crumbs-clear:hover[b-d95yu8p2yg] {
        color: var(--kd-text);
    }

/* ---- Recherche (panneau du rail) ----
   Le champ est un .form-control : il ne reçoit ici que sa largeur et son retrait, pour la loupe et la croix posées
   dessus (.claude/rules/styles-css.md, « Champs de saisie »). */
.exf-search[b-d95yu8p2yg] {
    position: relative;
}

    .exf-search .form-control[b-d95yu8p2yg] {
        width: 100%;
        padding-left: 30px;
        padding-right: 30px;
    }

.exf-search-ic[b-d95yu8p2yg] {
    position: absolute;
    top: 50%;
    left: 10px;
    transform: translateY(-50%);
    font-size: 14px;
    color: var(--kd-text-muted);
    pointer-events: none;
}

.exf-search-clear[b-d95yu8p2yg] {
    position: absolute;
    top: 50%;
    right: 6px;
    transform: translateY(-50%);
    display: inline-flex;
    padding: 2px;
    border: none;
    background: transparent;
    color: var(--kd-text-muted);
    cursor: pointer;
}

    .exf-search-clear:hover[b-d95yu8p2yg] {
        color: var(--kd-text);
    }

.exf-search-hint[b-d95yu8p2yg] {
    margin: 10px 2px 0;
    font-size: var(--kd-fs-12);
    color: var(--kd-text-muted);
}

/* ---- Détail ---- */

/* Propriétés du document, sous ses actions. */
.exf-props[b-d95yu8p2yg] {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 6px 12px;
    margin: 4px 2px 0;
    font-size: 12.5px;
}

    .exf-props dt[b-d95yu8p2yg] {
        font-weight: 400;
        color: var(--kd-text-muted);
    }

    .exf-props dd[b-d95yu8p2yg] {
        margin: 0;
        overflow-wrap: anywhere;
    }

/* L'iframe du lecteur PDF remplit la fenêtre d'aperçu. */
.pdf-viewer[b-d95yu8p2yg] {
    width: 100%;
    height: 100%;
    border: none;
}
/* /Features/Explorers/Lists/Components/ExplorerListMeasureFilterPanel.razor.rz.scp.css */
.exl-card[b-gliw3j9qb2] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 10px;
    margin-bottom: 14px;
}

.exl-card-text[b-gliw3j9qb2] {
    flex: 1;
    display: flex;
    flex-direction: column;
}

.exl-card-title[b-gliw3j9qb2] {
    font-weight: 600;
    font-size: 12.5px;
}

.exl-card-hint[b-gliw3j9qb2] {
    font-size: 11px;
    color: #9499a1;
}

.exl-switchbtn[b-gliw3j9qb2] {
    border: none;
    background: transparent;
    padding: 0;
    cursor: pointer;
}

.exl-switch[b-gliw3j9qb2] {
    position: relative;
    display: inline-block;
    width: 34px;
    height: 19px;
    border-radius: 100px;
    background: #cfd4d9;
}

    .exl-switch[b-gliw3j9qb2]::after {
        content: "";
        position: absolute;
        top: 2px;
        left: 2px;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        background: #fff;
        transition: left .12s;
    }

.exl-switch--on[b-gliw3j9qb2] {
    background: #2e9e5b;
}

    .exl-switch--on[b-gliw3j9qb2]::after {
        left: 17px;
    }

.exl-seg[b-gliw3j9qb2] {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 8px;
    overflow: hidden;
    margin-bottom: 12px;
}

    .exl-seg button[b-gliw3j9qb2] {
        border: none;
        background: #fff;
        padding: 6px 4px;
        font-size: 12px;
        color: #4c4c5c;
        cursor: pointer;
    }

        .exl-seg button + button[b-gliw3j9qb2] {
            border-left: 1px solid var(--bs-border-color, #e6e6e8);
        }

    .exl-seg .exl-seg--on[b-gliw3j9qb2] {
        background: var(--bs-primary, #1178d8);
        color: #fff;
    }

.exl-thr[b-gliw3j9qb2] {
    display: flex;
    justify-content: space-between;
    font-size: 12px;
    margin-top: 10px;
}

    .exl-thr b[b-gliw3j9qb2] {
        font-variant-numeric: tabular-nums;
    }

.exl-range[b-gliw3j9qb2] {
    width: 100%;
    accent-color: var(--bs-primary, #1178d8);
}

.exl-scale[b-gliw3j9qb2] {
    font-size: 11px;
    color: #9499a1;
    margin: 4px 0 12px;
}

.exl-seed[b-gliw3j9qb2] {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    font-size: 11.5px;
    color: #4c4c5c;
    margin: 0 0 12px;
}

    .exl-seed i[b-gliw3j9qb2] {
        color: #9499a1;
    }

.exl-linkbtn[b-gliw3j9qb2] {
    border: none;
    background: transparent;
    padding: 0;
    color: var(--bs-primary, #1178d8);
    font-size: 11.5px;
    cursor: pointer;
}

.exl-summary[b-gliw3j9qb2] {
    display: flex;
    gap: 8px;
    padding: 10px;
    background: #f6f8fa;
    border-radius: 8px;
    font-size: 12px;
    color: #4c4c5c;
}

    .exl-summary i[b-gliw3j9qb2] {
        color: #9499a1;
        font-size: 15px;
        flex: none;
        margin-top: 1px;
    }

@media (prefers-reduced-motion: reduce) {
    .exl-switch[b-gliw3j9qb2]::after { transition: none; }
}
/* /Features/Explorers/Lists/Components/ExplorerListMeasuresPanel.razor.rz.scp.css */
/* Une ligne = [icône | nom sur toute la largeur, puis plage + boutons]. Côte à côte, le nom n'avait que 116 px
   entre l'icône et les trois boutons (mesuré le 14/09/2026) : 16 capacités sur 68 restaient coupées même sur
   deux lignes. Les boutons descendent donc sur la ligne de plage ; l'icône se cale en haut, sur le nom. */
.exl-measure[b-75khhwyrph] {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 7px 6px;
    border-radius: 8px;
}

    .exl-measure:hover[b-75khhwyrph] {
        background: #f5f6f8;
    }

.exl-measure--open[b-75khhwyrph] {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
}

.exl-measure-ic[b-75khhwyrph] {
    width: 28px;
    height: 28px;
    border-radius: 9px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: #f1f3f5;
    color: #4c4c5c;
    font-size: 15px;
    flex: none;
}

.exl-measure-txt[b-75khhwyrph] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

/* Plage à gauche, qui s'élide ; boutons à droite, jamais comprimés. */
.exl-measure-foot[b-75khhwyrph] {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
}

.exl-measure-name[b-75khhwyrph] {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    white-space: normal;
    overflow-wrap: break-word;
    font-size: 12.5px;
    line-height: 1.3;
}

.exl-measure-range[b-75khhwyrph] {
    flex: 1;
    min-width: 0;
    font-size: 11px;
    color: #9499a1;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.exl-measure-acts[b-75khhwyrph] {
    display: flex;
    gap: 3px;
    flex: none;
}

.exl-sq[b-75khhwyrph] {
    width: 26px;
    height: 26px;
    border-radius: 8px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    background: #fff;
    color: #9499a1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    font-size: 14px;
}

    .exl-sq:hover[b-75khhwyrph] {
        color: #4c4c5c;
        background: #f4f5f7;
    }

.exl-sq--on[b-75khhwyrph] {
    background: var(--bs-primary, #1178d8);
    border-color: var(--bs-primary, #1178d8);
    color: #fff;
}

    .exl-sq--on:hover[b-75khhwyrph] {
        color: #fff;
        background: var(--bs-primary, #1178d8);
    }
/* /Features/Explorers/Lists/Components/ExplorerListPropertiesPanel.razor.rz.scp.css */
/* Une ligne = le nom sur toute la largeur (deux lignes au plus), puis [sélecteur de valeur][colonne]. */
.exl-prop[b-bsxaxabnjq] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 6px;
    border-radius: 6px;
}

.exl-prop--on[b-bsxaxabnjq] {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
}

/* Les noms de champs BOS n'ont souvent aucune espace (« #ADRESSAGE_GEOGRAPHIQUE ») : coupure n'importe où. */
.exl-prop-name[b-bsxaxabnjq] {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    overflow-wrap: anywhere;
    font-size: 12.5px;
    line-height: 1.3;
}

.exl-prop-foot[b-bsxaxabnjq] {
    display: flex;
    align-items: center;
    gap: 6px;
}

/* Sélecteur replié : même gabarit que l'ancien <select> (hauteur du bouton colonne), le choix courant élidé. */
.exl-prop-pick[b-bsxaxabnjq] {
    flex: 1;
    min-width: 0;
    height: 28px;
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 0 8px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 6px;
    background: #fff;
    font-size: 12px;
    color: #4c4c5c;
    text-align: left;
    cursor: pointer;
}

    .exl-prop-pick i[b-bsxaxabnjq] {
        font-size: 12px;
        color: #9499a1;
    }

.exl-prop-pick--open[b-bsxaxabnjq] {
    border-color: var(--bs-primary, #1178d8);
}

.exl-prop-pick-text[b-bsxaxabnjq] {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

.exl-prop--on .exl-prop-pick[b-bsxaxabnjq] {
    border-color: var(--bs-primary, #1178d8);
    color: var(--bs-primary, #1178d8);
    font-weight: 600;
}

/* Liste dépliée dans le flux, sous la ligne : champ de filtre, puis les choix. */
.exl-prop-menu[b-bsxaxabnjq] {
    margin-top: 2px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 8px;
    background: #fff;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .06);
    overflow: hidden;
}

.exl-prop-menu-search[b-bsxaxabnjq] {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 8px;
    border-bottom: 1px solid #eef0f2;
    color: #9499a1;
}

    .exl-prop-menu-search input[b-bsxaxabnjq] {
        flex: 1;
        min-width: 0;
        border: none;
        background: transparent;
        outline: none;
        font-size: 12.5px;
        color: #1a1a1a;
    }

.exl-prop-menu-spin[b-bsxaxabnjq] {
    width: 12px;
    height: 12px;
    border-width: 2px;
}

.exl-prop-menu-list[b-bsxaxabnjq] {
    max-height: 260px;
    overflow-y: auto;
    padding: 4px;
}

.exl-prop-opt[b-bsxaxabnjq] {
    display: flex;
    align-items: baseline;
    gap: 8px;
    width: 100%;
    padding: 5px 8px;
    border: none;
    border-radius: 6px;
    background: transparent;
    font-size: 12px;
    color: #1a1a1a;
    text-align: left;
    cursor: pointer;
}

    .exl-prop-opt:hover[b-bsxaxabnjq] {
        background: #f5f6f8;
    }

.exl-prop-opt--on[b-bsxaxabnjq] {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 10%, transparent);
    color: var(--bs-primary, #1178d8);
    font-weight: 600;
}

.exl-prop-opt-text[b-bsxaxabnjq] {
    flex: 1;
    min-width: 0;
    overflow-wrap: anywhere;
}

.exl-prop-opt-count[b-bsxaxabnjq] {
    flex: none;
    color: #9499a1;
    font-weight: 400;
    font-variant-numeric: tabular-nums;
}

.exl-prop-menu-sep[b-bsxaxabnjq] {
    height: 1px;
    margin: 4px 0;
    background: #eef0f2;
}

.exl-prop-menu-note[b-bsxaxabnjq] {
    padding: 6px 8px;
    font-size: 11px;
    line-height: 1.45;
    color: #9499a1;
}

/* Bouton carré « afficher en colonne », même gabarit que les actions du panneau Mesures (CSS isolé : dupliqué). */
.exl-sq[b-bsxaxabnjq] {
    width: 28px;
    height: 28px;
    border-radius: 8px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    background: #fff;
    color: #9499a1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 14px;
    cursor: pointer;
}

    .exl-sq:hover[b-bsxaxabnjq] {
        color: #4c4c5c;
        background: #f4f5f7;
    }

.exl-sq--on[b-bsxaxabnjq] {
    background: var(--bs-primary, #1178d8);
    border-color: var(--bs-primary, #1178d8);
    color: #fff;
}

    .exl-sq--on:hover[b-bsxaxabnjq] {
        color: #fff;
        background: var(--bs-primary, #1178d8);
    }

.exl-switchrow[b-bsxaxabnjq] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 0;
    font-size: 12.5px;
}

.exl-switchbtn[b-bsxaxabnjq] {
    border: none;
    background: transparent;
    padding: 0;
    cursor: pointer;
}

.exl-switch[b-bsxaxabnjq] {
    position: relative;
    display: inline-block;
    width: 34px;
    height: 19px;
    border-radius: 100px;
    background: #cfd4d9;
}

    .exl-switch[b-bsxaxabnjq]::after {
        content: "";
        position: absolute;
        top: 2px;
        left: 2px;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        background: #fff;
    }

.exl-switch--on[b-bsxaxabnjq] {
    background: #2e9e5b;
}

    .exl-switch--on[b-bsxaxabnjq]::after {
        left: 17px;
    }
/* /Features/Explorers/Lists/Components/ExplorerListScopePanel.razor.rz.scp.css */
.exl-row--floor[b-nyovn690r1] {
    padding-left: 32px;
}

.exl-building[b-nyovn690r1] {
    margin-top: 2px;
}

.exl-caret[b-nyovn690r1] {
    width: 14px;
    flex: 0 0 14px;
    font-size: 12px;
    color: #9499a1;
    cursor: pointer;
}

.exl-alarm[b-nyovn690r1] {
    background: #fdeef2;
    color: #a11f3f;
    font-size: 10.5px;
    font-weight: 700;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 9px;
    display: inline-grid;
    place-items: center;
}
/* /Features/Explorers/Lists/ExplorerListIndex.razor.rz.scp.css */
/* Explorateur Patrimoine. Le shell (.explorer-page/.explorer-root/.explorer-viewport) vient de la couche
   partagée [23. Explorers] d'app.css. Cette feuille garde : les outils flottants de la liste, la recherche
   dans la liste, les cellules, et les PRIMITIVES DE CONTENU des panneaux (.exl-*) via `.exl-root ::deep` — le
   CSS scopé d'un composant n'atteint pas le markup slotté DANS RailNav ; la page, ancêtre commun, si. Le
   sous-ensemble `.ex-plans-*` sert au panneau Recherche, mutualisé avec le 2D, qui consomme les primitives
   du shell 2D. */

/* ------------------------------------------------------------------ Viewport = la liste */
.exl-viewport[b-fru8frk52z] {
    flex-direction: column;
    min-width: 0;
    background: #f4f4f4;
}

/* Outils de la liste (RailNav.ViewportTools) : au coin haut-gauche de la vue, là où les explorateurs 2D et
   3D posent leur portée — « Lister », puis la pastille des critères actifs. Plus de bande au-dessus du
   rail ni de barre au-dessus du tableau (14/09/2026) : le rail monte au bord, comme sur les trois autres.
   Même gabarit que les pills de portée (30 px, --kd-border, rayon 8, 12 px) : les deux écrans se lisent
   pareil. */
.exl-tools[b-fru8frk52z] {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: nowrap;
}

/* « Lister » est le bloc des onglets de page (NavLinks, 05/10/2026), haut d'un contrôle (--kd-control-h) : ici, il
   garde la hauteur de la rangée d'outils (--kd-explorer-tools-h), sur laquelle est calé le retrait de la liste
   (.exl-grid). */
.exl-tools[b-fru8frk52z]  .kd-seg {
    height: var(--kd-explorer-tools-h);
}

.exl-tools-clear[b-fru8frk52z] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: var(--kd-explorer-tools-h);
    padding: 0 8px;
    border: 1px solid var(--kd-border);
    border-radius: 8px;
    background: var(--kd-surface);
    color: var(--kd-text);
    font-size: 12px;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    transition: background .12s ease;
}

    .exl-tools-clear:hover[b-fru8frk52z] {
        background: var(--kd-page-bg);
    }

    .exl-tools-clear i[b-fru8frk52z] {
        font-size: 13px;
        color: var(--kd-text-muted);
    }

.exl-tools-count[b-fru8frk52z] {
    color: var(--kd-text-muted);
}

.exl-tools-action[b-fru8frk52z] {
    font-weight: 600;
    color: var(--kd-primary);
}

/* ⚠️ LE RETRAIT HAUT N'EST PAS DÉCORATIF. Les outils flottent (12 px du haut, rangée de 30 px) : sans lui,
   ils recouvriraient l'en-tête du tableau — ce que la doc du shell annonçait pour le jour où la grille
   arriverait sous une carte flottante. La liste démarre donc sous leur rangée, du même écart. */
.exl-grid[b-fru8frk52z] {
    flex: 1 1 auto;
    min-height: 0;
    padding: calc(12px + var(--kd-explorer-tools-h) + 12px) 14px 12px;
    display: flex;
    flex-direction: column;
}

/* ------------------------------------------------------------------ Recherche dans la liste (onglet Recherche) */
/* Filtre les lignes par leur nom, et porte la restriction posée par un résultat choisi plus bas dans le
   panneau. Encadrée en couleur quand elle est active : la liste ne montre alors plus tout. */
.exl-listsearch[b-fru8frk52z] {
    display: flex;
    align-items: center;
    gap: 7px;
    height: 34px;
    margin: 0 0 14px;
    padding: 0 10px;
    border: 1px solid var(--kd-border);
    border-radius: 8px;
    background: var(--kd-surface);
    color: var(--kd-text-muted);
}

.exl-listsearch--on[b-fru8frk52z] {
    border-color: var(--kd-primary);
    box-shadow: 0 0 0 .15rem rgba(var(--kd-primary-rgb), .18);
}

    .exl-listsearch input[b-fru8frk52z] {
        flex: 1;
        min-width: 0;
        border: none;
        background: transparent;
        outline: none;
        font-size: 13px;
        color: var(--kd-text);
    }

.exl-listsearch-clear[b-fru8frk52z] {
    display: inline-flex;
    padding: 0;
    border: none;
    background: transparent;
    color: var(--kd-text-muted);
    cursor: pointer;
}

/* Comptes du texte cherché, une ligne par entité : [picto] Libellé ........ nombre. L'entité listée est marquée
   comme l'est son bouton dans « Lister » ; une entité à zéro reste visible (elle dit « rien ici ») mais éteinte. */
.exl-textcounts[b-fru8frk52z] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    margin: -6px 0 14px;
}

.exl-textcount[b-fru8frk52z] {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    padding: 6px 8px;
    border: none;
    border-radius: 8px;
    background: transparent;
    color: var(--kd-text);
    font-size: 12.5px;
    text-align: left;
    cursor: pointer;
}

    .exl-textcount:hover:not(:disabled)[b-fru8frk52z] {
        background: #f5f6f8;
    }

    .exl-textcount i[b-fru8frk52z] {
        font-size: 15px;
        color: var(--kd-text-muted);
    }

.exl-textcount--on[b-fru8frk52z] {
    background: color-mix(in srgb, var(--kd-primary) 10%, transparent);
    font-weight: 600;
    cursor: default;
}

    .exl-textcount--on:hover:not(:disabled)[b-fru8frk52z] {
        background: color-mix(in srgb, var(--kd-primary) 10%, transparent);
    }

    .exl-textcount--on i[b-fru8frk52z] {
        color: var(--kd-primary);
    }

.exl-textcount:disabled[b-fru8frk52z] {
    color: var(--kd-text-muted);
    cursor: default;
}

.exl-textcount-label[b-fru8frk52z] {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

.exl-textcount-n[b-fru8frk52z],
.exl-textcount-of[b-fru8frk52z] {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.exl-textcount-of[b-fru8frk52z] {
    font-weight: 400;
    color: var(--kd-text-muted);
}

/* ------------------------------------------------------------------ Cellules (fragments rendus par la page) */
.exl-name[b-fru8frk52z] {
    font-weight: 600;
}

/* Picto devant la mesure ou le porteur-espace (liste des capacités). */
.exl-name-ic[b-fru8frk52z] {
    font-size: 14px;
    color: #6b7280;
    margin-right: 6px;
    vertical-align: -2px;
}

.exl-typedot[b-fru8frk52z] {
    width: 9px;
    height: 9px;
    border-radius: 2px;
    display: inline-block;
    margin-right: 8px;
    vertical-align: -1px;
}

.exl-alarmchip[b-fru8frk52z] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 11.5px;
    padding: 2px 8px;
    border-radius: 100px;
    background: #f6f8fa;
    color: #4c4c5c;
}

.exl-sev[b-fru8frk52z] {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    display: inline-block;
}

.exl-muted[b-fru8frk52z] {
    color: #c2c7cd;
}

.exl-val[b-fru8frk52z] {
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.exl-val--oor[b-fru8frk52z] {
    color: #eb3d63;
}

.exl-stale[b-fru8frk52z] {
    color: #9499a1;
    font-size: 10.5px;
    margin-left: 5px;
}

/* En-têtes des colonnes ajoutées : le tableau applique CssClass à th ET td (dans son propre scope) ;
   ici on ne colore que via ::deep, la classe étant posée par le composant. */
.exl-root[b-fru8frk52z]  .exl-col--prop.dt-th {
    color: #1f9b8e;
}

.exl-root[b-fru8frk52z]  .exl-col--cap.dt-th {
    color: var(--bs-primary, #1178d8);
}

/* Actions de ligne (RowAction, app.css § 49) : seul reste le rouge Localisation GMAO, sur le picto 2D d'un équipement
   placé dont la position diverge de la GMAO. */
.exl-root[b-fru8frk52z]  .kd-row-act.exl-act--warning {
    color: var(--kd-danger);
}

/* ------------------------------------------------------------------ Primitives des panneaux (slottés dans RailNav) */
.exl-root[b-fru8frk52z]  .exl-header {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 10px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: #4c4c5c;
}

    .exl-root[b-fru8frk52z]  .exl-header i {
        font-size: 15px;
        color: #9499a1;
    }

.exl-root[b-fru8frk52z]  .exl-header--spaced {
    margin-top: 18px;
}

.exl-root[b-fru8frk52z]  .exl-header-count {
    margin-left: auto;
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
    color: #aab0b8;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 55%;
}

.exl-root[b-fru8frk52z]  .exl-hint {
    margin: -3px 0 11px;
    font-size: 11px;
    line-height: 1.55;
    color: rgba(76, 76, 92, .7);
}

.exl-root[b-fru8frk52z]  .exl-hint--foot {
    margin-top: 10px;
}

.exl-root[b-fru8frk52z]  .exl-row {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    border: none;
    background: transparent;
    text-align: left;
    padding: 7px 8px;
    border-radius: 6px;
    cursor: pointer;
    font-size: 12.5px;
    color: #1a1a1a;
}

    .exl-root[b-fru8frk52z]  .exl-row:hover:not(:disabled) {
        background: #f5f6f8;
    }

    .exl-root[b-fru8frk52z]  .exl-row:disabled {
        opacity: .6;
        cursor: default;
    }

.exl-root[b-fru8frk52z]  .exl-row--selected {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
}

.exl-root[b-fru8frk52z]  .exl-row-ic {
    flex: 0 0 auto;
    color: #9499a1;
    font-size: 15px;
}

.exl-root[b-fru8frk52z]  .exl-row-label {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.exl-root[b-fru8frk52z]  .exl-row-label--strong {
    font-weight: 600;
}

.exl-root[b-fru8frk52z]  .exl-row-meta {
    font-size: 11px;
    color: #aab0b8;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.exl-root[b-fru8frk52z]  .exl-check {
    flex: 0 0 15px;
    width: 15px;
    height: 15px;
    border-radius: 3px;
    border: 1.5px solid #c4c9cf;
    background: #fff;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 11px;
    line-height: 1;
    color: #fff;
}

.exl-root[b-fru8frk52z]  .exl-check--on {
    background: var(--bs-primary, #1178d8);
    border-color: var(--bs-primary, #1178d8);
}

.exl-root[b-fru8frk52z]  .exl-check--partial {
    border-color: var(--bs-primary, #1178d8);
    color: var(--bs-primary, #1178d8);
}

.exl-root[b-fru8frk52z]  .exl-search {
    display: flex;
    align-items: center;
    gap: 6px;
    border: 1px solid #e6e6e8;
    border-radius: 8px;
    padding: 6px 8px;
    background: #fafbfc;
    color: #9499a1;
    margin-bottom: 10px;
}

    .exl-root[b-fru8frk52z]  .exl-search input {
        flex: 1;
        min-width: 0;
        border: none;
        background: transparent;
        outline: none;
        font-size: 12.5px;
        color: #1a1a1a;
    }

.exl-root[b-fru8frk52z]  .exl-search--field {
    background: #fff;
}

.exl-root[b-fru8frk52z]  .exl-search-clear {
    border: none;
    background: transparent;
    color: #9499a1;
    padding: 0;
    cursor: pointer;
    display: inline-flex;
}

.exl-root[b-fru8frk52z]  .exl-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: 4px 0 12px;
}

.exl-root[b-fru8frk52z]  .exl-chip {
    border: 1px solid #e6e6e8;
    background: #fff;
    border-radius: 100px;
    padding: 3px 10px;
    font-size: 11.5px;
    color: #4c4c5c;
    cursor: pointer;
}

.exl-root[b-fru8frk52z]  .exl-chip--on {
    border-color: var(--bs-primary, #1178d8);
    color: var(--bs-primary, #1178d8);
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
}

/* ------------------------------------------------------------------ Sous-ensemble .ex-plans-* pour le panneau Recherche (2D) */
.exl-root[b-fru8frk52z]  .ex-plans-header {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 11px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: #4c4c5c;
}

.exl-root[b-fru8frk52z]  .ex-plans-header .ex-plans-header-count {
    margin-left: auto;
    font-size: 11px;
    font-weight: 400;
    color: #aab0b8;
    letter-spacing: 0;
    text-transform: none;
}

.exl-root[b-fru8frk52z]  .ex-plans-hint {
    margin: -3px 0 11px;
    font-size: 11px;
    line-height: 1.55;
    color: rgba(76, 76, 92, .7);
}

.exl-root[b-fru8frk52z]  .ex-plans-empty {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
}

.exl-root[b-fru8frk52z]  .ex-plans-row {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    border: none;
    background: transparent;
    text-align: left;
    padding: 8px;
    border-radius: 7px;
    cursor: pointer;
    font-size: 12.5px;
    color: #1a1a1a;
}

    .exl-root[b-fru8frk52z]  .ex-plans-row:hover {
        background: #f6f7f9;
    }

.exl-root[b-fru8frk52z]  .ex-plans-row--selected {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
}

.exl-root[b-fru8frk52z]  .ex-plans-search {
    display: flex;
    align-items: center;
    gap: 7px;
    background: #f6f7f9;
    border: 1px solid #e6e6e8;
    border-radius: 7px;
    padding: 6px 8px;
    margin-bottom: 10px;
}

    .exl-root[b-fru8frk52z]  .ex-plans-search i {
        font-size: 13px;
        color: #9499a1;
    }

    .exl-root[b-fru8frk52z]  .ex-plans-search input {
        flex: 1;
        min-width: 0;
        border: none;
        background: transparent;
        outline: none;
        font-size: 12px;
    }
/* /Features/Explorers/Plans/Components/ExplorerPlansCapabilitiesPanel.razor.rz.scp.css */
/* Styles propres au panneau Capacités. Les primitives partagées (row, switch, radio, check, header,
   detail-wrap/actions/btn) sont déclarées au niveau page dans ExplorerPlansIndex.razor.css. */

/* Libellé des switches : occupe la place restante à droite du switch. `font-weight: 500` comme les
   panneaux Objets et Alarmes — l'omettre affichait ces deux switches-ci plus légers que tous les autres
   de l'explorateur. (Règle recopiée une 3ᵉ fois : à promouvoir en primitive `.ex-plans-switchlabel` dans
   ExplorerPlansIndex.razor.css, où vit déjà `.ex-plans-switch`.) */
.ex-plans-caps-switchlabel[b-ao4trnkqet] {
    flex: 1;
    min-width: 0;
    font-weight: 500;
}

/* Une mesure : icône, puis le nom sur toute la largeur, et sous lui la plage et les boutons de représentation
   (14/09/2026, même disposition que l'onglet Capacités de l'Explorateur Patrimoine — côte à côte, le nom se
   coupait). L'icône se cale en haut, sur le nom. La ligne n'est pas cliquable —
   c'est le BOUTON qui porte l'action, parce qu'il y en a deux et qu'aucune n'est « par défaut ».
   Pas de padding horizontal, contrairement à .ex-plans-row : celle-ci en a parce qu'elle est cliquable
   dans son ENTIER et que le padding EST sa zone de clic. Ici rien n'est cliquable hors des boutons, donc
   le retrait aligne l'icône sur les en-têtes de section (.ex-plans-header, sans marge latérale) au lieu
   de la décaler de 10 px sans raison. */
.ex-plans-caps-item[b-ao4trnkqet] {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 7px 0;
    border-radius: 8px;
}

/* Le fond de la ligne active déborde de part et d'autre — marge négative compensée par un padding égal,
   donc le CONTENU reste aligné sur les en-têtes pendant que la surbrillance respire. Sans ça elle collerait
   à l'icône et au dernier bouton, et ses coins arrondis n'auraient rien à arrondir. */
.ex-plans-caps-item--on[b-ao4trnkqet] {
    background: #f4f8fd;
    margin: 0 -8px;
    padding-left: 8px;
    padding-right: 8px;
}

.ex-plans-caps-icon[b-ao4trnkqet] {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    background: #f2f3f5;
    color: #6b7280;
    font-size: 16px;
}

/* Bouton de représentation (surfaçage / pastille) et entonnoir : même gabarit, pour qu'ils s'alignent.
   26 px, comme les boutons de l'onglet Capacités du Patrimoine : sur la ligne de plage, 30 px la faisaient
   plus haute que le nom. */
.ex-plans-caps-mode[b-ao4trnkqet] {
    flex: 0 0 auto;
    width: 26px;
    height: 26px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 1px solid #e4e6ea;
    border-radius: 8px;
    background: var(--kd-surface);
    color: #6b7280;
    font-size: 15px;
    cursor: pointer;
}

.ex-plans-caps-mode:hover:not(:disabled)[b-ao4trnkqet] {
    border-color: #cfd4db;
    color: var(--ex-text);
}

.ex-plans-caps-mode--on[b-ao4trnkqet] {
    border-color: var(--ex-accent);
    background: var(--ex-accent);
    color: var(--ex-on-accent);
}

.ex-plans-caps-mode--active[b-ao4trnkqet] {
    border-color: #cfd4db;
    background: #f2f3f5;
    color: var(--ex-text);
}

/* Indisponible : trait pointillé plutôt qu'un simple pâlissement — on doit voir que le bouton existe et
   qu'il est refusé, pas croire qu'il est en cours de chargement. L'infobulle en donne la raison. */
.ex-plans-caps-mode:disabled[b-ao4trnkqet] {
    border-style: dashed;
    border-color: #e4e6ea;
    background: #fafbfc;
    color: #cfd4db;
    cursor: not-allowed;
}

/* Libellé d'une capacité : le titre, puis la ligne de plage et de boutons. */
.ex-plans-caps-label[b-ao4trnkqet] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
}

/* Deux lignes au plus, puis coupé : c'est la fin du nom qui distingue deux mesures voisines. */
.ex-plans-caps-title[b-ao4trnkqet] {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    white-space: normal;
    overflow-wrap: break-word;
    line-height: 1.3;
}

/* Plage à gauche, qui s'élide ; boutons à droite, jamais comprimés. */
.ex-plans-caps-foot[b-ao4trnkqet] {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
}

.ex-plans-caps-modes[b-ao4trnkqet] {
    display: flex;
    gap: 3px;
    flex: none;
}

.ex-plans-caps-range[b-ao4trnkqet] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 11px;
    color: var(--ex-text-muted);
    font-variant-numeric: tabular-nums;
}

/* Entonnoir d'une capacité dont le filtre est ACTIF (pas seulement ouvert) : pastille de rappel, pour
   qu'on comprenne au premier coup d'œil pourquoi des valeurs manquent sur le plan. */
.ex-plans-caps-filter--set[b-ao4trnkqet] {
    color: var(--ex-accent);
    border-color: #cfe3f8;
    background: #eef6ff;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansCapabilityFilterPanel.razor.rz.scp.css */
/* Panneau de filtrage par seuils (3ᵉ panneau de l'onglet Capacités). */

/* Carte d'activation : libellé + explication à gauche, switch à droite. */
.ex-plans-capfilter-card[b-i00ggiuovj] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 11px 12px;
    margin-bottom: 14px;
    border: 1px solid #eceef1;
    border-radius: 9px;
    background: #f8f9fb;
}

.ex-plans-capfilter-cardtext[b-i00ggiuovj] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1;
    min-width: 0;
}

.ex-plans-capfilter-cardtitle[b-i00ggiuovj] {
    font-size: 13px;
    font-weight: 600;
    color: var(--ex-text);
}

.ex-plans-capfilter-cardhint[b-i00ggiuovj] {
    font-size: 11px;
    color: rgba(76, 76, 92, .7);
    color: color-mix(in srgb, var(--ex-text-2) 70%, transparent);
}

.ex-plans-capfilter-switchbtn[b-i00ggiuovj] {
    flex: 0 0 auto;
    border: none;
    background: transparent;
    padding: 0;
    cursor: pointer;
    display: inline-flex;
}

/* Segmenté 2 positions (Hors plage / Dans la plage). */
.ex-plans-capfilter-segment[b-i00ggiuovj] {
    display: flex;
    gap: 4px;
    padding: 3px;
    margin-bottom: 16px;
    border-radius: 9px;
    background: var(--ex-fill);
}

/* Variante à trois cases (mesure d'état) : les libellés « Occupée / Inoccupée » sont plus longs que
   « Hors plage / Dans la plage » à deux, d'où un peu moins de rembourrage horizontal. */
.ex-plans-capfilter-segment--three button[b-i00ggiuovj] {
    padding-left: 2px;
    padding-right: 2px;
    font-size: 12px;
}

.ex-plans-capfilter-segment button[b-i00ggiuovj] {
    flex: 1;
    /* Transparente et non « none » : la case retenue porte un liseré, et sans cette réserve d'1 px la
       hauteur du segmenté sauterait à chaque changement de choix. */
    border: 1px solid transparent;
    border-radius: 7px;
    background: transparent;
    padding: 8px 6px;
    font-size: 12.5px;
    color: var(--ex-text-2);
    cursor: pointer;
}

.ex-plans-capfilter-segment button:hover[b-i00ggiuovj] {
    color: var(--ex-text);
}

/* Case retenue : couleur PRIMAIRE de l'application, pas un gris foncé. Sur une piste claire, un pavé
   noir se lit comme un bouton parmi d'autres ; la couleur de marque dit « c'est ce qui est choisi ».
   Le liseré plus sombre détache la case de la piste quand les deux sont proches à l'écran.

   Texte SOMBRE et non blanc : le primaire est un vert clair (#8EB937), sur lequel du blanc tombe à
   ~2,3:1 — sous le seuil AA de 4,5:1, et d'autant plus pénalisant sur du 12,5 px. Le même texte en
   #1a1a1a monte à ~8:1. On garde donc la couleur demandée sans sacrifier la lisibilité. */
.ex-plans-capfilter-segment button.ex-plans-capfilter-seg--on[b-i00ggiuovj],
.ex-plans-capfilter-segment button.ex-plans-capfilter-seg--on:hover[b-i00ggiuovj] {
    background: var(--bs-primary, #8EB937);
    border-color: rgba(0, 0, 0, 0.18);
    color: var(--ex-text);
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
}

/* Ligne d'un seuil : libellé à gauche, valeur courante à droite. */
.ex-plans-capfilter-threshold[b-i00ggiuovj] {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    margin-bottom: 6px;
}

.ex-plans-capfilter-thlabel[b-i00ggiuovj] {
    font-size: 12.5px;
    color: var(--ex-text-2);
}

.ex-plans-capfilter-thvalue[b-i00ggiuovj] {
    font-size: 14px;
    font-weight: 700;
    color: var(--ex-text);
    font-variant-numeric: tabular-nums;
}

.ex-plans-capfilter-range[b-i00ggiuovj] {
    width: 100%;
    margin: 0 0 16px;
    accent-color: var(--ex-text);
}

/* Rappel de la plage mesurée sur l'étage (bornes des curseurs). */
.ex-plans-capfilter-scale[b-i00ggiuovj] {
    margin: -6px 0 16px;
    text-align: center;
    font-size: 11px;
    color: var(--ex-text-muted);
    font-variant-numeric: tabular-nums;
}

/* Phrase de rappel de l'effet du filtre sur le plan. */
.ex-plans-capfilter-summary[b-i00ggiuovj] {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    /* Marge haute franche : ce cadre commente les réglages qui le précèdent, il ne les prolonge pas.
       Collé aux curseurs, il se lisait comme une quatrième ligne de contrôle. */
    margin-top: 20px;
    padding: 11px 12px;
    border-radius: 9px;
    /* Fond d'INFORMATION plutôt que gris neutre : accordé au picto, il distingue d'un coup d'œil le
       commentaire de l'écran des blocs de saisie, tous gris. */
    background: #ecfbfe;
    border: 1px solid #cdebf4;
    font-size: 11.5px;
    line-height: 1.5;
    color: #4c5a60;
}

/* Picto « i » : même grammaire que les notes de la légende, pour qu'on lise ce cadre comme un
   commentaire de l'écran et non comme un contrôle. */
.ex-plans-capfilter-summary > i[b-i00ggiuovj] {
    flex: 0 0 auto;
    font-size: 13px;
    line-height: 1.5;
    color: #0891b2;
}

/* Colonne de texte : le picto reste aligné en tête, quel que soit le nombre de phrases. */
.ex-plans-capfilter-summarytext[b-i00ggiuovj] {
    flex: 1;
    min-width: 0;
}

/* Rappel « ces curseurs viennent du profil » + retour à la plage mesurée. Discret : c'est une note de
   provenance, pas une alerte — la valeur affichée reste la vérité de l'écran. */
.ex-plans-capfilter-seed[b-i00ggiuovj] {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 4px 6px;
    margin: 2px 0 10px;
    font-size: 11px;
    color: #6b7280;
}

.ex-plans-capfilter-seed i[b-i00ggiuovj] {
    font-size: 12px;
}

.ex-plans-capfilter-seedreset[b-i00ggiuovj] {
    padding: 0;
    border: 0;
    background: none;
    font: inherit;
    color: #2563eb;
    text-decoration: underline;
    cursor: pointer;
}

.ex-plans-capfilter-seedreset:hover[b-i00ggiuovj] {
    color: #1d4ed8;
}

/* Conséquence des seuils sur cet étage, en SECONDE PHRASE du résumé et non en encart séparé : c'est
   la suite de « Sur le plan : … », pas un avertissement à part. Détachée par un filet et une teinte,
   plus soutenue quand le plan est vide. */
.ex-plans-capfilter-reach[b-i00ggiuovj] {
    display: block;
    margin-top: 7px;
    padding-top: 7px;
    /* Filet accordé au fond d'information : un gris neutre y trancherait. */
    border-top: 1px solid #cdebf4;
    color: #8a6416;
}

.ex-plans-capfilter-reach--none[b-i00ggiuovj] {
    color: #9a3529;
    font-weight: 600;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansCapabilityLegend.razor.rz.scp.css */
/* Légende en surimpression du plan. Le viewport (.ex-plans-viewport) est déjà `position: relative`. */
.ex-plans-caps-legend[b-g1bx3f7fee] {
    position: absolute;
    /* S'écarte de ce qui recouvre la vue quand les panneaux sont en surimpression (RailNav.Panel2Overlay,
       essai du 11/09/2026) : --rn-p2 / --rn-p3 sont posées par la racine du rail, un ancêtre. Hors
       surimpression elles n'existent pas et le repli vaut 0 — la légende reste à 16 px du bord. */
    left: calc(var(--rn-p2, 0px) + var(--rn-p3, 0px) + 16px);
    bottom: 16px;
    z-index: 2;
    min-width: 220px;
    max-width: 300px;
    padding: 12px 14px;
    border: 1px solid #eceef1;
    border-radius: 11px;
    background: rgba(255, 255, 255, .96);
    background: color-mix(in srgb, var(--kd-surface) 96%, transparent);
    box-shadow: 0 4px 16px rgba(26, 26, 26, .12);
    font-size: 12px;
    color: var(--ex-text);
    pointer-events: none;   /* purement informatif : ne vole pas les clics de la carte */
}

.ex-plans-caps-legend-title[b-g1bx3f7fee] {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--ex-text-2);
    margin-bottom: 8px;
}

.ex-plans-caps-legend-unit[b-g1bx3f7fee] {
    font-weight: 400;
    color: var(--ex-text-muted);
}

/* Barre du dégradé : le fond est posé en style inline depuis CapabilityColorScale. */
.ex-plans-caps-legend-bar[b-g1bx3f7fee] {
    height: 8px;
    border-radius: 100px;
}

.ex-plans-caps-legend-bounds[b-g1bx3f7fee] {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
    margin-top: 5px;
    font-size: 11px;
    color: var(--ex-text-2);
    font-variant-numeric: tabular-nums;
}

.ex-plans-caps-legend-scale[b-g1bx3f7fee] {
    color: var(--ex-text-faint);
    font-variant-numeric: normal;
}

/* Une capacité affichée sur les pastilles. */
.ex-plans-caps-legend-row[b-g1bx3f7fee] {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 9px;
}

.ex-plans-caps-legend-row i[b-g1bx3f7fee] {
    font-size: 15px;
    color: var(--ex-text-muted);
}

.ex-plans-caps-legend-rowtitle[b-g1bx3f7fee] {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Mesure d'état : deux cas nommés à la place de la barre de dégradé. */
.ex-plans-caps-legend-states[b-g1bx3f7fee] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 14px;
}

.ex-plans-caps-legend-state[b-g1bx3f7fee] {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: 11px;
    color: var(--ex-text-2);
}

.ex-plans-caps-legend-state i[b-g1bx3f7fee] {
    font-size: 14px;
}

/* Notes sous la barre : origine de la donnée (projection) et couverture. Volontairement plus discrètes
   que le rappel de filtre — elles qualifient la mesure, elles ne disent pas ce que la carte a retiré. */
.ex-plans-caps-legend-note[b-g1bx3f7fee] {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    margin-top: 5px;
    font-size: 11px;
    line-height: 1.35;
    color: var(--ex-text-muted);
}

.ex-plans-caps-legend-note i[b-g1bx3f7fee] {
    flex: 0 0 auto;
    font-size: 12px;
    line-height: 1.35;
}

/* Rappel du filtre actif : ce que la carte retient réellement. */
.ex-plans-caps-legend-filter[b-g1bx3f7fee] {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    margin-top: 5px;
    font-size: 11px;
    line-height: 1.35;
    color: #6b7280;
}

.ex-plans-caps-legend-filter i[b-g1bx3f7fee] {
    flex: 0 0 auto;
    font-size: 12px;
    line-height: 1.35;
    color: #0891b2;
}

.ex-plans-caps-legend-tag[b-g1bx3f7fee] {
    flex: 0 0 auto;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .05em;
    color: var(--ex-text-faint);
}

/* Le filtre actif ne laisse RIEN sur cet étage : sans cette ligne, la légende décrit une restriction
   devant un plan vide, ce qui se lit comme une panne d'affichage. */
.ex-plans-caps-legend-filter--none[b-g1bx3f7fee] {
    color: #c0554a;
}

/* L'icône porte sa propre couleur (cyan d'information) : la teindre aussi, sinon l'avertissement
   arbore le picto d'une note neutre. */
.ex-plans-caps-legend-filter--none i[b-g1bx3f7fee] {
    color: #c0554a;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansClassTreePanel.razor.rz.scp.css */
/* Arbre de classes partagé (Espaces / Objets, explorateurs 2D ET BIM) — styles propres. Les primitives
   « ligne » et « case » (ex-plans-row / ex-plans-check) sont portées ICI (et non plus déléguées au shell
   page) pour que le composant s'affiche à l'IDENTIQUE quel que soit l'hôte — le shell BIM n'a pas les
   `.ex-plans-root ::deep …` du shell 2D, d'où les bordures de bouton par défaut sans ça. Le shell 2D
   redéfinit ces mêmes primitives via ::deep pour ses AUTRES lignes (résultats de recherche…) : valeurs
   identiques → aucun impact visuel, seulement une couverture des deux contextes. */

/* Ligne générique cliquable (case | libellé | compteur) — bouton sans bordure/fond natifs. */
.ex-plans-row[b-i34k8fdv33] {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    border: none;
    background: transparent;
    text-align: left;
    padding: 8px;
    border-radius: 7px;
    cursor: pointer;
    font-size: 12.5px;
    color: var(--ex-text);
}

    .ex-plans-row:hover[b-i34k8fdv33] {
        background: var(--ex-row-hover);
    }

/* Case à cocher 15 px, tri-état : la couleur du fond « coché » est posée en style inline (dépend du type),
   l'état partiel utilise --partial. */
.ex-plans-check[b-i34k8fdv33] {
    flex: 0 0 15px;
    width: 15px;
    height: 15px;
    border-radius: 3px;
    border: 1.5px solid var(--ex-control-border);
    background: var(--kd-surface);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ex-on-accent);
    font-size: 10px;
    line-height: 1;
    box-sizing: border-box;
}

.ex-plans-check--partial[b-i34k8fdv33] {
    border-color: var(--ex-partial);
    background: var(--ex-partial);
}

/* Ligne de type = rangée flex [bouton bascule | icône détail | pastille couleur] → jamais de chevauchement. */
.ex-plans-tree-typewrap[b-i34k8fdv33] {
    display: flex;
    align-items: center;
    gap: 4px;
}

/* Le bouton bascule prend l'espace restant (rétrécit devant la pastille) ; min-width:0 pour l'ellipsis du libellé. */
.ex-plans-tree-typerow[b-i34k8fdv33] {
    min-width: 0;
    padding-right: 6px;
}

/* DEUX LIGNES AU PLUS, puis coupé (14/09/2026) : sur une seule ligne, les sous-types — les plus en retrait,
   et souvent les plus longs (« Équipement de sécurité incendie ») — ne montraient plus que leur premier mot.
   Un libellé court reste sur une ligne ; la ligne ne grandit que pour ceux qui en ont besoin. */
.ex-plans-tree-label[b-i34k8fdv33] {
    flex: 1;
    min-width: 0;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    white-space: normal;
    overflow-wrap: break-word;
    line-height: 1.3;
}

/* Un seul nombre, abrégé au-delà de 10 000 (cf. Compact) : il ne se coupe ni ne se comprime. Le total de la
   branche, qui le suivait en retrait (« · 112577 »), est passé dans l'info-bulle. */
.ex-plans-tree-count[b-i34k8fdv33] {
    flex: none;
    white-space: nowrap;
    color: var(--ex-text-muted);
    font-size: 11px;
    font-variant-numeric: tabular-nums;
}

.ex-plans-tree-caret[b-i34k8fdv33] {
    font-size: 13px;
    color: var(--ex-text-muted);
    cursor: pointer;
}

/* Chevron d'un regroupement pur (self-only), posé À LA PLACE de la case qu'il n'a pas : il en prend la
   largeur exacte (15 px, cf. .ex-plans-check) pour que son libellé tombe au même endroit que celui d'un
   frère cochable sans enfants. Centré dans cet emplacement, et non calé à gauche, pour s'aligner à l'œil
   sur les cases de la colonne. */
.ex-plans-tree-caret--slot[b-i34k8fdv33] {
    flex: 0 0 15px;
    width: 15px;
    text-align: center;
}

/* Bouton « liste/détails » d'un type → ouvre le 3ᵉ panneau (élément flex, avant la pastille couleur). */
.ex-plans-tree-list[b-i34k8fdv33] {
    flex: 0 0 auto;
    width: 26px;
    height: 26px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 7px;
    background: transparent;
    color: var(--ex-text-muted);
    cursor: pointer;
}

    .ex-plans-tree-list:hover[b-i34k8fdv33] {
        background: var(--ex-accent-hover-bg);
        color: var(--ex-accent);
    }

    .ex-plans-tree-list i[b-i34k8fdv33] {
        font-size: 15px;
    }

.ex-plans-tree-list--active[b-i34k8fdv33],
.ex-plans-tree-list--active:hover[b-i34k8fdv33] {
    background: var(--ex-accent);
    color: var(--ex-on-accent);
}

/* Pastille couleur = <input type="color"> natif en petit swatch, ÉLÉMENT FLEX (fixe 16px, jamais superposé). */
.ex-plans-tree-dot[b-i34k8fdv33] {
    flex: 0 0 16px;
    width: 16px;
    max-width: 16px;
    height: 16px;
    box-sizing: border-box;
    margin-right: 4px;
    padding: 0;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background: none;
    overflow: hidden;
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .08);
}

    .ex-plans-tree-dot[b-i34k8fdv33]::-webkit-color-swatch-wrapper {
        padding: 0;
    }

    .ex-plans-tree-dot[b-i34k8fdv33]::-webkit-color-swatch {
        border: none;
        border-radius: 4px;
    }

    .ex-plans-tree-dot[b-i34k8fdv33]::-moz-color-swatch {
        border: none;
        border-radius: 4px;
    }

/* Type non coché : pastille retirée du flux, sa place rendue au libellé ; elle revient au survol de la ligne.
   ⚠️ `:focus-within` N'EST PAS DÉCORATIF : le sélecteur de couleur de l'OS s'ouvre hors de la ligne, le
   survol se perd aussitôt, et un input masqué en pleine saisie risquerait de refermer le sélecteur ou
   d'en perdre la valeur. Focalisé, il reste affiché. */
.ex-plans-tree-dot--idle[b-i34k8fdv33] {
    display: none;
}

.ex-plans-tree-typewrap:hover .ex-plans-tree-dot--idle[b-i34k8fdv33],
.ex-plans-tree-typewrap:focus-within .ex-plans-tree-dot--idle[b-i34k8fdv33] {
    display: inline-block;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansFloorsPanel.razor.rz.scp.css */
/* Panneau Étages (spec §4.2) — styles propres ; les primitives (hint, row, radio…) viennent du shell. */

.ex-plans-floor-label[b-ld8yxmcyvr] {
    flex: 1;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Badge d'alarmes de l'étage : pill rosée + icône warning pleine */
.ex-plans-floor-alarms[b-ld8yxmcyvr] {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 2px 7px;
    border-radius: 100px;
    background: rgba(235, 61, 99, .14);
    color: #eb3d63;
    font-size: 10.5px;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

    .ex-plans-floor-alarms i[b-ld8yxmcyvr] {
        font-size: 11px;
    }

/* Header de bâtiment : reprend la primitive .ex-plans-header, espacé quand il suit une liste */
.ex-plans-floors-building[b-ld8yxmcyvr] {
    margin-top: 10px;
}

    .ex-plans-floors-building:first-of-type[b-ld8yxmcyvr] {
        margin-top: 0;
    }
/* /Features/Explorers/Plans/Components/ExplorerPlansObjectsPanel.razor.rz.scp.css */
/* Panneau Objets (spec §4.5) — styles propres ; primitives (row, check, switch…) via le shell page,
   l'arbre des types via le composant partagé ExplorerPlansClassTreePanel. */

.ex-plans-objects-switchlabel[b-7se994isc4] {
    flex: 1;
    font-weight: 500;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansSearchPanel.razor.rz.scp.css */
/* Panneau Recherche (spec §4.1) — styles propres ; primitives (search, row, header…) via le shell. */

/* Pastille d'icône 28 px (fond = couleur du type à 10 %, posé en inline) */
.ex-plans-search-badge[b-qcmq21y9ri] {
    flex: 0 0 28px;
    width: 28px;
    height: 28px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}

    .ex-plans-search-badge i[b-qcmq21y9ri] {
        font-size: 15px;
    }

.ex-plans-search-main[b-qcmq21y9ri] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
}

.ex-plans-search-label[b-qcmq21y9ri] {
    font-size: 12.5px;
    word-break: break-all;
}

.ex-plans-search-sub[b-qcmq21y9ri] {
    font-size: 10.5px;
    color: var(--ex-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.ex-plans-search-cross[b-qcmq21y9ri] {
    flex: 0 0 auto;
    font-size: 15px;
    color: var(--ex-control-border);
}

.ex-plans-search-cross--active[b-qcmq21y9ri] {
    color: var(--ex-accent);
}

/* Localisation GMAO renseignée récemment : le picto de centrage passe au rouge du thème (celui du texte
   `.alert-danger`, pour coller au bandeau du drawer), sélection comprise. */
.ex-plans-search-cross--warning[b-qcmq21y9ri],
.ex-plans-search-cross--warning.ex-plans-search-cross--active[b-qcmq21y9ri] {
    color: #900f17;
}

.ex-plans-search-group[b-qcmq21y9ri] {
    margin-top: 8px;
}

/* Historique (état vide) : pastille neutre — une entrée d'historique n'est pas un résultat typé, elle ne
   doit donc pas emprunter les couleurs de nature (personne/espace/équipement). */
.ex-plans-search-badge--recent[b-qcmq21y9ri] {
    background: #f1f3f5;
    color: var(--ex-text-muted);
}

.ex-plans-search-recent-clear[b-qcmq21y9ri] {
    border: 0;
    background: none;
    padding: 0;
    line-height: 1;
    color: var(--ex-control-border);
    cursor: pointer;
}

    .ex-plans-search-recent-clear:hover[b-qcmq21y9ri] {
        color: #eb3d63;
    }
/* /Features/Explorers/Plans/Components/ExplorerPlansZoneEquipmentListPanel.razor.rz.scp.css */
/* Contenu du 3ᵉ panneau (détail) : rangées d'équipements d'une zone (primitive .ex-plans-row via la page). */

.ex-plans-detailzone-icon[b-qb2h1h9o10] {
    font-size: 15px;
    color: #6b7078;
}

.ex-plans-detailzone-name[b-qb2h1h9o10] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-weight: 500;
}

.ex-plans-detailzone-cat[b-qb2h1h9o10] {
    flex: 0 0 auto;
    max-width: 40%;
    color: var(--ex-text-muted);
    font-size: 10.5px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* /Features/Explorers/Plans/Components/ExplorerPlansZonesPanel.razor.rz.scp.css */
/* Panneau Zones virtuelles (spec §4.4) — styles propres ; primitives (search, row…) via le shell. */

/* Ligne d'une zone = rangée flex [bouton zone | bouton détails] → jamais de <button> imbriqué. */
.ex-plans-zones-wrap[b-i6jhxsta0i] {
    display: flex;
    align-items: center;
    gap: 4px;
}

.ex-plans-zones-row[b-i6jhxsta0i] {
    min-width: 0;
    gap: 6px;
    padding-right: 6px;
}

/* Sélection : fond bleuté + liseré intérieur (sélecteur doublé pour l'emporter sur le hover du shell) */
.ex-plans-row.ex-plans-zones-row--selected[b-i6jhxsta0i],
.ex-plans-row.ex-plans-zones-row--selected:hover[b-i6jhxsta0i] {
    background: #eef4ff;
    box-shadow: inset 0 0 0 1px #c7ddfb;
}

.ex-plans-zones-caret[b-i6jhxsta0i] {
    flex: 0 0 auto;
    font-size: 13px;
    color: var(--ex-text-muted);
    cursor: pointer;
}

.ex-plans-zones-caret-spacer[b-i6jhxsta0i] {
    flex: 0 0 13px;
}

.ex-plans-zones-icon[b-i6jhxsta0i] {
    flex: 0 0 auto;
    font-size: 15px;
    color: #8b5cf6;
}

/* Bloc texte 2 lignes (code + catégorie) : prend l'espace disponible, tronque à l'intérieur. C'est LUI qui
   porte le flex:1 (plus le code) → le code ne partage plus sa ligne avec le type et cesse d'être écrasé. */
.ex-plans-zones-text[b-i6jhxsta0i] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
    overflow: hidden;
}

.ex-plans-zones-code[b-i6jhxsta0i] {
    min-width: 0;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Catégorie (« Zone », « Zone d'éclairage »…) en légende sous le code : discrète, tronquée si trop longue,
   couleur du type (rappel de l'icône) — remplace l'ancien badge inline qui volait la place au libellé. */
.ex-plans-zones-cat[b-i6jhxsta0i] {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: #8b5cf6;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .01em;
}

/* Compteur d'équipements/collections/systèmes membres (connu une fois la zone chargée). */
.ex-plans-zones-count[b-i6jhxsta0i] {
    flex: 0 0 auto;
    color: var(--ex-text-muted);
    font-size: 11px;
    font-variant-numeric: tabular-nums;
}

/* Bouton « détails » d'une zone → ouvre le 3ᵉ panneau listant ses équipements (miroir de .ex-plans-spaces-list). */
.ex-plans-zones-list[b-i6jhxsta0i] {
    flex: 0 0 auto;
    width: 26px;
    height: 26px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 7px;
    background: transparent;
    color: var(--ex-text-muted);
    cursor: pointer;
}

    .ex-plans-zones-list:hover[b-i6jhxsta0i] {
        background: var(--ex-accent-hover-bg);
        color: var(--ex-accent);
    }

    .ex-plans-zones-list i[b-i6jhxsta0i] {
        font-size: 15px;
    }

.ex-plans-zones-list--active[b-i6jhxsta0i],
.ex-plans-zones-list--active:hover[b-i6jhxsta0i] {
    background: var(--ex-accent);
    color: var(--ex-on-accent);
}

.ex-plans-zones-spin[b-i6jhxsta0i] {
    flex: 0 0 auto;
    color: var(--ex-text-muted);
    animation: ex-plans-zones-spin-b-i6jhxsta0i 1s linear infinite;
}

@keyframes ex-plans-zones-spin-b-i6jhxsta0i {
    to {
        transform: rotate(360deg);
    }
}

.ex-plans-zones-emptychild[b-i6jhxsta0i] {
    padding: 4px 8px 8px;
    font-size: 11px;
    color: rgba(76, 76, 92, .5);
    color: color-mix(in srgb, var(--ex-text-2) 50%, transparent);
}
/* /Features/Explorers/Plans/ExplorerPlansIndex.razor.rz.scp.css */
/* Explorateur 2D : le chrome (rail + panneaux + viewport) est porté par le composant réutilisable
   RailNav (KDCockpit.WebComponents). Cette feuille garde : le wrapper de page, le viewport, et les
   PRIMITIVES DE CONTENU des panneaux (rows, headers, checks…) — définies ici via `.ex-plans-root ::deep`
   car elles doivent atteindre le markup slotté DANS RailNav (le CSS scopé d'un composant ne s'y applique
   pas ; la page, ancêtre commun, si). */

/* Page = colonne : bandeau de diagnostic (optionnel) en haut + chrome (rail/panneaux/viewport) en dessous. */
.ex-plans-page[b-r0ef4ug8pc] {
    display: flex;
    flex-direction: column;
    height: 100%;
    width: 100%;
}

/* La palette des explorateurs (--ex-*) est déclarée UNE fois, dans tokens.css (« Palette des
   explorateurs ») : ses deux copies locales, ici et sur .ex-bim-root, laissaient l'Explorateur
   Patrimoine sans valeur — cases sans bordure. */
.ex-plans-root[b-r0ef4ug8pc] {
    height: 100%;
    background: var(--kd-page-bg);
    overflow: hidden;
}

/* Sous un éventuel bandeau, le chrome remplit la hauteur restante (pas 100% qui déborderait du bandeau). */
.ex-plans-page > .ex-plans-root[b-r0ef4ug8pc] {
    height: auto;
    flex: 1 1 auto;
    min-height: 0;
}

/* .ex-plans-scopebar a disparu avec la bande de portée : les pills Campus / Bâtiment / Étage sont rendues
   dans les outils de la barre supérieure (PageWrapper.ToolsContent). Ne reste au-dessus du chrome que le
   bandeau de diagnostic, qui porte lui-même son gabarit de bande. */

.ex-plans-viewport[b-r0ef4ug8pc] {
    position: relative;
    min-width: 320px;
    height: 100%;
    display: flex;
    overflow: hidden;
}

/* État vide / plan indisponible, centré dans le viewport. */
.ex-plans-viewport-overlay[b-r0ef4ug8pc] {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    color: var(--ex-text-muted);
    font-size: 13px;
}

    .ex-plans-viewport-overlay i[b-r0ef4ug8pc] {
        font-size: 34px;
    }

/* ------------------------------------------------------------------
   Primitives de ligne partagées par tous les panneaux (spec §3), atteignant le contenu slotté dans
   RailNav via `.ex-plans-root ::deep`. Les styles propres à UN panneau restent dans son .razor.css.
------------------------------------------------------------------ */

/* Header de section : label ALL-CAPS + icône + compteur droit optionnel */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-header {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 11px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--ex-text-2);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-header i {
    font-size: 15px;
    color: var(--ex-text-muted);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-header .ex-plans-header-count {
    margin-left: auto;
    font-size: 11px;
    font-weight: 400;
    color: var(--ex-text-faint);
    letter-spacing: 0;
    text-transform: none;
    font-variant-numeric: tabular-nums;
}

/* Texte d'aide */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-hint {
    margin: -3px 0 11px;
    font-size: 11px;
    line-height: 1.55;
    color: rgba(76, 76, 92, .7);
    color: color-mix(in srgb, var(--ex-text-2) 70%, transparent);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-divider {
    border-top: 1px solid var(--ex-fill);
    margin: 11px 0;
}

/* État vide centré */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-empty {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
    color: color-mix(in srgb, var(--ex-text-2) 50%, transparent);
}

/* Ligne générique cliquable */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    border: none;
    background: transparent;
    text-align: left;
    padding: 8px;
    border-radius: 7px;
    cursor: pointer;
    font-size: 12.5px;
    color: var(--ex-text);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row:hover {
    background: var(--ex-row-hover);
}

/* Ligne inopérante (ex. « Afficher les noms » quand les pins sont masqués) */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row:disabled {
    opacity: .45;
    cursor: default;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row:disabled:hover {
    background: transparent;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row--selected,
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-row--selected:hover {
    background: var(--ex-accent-bg);
}

/* Rangée de détail = [ligne cliquable (centrer) | groupe d'actions serré : bouton « centrer » + bouton
   « détail »]. Boutons frères (jamais imbriqués) — partagé par les panneaux Objets et Zones du 3ᵉ panneau.
   Les deux actions forment une paire homogène et rapprochée en fin de rangée (fini l'ancienne asymétrie
   pastille-dans-la-ligne + bouton détaché). */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-wrap {
    display: flex;
    align-items: center;
    gap: 6px;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-wrap .ex-plans-row {
    min-width: 0;   /* la ligne prend la place restante et tronque ; le groupe d'actions garde sa taille */
}

/* Groupe d'actions en fin de rangée : les deux boutons icône collés. */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-actions {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 2px;
}

/* Bouton d'action icône du 3ᵉ panneau (centrer / détail) — même gabarit pour les deux. */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid transparent;
    border-radius: 7px;
    background: transparent;
    color: var(--ex-text-muted);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease, border-color .12s ease;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn:hover {
    background: var(--ex-accent-hover-bg);
    color: var(--ex-accent);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn i {
    font-size: 15px;
}

/* Bouton « centrer » actif (élément centré/sélectionné) → plein bleu. */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--active,
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--active:hover {
    background: var(--ex-accent);
    border-color: var(--ex-accent);
    color: var(--ex-on-accent);
}

/* Localisation GMAO renseignée récemment : le picto de centrage passe au rouge du thème (texte
   `.alert-danger`, comme le bandeau du drawer), état actif compris. Même règle que `.exobj-btn--warning`. */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--warning,
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--warning:hover {
    color: #900f17;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--warning.ex-plans-detail-btn--active,
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-detail-btn--warning.ex-plans-detail-btn--active:hover {
    background: #900f17;
    border-color: #900f17;
    color: #fff;
}

/* Radio 15 px (mono-sélection) */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-radio {
    flex: 0 0 15px;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    border: 1.5px solid #cfd4d9;
    background: var(--kd-surface);
    box-sizing: border-box;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-radio--on {
    border: 4.5px solid var(--ex-accent);
}

/* Case à cocher 15 px, tri-état (cochée / partielle / vide) ; la couleur de fond est posée en style
   inline quand elle dépend du type. */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-check {
    flex: 0 0 15px;
    width: 15px;
    height: 15px;
    border-radius: 3px;
    border: 1.5px solid var(--ex-control-border);
    background: var(--kd-surface);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ex-on-accent);
    font-size: 10px;
    line-height: 1;
    box-sizing: border-box;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-check--on {
    border-color: var(--ex-accent);
    background: var(--ex-accent);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-check--partial {
    border-color: var(--ex-partial);
    background: var(--ex-partial);
}

/* Switch 34×19 */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-switch {
    position: relative;
    flex: 0 0 34px;
    width: 34px;
    height: 19px;
    border-radius: 100px;
    background: #cfd4d9;
    transition: background .15s;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-switch::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    background: var(--kd-surface);
    transition: left .15s;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-switch--on {
    background: var(--kd-primary-border);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-switch--on::after {
    left: 17px;
}

/* Densité compacte (prop « density » du spec) : padding vertical des lignes 8 → 6 px */
/* ESSAI surimpression (RailNav.Panel2Overlay) : la carte passe sous le rail d'outils (app.css). Ses
   contrôles calés à droite — zoom, boussole — s'en écartent d'autant, sans quoi ils passeraient
   dessous et deviendraient inatteignables. */
.ex-plans-root[b-r0ef4ug8pc]  .mapboxgl-ctrl-top-right,
.ex-plans-root[b-r0ef4ug8pc]  .mapboxgl-ctrl-bottom-right {
    right: var(--kd-tools-offset);
}

.ex-plans-root[b-r0ef4ug8pc]  .railnav-panel-body--compact .ex-plans-row {
    padding-top: 6px;
    padding-bottom: 6px;
}

/* Champ de recherche local */
.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-search {
    display: flex;
    align-items: center;
    gap: 7px;
    background: var(--ex-row-hover);
    border: 1px solid #e6e6e8;
    border-radius: 7px;
    padding: 7px 10px;
    margin-bottom: 11px;
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-search i {
    font-size: 13px;
    color: var(--ex-text-muted);
}

.ex-plans-root[b-r0ef4ug8pc]  .ex-plans-search input {
    flex: 1;
    min-width: 0;
    border: none;
    background: transparent;
    outline: none;
    font-size: 12px;
    color: var(--ex-text);
}
/* /Features/Explorers/Shared/AlarmPanel/AlarmFiltersPanel.razor.rz.scp.css */
/* Panneau Alarmes — 1ᵉʳ panneau (filtres), partagé 2D/3D. Composant AUTONOME : il porte l'interrupteur,
   la ligne de compteur et les états vides en propre, sans dépendre des primitives ::deep d'un shell —
   il est monté dans deux hôtes qui n'ont pas les mêmes.
   Le compteur et le bouton « rafraîchir » reprennent les jetons `--ex-*` posés par le lot B habillage sur
   l'ancien ExplorerPlansAlarmsPanel (rendu strictement constant) ; ils sont hérités de `.ex-plans-root`
   ou `.ex-bim-root`, les deux seuls hôtes du composant. Le reste de la feuille est la palette propre au
   double panneau Alarmes (#90a4ae, #37474f, #8bc34a…), sans jeton à ce stade. */

/* --- Interrupteur d'affichage : libellé à gauche, bascule à droite --- */
.afp-toggle[b-qrsmd5ogjr] {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    padding: 8px 8px 6px;
    border: none;
    border-bottom: 1px solid #eef2f4;
    border-radius: 0;
    background: transparent;
    text-align: left;
    cursor: pointer;
    font-size: 12.5px;
    color: #1a1a1a;
}

    .afp-toggle:hover[b-qrsmd5ogjr] {
        background: #f6f7f9;
    }

.afp-togglelabel[b-qrsmd5ogjr] {
    flex: 1;
    font-weight: 500;
}

.afp-switch[b-qrsmd5ogjr] {
    position: relative;
    flex: 0 0 34px;
    width: 34px;
    height: 19px;
    border-radius: 100px;
    background: #cfd4d9;
    transition: background .15s;
}

    .afp-switch[b-qrsmd5ogjr]::after {
        content: "";
        position: absolute;
        top: 2px;
        left: 2px;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        background: #fff;
        transition: left .15s;
    }

.afp-switch--on[b-qrsmd5ogjr] {
    background: #7bb224;
}

    .afp-switch--on[b-qrsmd5ogjr]::after {
        left: 17px;
    }

/* --- Compteur global de l'étage --- */
.afp-count[b-qrsmd5ogjr] {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 5px 8px 10px;
    border-bottom: 1px solid #eef2f4;
    font-size: 12px;
    color: var(--ex-text-2);
}

    .afp-count > i[b-qrsmd5ogjr] {
        font-size: 15px;
        color: var(--ex-accent);
    }

    .afp-count > span[b-qrsmd5ogjr] {
        flex: 1;
    }

.afp-refresh[b-qrsmd5ogjr] {
    width: 26px;
    height: 26px;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: var(--ex-text-muted);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

    .afp-refresh:hover[b-qrsmd5ogjr] {
        background: var(--ex-fill);
        color: var(--ex-text-2);
    }

    .afp-refresh:disabled[b-qrsmd5ogjr] {
        opacity: .45;
        cursor: default;
    }

/* --- État vide --- */
.afp-empty[b-qrsmd5ogjr] {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
}

/* --- Libellé de section --- */
.afp-seclabel[b-qrsmd5ogjr] {
    margin: 14px 0 7px;
    padding: 0 2px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: #90a4ae;
}

/* --- Filtre de sévérité : pills compactes (la couleur de la sévérité active est posée en inline) --- */
.afp-sevtags[b-qrsmd5ogjr] {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.afp-sevtag[b-qrsmd5ogjr] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    border: 1px solid #e6e6e8;
    border-radius: 100px;
    background: #fff;
    color: #4c4c5c;
    font-size: 11px;
    font-weight: 600;
    cursor: pointer;
}

.afp-sevtag--active[b-qrsmd5ogjr] {
    border-color: #4c4c5c;
    background: #f6f7f9;
}

.afp-sevdot[b-qrsmd5ogjr] {
    width: 8px;
    height: 8px;
    border-radius: 100px;
}

.afp-sevcount[b-qrsmd5ogjr] {
    color: #9499a1;
    font-weight: 400;
    font-variant-numeric: tabular-nums;
}

/* --- Liste des types d'équipement --- */
.afp-types[b-qrsmd5ogjr] {
    display: flex;
    flex-direction: column;
}

.afp-typerow[b-qrsmd5ogjr] {
    display: flex;
    align-items: center;
    gap: 9px;
    width: 100%;
    padding: 9px 8px;
    border: none;
    border-radius: 7px;
    background: transparent;
    text-align: left;
    cursor: pointer;
}

    .afp-typerow:hover[b-qrsmd5ogjr] {
        background: #f7fafb;
    }

.afp-typerow--on[b-qrsmd5ogjr],
.afp-typerow--on:hover[b-qrsmd5ogjr] {
    background: #f2f6f8;
}

.afp-typename[b-qrsmd5ogjr] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 13.5px;
    color: #37474f;
}

.afp-typecount[b-qrsmd5ogjr] {
    flex: 0 0 auto;
    min-width: 22px;
    padding: 2px 7px;
    border-radius: 100px;
    background: #fdecea;
    color: #d9534f;
    font-size: 11.5px;
    font-weight: 600;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

.afp-typechevron[b-qrsmd5ogjr] {
    flex: 0 0 auto;
    font-size: 13px;
    color: #b0bec5;
}
/* /Features/Explorers/Shared/AlarmPanel/AlarmListPanel.razor.rz.scp.css */
/* Panneau Alarmes — 2ᵉ panneau (liste), partagé 2D/3D : recherche, onglets de tri, lignes d'alarme.
   Composant autonome : styles complets, aucune primitive héritée d'un shell hôte. */

/* --- Recherche locale --- */
.alp-filter[b-67160uazkr] {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 7px 10px;
    border: 1px solid #e0e5e8;
    border-radius: 8px;
    background: #fff;
    margin-bottom: 10px;
}

    .alp-filter > i[b-67160uazkr] {
        font-size: 15px;
        color: #90a4ae;
    }

    .alp-filter input[b-67160uazkr] {
        flex: 1;
        min-width: 0;
        border: none;
        outline: none;
        background: transparent;
        font-size: 13px;
        color: #37474f;
    }

.alp-filterclear[b-67160uazkr] {
    width: 20px;
    height: 20px;
    border: none;
    border-radius: 5px;
    background: transparent;
    color: #90a4ae;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

    .alp-filterclear:hover[b-67160uazkr] {
        background: #f1f2f4;
        color: #37474f;
    }

/* --- Onglets de tri : soulignement de l'onglet actif --- */
.alp-sorts[b-67160uazkr] {
    display: flex;
    gap: 16px;
    border-bottom: 1px solid #f2f5f7;
    margin-bottom: 4px;
}

.alp-sort[b-67160uazkr] {
    padding: 6px 0 8px;
    border: none;
    border-bottom: 2px solid transparent;
    background: transparent;
    color: #90a4ae;
    font-size: 13px;
    cursor: pointer;
}

    .alp-sort:hover[b-67160uazkr] {
        color: #37474f;
    }

.alp-sort--on[b-67160uazkr],
.alp-sort--on:hover[b-67160uazkr] {
    border-bottom-color: #8bc34a;
    color: #37474f;
    font-weight: 500;
}

/* --- Ligne d'alarme --- */
.alp-row[b-67160uazkr] {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    width: 100%;
    padding: 10px 8px;
    border: none;
    border-bottom: 1px solid #f2f5f7;
    background: transparent;
    text-align: left;
    cursor: pointer;
}

    .alp-row:hover[b-67160uazkr] {
        background: #f7fafb;
    }

/* Sélection : barre latérale à la couleur de sévérité (--alp-selink, posée en inline par la ligne),
   celle-là même que la pastille posée sur le plan. */
.alp-row--on[b-67160uazkr],
.alp-row--on:hover[b-67160uazkr] {
    background: #eef4f8;
    box-shadow: inset 3px 0 0 var(--alp-selink, #37474f);
}

.alp-dot[b-67160uazkr] {
    flex: 0 0 9px;
    width: 9px;
    height: 9px;
    border-radius: 100px;
    margin-top: 5px;
}

.alp-main[b-67160uazkr] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.alp-line[b-67160uazkr] {
    display: flex;
    align-items: baseline;
    gap: 8px;
}

.alp-name[b-67160uazkr] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 13.5px;
    font-weight: 600;
    color: #263238;
}

/* Indicateur de localisation : discret par défaut (le cas courant ne doit pas crier), plus appuyé quand
   le plan ne peut RIEN montrer — c'est là que l'information a de la valeur. Jamais en compétition avec
   la pastille de sévérité. */
.alp-loc[b-67160uazkr] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    color: #cfd8dc;
    font-size: 13px;
    cursor: help;
}

.alp-loc--off[b-67160uazkr] {
    color: #90a4ae;
}

/* Localisation GMAO renseignée récemment : l'indicateur passe au rouge du thème (texte `.alert-danger`),
   qu'il soit localisé ou non — l'info-bulle cumule les deux messages. */
.alp-loc--warning[b-67160uazkr],
.alp-loc--warning.alp-loc--off[b-67160uazkr] {
    color: #900f17;
}

.alp-time[b-67160uazkr] {
    flex: 0 0 auto;
    font-size: 11.5px;
    color: #90a4ae;
    font-variant-numeric: tabular-nums;
}

.alp-sub[b-67160uazkr] {
    font-size: 12.5px;
    color: #78909c;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.alp-count[b-67160uazkr] {
    flex: 0 0 auto;
    min-width: 18px;
    height: 18px;
    margin-top: 2px;
    padding: 0 5px;
    border-radius: 100px;
    color: #fff;
    font-size: 10.5px;
    font-weight: 700;
    line-height: 18px;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

/* --- État vide (filtres sans résultat) --- */
.alp-empty[b-67160uazkr] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    padding: 30px 12px;
    text-align: center;
    font-size: 12.5px;
    color: #90a4ae;
}

.alp-reset[b-67160uazkr] {
    border: none;
    background: transparent;
    color: #6fae1f;
    font-size: 12.5px;
    font-weight: 500;
    text-decoration: underline;
    cursor: pointer;
}

    .alp-reset:hover[b-67160uazkr] {
        color: #5a8f18;
    }
/* /Features/Explorers/Shared/ExplorerObjectListView.razor.rz.scp.css */
/* Liste partagée des objets d'un type (3ᵉ panneau des explorateurs 2D et 3D).

   Styles AUTONOMES (comme AlarmAssetListView) : le composant n'hérite ni des primitives `.ex-plans-*`
   injectées par ExplorerPlansIndex via `::deep`, ni des `.bim-objlist-*` d'ExplorerBim — c'est ce qui
   garantit un rendu identique des deux côtés. Les valeurs reprennent à l'identique celles des primitives
   `.ex-plans-*` du 3ᵉ panneau (aucun décalage visuel côté carte 2D).

   Couleurs en jetons `--ex-*` (lot B habillage, rendu strictement constant) : elles sont héritées de
   `.ex-plans-root` (2D) ou `.ex-bim-root` (3D), qui déclarent la même palette. Le composant n'étant
   monté que sous l'un de ces deux shells, la chaîne d'héritage est garantie. Les teintes sans jeton
   (rouge `#900f17` de la localisation GMAO, bordures `#e6e6e8` / `#d8dce1`) restent littérales, comme
   dans `ExplorerPlansIndex.razor.css`. */

/* État vide (aucun objet fourni, ou aucun résultat pour le filtre). */
.exobj-empty[b-9nmjzvndr9] {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: color-mix(in srgb, var(--ex-text-2) 50%, transparent);
}

/* ----------------------------- Filtre local ----------------------------- */
/* Non collant, comme la recherche des autres panneaux (`.ex-plans-search`) : il défile avec la liste. */
.exobj-filter[b-9nmjzvndr9] {
    display: flex;
    align-items: center;
    gap: 7px;
    background: var(--ex-row-hover);
    border: 1px solid #e6e6e8;
    border-radius: 7px;
    padding: 7px 10px;
    margin-bottom: 11px;
}

.exobj-filter i[b-9nmjzvndr9] {
    font-size: 13px;
    color: var(--ex-text-muted);
}

.exobj-filter input[b-9nmjzvndr9] {
    flex: 1;
    min-width: 0;
    border: none;
    background: transparent;
    outline: none;
    font-size: 12px;
    color: var(--ex-text);
}

.exobj-filter-clear[b-9nmjzvndr9] {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    padding: 0;
    cursor: pointer;
    color: var(--ex-text-muted);
}

.exobj-filter-clear:hover[b-9nmjzvndr9] {
    color: var(--ex-text);
}

/* Compte filtré / total — affiché seulement quand un filtre est actif (le sous-titre du panneau
   annonce le total). */
.exobj-count[b-9nmjzvndr9] {
    padding: 0 2px 8px;
    font-size: 11.5px;
    color: color-mix(in srgb, var(--ex-text-2) 55%, transparent);
}

/* ------------------------------- Rangées ------------------------------- */
/* Rangée = [ligne cliquable (centrer) | groupe d'actions serré (centrer + détail)]. */
.exobj-wrap[b-9nmjzvndr9] {
    display: flex;
    align-items: center;
    gap: 6px;
}

.exobj-row[b-9nmjzvndr9] {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    min-width: 0;   /* la ligne prend la place restante et tronque ; les actions gardent leur taille */
    border: none;
    background: transparent;
    text-align: left;
    padding: 8px;
    border-radius: 7px;
    cursor: pointer;
    font-size: 12.5px;
    color: var(--ex-text);
}

.exobj-row:hover[b-9nmjzvndr9] {
    background: var(--ex-row-hover);
}

.exobj-row--selected[b-9nmjzvndr9],
.exobj-row--selected:hover[b-9nmjzvndr9] {
    background: var(--ex-accent-bg);
}

/* Objet que l'explorateur ne sait pas montrer : éteint plutôt que masqué, la liste reste exacte. */
.exobj-row--off[b-9nmjzvndr9],
.exobj-row--off:hover[b-9nmjzvndr9] {
    cursor: default;
    opacity: .55;
    background: transparent;
}

.exobj-icon[b-9nmjzvndr9] {
    flex: 0 0 auto;
    font-size: 15px;
    color: var(--ex-text-muted);   /* surchargeable en style inline (RowIconColor) */
}

.exobj-name[b-9nmjzvndr9] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-weight: 500;
}

.exobj-sub[b-9nmjzvndr9] {
    flex: 0 1 auto;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 11.5px;
    color: var(--ex-text-muted);
}

/* --------------------------- Actions de fin ---------------------------- */
.exobj-actions[b-9nmjzvndr9] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 2px;
}

.exobj-btn[b-9nmjzvndr9] {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid transparent;
    border-radius: 7px;
    background: transparent;
    color: var(--ex-text-muted);
    cursor: pointer;
    transition: background-color .12s ease, color .12s ease, border-color .12s ease;
}

.exobj-btn:hover[b-9nmjzvndr9] {
    background: var(--ex-accent-hover-bg);
    color: var(--ex-accent);
}

.exobj-btn i[b-9nmjzvndr9] {
    font-size: 15px;
}

/* Bouton « centrer » de l'objet actuellement centré/sélectionné → plein bleu. */
.exobj-btn--active[b-9nmjzvndr9],
.exobj-btn--active:hover[b-9nmjzvndr9] {
    background: var(--ex-accent);
    border-color: var(--ex-accent);
    color: var(--ex-on-accent);
}

/* Localisation GMAO renseignée récemment : le picto de centrage passe au rouge du thème (celui du texte
   `.alert-danger`, pour coller au bandeau du drawer), état actif compris. */
.exobj-btn--warning[b-9nmjzvndr9],
.exobj-btn--warning:hover[b-9nmjzvndr9] {
    color: #900f17;
}

.exobj-btn--warning.exobj-btn--active[b-9nmjzvndr9],
.exobj-btn--warning.exobj-btn--active:hover[b-9nmjzvndr9] {
    background: #900f17;
    border-color: #900f17;
    color: #fff;
}

/* ------------------------- « Charger plus » ---------------------------- */
/* Plafond d'AFFICHAGE (le filtre porte sur la liste entière). Pleine largeur en pied de liste. */
.exobj-more[b-9nmjzvndr9] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    width: 100%;
    margin-top: 10px;
    padding: 9px 10px;
    border: 1px dashed #d8dce1;
    border-radius: 8px;
    background: transparent;
    color: #6b7078;
    font-size: 12px;
    cursor: pointer;
    transition: background-color .12s ease, border-color .12s ease, color .12s ease;
}

.exobj-more:hover[b-9nmjzvndr9] {
    background: var(--ex-row-hover);
    border-color: var(--ex-accent);
    color: var(--ex-accent);
}

.exobj-more i[b-9nmjzvndr9] {
    font-size: 14px;
}
/* /Features/Explorers/Shared/ExplorerSpaceTypesPanel.razor.rz.scp.css */
/* Panneau Espaces partagé (2D et 3D). Styles AUTONOMES, comme ExplorerObjectListView : en 2D la page les
   fournissait par `.ex-plans-root ::deep`, que la maquette 3D n'a pas. Mêmes valeurs que ces primitives,
   donc aucun décalage côté plan. */

.ex-plans-header[b-b69du9x0t2] {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 11px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--ex-text-2);
}

.ex-plans-header i[b-b69du9x0t2] {
    font-size: 15px;
    color: var(--ex-text-muted);
}

.ex-plans-header .ex-plans-header-count[b-b69du9x0t2] {
    margin-left: auto;
    font-size: 11px;
    font-weight: 400;
    color: var(--ex-text-faint);
    letter-spacing: 0;
    text-transform: none;
    font-variant-numeric: tabular-nums;
}

.ex-plans-hint[b-b69du9x0t2] {
    margin: -3px 0 11px;
    font-size: 11px;
    line-height: 1.55;
    color: color-mix(in srgb, var(--ex-text-2) 70%, transparent);
}

.ex-plans-divider[b-b69du9x0t2] {
    border-top: 1px solid var(--ex-fill);
    margin: 11px 0;
}

.ex-plans-empty[b-b69du9x0t2] {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: color-mix(in srgb, var(--ex-text-2) 50%, transparent);
}
/* /Features/Explorers/Shared/SavedViews/ExplorerSavedViewsPanel.razor.rz.scp.css */
/* Onglet « Vues » partagé des explorateurs 3D et liste — préfixe exsv-*.

   Styles AUTONOMES (comme ExplorerObjectListView) : le composant n'hérite ni des primitives `.exl-*`
   injectées par ExplorerListIndex via `::deep`, ni des `.forge-aps-*` d'ExplorerBim — c'est ce qui garantit
   un rendu identique des deux côtés. Les valeurs reprennent celles des primitives `.exl-*` du rail liste. */

.exsv[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
}

/* ---- Textes d'aide, en-têtes ---- */

.exsv-hint[b-8da24dzpin] {
    margin: -3px 0 11px;
    font-size: 11px;
    line-height: 1.55;
    color: rgba(76, 76, 92, .7);
}

.exsv-hint--tight[b-8da24dzpin] {
    margin: 4px 0 0;
}

.exsv-header[b-8da24dzpin] {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0 10px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: #4c4c5c;
}

    .exsv-header i[b-8da24dzpin] {
        font-size: 15px;
        color: #9499a1;
    }

.exsv-section[b-8da24dzpin] {
    display: flex;
    align-items: center;
    gap: 5px;
    margin: 14px 0 4px;
    padding: 0 6px;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #9499a1;
}

.exsv-count[b-8da24dzpin] {
    margin-left: auto;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0;
    color: #6c757d;
    background: #f1f3f5;
    border-radius: 999px;
    padding: 1px 8px;
    font-variant-numeric: tabular-nums;
}

/* ---- Groupes (3D : bâtiments) ---- */

.exsv-group[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
}

.exsv-group-title[b-8da24dzpin],
.exsv-group-header[b-8da24dzpin] {
    display: flex;
    align-items: center;
    gap: 6px;
    width: 100%;
    margin-top: 10px;
    padding: 6px 6px 2px;
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: #4c4c5c;
}

.exsv-group-header[b-8da24dzpin] {
    border: none;
    border-top: 1px solid rgba(0, 0, 0, 0.08);
    background: none;
    cursor: pointer;
    text-align: left;
    color: #6c757d;
}

    .exsv-group-header:hover[b-8da24dzpin] {
        color: #1a1a1a;
    }

.exsv-group-caret[b-8da24dzpin] {
    transition: transform 0.15s ease;
    transform: rotate(90deg);
}

.exsv-group-header.is-collapsed .exsv-group-caret[b-8da24dzpin] {
    transform: none;
}

.exsv-group-name[b-8da24dzpin] {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ---- Boutons ---- */

.exsv-btn[b-8da24dzpin] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    background: #fff;
    border-radius: 8px;
    padding: 6px 10px;
    font-size: 12px;
    color: #4c4c5c;
    cursor: pointer;
}

    .exsv-btn:hover:not(:disabled)[b-8da24dzpin] {
        background: #f8f9fa;
    }

    .exsv-btn:disabled[b-8da24dzpin] {
        opacity: .5;
        cursor: not-allowed;
    }

.exsv-btn--primary[b-8da24dzpin] {
    background: var(--bs-primary, #1178d8);
    border-color: var(--bs-primary, #1178d8);
    color: #fff;
    font-weight: 600;
}

    .exsv-btn--primary:hover:not(:disabled)[b-8da24dzpin] {
        background: var(--bs-primary, #1178d8);
        filter: brightness(1.05);
    }

.exsv-btn--block[b-8da24dzpin] {
    width: 100%;
    justify-content: center;
    margin-bottom: 14px;
}

/* ---- Vue appliquée ---- */

.exsv-current[b-8da24dzpin] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 10px;
}

.exsv-current--dirty[b-8da24dzpin] {
    border-color: #e0a100;
}

.exsv-vicon[b-8da24dzpin] {
    width: 30px;
    height: 30px;
    border-radius: 9px;
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
    color: var(--bs-primary, #1178d8);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 15px;
    flex: none;
}

.exsv-current-text[b-8da24dzpin] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

    .exsv-current-text b[b-8da24dzpin] {
        font-weight: 600;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    .exsv-current-text span[b-8da24dzpin] {
        font-size: 11px;
        color: #9499a1;
    }

    .exsv-current--dirty .exsv-current-text span[b-8da24dzpin] {
        color: #b87d00;
    }

.exsv-current-actions[b-8da24dzpin] {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    margin: 8px 0 14px;
}

/* ---- Formulaire inline ---- */

.exsv-form[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
    gap: 12px;
    border: 1px solid var(--bs-border-color, #e6e6e8);
    border-radius: 10px;
    padding: 10px;
    margin-bottom: 14px;
}

    .exsv-form .exsv-header[b-8da24dzpin],
    .exsv-form .exsv-hint[b-8da24dzpin] {
        margin: 0;
    }

.exsv-field[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.exsv-field-label[b-8da24dzpin] {
    font-size: 0.72rem;
    font-weight: 650;
    color: #6c757d;
}

.exsv-input[b-8da24dzpin] {
    width: 100%;
    border: 1px solid #e6e6e8;
    border-radius: 8px;
    padding: 6px 8px;
    background: #fff;
    font-size: 12.5px;
    color: #1a1a1a;
    outline: none;
}

    .exsv-input:focus[b-8da24dzpin] {
        border-color: var(--bs-primary, #1178d8);
    }

.exsv-radio[b-8da24dzpin] {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 8px 11px;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 8px;
    cursor: pointer;
    margin: 0;
}

    .exsv-radio.is-selected[b-8da24dzpin] {
        border-color: var(--bs-primary, #1178d8);
        background: rgba(17, 120, 216, 0.07);
    }

    .exsv-radio input[b-8da24dzpin] {
        margin-top: 3px;
    }

.exsv-radio-text[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
}

    .exsv-radio-text b[b-8da24dzpin] {
        font-size: 0.82rem;
    }

    .exsv-radio-text small[b-8da24dzpin] {
        font-size: 0.72rem;
        color: #6c757d;
    }

/* Sélecteur de profils, encarté SOUS la radio « Partagée » : il n'apparaît que quand ce niveau est choisi. */
.exsv-roles[b-8da24dzpin] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 0 0 0 22px;
}

.exsv-roles-count[b-8da24dzpin] {
    font-size: 0.72rem;
    color: #6c757d;
}

.exsv-chips[b-8da24dzpin] {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.exsv-chip[b-8da24dzpin] {
    font-size: 0.7rem;
    color: #6c757d;
    background: #f1f3f5;
    border: 1px solid rgba(0, 0, 0, 0.08);
    border-radius: 999px;
    padding: 3px 10px;
    white-space: nowrap;
}

.exsv-form-actions[b-8da24dzpin] {
    display: flex;
    gap: 6px;
    justify-content: flex-end;
}

/* ---- Lignes de vue ---- */

.exsv-row[b-8da24dzpin] {
    position: relative;
    display: flex;
    align-items: stretch;
    gap: 2px;
}

.exsv-row-main[b-8da24dzpin] {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 8px;
    border: none;
    background: transparent;
    text-align: left;
    padding: 7px 8px;
    border-radius: 6px;
    cursor: pointer;
    font-size: 12.5px;
    color: #1a1a1a;
}

    .exsv-row-main:hover:not(:disabled)[b-8da24dzpin] {
        background: #f5f6f8;
    }

    .exsv-row-main:disabled[b-8da24dzpin] {
        cursor: default;
        opacity: .75;
    }

    .exsv-row-main > i[b-8da24dzpin] {
        flex: 0 0 auto;
        font-size: 15px;
        color: #9499a1;
    }

.exsv-row.is-active .exsv-row-main[b-8da24dzpin] {
    background: color-mix(in srgb, var(--bs-primary, #1178d8) 12%, transparent);
    color: var(--bs-primary, #1178d8);
    font-weight: 600;
}

    .exsv-row.is-active .exsv-row-main > i[b-8da24dzpin] {
        color: var(--bs-primary, #1178d8);
    }

.exsv-row-text[b-8da24dzpin] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    line-height: 1.25;
}

.exsv-row-name[b-8da24dzpin],
.exsv-row-text small[b-8da24dzpin] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.exsv-row-text small[b-8da24dzpin] {
    font-size: 11px;
    font-weight: 400;
    color: #9499a1;
}

.exsv-badge[b-8da24dzpin] {
    flex: 0 0 auto;
    font-size: 0.6rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    border-radius: 999px;
    padding: 2px 7px;
}

.exsv-badge--public[b-8da24dzpin] {
    color: #2f9461;
    background: rgba(47, 148, 97, 0.12);
}

/* Partagée : diffusion restreinte, donc une teinte plus froide que le vert « ouvert à tous ». */
.exsv-badge--shared[b-8da24dzpin] {
    color: #1178d8;
    background: rgba(17, 120, 216, 0.12);
}

.exsv-row-more[b-8da24dzpin] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    border: none;
    border-radius: 6px;
    background: none;
    color: #adb5bd;
    cursor: pointer;
}

    .exsv-row-more:hover[b-8da24dzpin] {
        background: #f1f2f4;
        color: #4c4c5c;
    }

.exsv-spin[b-8da24dzpin] {
    animation: exsv-spin-b-8da24dzpin 0.9s linear infinite;
}

@keyframes exsv-spin-b-8da24dzpin {
    to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .exsv-spin[b-8da24dzpin] { animation: none; }
}

/* ---- Menu d'actions (⋯) ---- */

.exsv-menu-backdrop[b-8da24dzpin] {
    position: fixed;
    inset: 0;
    z-index: 1050;
}

.exsv-menu[b-8da24dzpin] {
    position: absolute;
    top: 100%;
    right: 0;
    z-index: 1051;
    min-width: 230px;
    padding: 5px;
    background: #fff;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 9px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
}

.exsv-menu-item[b-8da24dzpin] {
    display: flex;
    align-items: center;
    gap: 9px;
    width: 100%;
    padding: 7px 10px;
    border: none;
    border-radius: 6px;
    background: none;
    color: #1a1a1a;
    font-size: 12.5px;
    text-align: left;
    cursor: pointer;
}

    .exsv-menu-item:hover:not(:disabled)[b-8da24dzpin] {
        background: #f1f3f5;
    }

    .exsv-menu-item:disabled[b-8da24dzpin] {
        opacity: 0.45;
        cursor: not-allowed;
    }

    .exsv-menu-item i[b-8da24dzpin] {
        flex: 0 0 auto;
        font-size: 0.9rem;
        color: #6c757d;
    }

    .exsv-menu-item.is-danger[b-8da24dzpin],
    .exsv-menu-item.is-danger i[b-8da24dzpin] {
        color: #a11f3f;
    }

.exsv-menu-sep[b-8da24dzpin] {
    height: 1px;
    margin: 4px 8px;
    background: rgba(0, 0, 0, 0.1);
}
/* /Features/Infrastructure/Tabs/TabConnectivity.razor.rz.scp.css */
/* Onglet « Connectivité » du Centre de surveillance.
   Les états (ok, warning, ko, inactive, nottested, indeterminate) sont portés par des classes
   is-* et par data-link, et pris dans les variables Bootstrap : clair comme sombre. */

.cx-tab[b-8bcyb81y03] {
    --cx-ok: var(--bs-success);
    --cx-warning: var(--bs-warning);
    --cx-ko: var(--bs-danger);
    --cx-muted: var(--bs-secondary-color);
    --cx-faint: var(--bs-border-color);
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

/* En-tête : description à gauche, heures d'actualisation et « Tout tester maintenant » à droite. Pas de titre : c'est
   celui de l'onglet. */
.cx-head[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .75rem 1.5rem;
}

.cx-subtitle[b-8bcyb81y03] {
    margin: 0;
    color: var(--cx-muted);
    font-size: .875rem;
}

.cx-head-side[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem 1rem;
}

.cx-refresh-info[b-8bcyb81y03] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .75rem;
    margin: 0;
    padding: .25rem .75rem;
    border: 1px solid var(--bs-border-color);
    border-radius: 1rem;
    background: var(--bs-body-bg);
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-refresh-info time[b-8bcyb81y03] {
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--bs-body-color);
}

/* « Tout tester maintenant » : confirmation chiffrée, sous l'en-tête, avant de rien lancer. */
.cx-confirm[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: .75rem 1.5rem;
    padding: .75rem 1rem;
    border: 1px solid var(--bs-primary-border-subtle);
    border-left: 3px solid var(--bs-primary);
    border-radius: .5rem;
    background: var(--bs-body-bg);
}

.cx-confirm-text[b-8bcyb81y03] {
    flex: 1 1 24rem;
    min-width: 0;
    font-size: .875rem;
}

.cx-confirm-title[b-8bcyb81y03] {
    margin-bottom: .25rem;
    font-weight: 600;
}

.cx-confirm-note[b-8bcyb81y03] {
    color: var(--cx-muted);
}

.cx-confirm-actions[b-8bcyb81y03] {
    display: flex;
    gap: .5rem;
}

/* Avancement d'une série de tests demandés, puis son bilan, gardé deux minutes. */
.cx-requests[b-8bcyb81y03] {
    display: flex;
    flex-direction: column;
    gap: .25rem;
    padding: .5rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-radius: .5rem;
    background: var(--bs-tertiary-bg);
    font-size: .875rem;
}

.cx-requests-main[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem 1rem;
}

.cx-requests-label[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* margin: 0 : app.css donne 20 px de marge basse aux .progress, qui décalait la barre vers le haut de la ligne. */
.cx-requests-bar[b-8bcyb81y03] {
    flex: 1 1 10rem;
    max-width: 20rem;
    height: .5rem;
    margin: 0;
}

.cx-requests-hint[b-8bcyb81y03],
.cx-requests-pace[b-8bcyb81y03] {
    margin: 0;
}

.cx-requests-pace[b-8bcyb81y03] {
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-requests-results[b-8bcyb81y03] {
    display: inline-flex;
    flex-wrap: wrap;
    gap: .375rem;
}

.cx-requests-close[b-8bcyb81y03] {
    margin-left: auto;
    font-size: .625rem;
}

.cx-requests.is-finished.is-ok[b-8bcyb81y03] { border-left: 3px solid var(--cx-ok); }
.cx-requests.is-finished.is-warning[b-8bcyb81y03] { border-left: 3px solid var(--cx-warning); }
.cx-requests.is-finished.is-ko[b-8bcyb81y03] { border-left: 3px solid var(--cx-ko); }

.cx-requests.is-finished.is-ok .progress-bar[b-8bcyb81y03] { background-color: var(--cx-ok); }
.cx-requests.is-finished.is-warning .progress-bar[b-8bcyb81y03] { background-color: var(--cx-warning); }
.cx-requests.is-finished.is-ko .progress-bar[b-8bcyb81y03] { background-color: var(--cx-ko); }

/* Indicateurs : quatre tuiles de front quand chacune garde la place de son icône et de son libellé (228 px, la largeur
   qu'elles avaient à six de front dès 90rem), deux sinon — trois colonnes laisseraient la quatrième seule sur sa ligne.
   En auto-fit, des tuiles de 200 px coupaient « OPÉRATIONNELLES » en plein mot. La largeur utile dépend du menu (déplié
   ou replié) et du rail : requête de conteneur, pas de fenêtre. */
.cx-kpis-frame[b-8bcyb81y03] {
    container-type: inline-size;
}

.cx-kpis[b-8bcyb81y03] {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1rem;
}

@container (min-width: 60rem) {
    .cx-kpis[b-8bcyb81y03] {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

/* Chaîne : une grille, quatre colonnes, les liens tracés en SVG derrière les nœuds */
.cx-card[b-8bcyb81y03] {
    margin: 0;
}

.cx-scroll[b-8bcyb81y03] {
    overflow-x: auto;
}

.cx-grid[b-8bcyb81y03] {
    position: relative;
    display: grid;
    grid-template-columns: minmax(10rem, .8fr) minmax(12rem, 1fr) minmax(15rem, 1.3fr) minmax(12rem, 1fr);
    column-gap: 4.5rem;
    row-gap: .75rem;
    min-width: 64rem;
    padding: 1.25rem 1.5rem 1.5rem;
}

.cx-colhead[b-8bcyb81y03] {
    grid-row: 1;
    padding-bottom: .5rem;
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--cx-muted);
}

.cx-col-platform[b-8bcyb81y03] { grid-column: 1; }
.cx-col-api[b-8bcyb81y03] { grid-column: 2; }
.cx-col-connector[b-8bcyb81y03] { grid-column: 3; }
.cx-col-system[b-8bcyb81y03] { grid-column: 4; }
.cx-col-service[b-8bcyb81y03] { grid-column: 3 / 5; }

/* Regroupement par service du bâtiment : l'en-tête d'un service coiffe ses connecteurs et leurs systèmes. */
.cx-service[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .375rem .625rem;
    width: 100%;
    padding: .75rem 0 .375rem;
    border-bottom: 1px solid var(--cx-faint);
}

.cx-service-icon[b-8bcyb81y03] {
    font-size: 1.125rem;
    color: var(--cx-muted);
}

.cx-service-name[b-8bcyb81y03] {
    min-width: 0;
    overflow: hidden;
    font-weight: 600;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cx-service-alarms[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    margin-left: auto;
    font-size: .8125rem;
    color: var(--bs-danger-text-emphasis);
}

/* Barre d'outils du schéma : « Regrouper : » à gauche, paramétrage des services à droite. */
.cx-toolbar[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .5rem 1rem;
}

.cx-cell[b-8bcyb81y03] {
    grid-row: var(--row) / span var(--span);
    display: flex;
    align-items: center;
    min-width: 0;
}

.cx-edges[b-8bcyb81y03] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    overflow: visible;
    pointer-events: none;
}

.cx-edges[b-8bcyb81y03]  .cx-edge {
    fill: none;
    stroke: var(--bs-border-color);
    stroke-width: 2;
    stroke-dasharray: 6 5;
}

.cx-edges[b-8bcyb81y03]  .cx-edge.is-ok { stroke: var(--bs-success); }
.cx-edges[b-8bcyb81y03]  .cx-edge.is-warning { stroke: var(--bs-warning); }
.cx-edges[b-8bcyb81y03]  .cx-edge.is-ko { stroke: var(--bs-danger); stroke-dasharray: 2 4; stroke-linecap: round; }
.cx-edges[b-8bcyb81y03]  .cx-edge.is-inactive { stroke: var(--bs-secondary-color); opacity: .55; }
.cx-edges[b-8bcyb81y03]  .cx-edge.is-nottested { stroke-dasharray: 2 5; stroke-linecap: round; }
.cx-edges[b-8bcyb81y03]  .cx-edge.is-indeterminate { stroke: var(--bs-secondary-color); stroke-dasharray: 2 6; stroke-linecap: round; opacity: .5; }

/* Flux OK animé : le pointillé avance dans le sens du tracé, de Cockpit vers les systèmes. Seul ce qui passe
   bouge ; un système silencieux ou un lien KO reste immobile. Décalage = une période du pointillé (6 + 5). */
@keyframes cx-flow-b-8bcyb81y03 {
    to { stroke-dashoffset: -11; }
}

.cx-edges[b-8bcyb81y03]  .cx-edge.is-ok { animation: cx-flow-b-8bcyb81y03 .9s linear infinite; }

@media (prefers-reduced-motion: reduce) {
    .cx-edges[b-8bcyb81y03]  .cx-edge.is-ok { animation: none; }
}

/* Nœuds */
.cx-node[b-8bcyb81y03] {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    gap: .375rem;
    width: 100%;
    min-width: 0;
    padding: .75rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-left: 3px solid var(--cx-link, var(--bs-border-color));
    border-radius: .5rem;
    background: var(--bs-body-bg);
    color: var(--bs-body-color);
    text-align: left;
    font: inherit;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}

button.cx-node[b-8bcyb81y03] {
    cursor: pointer;
    transition: box-shadow .15s ease, border-color .15s ease;
}

button.cx-node:hover[b-8bcyb81y03] {
    box-shadow: 0 2px 8px rgba(0, 0, 0, .1);
}

button.cx-node:focus-visible[b-8bcyb81y03] {
    outline: 2px solid var(--bs-primary);
    outline-offset: 2px;
}

.cx-node.is-selected[b-8bcyb81y03] {
    border-color: var(--bs-primary);
    box-shadow: 0 0 0 1px var(--bs-primary);
}

.cx-node[data-link="ok"][b-8bcyb81y03] { --cx-link: var(--bs-success); }
.cx-node[data-link="warning"][b-8bcyb81y03] { --cx-link: var(--bs-warning); }
.cx-node[data-link="ko"][b-8bcyb81y03] { --cx-link: var(--bs-danger); }
.cx-node[data-link="inactive"][b-8bcyb81y03] { --cx-link: var(--bs-secondary-color); }

.cx-node.is-stale .cx-chips[b-8bcyb81y03] {
    opacity: .6;
}

/* Le nœud Cockpit s'inverse avec le thème, comme sur la maquette */
.cx-node-platform[b-8bcyb81y03] {
    border: 0;
    background: var(--bs-body-color);
    color: var(--bs-body-bg);
}

.cx-node-platform .cx-kicker[b-8bcyb81y03] {
    color: inherit;
    opacity: .7;
}

.cx-node-system[b-8bcyb81y03] {
    border-style: dashed;
    border-left-style: solid;
    background: var(--bs-tertiary-bg);
}

.cx-kicker[b-8bcyb81y03] {
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--cx-muted);
}

.cx-node-title[b-8bcyb81y03] {
    overflow: hidden;
    font-weight: 600;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cx-node-row[b-8bcyb81y03] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    min-width: 0;
}

.cx-node-status[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font-size: .8125rem;
}

.cx-node-meta[b-8bcyb81y03] {
    font-size: .75rem;
    color: var(--cx-muted);
}

/* Icône du type de vérification devant sa date : ⇄ test de bout en bout, base de données pour la fraîcheur des mesures. */
.cx-kind[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    cursor: help;
}

.cx-kind i[b-8bcyb81y03] {
    flex-shrink: 0;
    font-size: .875rem;
}

.cx-node-platform .cx-node-meta[b-8bcyb81y03] {
    color: inherit;
    opacity: .7;
}

.cx-empty[b-8bcyb81y03] {
    padding: .5rem 0;
    font-size: .8125rem;
    font-style: italic;
    color: var(--cx-muted);
}

/* Rangée de pastilles d'état : les pastilles elles-mêmes sont le composant StatusPill (app.css § 36 Badges) */
.cx-chips[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    gap: .375rem;
}

.cx-dot[b-8bcyb81y03] {
    display: inline-block;
    flex-shrink: 0;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: currentColor;
}

.cx-dot.is-ok[b-8bcyb81y03] { background: var(--cx-ok); }
.cx-dot.is-warning[b-8bcyb81y03] { background: var(--cx-warning); }
.cx-dot.is-ko[b-8bcyb81y03] { background: var(--cx-ko); }
.cx-dot.is-inactive[b-8bcyb81y03],
.cx-dot.is-nottested[b-8bcyb81y03],
.cx-dot.is-indeterminate[b-8bcyb81y03] { background: var(--cx-muted); }

/* Détail d'un nœud */
.cx-detail[b-8bcyb81y03] {
    margin: 0;
}

.cx-detail-head[b-8bcyb81y03] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: .75rem;
}

.cx-detail-title[b-8bcyb81y03] {
    margin: .125rem 0 0;
    font-weight: 600;
}

.cx-facts[b-8bcyb81y03] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
    gap: .75rem 1.5rem;
    margin: 0 0 .75rem;
}

.cx-facts dt[b-8bcyb81y03] {
    font-size: .75rem;
    font-weight: 600;
    color: var(--cx-muted);
}

.cx-facts dd[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .375rem;
    margin: .125rem 0 0;
}

.cx-facts-wide[b-8bcyb81y03] {
    grid-column: 1 / -1;
}

.cx-fact-note[b-8bcyb81y03] {
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-version-changes[b-8bcyb81y03] {
    display: flex;
    flex-direction: column;
    gap: .25rem;
    width: 100%;
    margin: 0;
    padding: 0;
    list-style: none;
}

.cx-version-changes li[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0 .5rem;
    overflow-wrap: anywhere;
}

.cx-note[b-8bcyb81y03] {
    margin: 0 0 1rem;
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-subhead[b-8bcyb81y03] {
    margin: 1rem 0 .5rem;
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--cx-muted);
}

.cx-health[b-8bcyb81y03],
.cx-systems[b-8bcyb81y03] {
    display: flex;
    flex-direction: column;
    gap: .375rem;
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: .875rem;
}

.cx-health li[b-8bcyb81y03],
.cx-system-line[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem;
}

.cx-systems[b-8bcyb81y03] {
    gap: .75rem;
}

/* Tests de connectivité d'un système, sous sa ligne */
.cx-checks[b-8bcyb81y03] {
    display: flex;
    flex-direction: column;
    gap: .375rem;
    margin: .375rem 0 0;
    padding: 0 0 0 1rem;
    border-left: 2px solid var(--bs-border-color);
    list-style: none;
}

.cx-check-line[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .5rem;
}

.cx-check-meta[b-8bcyb81y03] {
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-check-action[b-8bcyb81y03] {
    margin-left: auto;
}

.cx-check-requested[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    font-size: .8125rem;
    color: var(--cx-muted);
}

.cx-check-failure[b-8bcyb81y03] {
    font-size: .8125rem;
    color: var(--bs-danger-text-emphasis);
}

.cx-check-none[b-8bcyb81y03] {
    margin: .25rem 0 0;
    font-size: .8125rem;
    font-style: italic;
    color: var(--cx-muted);
}

.cx-detail-actions[b-8bcyb81y03] {
    display: flex;
    align-items: center;
    gap: .5rem;
}

/* Derniers logs d'un connecteur : erreurs ou avertissements, au choix. */
.cx-logs-head[b-8bcyb81y03] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .375rem 1rem;
}

/* Bascule erreurs / avertissements : les pastilles de la carte du connecteur, cliquables. La sélection porte un liseré de
   sa propre couleur ; le sous-titre qui les contient est en capitales espacées, qu'elles ne reprennent pas. */
.cx-logs-switch[b-8bcyb81y03] {
    display: inline-flex;
    flex-wrap: wrap;
    gap: .375rem;
}

/* Test d'une série déjà passé : son résultat vient d'arriver. */
.cx-check-received[b-8bcyb81y03] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    font-size: .75rem;
    font-weight: 600;
    color: var(--bs-success-text-emphasis);
}

.cx-errors[b-8bcyb81y03] {
    margin: 0;
    font-size: .8125rem;
}

/* Textes venus du BOS : du JSON ou un nom de classe d'un seul tenant n'offre aucun point de coupure. À 400 px, un
   message de log élargissait le tableau à 618 px pour 348 disponibles, et un code d'erreur (raison d'un échec de l'API,
   référence) faisait défiler toute la page. « anywhere », et non le « break-word » déjà hérité : lui seul réduit la
   largeur minimale que retiennent un tableau et un élément flex (dd). */
.cx-errors-message[b-8bcyb81y03],
.cx-facts dd code[b-8bcyb81y03] {
    overflow-wrap: anywhere;
}

/* Écran étroit : la chaîne s'empile, les liens tracés disparaissent au profit de la bordure colorée */
@media (max-width: 991.98px) {
    .cx-scroll[b-8bcyb81y03] {
        overflow-x: visible;
    }

    .cx-grid[b-8bcyb81y03] {
        display: flex;
        flex-direction: column;
        gap: .5rem;
        min-width: 0;
        padding: 1rem;
    }

    .cx-colhead[b-8bcyb81y03],
    .cx-edges[b-8bcyb81y03],
    .cx-col-platform[b-8bcyb81y03] {
        display: none;
    }

    .cx-col-api[b-8bcyb81y03] {
        margin-top: .75rem;
    }

    .cx-col-connector[b-8bcyb81y03],
    .cx-col-service[b-8bcyb81y03] {
        padding-left: 1rem;
    }

    .cx-col-system[b-8bcyb81y03] {
        padding-left: 2rem;
    }
}
/* /Features/Infrastructure/Tabs/TabIncidents.razor.rz.scp.css */
/* Onglet « Incidents » de l'État de l'infrastructure : le journal des pannes.
   Couleurs prises dans les variables Bootstrap : clair comme sombre. */

.ij-tab[b-m6yyosegqx] {
    --ij-ko: var(--bs-danger);
    --ij-ok: var(--bs-success);
    --ij-muted: var(--bs-secondary-color);
    --ij-line: var(--bs-border-color);
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.ij-subtitle[b-m6yyosegqx] {
    margin: 0;
    color: var(--ij-muted);
    font-size: .875rem;
}

/* Bandeau : les incidents en cours, et depuis quand la supervision n'a rien vérifié. */
.ij-status[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .25rem 1rem;
    padding: .5rem .875rem;
    border-radius: .5rem;
    font-size: .875rem;
}

.ij-status.is-ko[b-m6yyosegqx] { background: var(--bs-danger-bg-subtle); color: var(--bs-danger-text-emphasis); }
.ij-status.is-warning[b-m6yyosegqx] { background: var(--bs-warning-bg-subtle); color: var(--bs-warning-text-emphasis); }
.ij-status.is-ok[b-m6yyosegqx] { background: var(--bs-success-bg-subtle); color: var(--bs-success-text-emphasis); }

.ij-status-main[b-m6yyosegqx] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font-weight: 600;
}

.ij-status-main i[b-m6yyosegqx] {
    font-size: 1.125rem;
}

.ij-status-supervision[b-m6yyosegqx] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
}

/* Filtres : période, nature, source, recherche. */
.ij-filters[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem;
}

.ij-select[b-m6yyosegqx] {
    width: auto;
    max-width: 100%;
}

.ij-search[b-m6yyosegqx] {
    flex: 1 1 12rem;
    min-width: 0;
}

.ij-section[b-m6yyosegqx] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
}

.ij-section-head[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: .25rem 1rem;
}

.ij-section-title[b-m6yyosegqx] {
    margin: 0;
    font-size: .875rem;
    font-weight: 600;
    color: var(--ij-muted);
}

.ij-section-note[b-m6yyosegqx] {
    font-size: .8125rem;
    color: var(--ij-muted);
}

.ij-empty[b-m6yyosegqx] {
    margin: 0;
    padding: 1rem 0;
    color: var(--ij-muted);
    font-size: .875rem;
}

/* Carte d'une panne en cours (fond et coins : .card du thème). */
.ij-card[b-m6yyosegqx] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    padding: .75rem 1rem;
    border-color: var(--bs-danger-border-subtle);
    border-left: 3px solid var(--ij-ko);
}

.ij-card-head[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: .25rem 1rem;
}

.ij-card-title[b-m6yyosegqx] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font-weight: 600;
}

.ij-card-since[b-m6yyosegqx] {
    color: var(--ij-ko);
    font-size: .875rem;
    white-space: nowrap;
}

.ij-chips[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    gap: .375rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.ij-chip[b-m6yyosegqx] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    padding: .125rem .5rem;
    border: 1px solid var(--ij-line);
    border-radius: 1rem;
    background: var(--bs-tertiary-bg);
    font-size: .8125rem;
    color: var(--bs-body-color);
}

/* Ce que la supervision constate maintenant : raisons d'échec, perdues une fois la panne résolue. */
.ij-live[b-m6yyosegqx] {
    font-size: .8125rem;
}

.ij-live-label[b-m6yyosegqx] {
    color: var(--ij-muted);
}

.ij-live ul[b-m6yyosegqx] {
    margin: .125rem 0 0;
    padding-left: 1.25rem;
    overflow-wrap: anywhere;
}

.ij-facts[b-m6yyosegqx] {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem 1.25rem;
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: .8125rem;
    color: var(--ij-muted);
}

.ij-facts li[b-m6yyosegqx] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .375rem;
}

/* Historique, dans une carte : un titre par jour, une ligne par panne ou changement de version. */
.ij-history[b-m6yyosegqx] {
    padding: .25rem 1rem .5rem;
}

.ij-day[b-m6yyosegqx] {
    margin: .75rem 0 0;
    padding-bottom: .25rem;
    border-bottom: 1px solid var(--ij-line);
    font-size: .8125rem;
    font-weight: 600;
    color: var(--ij-muted);
}

.ij-list[b-m6yyosegqx] {
    margin: 0;
    padding: 0;
    list-style: none;
}

.ij-item[b-m6yyosegqx] {
    border-bottom: 1px solid var(--ij-line);
}

.ij-item:last-child[b-m6yyosegqx] {
    border-bottom: 0;
}

.ij-row[b-m6yyosegqx] {
    display: grid;
    grid-template-columns: 3.5rem 1.25rem minmax(0, 1fr) auto 1rem;
    align-items: start;
    gap: .625rem;
    width: 100%;
    padding: .5625rem .25rem;
    border: 0;
    background: none;
    color: inherit;
    font: inherit;
    text-align: left;
}

button.ij-row:hover[b-m6yyosegqx] {
    background: var(--bs-tertiary-bg);
}

.ij-item.is-version .ij-row[b-m6yyosegqx] {
    grid-template-columns: 3.5rem 1.25rem minmax(0, 1fr);
}

.ij-time[b-m6yyosegqx] {
    font-size: .875rem;
    font-variant-numeric: tabular-nums;
    color: var(--ij-muted);
    text-align: right;
}

.ij-state[b-m6yyosegqx] {
    font-size: 1.125rem;
    line-height: 1.25rem;
    color: var(--ij-muted);
}

.ij-state.is-ongoing[b-m6yyosegqx] { color: var(--ij-ko); }
.ij-state.is-resolved[b-m6yyosegqx] { color: var(--ij-ok); }

.ij-main[b-m6yyosegqx] {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.ij-title[b-m6yyosegqx] {
    font-weight: 600;
    overflow-wrap: anywhere;
}

.ij-sub[b-m6yyosegqx] {
    font-size: .8125rem;
    color: var(--ij-muted);
    overflow-wrap: anywhere;
}

.ij-end[b-m6yyosegqx] {
    font-size: .8125rem;
    color: var(--ij-muted);
    white-space: nowrap;
    text-align: right;
}

.ij-end.is-ongoing[b-m6yyosegqx] {
    color: var(--ij-ko);
}

.ij-caret[b-m6yyosegqx] {
    color: var(--ij-muted);
    transition: transform .15s ease;
}

.ij-item.is-expanded .ij-caret[b-m6yyosegqx] {
    transform: rotate(180deg);
}

/* Détail d'une panne, sous sa ligne, aligné sur le titre. */
.ij-detail[b-m6yyosegqx] {
    display: flex;
    flex-direction: column;
    gap: .625rem;
    margin: 0 0 .75rem 5.5rem;
    padding: .625rem .875rem;
    border-radius: .5rem;
    background: var(--bs-tertiary-bg);
    font-size: .8125rem;
}

.ij-steps[b-m6yyosegqx] {
    display: flex;
    flex-direction: column;
    gap: .25rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.ij-step[b-m6yyosegqx] {
    display: grid;
    grid-template-columns: minmax(3rem, auto) 1rem minmax(0, 1fr);
    align-items: baseline;
    gap: .5rem;
}

.ij-step-time[b-m6yyosegqx] {
    font-variant-numeric: tabular-nums;
    color: var(--ij-muted);
    white-space: nowrap;
}

.ij-step.is-start i[b-m6yyosegqx] { color: var(--ij-ko); }
.ij-step.is-end i[b-m6yyosegqx] { color: var(--ij-ok); }
.ij-step.is-mail i[b-m6yyosegqx],
.ij-step.is-version i[b-m6yyosegqx] { color: var(--ij-muted); }

.ij-step-badge[b-m6yyosegqx] {
    display: inline-block;
    margin-left: .375rem;
    padding: 0 .375rem;
    border: 1px solid var(--ij-line);
    border-radius: 1rem;
    font-size: .75rem;
    color: var(--ij-muted);
}

.ij-concurrent-label[b-m6yyosegqx] {
    color: var(--ij-muted);
}

.ij-concurrent ul[b-m6yyosegqx] {
    margin: .125rem 0 0;
    padding-left: 1.25rem;
}

.ij-detail .ij-facts[b-m6yyosegqx] {
    padding-top: .5rem;
    border-top: 1px solid var(--ij-line);
}

/* Téléphone : l'heure de fin passe sous le titre, le détail reprend toute la largeur. */
@media (max-width: 575.98px) {
    .ij-row[b-m6yyosegqx] {
        grid-template-columns: 3rem 1.25rem minmax(0, 1fr) 1rem;
    }

    .ij-end[b-m6yyosegqx] {
        grid-column: 3;
        grid-row: 2;
        text-align: left;
        white-space: normal;
    }

    .ij-caret[b-m6yyosegqx] {
        grid-column: 4;
        grid-row: 1;
    }

    .ij-detail[b-m6yyosegqx] {
        margin-left: 0;
    }
}
/* /Features/MetricsExplorer/MetricsExplorer.razor.rz.scp.css */
/* Racine : remplit son hôte. Popup DevExpress : le corps de la modale ne donne pas de hauteur définie à ses
   enfants → hauteur relative au viewport (valeur héritée de l'ancien conteneur, ≈ hauteur de la popup moins
   son en-tête ; en mode réduit la popup fait 72vh). Page : la colonne .mx-page donne la hauteur. */
.mx-root[b-37r9hxtrmz] {
    position: relative;   /* ancre du voile qui referme la palette de couleurs */
    height: 100%;
    width: 100%;
    overflow: hidden;
    background: #fff;
}

/* Panneau bas agrandi (maquette : ⤢) : il prend toute la hauteur, graphe et poignée s'effacent. */
.mx-root--bottom-max[b-37r9hxtrmz]  .mx-main,
.mx-root--bottom-max[b-37r9hxtrmz]  .mx-split {
    display: none;
}

.mx-root--popup[b-37r9hxtrmz] {
    height: calc(90vh - 56px);
}

.mx-root--popup.mx-root--reduced[b-37r9hxtrmz] {
    height: calc(67vh - 56px);
}

.mx-root--page[b-37r9hxtrmz] {
    height: auto;
    flex: 1 1 auto;
    min-height: 0;
}

/* Mode réduit (« Afficher l'historique ») : le graphe seul — ni rail, ni panneau latéral. Le RailNav reste
   monté pour que le dépliage n'ait rien à recréer ; on n'en montre que le viewport. */
.mx-root--reduced[b-37r9hxtrmz]  .railnav-rail,
.mx-root--reduced[b-37r9hxtrmz]  .railnav-band,
.mx-root--reduced[b-37r9hxtrmz]  .railnav-panel {
    display: none;
}

/* ------------------------------------------------------------------
   Viewport = colonne : zone principale (en-tête + graphes, défile) | poignée de split | panneau bas.
   Tout ce qui suit est slotté dans RailNav → ::deep depuis la racine, comme ExplorerPlansIndex.
------------------------------------------------------------------- */
.mx-root[b-37r9hxtrmz]  .mx-viewport {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}

/* Arbre en surimpression (lot E), panneau REPLIÉ : sa bande de 34 px flotte elle aussi sur la vue, et rognait le
   bord gauche de l'en-tête, du graphe et du panneau bas (vu le 17/09 à 800 px). La vue s'en écarte d'autant.
   Déplié, le panneau recouvre la vue le temps du choix, sans la pousser — c'est l'objet de la surimpression.
   Rembourrage et non marge : la largeur mesurée de .mx-viewport ne bouge pas, le seuil de disposition non plus. */
.mx-root[b-37r9hxtrmz]  .railnav--overlay.railnav--collapsed .mx-viewport {
    padding-left: var(--rn-p2);
}

.mx-root[b-37r9hxtrmz]  .mx-main {
    flex: 1 1 auto;
    min-height: 0;
    min-width: 0;
    display: flex;
    flex-direction: column;
    overflow-y: auto;
    padding: 12px 16px 8px;
}

/* Les barres d'en-tête gardent leur hauteur ; l'hôte des graphes prend le reste. */
.mx-root[b-37r9hxtrmz]  .mx-main > * {
    flex: 0 0 auto;
}

/* Hôte des graphes. Graphe combiné en hauteur 100 % : ApexCharts la résout sur ce parent (et ne fige alors
   aucune hauteur inline), puis la recalcule au « resize » relayé par app.tools.observeResize. En sous-graphes,
   la pile (180 px chacun) défile ici et l'en-tête reste visible. Le plancher évite un graphe écrasé quand le
   panneau bas est très haut : la zone principale défile alors. */
.mx-root[b-37r9hxtrmz]  .mx-chart-host {
    flex: 1 1 0;
    min-height: 220px;
    overflow: hidden;
}

.mx-root[b-37r9hxtrmz]  .mx-chart-host--stack {
    overflow-y: auto;
}

/* En-tête du mode réduit : la mesure lue et sa dernière valeur (mise à jour en direct). */
.mx-root[b-37r9hxtrmz]  .mx-focus {
    display: flex;
    align-items: baseline;
    gap: 8px;
    min-width: 0;
}

/* Ligne d'affichage : un filet entre le trace (mode, courbe ou barres) et ce qui se lit en fond (seuils, jours fermes). */
.mx-root[b-37r9hxtrmz]  .mx-bar-sep {
    width: 1px;
    height: 20px;
    background: var(--kd-border);
}

.mx-root[b-37r9hxtrmz]  .mx-focus-value {
    font-size: 18px;
    font-weight: 700;
    color: #1a1a1a;
    font-variant-numeric: tabular-nums;
}

/* Menu « Comparer » : liste déroulante ancrée sous son bouton. */
.mx-root[b-37r9hxtrmz]  .mx-compare {
    position: relative;
}

.mx-root[b-37r9hxtrmz]  .mx-compare-menu {
    position: absolute;
    top: 100%;
    right: 0;
    z-index: 1100;
    min-width: 240px;
    padding: 4px;
}

/* Période personnalisée : panneau ancré sous le bouton, hors du flux — l'en-tête ne se décale pas. */
.mx-root[b-37r9hxtrmz]  .mx-custom-period {
    position: relative;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-caret {
    font-size: 0.75em;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-menu {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    z-index: 1100;
    width: 300px;
    padding: 12px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-shift {
    padding-inline: 6px;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-presets {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-presets .btn {
    font-size: 11px;
    padding: 2px 8px;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-title {
    font-weight: 600;
    font-size: 0.85rem;
}

.mx-root[b-37r9hxtrmz]  .mx-custom-hint {
    font-size: 0.75rem;
    color: var(--bs-secondary-color);
}

.mx-root[b-37r9hxtrmz]  .mx-custom-actions {
    display: flex;
    justify-content: flex-end;
    gap: 6px;
}

/* Poignée de split : le JS (app.tools.initVerticalSplit) fixe la hauteur du panneau bas en style inline —
   attribut que Blazor ne rend pas, donc n'écrase pas au re-rendu. Inopérante panneau replié. */
.mx-root[b-37r9hxtrmz]  .mx-split {
    flex: 0 0 7px;
    cursor: row-resize;
    background: #f1f2f4;
    border-top: 1px solid #e6e6e8;
    border-bottom: 1px solid #e6e6e8;
    touch-action: none;
}

.mx-root[b-37r9hxtrmz]  .mx-split:hover {
    background: #dfe3e8;
}

.mx-root[b-37r9hxtrmz]  .mx-split--disabled {
    pointer-events: none;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom {
    flex: 0 0 auto;
    height: 260px;
    min-height: 0;
    display: flex;
    flex-direction: column;
    background: #fff;
}

/* Affichage étroit (lot E) : le panneau bas ne prend jamais plus de la moitié de la hauteur — sa hauteur est en
   pixels (poignée), et sur une fenêtre basse il écrasait le graphe à son plancher et faisait défiler la page
   (mesuré : 933 px d'explorateur dans une fenêtre de 768). Agrandi, il prend tout, comme avant. */
.mx-root[b-37r9hxtrmz]  .mx-bottom:not(.mx-bottom--max) {
    max-height: 50%;
}

/* !important : prime sur la hauteur inline posée par la poignée, qu'on garde pour le dépliage. */
.mx-root[b-37r9hxtrmz]  .mx-bottom--collapsed {
    height: 36px !important;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom--max {
    height: auto !important;
    flex: 1 1 auto;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-tabs {
    flex: 0 0 36px;
    display: flex;
    align-items: center;
    gap: 2px;
    padding: 0 8px;
    border-bottom: 1px solid #eee;
    /* Dernier recours quand même les icônes ne tiennent pas : la barre défile, la page non. */
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-tab {
    display: inline-flex;
    flex: 0 0 auto;
    align-items: center;
    gap: 6px;
    border: none;
    background: transparent;
    border-radius: 6px;
    padding: 5px 10px;
    font-size: 12px;
    font-weight: 600;
    color: #6b7078;
    white-space: nowrap;   /* « Valeurs brutes » passait sur deux lignes */
    cursor: pointer;
}

.mx-root--narrow[b-37r9hxtrmz]  .mx-bottom-tab {
    padding-inline: 8px;
}

/* Liste courte d'agrégation (disposition étroite) : à la largeur de son plus long libellé. */
.mx-root[b-37r9hxtrmz]  .mx-bucket-select {
    width: auto;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-tab i {
    font-size: 15px;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-tab:hover {
    background: #f6f7f9;
    color: #1a1a1a;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-tab.is-active {
    color: var(--bs-primary);
    background: color-mix(in srgb, var(--bs-primary) 12%, transparent);
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-badge {
    font-size: 10px;
    font-weight: 600;
    line-height: 1;
    color: #fff;
    background: var(--bs-primary);
    border-radius: 999px;
    padding: 3px 6px;
    font-variant-numeric: tabular-nums;
}

/* Actions à droite de la barre d'onglets : export (valeurs brutes), repli, agrandissement. */
.mx-root[b-37r9hxtrmz]  .mx-bottom-actions {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 2px;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-action {
    height: 28px;
    min-width: 28px;
    padding: 0 6px;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: #9499a1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
    font-size: 12px;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-action:hover {
    background: #f1f2f4;
    color: #4c4c5c;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-action:disabled {
    opacity: .4;
    cursor: default;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-export {
    border: 1px solid #e6e6e8;
    color: #4c4c5c;
    margin-right: 6px;
    font-weight: 600;
}

.mx-root[b-37r9hxtrmz]  .mx-bottom-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
}

/* ------------------------------------------------------------------
   Onglet Métriques (lot 3) : la table de traces — une ligne par mesure, ses réglages de rendu en ligne.
------------------------------------------------------------------- */
.mx-root[b-37r9hxtrmz]  .mx-traces-head {
    position: sticky;
    top: 0;
    z-index: 2;
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 8px 12px;
    background: #f7f8fa;
    border-bottom: 1px solid #ececef;
    font-size: 12px;
    color: #4c4c5c;
}

.mx-root[b-37r9hxtrmz]  .mx-traces-count strong {
    color: #1a1a1a;
}

.mx-root[b-37r9hxtrmz]  .mx-traces-actions {
    margin-left: auto;
    display: flex;
    gap: 18px;
}

.mx-root[b-37r9hxtrmz]  .mx-traces-actions .btn {
    font-size: 12px;
    font-weight: 600;
    text-decoration: none;
}

/* Seuil de lisibilite (D2) : on previent, on ne refuse rien. */
.mx-root[b-37r9hxtrmz]  .mx-traces-warn {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 0 0 6px;
    padding: 6px 10px;
    border-radius: 6px;
    background: #fff7e6;
    color: #8a5a00;
    font-size: 12px;
}

/* Vue enregistree ouverte (lot 4) : au bout de la ligne d'affichage depuis le 22/09/2026, alignee sur ses boutons ; la
   croix la quitte sans toucher a la selection. */
.mx-root[b-37r9hxtrmz]  .mx-view-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    max-width: 100%;
    padding: 2px 8px 2px 10px;
    border-radius: 100px;
    background: #e8f4ff;
    color: #0b5cab;
    font-size: 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-view-chip i {
    font-size: 13px;
}

.mx-root[b-37r9hxtrmz]  .mx-view-leave {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: transparent;
    color: inherit;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-view-leave:hover {
    background: rgba(11, 92, 171, .12);
}

.mx-root[b-37r9hxtrmz]  .mx-view-warn {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 6px;
    background: #fff7e6;
    color: #8a5a00;
    font-size: 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-traces {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-traces th {
    padding: 8px 10px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: #6b7078;
    text-align: left;
    white-space: nowrap;
    border-bottom: 1px solid #ececef;
}

.mx-root[b-37r9hxtrmz]  .mx-traces td {
    padding: 6px 10px;
    vertical-align: middle;
    border-bottom: 1px solid #f1f2f4;
}

.mx-root[b-37r9hxtrmz]  .mx-traces tr.is-hidden td {
    opacity: .55;
}

.mx-root[b-37r9hxtrmz]  .mx-col-vis {
    width: 36px;
    text-align: center;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-check {
    margin: 0;
    width: 16px;
    height: 16px;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-id {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 200px;
}

.mx-root[b-37r9hxtrmz]  .mx-swatch {
    flex: 0 0 auto;
    width: 10px;
    height: 10px;
    border-radius: 2px;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-name {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
    min-width: 0;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-name strong {
    font-weight: 600;
    color: #1a1a1a;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-name code {
    font-size: 10px;
    color: #9499a1;
    background: none;
    padding: 0;
}

/* Couleur : un bouton à la couleur de la trace, la palette dépliée dessous ; le voile referme au clic ailleurs. */
.mx-root[b-37r9hxtrmz]  .mx-color {
    position: relative;
}

.mx-root[b-37r9hxtrmz]  .mx-color-btn {
    width: 60px;
    height: 26px;
    padding: 0 6px;
    border: none;
    border-radius: 6px;
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-color-menu {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 1101;
    margin-top: 4px;
    padding: 6px;
    display: grid;
    grid-template-columns: repeat(6, 22px);
    gap: 6px;
    background: #fff;
    border: 1px solid #e6e6e8;
    border-radius: 8px;
    box-shadow: 0 6px 20px rgba(0, 0, 0, .12);
}

.mx-root[b-37r9hxtrmz]  .mx-color-swatch {
    width: 22px;
    height: 22px;
    padding: 0;
    border: 2px solid transparent;
    border-radius: 5px;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-color-swatch.is-current,
.mx-root[b-37r9hxtrmz]  .mx-color-swatch:hover {
    border-color: #1a1a1a;
}

.mx-root[b-37r9hxtrmz]  .mx-backdrop {
    position: absolute;
    inset: 0;
    z-index: 1100;
}

.mx-root[b-37r9hxtrmz]  .mx-stepper {
    display: inline-flex;
    align-items: center;
    height: 26px;
    border: 1px solid #e6e6e8;
    border-radius: 6px;
}

.mx-root[b-37r9hxtrmz]  .mx-stepper button {
    width: 24px;
    height: 100%;
    border: none;
    background: transparent;
    color: #6b7078;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-stepper button:disabled {
    color: #cfd2d8;
    cursor: default;
}

.mx-root[b-37r9hxtrmz]  .mx-stepper span {
    min-width: 28px;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

.mx-root[b-37r9hxtrmz]  .mx-select {
    width: auto;
    min-width: 96px;
    height: 26px;
    padding: 2px 26px 2px 8px;
    font-size: 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-bound {
    width: 76px;
    height: 26px;
    padding: 2px 6px;
    font-size: 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-bound::placeholder {
    color: #9499a1;
}

.mx-root[b-37r9hxtrmz]  .mx-col-remove {
    width: 36px;
    text-align: center;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-remove {
    width: 26px;
    height: 26px;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: #9499a1;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-trace-remove:hover {
    background: #fdecec;
    color: #d83c31;
}

/* ------------------------------------------------------------------
   Onglet Valeurs brutes : le DxGrid habillé comme les tableaux « Métriques » et « Statistiques » (.mx-traces) —
   12 px, en-têtes en petites capitales grises sur fond blanc, un filet sous chaque ligne, ni bande d'en-tête, ni
   filets verticaux, ni zébrures (demandé le 21/09/2026 : le style commun des grilles, app.css § 10, le
   distinguait). La colonne garde la couleur de sa trace, avec l'équipement dessous ; défilement virtuel sur toute
   la hauteur. Les !important répondent à ceux de app.css.
------------------------------------------------------------------- */
.mx-root[b-37r9hxtrmz]  .mx-rv-grid {
    height: 100%;
    border: none;
    font-size: 12px;
    --dxbl-grid-font-size: 12px;
    --dxbl-grid-bg: #fff;
    --dxbl-grid-header-bg: #fff;
    --dxbl-grid-header-color: #6b7078;
    --dxbl-grid-text-cell-padding-y: 6px !important;
    --dxbl-grid-text-cell-padding-x: 10px !important;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-grid .dxbl-grid-table td,
.mx-root[b-37r9hxtrmz]  .mx-rv-grid .dxbl-grid-table th {
    border-left: none !important;
    border-right: none !important;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-grid .dxbl-grid-table > thead > tr > th {
    border-bottom: 1px solid #ececef !important;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-grid .dxbl-grid-table > tbody > tr > td {
    border-bottom: 1px solid #f1f2f4 !important;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-grid .dxbl-grid-header {
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: #6b7078;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-head {
    display: block;
    font-weight: 700;
}

.mx-root[b-37r9hxtrmz]  .mx-rv-sub {
    display: block;
    font-family: monospace;
    font-size: 9px;
    letter-spacing: 0;
    text-transform: none;
    color: #9499a1;
}

/* Onglet Alarmes : une ligne par alarme, liseré à la couleur de la sévérité (même lecture que l'ancienne
   tendance) ; le bouton principal sélectionne le point sur la courbe, la loupe ouvre le diagnostic. */
.mx-root[b-37r9hxtrmz]  .mx-alarms {
    padding: 6px 12px 12px;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-row {
    display: flex;
    align-items: center;
    gap: 4px;
    margin-bottom: 4px;
    border: 1px solid #eee;
    border-radius: 6px;
    background: #fff;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-row.is-selected {
    background: #f6f7f9;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-main {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 8px;
    border: none;
    background: transparent;
    padding: 5px 8px;
    text-align: left;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-time {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
    min-width: 46px;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-details {
    flex: 0 0 auto;
    width: 30px;
    height: 30px;
    margin-right: 4px;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: #6b7078;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.mx-root[b-37r9hxtrmz]  .mx-alarm-details:hover {
    background: #eef2f7;
    color: var(--bs-primary);
}

/* État vide des panneaux du rail (même ton que les autres explorateurs). */
.mx-root[b-37r9hxtrmz]  .mx-empty {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
}

/* Sélection vide : la phrase qui renvoie à l'arbre, sur quelques lignes plutôt que sur toute la largeur du graphe. */
.mx-empty-hint[b-37r9hxtrmz] {
    max-width: 26rem;
}

/* Cellule du DxGrid : la div remplit la cellule pour offrir une cible de clic complète. */
.mx-root[b-37r9hxtrmz]  .basket-cell {
    display: block;
    width: 100%;
    cursor: pointer;
}

/* Surbrillance d'une cellule lorsqu'on survole le point correspondant dans le graphique. */
.mx-root[b-37r9hxtrmz]  .basket-cell-active {
    background-color: var(--bs-primary-bg-subtle, #cfe2ff) !important;
    box-shadow: inset 0 0 0 2px var(--bs-primary, #0d6efd);
    font-weight: 600;
}
/* /Features/MetricsExplorer/MetricsExplorerMarkers.razor.rz.scp.css */
/* Onglet « Repères » : une ligne d'ajout, puis la liste des repères dans l'ordre du temps. */
.mxm[b-a69k5d981h] {
    padding-bottom: 12px;
}

.mxm-add[b-a69k5d981h] {
    position: sticky;
    top: 0;
    z-index: 2;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    background: #f7f8fa;
    border-bottom: 1px solid #ececef;
}

.mxm-at[b-a69k5d981h] {
    width: 190px;
}

.mxm-label[b-a69k5d981h] {
    flex: 1 1 200px;
    min-width: 160px;
}

.mxm-colors[b-a69k5d981h] {
    display: flex;
    gap: 4px;
}

.mxm-color[b-a69k5d981h] {
    width: 18px;
    height: 18px;
    padding: 0;
    border: 2px solid transparent;
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08);
}

.mxm-color.is-current[b-a69k5d981h] {
    border-color: #1a1a1a;
}

.mxm-color:focus-visible[b-a69k5d981h] {
    outline: 2px solid #2563EB;
    outline-offset: 1px;
}

.mxm-hint[b-a69k5d981h] {
    margin: 8px 12px;
    font-size: 11px;
    color: #6b7078;
}

.mxm-list[b-a69k5d981h] {
    list-style: none;
    margin: 0;
    padding: 0 12px;
}

.mxm-row[b-a69k5d981h] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 5px 0;
    border-bottom: 1px solid #f1f2f4;
    font-size: 12px;
}

.mxm-row.is-outside[b-a69k5d981h] {
    opacity: .6;
}

.mxm-dot[b-a69k5d981h] {
    flex: 0 0 10px;
    height: 10px;
    border-radius: 50%;
}

.mxm-row-at[b-a69k5d981h] {
    flex: 0 0 190px;
    font-variant-numeric: tabular-nums;
}

.mxm-row-label[b-a69k5d981h] {
    flex: 1 1 auto;
    min-width: 0;
}

.mxm-outside[b-a69k5d981h] {
    flex: 0 0 auto;
    padding: 1px 6px;
    border-radius: 999px;
    background: #f1f2f4;
    color: #6b7078;
    font-size: 10px;
}
/* /Features/MetricsExplorer/MetricsExplorerPage.razor.rz.scp.css */
/* Page = colonne pleine hauteur, même idiome que les explorateurs (cf. .ex-plans-page) : l'explorateur
   (.mx-root--page) prend tout ce qui reste sous l'en-tête de page. */
.mx-page[b-95cy5p4icl] {
    display: flex;
    flex-direction: column;
    height: 100%;
    width: 100%;
}

/* Résolution de la sélection transmise par l'URL, avant le premier rendu du composant. */
.mx-page-loading[b-95cy5p4icl] {
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    color: #6b7078;
}
/* /Features/MetricsExplorer/MetricsExplorerStats.razor.rz.scp.css */
/* Onglet « Statistiques » : la table reprend .mx-traces (styles du parent) ; ici l'alignement des chiffres et la lecture
   des parts hors seuil. */
.mx-num[b-bgzp9jhfjm] {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.mx-stats-breach[b-bgzp9jhfjm] {
    color: #d83c31;
    font-weight: 600;
}

.mx-stats-ok[b-bgzp9jhfjm] {
    color: #19ad79;
}

.mx-stats-warning[b-bgzp9jhfjm] {
    display: block;
    color: #8a5a00;
    font-size: 10px;
}
/* /Features/MetricsExplorer/MetricsExplorerTree.razor.rz.scp.css */
/* Arbre du parc — panneau « Arbre » du rail de l'explorateur de données. Rendu dans .railnav-panel-body
   (padding 14px, overflow-y auto) : l'en-tête est collé en haut de ce défilement, la liste est virtualisée. */

.mxt-root[b-zi5diqszzb] {
    display: flex;
    flex-direction: column;
    min-height: 100%;
}

/* En-tête FIXE (sélecteurs, recherche, puces) : collé au bord du corps défilant, en débordant son padding pour
   couvrir les lignes qui passent dessous — même mécanique que le panneau BIM (top:-14px = marge négative). */
.mxt-head[b-zi5diqszzb] {
    position: sticky;
    top: -14px;
    z-index: 4;
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin: -14px -14px 6px;
    padding: 14px 14px 8px;
    background: #fff;
    border-bottom: 1px solid #eee;
}

.mxt-select[b-zi5diqszzb],
.mxt-search[b-zi5diqszzb] {
    font-size: 12px;
}

.mxt-chips[b-zi5diqszzb] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}

.mxt-chip[b-zi5diqszzb] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    max-width: 100%;
    padding: 2px 8px;
    border: 1px solid #dee2e6;
    border-radius: 100px;
    background: #fff;
    color: #1a1a1a;
    font-size: 11px;
    line-height: 1.5;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

    .mxt-chip:hover[b-zi5diqszzb] {
        background: #f6f7f9;
    }

    .mxt-chip.is-active[b-zi5diqszzb] {
        border-color: #1178d8;
        background: #e8f4ff;
        color: #0b5cab;
    }

    .mxt-chip .ph[b-zi5diqszzb],
    .mxt-chip .ph-fill[b-zi5diqszzb],
    .mxt-chip .ph-duotone[b-zi5diqszzb] {
        font-size: 12px;
    }

.mxt-chip--alarm.is-active[b-zi5diqszzb] {
    border-color: #d83c31;
    background: #fdecea;
    color: #a12a22;
}

.mxt-chip--more[b-zi5diqszzb] {
    border-style: dashed;
    color: #6b7280;
}

.mxt-chip-count[b-zi5diqszzb] {
    color: #9499a1;
    font-variant-numeric: tabular-nums;
}

.mxt-chip.is-active .mxt-chip-count[b-zi5diqszzb] {
    color: inherit;
    opacity: .7;
}

.mxt-count[b-zi5diqszzb] {
    font-size: 11px;
    color: #9499a1;
    font-variant-numeric: tabular-nums;
}

.mxt-empty[b-zi5diqszzb] {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
}

/* Liste de travail pleine : le clic n'ajoute plus rien, on le dit plutôt que de laisser le geste sans effet. */
.mxt-full[b-zi5diqszzb] {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 0 0 6px;
    padding: 6px 8px;
    border-radius: 6px;
    background: #fdecea;
    color: #a12a22;
    font-size: 11.5px;
}

.mxt-list[b-zi5diqszzb] {
    display: flex;
    flex-direction: column;
}

/* Une ligne : [caret] case | icône | libellé (ellipsis) | alarme | valeur ou compteur. Hauteur fixe = ItemSize
   du Virtualize. Le retrait par profondeur est posé en style inline. */
.mxt-row[b-zi5diqszzb] {
    display: flex;
    align-items: center;
    gap: 6px;
    height: 30px;
    padding-right: 4px;
    border-radius: 6px;
    font-size: 12.5px;
    color: #1a1a1a;
    cursor: pointer;
    user-select: none;
}

    .mxt-row:hover[b-zi5diqszzb] {
        background: #f6f7f9;
    }

.mxt-row--space[b-zi5diqszzb] {
    font-weight: 600;
}

.mxt-row--asset[b-zi5diqszzb] {
    font-weight: 500;
    color: #3a3a48;
}

.mxt-row--cap.is-on[b-zi5diqszzb] {
    background: #f4f8fd;
}

.mxt-caret[b-zi5diqszzb] {
    flex: 0 0 auto;
    width: 12px;
    font-size: 12px;
    color: #9499a1;
}

/* Une feuille n'a pas de caret : sa case s'aligne sur celle des nœuds grâce à cette réserve. */
.mxt-row--cap[b-zi5diqszzb]::before {
    content: "";
    flex: 0 0 12px;
    width: 12px;
}

/* Case 15 px : cochée = la couleur de la trace (style inline), partielle = grise, vide = bordée. */
.mxt-check[b-zi5diqszzb] {
    flex: 0 0 15px;
    width: 15px;
    height: 15px;
    padding: 0;
    border: 1.5px solid #c4c9cf;
    border-radius: 3px;
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 10px;
    line-height: 1;
    box-sizing: border-box;
    cursor: pointer;
}

.mxt-check--all[b-zi5diqszzb] {
    border-color: #1178d8;
    background: #1178d8;
}

.mxt-check--partial[b-zi5diqszzb] {
    border-color: #6b7078;
    background: #6b7078;
}

.mxt-icon[b-zi5diqszzb] {
    flex: 0 0 auto;
    font-size: 14px;
    color: #9499a1;
}

.mxt-row--cap .mxt-icon[b-zi5diqszzb] {
    color: #6b7280;
}

.mxt-label[b-zi5diqszzb] {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.mxt-alarm[b-zi5diqszzb] {
    flex: 0 0 auto;
    font-size: 13px;
    color: #d83c31;
}

.mxt-value[b-zi5diqszzb] {
    flex: 0 0 auto;
    max-width: 42%;
    font-size: 11.5px;
    color: #4c4c5c;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.mxt-num[b-zi5diqszzb] {
    flex: 0 0 auto;
    font-size: 11px;
    color: #9499a1;
    font-variant-numeric: tabular-nums;
}
/* /Features/MetricsExplorer/MetricsExplorerViews.razor.rz.scp.css */
/* Panneau « Vues » (vues enregistrées) de l'explorateur de données — préfixe mxv-*. Même dessin que le panneau
   de vues de l'explorateur BIM (sv-*), sans les groupes par bâtiment. */

.mxv-panel[b-sdxhlvvczn] {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

/* ---- Bouton principal « Enregistrer la vue actuelle » ---- */

.mxv-save-btn[b-sdxhlvvczn] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    padding: 8px 12px;
    margin-bottom: 8px;
    border: none;
    border-radius: 8px;
    background: var(--bs-primary, #1178d8);
    color: #fff;
    font-size: 0.82rem;
    font-weight: 600;
    cursor: pointer;
}

    .mxv-save-btn:hover:not(:disabled)[b-sdxhlvvczn] {
        filter: brightness(1.08);
    }

    .mxv-save-btn:disabled[b-sdxhlvvczn] {
        opacity: 0.5;
        cursor: not-allowed;
    }

    .mxv-save-btn i[b-sdxhlvvczn] {
        font-size: 1rem;
    }

.mxv-empty[b-sdxhlvvczn] {
    padding: 26px 12px;
    text-align: center;
    font-size: 12px;
    color: rgba(76, 76, 92, .5);
}

/* ---- Sections « Mes vues » / « Vues partagées » / « Vues publiques » ---- */

.mxv-section[b-sdxhlvvczn] {
    display: flex;
    align-items: center;
    gap: 5px;
    padding: 8px 6px 2px;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--bs-tertiary-color, #adb5bd);
}

/* ---- Lignes de vue ---- */

.mxv-row[b-sdxhlvvczn] {
    position: relative;
    display: flex;
    align-items: stretch;
    gap: 2px;
}

.mxv-row-main[b-sdxhlvvczn] {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 8px;
    border: none;
    border-radius: 7px;
    background: none;
    color: var(--bs-body-color, #212529);
    font-size: 0.82rem;
    text-align: left;
    cursor: pointer;
}

    .mxv-row-main:hover[b-sdxhlvvczn] {
        background: var(--bs-tertiary-bg, #f1f3f5);
    }

.mxv-row.is-active .mxv-row-main[b-sdxhlvvczn] {
    background: rgba(17, 120, 216, 0.1);
    color: var(--bs-primary, #1178d8);
    font-weight: 600;
}

.mxv-row-main i[b-sdxhlvvczn] {
    flex: 0 0 auto;
    font-size: 0.95rem;
    color: var(--bs-secondary-color, #6c757d);
}

.mxv-row.is-active .mxv-row-main i[b-sdxhlvvczn] {
    color: var(--bs-primary, #1178d8);
}

.mxv-row-name[b-sdxhlvvczn] {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.mxv-badge-public[b-sdxhlvvczn],
.mxv-badge-shared[b-sdxhlvvczn] {
    flex: 0 0 auto;
    font-size: 0.6rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    border-radius: 999px;
    padding: 2px 7px;
}

.mxv-badge-public[b-sdxhlvvczn] {
    color: var(--bs-success, #2f9461);
    background: rgba(47, 148, 97, 0.12);
}

/* Partagée : diffusion restreinte, donc une teinte plus froide que le vert « ouvert à tous ». */
.mxv-badge-shared[b-sdxhlvvczn] {
    color: var(--bs-info, #1178d8);
    background: rgba(17, 120, 216, 0.12);
}

.mxv-row-more[b-sdxhlvvczn],
.mxv-row-leave[b-sdxhlvvczn] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    border: none;
    border-radius: 7px;
    background: none;
    color: var(--bs-tertiary-color, #adb5bd);
    cursor: pointer;
}

.mxv-row-leave[b-sdxhlvvczn] {
    width: 22px;
    font-size: 12px;
}

    .mxv-row-more:hover[b-sdxhlvvczn],
    .mxv-row-leave:hover[b-sdxhlvvczn] {
        background: var(--bs-tertiary-bg, #f1f3f5);
        color: var(--bs-body-color, #212529);
    }

/* ---- Menu d'actions (⋯) ---- */

.mxv-menu-backdrop[b-sdxhlvvczn] {
    position: fixed;
    inset: 0;
    z-index: 1050;
}

.mxv-menu[b-sdxhlvvczn] {
    position: absolute;
    top: 100%;
    right: 0;
    z-index: 1051;
    min-width: 250px;
    padding: 5px;
    background: var(--bs-body-bg, #fff);
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 9px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
}

.mxv-menu-item[b-sdxhlvvczn] {
    display: flex;
    align-items: center;
    gap: 9px;
    width: 100%;
    padding: 7px 10px;
    border: none;
    border-radius: 6px;
    background: none;
    color: var(--bs-body-color, #212529);
    font-size: 0.8rem;
    text-align: left;
    cursor: pointer;
}

    .mxv-menu-item:hover:not(:disabled)[b-sdxhlvvczn] {
        background: var(--bs-tertiary-bg, #f1f3f5);
    }

    .mxv-menu-item:disabled[b-sdxhlvvczn] {
        opacity: 0.45;
        cursor: not-allowed;
    }

    .mxv-menu-item i[b-sdxhlvvczn] {
        flex: 0 0 auto;
        font-size: 0.9rem;
        color: var(--bs-secondary-color, #6c757d);
    }

    .mxv-menu-item.is-danger[b-sdxhlvvczn],
    .mxv-menu-item.is-danger i[b-sdxhlvvczn] {
        color: var(--bs-danger, #dc3545);
    }

.mxv-menu-sep[b-sdxhlvvczn] {
    height: 1px;
    margin: 4px 8px;
    background: var(--bs-border-color-translucent, rgba(0, 0, 0, 0.1));
}

/* ---- Hint de pied de liste ---- */

.mxv-footer-hint[b-sdxhlvvczn] {
    padding: 10px 6px 0;
    font-size: 0.72rem;
    line-height: 1.45;
    color: var(--bs-tertiary-color, #adb5bd);
}

/* ---- Popup (enregistrer / renommer / dupliquer / visibilité) ---- */

.mxv-popup-body[b-sdxhlvvczn] {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.mxv-field[b-sdxhlvvczn] {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.mxv-field-label[b-sdxhlvvczn] {
    font-size: 0.72rem;
    font-weight: 650;
    color: var(--bs-secondary-color, #6c757d);
}

.mxv-radio[b-sdxhlvvczn] {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 8px 11px;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 8px;
    cursor: pointer;
}

    .mxv-radio + .mxv-radio[b-sdxhlvvczn] {
        margin-top: 6px;
    }

    .mxv-radio.is-selected[b-sdxhlvvczn] {
        border-color: var(--bs-primary, #1178d8);
        background: rgba(17, 120, 216, 0.07);
    }

    .mxv-radio input[b-sdxhlvvczn] {
        margin-top: 3px;
    }

.mxv-radio-text[b-sdxhlvvczn] {
    display: flex;
    flex-direction: column;
}

    .mxv-radio-text b[b-sdxhlvvczn] {
        font-size: 0.82rem;
    }

    .mxv-radio-text small[b-sdxhlvvczn] {
        font-size: 0.72rem;
        color: var(--bs-secondary-color, #6c757d);
    }

/* Sélecteur de profils, encarté SOUS la radio « Partagée » : il n'apparaît que quand ce niveau est choisi. */
.mxv-roles[b-sdxhlvvczn] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 6px 0 0 22px;
}

    .mxv-roles + .mxv-radio[b-sdxhlvvczn] {
        margin-top: 6px;
    }

.mxv-roles-count[b-sdxhlvvczn] {
    font-size: 0.72rem;
    color: var(--bs-secondary-color, #6c757d);
}

.mxv-chips[b-sdxhlvvczn] {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.mxv-chip[b-sdxhlvvczn] {
    font-size: 0.7rem;
    color: var(--bs-secondary-color, #6c757d);
    background: var(--bs-tertiary-bg, #f1f3f5);
    border: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, 0.08));
    border-radius: 999px;
    padding: 3px 10px;
    white-space: nowrap;
}
/* /Features/ReportsCenter/Tabs/TabAllReports.razor.rz.scp.css */
/* Barre de la liste : recherche, filtres par thème et par type, « Nouveau dashboard » à droite. */
.rc-toolbar[b-4tws0umsfz] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px 14px;
}

.rc-filter[b-4tws0umsfz] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
}

/* Le libellé d'un groupe de filtres, « Thème » ou « Type », devant ses pastilles. */
.rc-filter-label[b-4tws0umsfz] {
    margin-right: 2px;
    font-size: var(--kd-fs-11);
    font-weight: 600;
    letter-spacing: var(--kd-tracking-caps);
    text-transform: uppercase;
    color: var(--kd-text-muted);
}

.rc-grow[b-4tws0umsfz] {
    flex: 1 1 auto;
}

/* La colonne du nom prend la moitié du tableau, et rétrécit avec l'écran : sur un écran étroit, menu déplié, elle
   gardait 544 px et poussait les actions hors du tableau (05/10/2026). */
.rc-table[b-4tws0umsfz]  .rc-col-name {
    width: 50%;
}

/* Le nom, et la description dessous en une ligne. */
.rc-name[b-4tws0umsfz] {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.rc-name a[b-4tws0umsfz] {
    font-weight: 600;
    color: var(--kd-text-strong);
}

.rc-name a:hover[b-4tws0umsfz] {
    color: var(--kd-primary-text);
}

.rc-name small[b-4tws0umsfz] {
    /* Coupée à la place qu'elle trouve, sans imposer sa longueur à la colonne (largeur nulle, étirée à 100 %). */
    width: 0;
    min-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--kd-text-muted);
}

/* Les thèmes, sous la description : du texte, pas des pastilles, pour ne pas les confondre avec le type. */
.rc-themes[b-4tws0umsfz] {
    margin-top: 2px;
    font-size: var(--kd-fs-11);
    font-weight: 600;
    color: var(--kd-text-muted);
}

.rc-pills[b-4tws0umsfz] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}
/* /Features/Settings/Alarms/Tabs/TabSettingsAlarmsAnalysis.razor.rz.scp.css */
.analysis-card[b-ejlcao3x5a] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    height: 100%;
    padding: 1rem 1.1rem;
    border: 1px solid var(--lightgray-color, #E3E4E4);
    border-radius: 0.75rem;
    background-color: #fff;
    transition: border-color 0.15s ease, opacity 0.15s ease;
}

.analysis-card:hover[b-ejlcao3x5a] {
    border-color: var(--primary-color, #8EB937);
}

.analysis-card--off[b-ejlcao3x5a] {
    opacity: 0.6;
}

.analysis-card__head[b-ejlcao3x5a] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.analysis-card__icon[b-ejlcao3x5a] {
    flex: 0 0 auto;
    font-size: 1.5rem;
    color: #6b7280;
}

.analysis-card__body[b-ejlcao3x5a] {
    min-width: 0;
}

.analysis-card__title[b-ejlcao3x5a] {
    font-weight: 600;
    line-height: 1.2;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.analysis-card__subtitle[b-ejlcao3x5a] {
    font-size: 0.78rem;
    color: var(--gray-color, #909298);
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
}

.analysis-card__footer[b-ejlcao3x5a] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    margin-top: auto;
}

.analysis-card__sev-badge[b-ejlcao3x5a] {
    display: inline-flex;
    align-items: center;
    border: 0;
    border-radius: 0.5rem;
    padding: 0.3rem 0.6rem;
    font-size: 0.8rem;
    font-weight: 600;
    line-height: 1.1;
    cursor: pointer;
}

.analysis-card__switch[b-ejlcao3x5a] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.analysis-card__switch-label[b-ejlcao3x5a] {
    font-size: 0.8rem;
    font-weight: 500;
}
/* /Features/Settings/Alarms/Tabs/TabSettingsAlarmsConnectorMappings.razor.rz.scp.css */
.mapping-section[b-q92cvvropq] {
    border: 1px solid var(--lightgray-color, #E3E4E4);
    border-radius: 0.85rem;
    background-color: #fff;
    padding: 1.1rem 1.25rem;
}

.mapping-section__header[b-q92cvvropq] {
    margin-bottom: 1rem;
}

.mapping-section__header--actions[b-q92cvvropq] {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

.mapping-section__title[b-q92cvvropq] {
    margin: 0;
    font-weight: 700;
    font-size: 0.8rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #1f2329;
}

.mapping-section__subtitle[b-q92cvvropq] {
    margin: 0.15rem 0 0;
    font-size: 0.85rem;
    color: var(--gray-color, #909298);
}

.mapping-section__selectors[b-q92cvvropq] {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.mapping-selector[b-q92cvvropq] {
    width: auto;
    min-width: 160px;
}

.mapping-default-select[b-q92cvvropq] {
    max-width: 360px;
}

.mapping-col-title[b-q92cvvropq] {
    font-weight: 700;
    font-size: 0.72rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--gray-color, #909298);
    margin-bottom: 0.65rem;
}

/* Rows rendered inside the MappingForm* child components */
[b-q92cvvropq] .mapping-row {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

[b-q92cvvropq] .mapping-row__label {
    flex: 0 0 7.5rem;
    display: flex;
}

[b-q92cvvropq] .mapping-row__input {
    flex: 1 1 auto;
    min-width: 0;
}

[b-q92cvvropq] .mapping-pill {
    display: inline-flex;
    align-items: center;
    border-radius: 0.5rem;
    padding: 0.3rem 0.6rem;
    font-size: 0.8rem;
    font-weight: 600;
    line-height: 1.1;
    white-space: nowrap;
}

[b-q92cvvropq] .mapping-pill--state {
    color: #495057;
    background-color: rgba(108, 117, 125, 0.12);
}
/* /Features/Settings/Appearance/AppearanceSettings.razor.rz.scp.css */
/* Écran Réglages › Interface › Apparence.

   Tout est SCOPÉ : rien de ce qui suit n'a d'emploi ailleurs (cf. .claude/rules/styles-css.md — en
   cas de doute, le scopé, plus facile à promouvoir vers app.css que l'inverse). Les couleurs sont
   prises aux jetons, jamais écrites en dur : cet écran doit suivre l'habillage qu'il règle.

   ⚠️ Les règles en ::deep visent les trois composants privés de la page (ColorField, ContrastBadge,
   LogoField), rendus sous .ap-page qui, elle, porte l'attribut de portée. */

.ap-page[b-rn1vipmhf6] {
    display: block;
}

.ap-intro[b-rn1vipmhf6],
.ap-page[b-rn1vipmhf6]  .ap-note,
.ap-note[b-rn1vipmhf6] {
    font-size: .8rem;
    color: var(--bs-secondary-color);
}

.ap-intro[b-rn1vipmhf6] {
    margin-bottom: 1rem;
}

.ap-page[b-rn1vipmhf6]  .ap-note,
.ap-note[b-rn1vipmhf6] {
    margin-top: .5rem;
    padding: 8px 10px;
    border: 1px dashed var(--bs-border-color);
    border-radius: 6px;
    background: var(--bs-tertiary-bg);
}

/* L'encart de portée est remonté en tête de page (13/09/2026). Contrairement aux encarts posés
   DANS une carte — le rappel « un logo part au téléversement » —, il lui faut une respiration
   avant la première carte et aucune au-dessus : l'introduction la donne déjà.
   ⚠️ APRÈS la règle générale, et pas avant : les deux se calculent à la même spécificité une
   fois la portée Blazor appliquée, c'est donc l'ordre qui tranche. */
.ap-page > .ap-note[b-rn1vipmhf6] {
    margin-top: 0;
    margin-bottom: 1rem;
}

/* Avertissement fort : le fond pâle de la famille « danger » reste lisible quel que soit
   l'habillage, puisqu'il se dérive lui-même de la teinte sémantique. */
.ap-page[b-rn1vipmhf6]  .ap-note--bad,
.ap-note--bad[b-rn1vipmhf6] {
    border-style: solid;
    border-color: var(--bs-danger-border-subtle);
    background: var(--bs-danger-bg-subtle);
    color: var(--bs-danger-text-emphasis);
}

.ap-page[b-rn1vipmhf6]  .ap-note--warn {
    border-style: solid;
    border-color: var(--bs-warning-border-subtle);
    background: var(--bs-warning-bg-subtle);
    color: var(--bs-warning-text-emphasis);
}

/* Deux colonnes dès qu'il y a la place : les couleurs se comparent, elles ne se lisent pas en
   liste. En dessous, une seule — le sélecteur et son état tiennent mal sous 320 px. */
.ap-grid[b-rn1vipmhf6] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 1.25rem 2rem;
}

/* Un bloc d'une carte « endroit ».

   Depuis que le découpage suit les ENDROITS de l'interface, la carte du menu porte trois choses de
   natures différentes : ses couleurs, ses logos, son état de départ. Le filet ne décore pas — il
   sépare des blocs dont l'un (les logos) s'enregistre tout seul et les deux autres non. Sans lui,
   le rappel « un logo part au téléversement » semblerait parler de toute la carte. */
.ap-block + .ap-block[b-rn1vipmhf6] {
    margin-top: 1.25rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--bs-border-color);
}

/* ⚠️ Reboot donne au <legend> une taille fluide — calc(1.275rem + .3vw), plafonnée à 1.5rem — que
   la classe .form-label ne redresse pas : elle ne touche pas à la taille de police. L'intitulé
   « État du menu par défaut » se rendait donc à ~1,5× les autres libellés de l'écran (relevé le
   12/09/2026). On le ramène à la taille héritée, celle de tous les <label class="form-label">. */
.ap-page legend.form-label[b-rn1vipmhf6] {
    font-size: inherit;
    line-height: inherit;
}

/*--- Un champ de couleur (ColorField) --------------------------------------*/

.ap-page[b-rn1vipmhf6]  .ap-field-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .25rem;
}

/* « Valeur d'usine » : discret tant qu'il n'y a rien à défaire, mais jamais masqué — un bouton qui
   disparaît se cherche, un bouton éteint s'explique. */
.ap-page[b-rn1vipmhf6]  .ap-reset {
    font-size: .75rem;
    text-decoration: none;
}

.ap-page[b-rn1vipmhf6]  .ap-reset:disabled {
    opacity: .4;
}

.ap-page[b-rn1vipmhf6]  .ap-field-picker {
    display: flex;
    align-items: center;
    gap: .6rem;
}

/* Le sélecteur remplace son input par son propre bouton : on borne l'enveloppe, pas l'input. */
.ap-page[b-rn1vipmhf6]  .ap-field-picker > div:first-child {
    flex: 0 0 auto;
    width: 150px;
}

/* ⚠️ Borner l'enveloppe ne suffisait pas. jscolorpicker se rend à sa largeur NATURELLE — 204 px,
   soit un champ de 174 plus la pastille de 30 — et débordait donc de 54 px, jusqu'à recouvrir le
   « Valeur d'usine (#…) » voisin. Relevé à l'écran le 12/09/2026 : 44 px de chevauchement sur
   chacun des huit champs.
   Le widget est construit en JavaScript, hors de la portée Blazor : il faut l'atteindre en
   ::deep. On lui impose la largeur de l'enveloppe et on laisse son champ se rétracter.
   Le min-width: 0 n'est pas décoratif — sans lui, la largeur intrinsèque du texte retient
   l'élément flex et le débord revient intact. */
.ap-page[b-rn1vipmhf6]  .ap-field-picker > div:first-child > .color-picker {
    width: 100%;
    max-width: 100%;
}

.ap-page[b-rn1vipmhf6]  .ap-field-picker .cp_input {
    flex: 1 1 auto;
    width: auto;
    min-width: 0;
}

.ap-page[b-rn1vipmhf6]  .ap-field-state {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    font-size: .75rem;
    color: var(--bs-secondary-color);
}

.ap-page[b-rn1vipmhf6]  .ap-state-value {
    font-family: var(--bs-font-monospace);
    color: var(--kd-text-strong);
}

/* La puce qui double le code hexadécimal : « Valeur d'usine (#8eb937) » ne dit rien à l'œil.

   ⚠️ La bordure n'est pas un ornement : sans elle, un #ffffff disparaîtrait purement et simplement
   sur le fond de la carte, et la puce mentirait par absence. Elle doit se voir sur une couleur
   claire comme sur une foncée, d'où un filet neutre et non une teinte dérivée de la couleur montrée.

   La couleur arrive par --ap-swatch, posée en ligne par ColorField APRÈS relecture par
   BrandingColor.ToCanonicalHex : rien de ce que porte la base n'atteint le style tel quel. Le repli
   `transparent` du composant laisse alors une puce vide, cernée — honnête pour une valeur qu'on n'a
   pas su décoder. */
.ap-page[b-rn1vipmhf6]  .ap-swatch {
    flex: 0 0 auto;
    width: .85rem;
    height: .85rem;
    border: 1px solid var(--kd-border);
    border-radius: 3px;
    background-color: var(--ap-swatch, transparent);
}

/*--- Le verdict de contraste (ContrastBadge) -------------------------------*/

.ap-page[b-rn1vipmhf6]  .ap-contrast {
    display: flex;
    align-items: flex-start;
    gap: .35rem;
    margin-top: .4rem;
    font-size: .75rem;
    line-height: 1.3;
}

.ap-page[b-rn1vipmhf6]  .ap-contrast--ok {
    color: var(--bs-success-text-emphasis);
}

.ap-page[b-rn1vipmhf6]  .ap-contrast--warn {
    color: var(--bs-warning-text-emphasis);
}

.ap-page[b-rn1vipmhf6]  .ap-contrast--bad {
    color: var(--bs-danger-text-emphasis);
}

/*--- Un emplacement de logo (LogoField) ------------------------------------*/

/* L'aperçu porte le fond RÉEL du logo, posé en ligne par le composant (il vient d'un sélecteur de
   couleur, il ne peut pas être une classe ; LogoField le repasse par BrandingColor avant de
   l'écrire). L'emplacement vide n'affiche pas de damier mais un libellé, halé en .ap-logo-empty :
   sur un fond quelconque, un damier de teinte fixe serait lui-même invisible une fois sur deux. */
.ap-page[b-rn1vipmhf6]  .ap-logo-preview {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 72px;
    margin-bottom: .5rem;
    padding: 10px 14px;
    border: 1px solid var(--bs-border-color);
    border-radius: 6px;
}

.ap-page[b-rn1vipmhf6]  .ap-logo-preview img {
    max-width: 100%;
    max-height: 52px;
}

/* La hauteur du logo : le curseur et sa valeur sur une ligne. La valeur ne rétrécit pas
   (`flex: none`) — elle passe de « 9 px » à « 40 px » pendant qu'on glisse, et une largeur qui suit
   le texte ferait sauter le curseur à chaque chiffre gagné. */
.ap-logo-height[b-rn1vipmhf6] {
    display: flex;
    align-items: center;
    gap: .6rem;   /* celui de .ap-field-picker : les rangées de la carte s'alignent */
}

.ap-logo-height .form-range[b-rn1vipmhf6] {
    flex: 1 1 auto;
    min-width: 0;
}

.ap-logo-height .ap-field-state[b-rn1vipmhf6] {
    flex: none;
    min-width: 3.5rem;
    justify-content: flex-end;
}

.ap-page[b-rn1vipmhf6]  .ap-logo-empty {
    font-size: .75rem;
    color: var(--bs-secondary-color);
    /* Sur un fond quelconque choisi par l'administrateur, un texte de couleur fixe serait illisible
       une fois sur deux : le halo le détache sans imposer de teinte. */
    text-shadow: 0 0 4px var(--kd-surface), 0 0 8px var(--kd-surface);
}

/*--- L'image d'accueil -----------------------------------------------------*/

/* Pas de ::deep ici : ce bloc est rendu par la page elle-même — il n'y en a qu'un, il n'a pas
   justifié un composant —, donc ses éléments portent déjà l'attribut de portée. Les classes
   partagées avec les logos (.ap-field-head, .ap-reset), elles, sont atteintes par les règles en
   ::deep plus haut : le sélecteur qui suit ::deep ne réclame plus la portée.

   L'aperçu RECADRE — object-fit: cover —, parce que c'est ce que le widget « Bienvenue » fait de son
   fond. Une vignette « entière » montrerait une image en portrait dans sa totalité et laisserait
   croire qu'elle passera ainsi. */
.ap-home-preview[b-rn1vipmhf6] {
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    height: 120px;
    margin-bottom: .5rem;
    border: 1px solid var(--bs-border-color);
    border-radius: 6px;
    background: var(--bs-tertiary-bg);
}

.ap-home-preview img[b-rn1vipmhf6] {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.ap-home-empty[b-rn1vipmhf6] {
    padding: 0 10px;
    font-size: .75rem;
    color: var(--bs-secondary-color);
}
/* /Features/Settings/Changelog/Changelog.razor.rz.scp.css */
[b-eoh3the6vy] .changelog-content {
    font-family: var(--bs-font-monospace);
    font-size: 0.78rem;
    line-height: 1.5;
}

[b-eoh3the6vy] .changelog-content h1 {
    font-size: 1.1rem;
    margin-top: 0;
    margin-bottom: 0.5rem;
}

[b-eoh3the6vy] .changelog-content h2 {
    font-size: 1rem;
    margin-top: 1.25rem;
    margin-bottom: 0.4rem;
    border-bottom: 1px solid #e0e0e0;
    padding-bottom: 0.2rem;
}

[b-eoh3the6vy] .changelog-content h3 {
    font-size: 0.82rem;
    margin-top: 0.9rem;
    margin-bottom: 0.25rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: #666;
}

[b-eoh3the6vy] .changelog-content ul {
    margin: 0.2rem 0 0.5rem 0;
    padding-left: 1.4rem;
}

[b-eoh3the6vy] .changelog-content li {
    margin-bottom: 0.15rem;
}

[b-eoh3the6vy] .changelog-content p {
    margin-bottom: 0.4rem;
}

[b-eoh3the6vy] .changelog-content hr {
    margin: 1rem 0;
    border-color: #e8e8e8;
}

[b-eoh3the6vy] .changelog-content a {
    color: inherit;
    text-decoration: underline;
    text-decoration-style: dotted;
}
/* /Features/Settings/Components/CapabilityThresholdsEditor.razor.rz.scp.css */
/* Tableau des seuils de mesures — propre à ce composant (cf. .claude/rules/styles-css.md) */

/* Le cadre mesure la place disponible pour ses enfants (@container plus bas) : cet éditeur vit aussi bien
   dans une page large que dans la colonne d'un écran à sections ou dans la carte d'une fiche de rôle, et
   c'est sa largeur à LUI qui décide de la disposition — pas celle de la fenêtre, qui n'en dit rien.
   `overflow-x` reste le filet de sécurité pour un cadre plus étroit que la disposition empilée. */
.kdc-thresholds[b-gbw6laa6rf] {
    container-type: inline-size;
    overflow-x: auto;
}

.kdc-thresholds-table[b-gbw6laa6rf] {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.86rem;
}

.kdc-thresholds-table th[b-gbw6laa6rf] {
    text-align: left;
    font-weight: 600;
    color: var(--bs-secondary-color, #6c757d);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    padding: 0.4rem 0.5rem;
    border-bottom: 1px solid var(--bs-border-color, #dee2e6);
    white-space: nowrap;
}

.kdc-thresholds-table td[b-gbw6laa6rf] {
    padding: 0.35rem 0.5rem;
    border-bottom: 1px solid var(--bs-border-color-translucent, rgba(0, 0, 0, 0.07));
    vertical-align: middle;
}

.kdc-th-tracked[b-gbw6laa6rf],
.kdc-td-center[b-gbw6laa6rf] {
    text-align: center;
}

.kdc-th-num[b-gbw6laa6rf] {
    width: 8.5rem;
}

.kdc-th-shape[b-gbw6laa6rf] {
    width: 14rem;
}

/* Étroite par défaut : les plages passent à la ligne plutôt que de pousser le tableau hors de son cadre. */
.kdc-th-reading[b-gbw6laa6rf] {
    min-width: 10rem;
}

/* Les largeurs de colonnes ne sont qu'indicatives : sur un écran d'environ 1 000 px, le tableau se tassait
   jusqu'à couper « Dépassement à la hausse » et les textes grisés (« danger au-del »), vu le 17/09. Des
   minimums sur les champs eux-mêmes, donc — mais au plus juste : chaque dixième de rem de trop est un
   dixième de rem de défilement horizontal une fois l'éditeur dans une colonne. */
.kdc-thresholds-table select[b-gbw6laa6rf] {
    min-width: 12rem;
}

.kdc-thresholds-table input[type="number"][b-gbw6laa6rf] {
    min-width: 7.5rem;
}

/* ------------------------- Cadre étroit : on empile -------------------------
   Six colonnes ne tiennent pas dans la colonne d'un écran à sections. Plutôt que de faire défiler le
   tableau à l'horizontale — le geste qu'on fait le moins volontiers, et qui cache la moitié des champs —
   chaque mesure devient un bloc : son nom et sa case en tête, la forme sur toute la largeur, les deux
   bornes côte à côte, la lecture en dessous. Rien n'est masqué, rien ne déborde. */
@container (max-width: 52rem) {
    .kdc-thresholds-table thead[b-gbw6laa6rf] {
        display: none;   /* les libellés de colonnes reviennent en placeholders et en aria-label */
    }

    .kdc-thresholds-table[b-gbw6laa6rf],
    .kdc-thresholds-table tbody[b-gbw6laa6rf],
    .kdc-thresholds-table tr[b-gbw6laa6rf],
    .kdc-thresholds-table td[b-gbw6laa6rf] {
        display: block;
        width: 100%;
    }

    .kdc-thresholds-table tr[b-gbw6laa6rf] {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 0.35rem 0.6rem;
        align-items: center;
        padding: 0.6rem 0;
        border-bottom: 1px solid var(--bs-border-color, #dee2e6);
    }

    .kdc-thresholds-table td[b-gbw6laa6rf] {
        padding: 0;
        border-bottom: 0;
    }

    /* Le nom prend la ligne, la case le reste : c'est la paire qu'on lit d'abord. */
    .kdc-thresholds-table td:nth-child(2)[b-gbw6laa6rf] {
        justify-self: end;
    }

    /* Forme et lecture sur toute la largeur ; les deux bornes se partagent la ligne. */
    .kdc-thresholds-table td:nth-child(3)[b-gbw6laa6rf],
    .kdc-thresholds-table td:nth-child(6)[b-gbw6laa6rf] {
        grid-column: 1 / -1;
    }

    /* Les minimums du mode tableau feraient déborder la grille : ici, chaque champ prend sa case. */
    .kdc-thresholds-table select[b-gbw6laa6rf],
    .kdc-thresholds-table input[type="number"][b-gbw6laa6rf] {
        min-width: 0;
        width: 100%;
    }

    .kdc-measure[b-gbw6laa6rf] {
        min-width: 0;
    }

    /* Une lecture vide ne doit pas ouvrir un blanc entre deux mesures. */
    .kdc-thresholds-table td:nth-child(6):empty[b-gbw6laa6rf] {
        display: none;
    }
}

/* ------------------------------ Lecture ------------------------------
   Les plages que découpe le seuil saisi, dans l'ordre des valeurs, chacune à la couleur de son verdict.
   Couleurs des jetons sémantiques (tokens.css), jamais de littéral : un habillage client les repeint. */
.kdc-reading[b-gbw6laa6rf] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
}

.kdc-reading--inherited[b-gbw6laa6rf] {
    opacity: 0.6;
}

.kdc-zone[b-gbw6laa6rf] {
    display: inline-flex;
    align-items: baseline;
    gap: 0.3rem;
    padding: 0.05rem 0.5rem;
    border-radius: 999px;
    font-size: 0.75rem;
    white-space: nowrap;
}

.kdc-zone-label[b-gbw6laa6rf] {
    font-weight: 600;
}

.kdc-zone-values[b-gbw6laa6rf] {
    font-variant-numeric: tabular-nums;
}

.kdc-zone--ok[b-gbw6laa6rf] {
    background: color-mix(in srgb, var(--kd-success) 14%, transparent);
    color: var(--kd-success-text);
}

.kdc-zone--warning[b-gbw6laa6rf] {
    background: color-mix(in srgb, var(--kd-warning) 32%, transparent);
    color: var(--kd-warning-text);
}

.kdc-zone--breach[b-gbw6laa6rf] {
    background: color-mix(in srgb, var(--kd-danger) 12%, transparent);
    color: var(--kd-danger-text);
}

.kdc-reading-none[b-gbw6laa6rf] {
    font-size: 0.75rem;
    color: var(--bs-secondary-color, #6c757d);
}

.kdc-reading-alert[b-gbw6laa6rf] {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.78rem;
    color: var(--kd-danger-text);
}

/* Une mesure non déclarée est en retrait — mais SEUL son libellé : ses champs restent éditables, et
   c'est justement la saisie d'une borne qui la déclare. Estomper la ligne entière la faisait passer
   pour désactivée. */
.kdc-row--off .kdc-measure[b-gbw6laa6rf] {
    opacity: 0.55;
}

.kdc-measure[b-gbw6laa6rf] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-width: 12rem;
}

.kdc-measure i[b-gbw6laa6rf] {
    font-size: 1.05rem;
    color: var(--bs-secondary-color, #6c757d);
    flex: 0 0 auto;
}

.kdc-measure-text[b-gbw6laa6rf] {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
}

.kdc-measure-title[b-gbw6laa6rf] {
    font-weight: 500;
}

.kdc-measure-unit[b-gbw6laa6rf] {
    font-size: 0.75rem;
    color: var(--bs-secondary-color, #6c757d);
}
/* /Features/Settings/Components/ClosureDaysEditor.razor.rz.scp.css */
/* Réglages › Jours de fermeture — propre à cet écran (cf. .claude/rules/styles-css.md). */

.kdc-closure-hint[b-1znrujwmgd],
.kdc-closure-tip[b-1znrujwmgd] {
    font-size: 0.82rem;
}

.kdc-closure-toolbar[b-1znrujwmgd] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    margin-bottom: 1rem;
}

.kdc-closure-yearnav[b-1znrujwmgd] {
    display: flex;
    align-items: center;
    gap: 0.25rem;
}

.kdc-closure-yearlabel[b-1znrujwmgd] {
    min-width: 3.5rem;
    text-align: center;
    font-size: 1.1rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.kdc-closure-count[b-1znrujwmgd] {
    font-size: 0.82rem;
}

/* Légende des natures, et d'où vient le week-end. */
.kdc-closure-legend[b-1znrujwmgd] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem 1rem;
    margin: -0.25rem 0 1rem;
    font-size: 0.78rem;
}

.kdc-closure-swatch[b-1znrujwmgd] {
    display: inline-block;
    width: 0.7rem;
    height: 0.7rem;
    margin-right: 0.35rem;
    border-radius: 2px;
    vertical-align: -1px;
}

.kdc-closure-swatch.is-holiday[b-1znrujwmgd] {
    background: var(--bs-danger, #dc3545);
}

.kdc-closure-swatch.is-closure[b-1znrujwmgd] {
    background: var(--bs-secondary, #6c757d);
}

.kdc-closure-swatch.is-weekend[b-1znrujwmgd] {
    background: var(--bs-secondary-bg, #e9ecef);
    box-shadow: inset 0 0 0 1px var(--bs-border-color, #dee2e6);
}

/* Calendrier à gauche, sélection et liste à droite ; empilés quand la place manque. */
.kdc-closure-layout[b-1znrujwmgd] {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 17rem;
    gap: 1.5rem;
    align-items: start;
}

@media (max-width: 1199.98px) {
    .kdc-closure-layout[b-1znrujwmgd] {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* Douze mini-mois, autant de colonnes que la largeur en tient. Pas de sélection de texte : on y glisse. */
.kdc-closure-year[b-1znrujwmgd] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr));
    gap: 1rem 1.5rem;
    user-select: none;
}

.kdc-closure-monthname[b-1znrujwmgd] {
    margin: 0 0 0.35rem;
    font-size: 0.8rem;
    font-weight: 600;
    text-transform: capitalize;
}

.kdc-closure-grid[b-1znrujwmgd] {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 2px;
}

.kdc-closure-weekday[b-1znrujwmgd] {
    font-size: 0.65rem;
    text-align: center;
    color: var(--bs-secondary-color, #6c757d);
}

.kdc-closure-day[b-1znrujwmgd] {
    aspect-ratio: 1;
    padding: 0;
    border: 0;
    border-radius: 4px;
    background: transparent;
    color: var(--bs-body-color, #212529);
    font-size: 0.75rem;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
}

.kdc-closure-day:hover[b-1znrujwmgd] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.kdc-closure-day:focus-visible[b-1znrujwmgd] {
    outline: 2px solid var(--bs-primary, #0d6efd);
    outline-offset: 1px;
}

.kdc-closure-day.is-weekend[b-1znrujwmgd] {
    color: var(--bs-secondary-color, #6c757d);
}

.kdc-closure-day.is-today[b-1znrujwmgd] {
    box-shadow: inset 0 -2px 0 var(--bs-primary, #0d6efd);
}

/* Jour bloqué : fond soutenu, lisible d'un coup d'œil sur l'année. Fermeture en gris (blanc sur gris : 4,7:1),
   férié en rouge comme sur un calendrier imprimé (blanc sur rouge : 4,5:1). */
.kdc-closure-day.is-closed[b-1znrujwmgd] {
    background: var(--bs-secondary, #6c757d);
    color: #fff;
    font-weight: 600;
}

.kdc-closure-day.is-holiday[b-1znrujwmgd] {
    background: var(--bs-danger, #dc3545);
}

/* Week-end fermé par la règle des tableaux de bord : calculé, non saisi — plus discret qu'un jour bloqué. */
.kdc-closure-day.is-weekend-closed[b-1znrujwmgd] {
    background: var(--bs-secondary-bg, #e9ecef);
}

/* Glissé en cours (classe posée par le module JS), puis sélection retenue (posée par le serveur). */
.kdc-closure-day.is-preview[b-1znrujwmgd],
.kdc-closure-day.is-selected[b-1znrujwmgd] {
    background: var(--bs-primary-bg-subtle, #cfe2ff);
    color: var(--bs-primary-text-emphasis, #052c65);
}

.kdc-closure-day.is-closed.is-preview[b-1znrujwmgd],
.kdc-closure-day.is-closed.is-selected[b-1znrujwmgd] {
    background: var(--bs-primary, #0d6efd);
    color: #fff;
}

.kdc-closure-side[b-1znrujwmgd] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.kdc-closure-selection[b-1znrujwmgd] {
    padding: 0.75rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: 0.5rem;
    background: var(--bs-tertiary-bg, #f8f9fa);
    font-size: 0.85rem;
}

.kdc-closure-listtitle[b-1znrujwmgd] {
    margin: 0.5rem 0 0;
    font-size: 0.8rem;
    font-weight: 600;
}

.kdc-closure-list[b-1znrujwmgd] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.kdc-closure-list li[b-1znrujwmgd] {
    display: flex;
    align-items: center;
    gap: 0.25rem;
}

.kdc-closure-range[b-1znrujwmgd] {
    flex: 1 1 auto;
    min-width: 0;
    display: grid;
    grid-template-columns: 7.5rem minmax(0, 1fr) auto;
    align-items: baseline;
    gap: 0.5rem;
    padding: 0.3rem 0.5rem;
    border: 0;
    border-radius: 4px;
    background: transparent;
    color: var(--bs-body-color, #212529);
    font-size: 0.8rem;
    text-align: left;
}

.kdc-closure-range:hover[b-1znrujwmgd] {
    background: var(--bs-tertiary-bg, #f1f3f5);
}

.kdc-closure-dates[b-1znrujwmgd] {
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.kdc-closure-label[b-1znrujwmgd] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.kdc-closure-length[b-1znrujwmgd] {
    color: var(--bs-secondary-color, #6c757d);
    font-variant-numeric: tabular-nums;
}

/* /Features/Settings/Documents/DocumentsSettings.razor.rz.scp.css */
/* État du connecteur ACC, une ligne par KD Convergence : seule l'icône porte la couleur de l'état, le texte le dit
   déjà. Teintes « -text » : contrastées pour du trait fin sur fond clair (cf. tokens.css). */
.doc-connectors .is-ok i[b-y8sfxjaffk] {
    color: var(--kd-success-text);
}

.doc-connectors .is-missing i[b-y8sfxjaffk] {
    color: var(--kd-warning-text);
}
/* /Features/Settings/General/HomeWidgetsSettings.razor.rz.scp.css */
.widget-selector[b-jvrl2g6aqn] {
    background-size: cover;
    content: " ";
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    position: absolute;
    z-index: 0;
    opacity: 0.69;
}

.widget-title[b-jvrl2g6aqn] {
    word-break: break-word;
    display: -webkit-box;
    color:#fff;
    font-weight: bold;
    text-transform:uppercase;
}

.widget-description[b-jvrl2g6aqn] {
    text-overflow: ellipsis;
    word-break: break-all;
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    height: 2lh;
}

.widget-card[b-jvrl2g6aqn] {
    transition: scale 0.1s ease-in-out;
    cursor: pointer;
}

.widget-card:hover[b-jvrl2g6aqn] {
    scale: 102%
}

.widget-modal-content[b-jvrl2g6aqn] {
    height: 83vh;
    overflow-y:scroll;
    overflow-x:hidden;
}
/* /Features/Settings/Instances/Components/ConnectivityCheckForm.razor.rz.scp.css */
/* Éditeur d'un test de connectivité, dans le drawer de saisie : cinq sections dans l'ordre du geste — interface,
   appel, contrôles, planification, attestation. Enregistrer et supprimer sont dans le pied du drawer. */

/* Marge à droite : sans elle, le texte bute contre la barre de défilement du panneau. */
.cxe[b-kavtbag0vi] {
    display: flex;
    flex-direction: column;
    padding: 0 .75rem 1rem 0;
}

.cxe-head[b-kavtbag0vi] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .5rem 1rem;
}

.cxe-title[b-kavtbag0vi] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .375rem;
    margin: 0;
    font-weight: 600;
}

.cxe-section[b-kavtbag0vi] {
    margin-top: 1.25rem;
    padding-top: 1rem;
    border-top: 1px solid var(--bs-border-color);
}

.cxe-section-title[b-kavtbag0vi] {
    margin-bottom: .75rem;
    font-weight: 600;
}

.cxe-last[b-kavtbag0vi] {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    font-size: .8125rem;
    color: var(--bs-secondary-color);
}

.cxe-muted[b-kavtbag0vi] {
    color: var(--bs-secondary-color);
}

.cxe-code[b-kavtbag0vi] {
    font-family: var(--bs-font-monospace);
    font-size: .8125rem;
}

.cxe-call-row[b-kavtbag0vi] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: .75rem 1.5rem;
    margin-top: 1rem;
}

.cxe-field-small[b-kavtbag0vi] {
    width: 10rem;
}

.cxe-call-action[b-kavtbag0vi] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem 1rem;
}

.cxe-result[b-kavtbag0vi] {
    margin-top: 1rem;
    padding: .75rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-left-width: 3px;
    border-radius: .5rem;
}

.cxe-result.is-ok[b-kavtbag0vi] { border-left-color: var(--bs-success); }
.cxe-result.is-warning[b-kavtbag0vi] { border-left-color: var(--bs-warning); }
.cxe-result.is-ko[b-kavtbag0vi] { border-left-color: var(--bs-danger); }

.cxe-result-head[b-kavtbag0vi] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .375rem 1rem;
}

.cxe-fact[b-kavtbag0vi] {
    font-size: .875rem;
}

.cxe-failure[b-kavtbag0vi] {
    color: var(--bs-danger-text-emphasis);
}

.cxe-subhead[b-kavtbag0vi] {
    margin: 1rem 0 .5rem;
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--bs-secondary-color);
}

.cxe-response[b-kavtbag0vi] {
    max-height: 24rem;
    margin: 0 0 .5rem;
    padding: .5rem .75rem;
    overflow: auto;
    border-radius: .375rem;
    background: var(--bs-tertiary-bg);
    white-space: pre-wrap;
    word-break: break-word;
}

.cxe-grid[b-kavtbag0vi] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
    gap: .75rem 1.5rem;
}

/* Période plus courte que la fréquence de la connexion : elle sera relevée, l'éditeur le dit. */
.cxe-period-limited[b-kavtbag0vi] {
    display: flex;
    align-items: baseline;
    gap: .25rem;
    color: var(--bs-warning-text-emphasis);
}

.cxe-assertions[b-kavtbag0vi] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    margin-bottom: .75rem;
}

.cxe-assertion[b-kavtbag0vi] {
    display: grid;
    grid-template-columns: minmax(10rem, 2fr) minmax(9rem, 1.2fr) minmax(8rem, 1.5fr) auto;
    align-items: center;
    gap: .5rem;
}

.cxe-errors[b-kavtbag0vi] {
    margin: 1.25rem 0 0;
}

    .cxe-errors:focus[b-kavtbag0vi] {
        outline: none;
        box-shadow: 0 0 0 .2rem rgba(var(--bs-danger-rgb), .25);
    }

@media (max-width: 575.98px) {
    .cxe-assertion[b-kavtbag0vi] {
        grid-template-columns: 1fr auto;
    }

    .cxe-field-small[b-kavtbag0vi] {
        width: 100%;
    }
}
/* /Features/Settings/Instances/Components/ConnectivityCheckFormFooter.razor.rz.scp.css */
/* Pied collant du drawer d'un test. Le conteneur (.layout-drawer-foot) est posé par le Drawer : ici, seuls les états
   propres au formulaire — mêmes teintes que le pied de Gestion du menu. */

.cxf-delete[b-6oeqtkp7tg] {
    margin-right: auto;
}

.cxf-unsaved[b-6oeqtkp7tg] {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
    font-size: 11.5px;
    font-weight: 600;
    color: #8a5d00;
}

    .cxf-unsaved i[b-6oeqtkp7tg] {
        flex: none;
    }

/* Demande d'abandon : remplace les boutons pour qu'on ne puisse pas fermer par réflexe. */
.cxf-discard[b-6oeqtkp7tg] {
    flex: 1;
    background: #fdf5e3;
    border: 1px solid #f0dda6;
    border-radius: 8px;
    padding: 10px 12px;
}

    .cxf-discard p[b-6oeqtkp7tg] {
        margin: 0 0 9px;
        font-size: 12.5px;
        color: #8a5d00;
        font-weight: 600;
    }

.cxf-discard-actions[b-6oeqtkp7tg] {
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}
/* /Features/Settings/Instances/Components/ConnectivityInterfacePicker.razor.rz.scp.css */
/* Choix de l'interface d'un test : recherche, liste des interfaces du système, résumé de l'interface retenue. */

.cip-search-row[b-68e5w9egt9] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem 1rem;
}

.cip-search-input[b-68e5w9egt9] {
    position: relative;
    flex: 1 1 18rem;
    min-width: 0;
}

    .cip-search-input i[b-68e5w9egt9] {
        position: absolute;
        top: 50%;
        left: .75rem;
        transform: translateY(-50%);
        color: var(--bs-secondary-color);
        pointer-events: none;
    }

    .cip-search-input input[b-68e5w9egt9] {
        padding-left: 2.25rem;
    }

.cip-count[b-68e5w9egt9] {
    font-size: .8125rem;
    color: var(--bs-secondary-color);
    font-variant-numeric: tabular-nums;
}

.cip-empty[b-68e5w9egt9] {
    margin: .75rem 0 0;
    color: var(--bs-secondary-color);
}

.cip-list[b-68e5w9egt9] {
    display: flex;
    flex-direction: column;
    gap: .375rem;
    max-height: 22rem;
    margin: .75rem 0 .25rem;
    padding: 0;
    overflow-y: auto;
    list-style: none;
}

.cip-option[b-68e5w9egt9] {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: .125rem 1rem;
    width: 100%;
    padding: .5rem .75rem;
    border: 1px solid var(--bs-border-color);
    border-radius: .5rem;
    background: var(--bs-body-bg);
    color: inherit;
    text-align: left;
}

    .cip-option:hover:not(:disabled)[b-68e5w9egt9] {
        border-color: var(--bs-primary);
    }

    .cip-option.is-selected[b-68e5w9egt9] {
        border-color: var(--bs-primary);
        box-shadow: inset 3px 0 0 var(--bs-primary);
    }

    .cip-option:disabled[b-68e5w9egt9] {
        opacity: .6;
        cursor: not-allowed;
    }

.cip-option-head[b-68e5w9egt9] {
    grid-column: 1 / -1;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .5rem;
}

.cip-label[b-68e5w9egt9] {
    font-weight: 600;
}

.cip-class[b-68e5w9egt9] {
    justify-self: start;
    min-width: 0;
    overflow-wrap: anywhere;
    font-size: .8125rem;
}

/* L'identifiant se lit, et se cherche : discret mais entier. */
.cip-guid[b-68e5w9egt9] {
    font-family: var(--bs-font-monospace);
    font-size: .75rem;
    color: var(--bs-secondary-color);
    white-space: nowrap;
}

.cip-selected[b-68e5w9egt9] {
    padding: .75rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-left: 3px solid var(--bs-primary);
    border-radius: .5rem;
}

.cip-selected-head[b-68e5w9egt9] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .5rem;
}

.cip-description[b-68e5w9egt9] {
    margin: .25rem 0 0;
    color: var(--bs-secondary-color);
}

.cip-facts[b-68e5w9egt9] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: .5rem 1.5rem;
    margin: .75rem 0 0;
}

    .cip-facts dt[b-68e5w9egt9] {
        margin-bottom: .125rem;
        font-size: .75rem;
        font-weight: 600;
        letter-spacing: .04em;
        text-transform: uppercase;
        color: var(--bs-secondary-color);
    }

    .cip-facts dt label[b-68e5w9egt9] {
        margin: 0;
    }

    .cip-facts dd[b-68e5w9egt9] {
        margin: 0;
        min-width: 0;
        overflow-wrap: anywhere;
    }

.cip-id[b-68e5w9egt9] {
    max-width: 24rem;
}

@media (max-width: 575.98px) {
    .cip-option[b-68e5w9egt9] {
        grid-template-columns: minmax(0, 1fr);
    }

    .cip-guid[b-68e5w9egt9] {
        white-space: normal;
        overflow-wrap: anywhere;
    }
}
/* /Features/Settings/Instances/Components/ConnectivityJsonTree.razor.rz.scp.css */
/* Arborescence de la réponse d'un appel de test : un clic sur « + » en fait un contrôle. */

.cxj-node > summary[b-hdbakstjjh] {
    list-style: none;
    cursor: pointer;
}

.cxj-node > summary[b-hdbakstjjh]::-webkit-details-marker {
    display: none;
}

.cxj-node > summary[b-hdbakstjjh]::before {
    content: "▸";
    display: inline-block;
    width: .875rem;
    color: var(--bs-secondary-color);
    transition: transform .1s ease;
}

.cxj-node[open] > summary[b-hdbakstjjh]::before {
    transform: rotate(90deg);
}

.cxj-line[b-hdbakstjjh] {
    display: flex;
    align-items: baseline;
    gap: .5rem;
    min-width: 0;
    padding: .0625rem 0;
}

.cxj-line:hover[b-hdbakstjjh] {
    background: var(--bs-tertiary-bg);
}

.cxj-children[b-hdbakstjjh] {
    margin: 0;
    padding-left: 1.25rem;
    list-style: none;
    border-left: 1px dotted var(--bs-border-color);
}

.cxj-name[b-hdbakstjjh] {
    font-weight: 600;
    white-space: nowrap;
}

.cxj-name.is-root[b-hdbakstjjh] {
    color: var(--bs-secondary-color);
}

.cxj-type[b-hdbakstjjh],
.cxj-more[b-hdbakstjjh] {
    color: var(--bs-secondary-color);
    white-space: nowrap;
}

.cxj-value[b-hdbakstjjh] {
    overflow: hidden;
    min-width: 0;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cxj-value.is-string[b-hdbakstjjh] { color: var(--bs-success-text-emphasis); }
.cxj-value.is-number[b-hdbakstjjh] { color: var(--bs-info-text-emphasis); }
.cxj-value.is-true[b-hdbakstjjh],
.cxj-value.is-false[b-hdbakstjjh],
.cxj-value.is-null[b-hdbakstjjh] { color: var(--bs-warning-text-emphasis); }

.cxj-pick[b-hdbakstjjh] {
    flex-shrink: 0;
    width: 1.25rem;
    height: 1.25rem;
    margin-left: auto;
    padding: 0;
    border: 1px solid var(--bs-border-color);
    border-radius: .25rem;
    background: var(--bs-body-bg);
    color: var(--bs-primary);
    line-height: 1;
    opacity: .35;
}

.cxj-line:hover > .cxj-pick[b-hdbakstjjh],
.cxj-pick:focus-visible[b-hdbakstjjh] {
    opacity: 1;
}

.cxj-pick i[b-hdbakstjjh] {
    font-size: .75rem;
}
/* /Features/Settings/Instances/Components/ConnectivitySchemaFields.razor.rz.scp.css */
/* Schéma d'appel d'une interface, sous son résumé dans l'éditeur d'un test. */

.csf[b-hvt3he3cry] {
    margin-top: 1rem;
}

.csf-head[b-hvt3he3cry] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .25rem 1rem;
    margin-bottom: .25rem;
}

.csf-title[b-hvt3he3cry] {
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--bs-secondary-color);
}

.csf-head .form-check-label[b-hvt3he3cry] {
    font-size: .8125rem;
    color: var(--bs-secondary-color);
}

.csf-note[b-hvt3he3cry] {
    margin: 0 0 .5rem;
    font-size: .875rem;
    color: var(--bs-secondary-color);
}

.csf-warning[b-hvt3he3cry] {
    display: flex;
    align-items: baseline;
    gap: .25rem;
    margin: 0 0 .5rem;
    font-size: .875rem;
    color: var(--bs-warning-text-emphasis);
}

.csf-table[b-hvt3he3cry] {
    margin-bottom: 0;
    font-size: .875rem;
}

/* Un champ d'objet ou d'élément de tableau se lit sous son parent, en retrait. */
.csf-name[b-hvt3he3cry] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .375rem;
    padding-left: calc(var(--depth, 0) * 1.25rem);
}

/* Neutre : la couleur principale varie selon l'habillage, et en rouge « obligatoire » se lirait comme une erreur. */
.csf-required[b-hvt3he3cry] {
    padding: .0625rem .375rem;
    border: 1px solid var(--bs-border-color);
    border-radius: .375rem;
    font-size: .6875rem;
    font-weight: 600;
    color: var(--bs-body-color);
    white-space: nowrap;
}

.csf-type[b-hvt3he3cry] {
    white-space: nowrap;
    font-size: .8125rem;
}

.csf-description[b-hvt3he3cry] {
    min-width: 12rem;
}

.csf-values[b-hvt3he3cry] {
    display: block;
    font-size: .8125rem;
    color: var(--bs-secondary-color);
}

.csf-present[b-hvt3he3cry] {
    font-size: .8125rem;
    color: var(--bs-success-text-emphasis);
}

.csf-table tr.is-technical code[b-hvt3he3cry] {
    color: var(--bs-secondary-color);
}
/* /Features/Settings/Instances/InstancesEditConnectivity.razor.rz.scp.css */
/* Réglages › connexion BOS › Tests de connectivité : un bloc par connecteur, un sous-bloc par système relié. */

.cxs-intro[b-5bqtr46jtj] {
    margin-bottom: 1.25rem;
    color: var(--bs-secondary-color);
}

/* Fréquence de la connexion : texte à gauche, saisie à droite ; empilés quand la carte est étroite. */
.cxs-frequency[b-5bqtr46jtj] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: .75rem 1.5rem;
    margin-bottom: 1.25rem;
    padding: .75rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-radius: .5rem;
    background: var(--bs-tertiary-bg);
}

.cxs-frequency-text[b-5bqtr46jtj] {
    flex: 1 1 22rem;
    min-width: 0;
}

.cxs-frequency-title[b-5bqtr46jtj] {
    display: flex;
    align-items: center;
    gap: .375rem;
    margin-bottom: .25rem;
    font-weight: 600;
}

.cxs-frequency-help[b-5bqtr46jtj] {
    margin: 0;
    font-size: .875rem;
    color: var(--bs-secondary-color);
}

.cxs-frequency-form[b-5bqtr46jtj] {
    flex: 0 1 16rem;
    min-width: 0;
}

/* Dérogation d'un connecteur, sous son en-tête. */
.cxs-connector-period[b-5bqtr46jtj] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .75rem;
    margin-bottom: .5rem;
    font-size: .875rem;
    color: var(--bs-secondary-color);
}

.cxs-connector-period .form-label[b-5bqtr46jtj],
.cxs-connector-period .form-text[b-5bqtr46jtj] {
    flex-basis: 100%;
}

.cxs-connector-period-text[b-5bqtr46jtj] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
}

.cxs-connector-period-form[b-5bqtr46jtj] {
    max-width: 22rem;
}

.cxs-connectors[b-5bqtr46jtj] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.cxs-connector[b-5bqtr46jtj] {
    padding: .75rem 1rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-radius: .5rem;
}

.cxs-connector-head[b-5bqtr46jtj] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem;
    margin-bottom: .5rem;
}

.cxs-connector-name[b-5bqtr46jtj] {
    margin: 0;
    font-weight: 600;
}

.cxs-system[b-5bqtr46jtj] {
    padding: .5rem 0 0 1rem;
    border-left: 2px solid var(--bs-border-color);
}

.cxs-system + .cxs-system[b-5bqtr46jtj] {
    margin-top: .75rem;
}

.cxs-system-head[b-5bqtr46jtj] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .25rem;
}

.cxs-system-name[b-5bqtr46jtj] {
    display: inline-flex;
    align-items: center;
    gap: .375rem;
    font-weight: 600;
}

.cxs-empty[b-5bqtr46jtj] {
    margin: 0;
    font-size: .875rem;
    font-style: italic;
    color: var(--bs-secondary-color);
}

.cxs-table[b-5bqtr46jtj] {
    margin: 0;
    font-size: .875rem;
}

.cxs-class[b-5bqtr46jtj] {
    display: block;
    font-family: var(--bs-font-monospace);
    font-size: .75rem;
    color: var(--bs-secondary-color);
}

.cxs-when[b-5bqtr46jtj],
.cxs-failure[b-5bqtr46jtj] {
    display: block;
    font-size: .75rem;
    color: var(--bs-secondary-color);
}

.cxs-failure[b-5bqtr46jtj] {
    color: var(--bs-danger-text-emphasis);
}

/* Dernière attestation « sans effet de bord » : qui l'a donnée, et quand. */
.cxs-attested[b-5bqtr46jtj] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    font-size: .75rem;
    color: var(--bs-secondary-color);
}
/* /Features/Settings/MeasurementOptions/MeasurementOptionsSettings.razor.rz.scp.css */
/* Styles propres à l'écran des options de mesure. Rien ici ne touche au fond, à la bordure, au rayon
   ni à la hauteur d'un champ : ceux-ci viennent des jetons --kd-field-* (cf. .claude/rules/styles-css.md).

   Les règles de la section montée passent par ::deep : le CSS isolé ne marque que le balisage de CE
   composant, et les cinq sections sont des composants enfants. Les écrire ici plutôt que dans cinq
   .razor.css évite qu'une même valeur diverge d'une section à l'autre. */

.kdc-measure-hint[b-cro7e21mix] {
    font-size: 0.82rem;
    max-width: 70ch;
    margin-bottom: 1rem;
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-sub {
    font-size: 0.82rem;
    margin-bottom: 0.9rem;
    max-width: 80ch;
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-note {
    font-size: 0.82rem;
    padding: 0.5rem 0.75rem;
    margin-bottom: 0;
}

/* Un bloc de la section « Périodes de référence » : fuseau, heures exclues, semaine. Séparés par un
   filet, pas par une carte — ce sont les faces d'un même réglage, et ils s'enregistrent ensemble. */
.kdc-measure-section[b-cro7e21mix]  .kdc-measure-block {
    padding-top: 1rem;
    margin-top: 1rem;
    border-top: 1px solid var(--kd-border, rgba(0, 0, 0, 0.08));
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-block-title {
    font-size: 0.95rem;
    font-weight: 600;
    margin-bottom: 0.15rem;
}

/* Les plages exclues : une ligne de pastilles qui passe à la ligne plutôt que de déborder. */
.kdc-measure-section[b-cro7e21mix]  .kdc-measure-ranges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    align-items: center;
    min-height: 2rem;
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-range {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
}

/* Un champ de trois chiffres n'a pas besoin de toute la carte. Largeur seulement : fond, bordure,
   rayon et hauteur restent aux jetons --kd-field-* (cf. .claude/rules/styles-css.md). */
.kdc-measure-section[b-cro7e21mix]  .kdc-measure-narrow {
    width: 120px;
    flex: 0 0 auto;
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-empty,
.kdc-measure-section[b-cro7e21mix]  .kdc-measure-error {
    font-size: 0.82rem;
}

/* Un bloc par thématique dans la section « Périmètre » : séparés par un filet, pas par une carte —
   ce sont des réglages de même nature, pas des sujets différents. */
.kdc-measure-section[b-cro7e21mix]  .kdc-measure-theme {
    padding-top: 0.9rem;
    margin-top: 0.9rem;
    border-top: 1px solid var(--kd-border, rgba(0, 0, 0, 0.08));
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-theme:first-of-type {
    padding-top: 0;
    margin-top: 0;
    border-top: 0;
}

.kdc-measure-section[b-cro7e21mix]  .kdc-measure-theme-title {
    font-size: 0.88rem;
    font-weight: 600;
    margin-bottom: 0.6rem;
}
/* /Features/Settings/MenuEditor/Components/MenuEditorForm.razor.rz.scp.css */
/* Formulaire d'entrée de menu, rendu dans le drawer. */

.mef[b-rm84bldzrg] {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

/* Onglets soulignés, même gabarit que les drawers Équipement et Espace. */
.mef-tabs[b-rm84bldzrg] {
    display: flex;
    gap: 2px;
    border-bottom: 1px solid #e2e7ee;
    margin: -4px 0 0;
}

.mef-tab[b-rm84bldzrg] {
    border: none;
    background: none;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    color: #6b7684;
    padding: 9px 12px;
    cursor: pointer;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

    .mef-tab:hover[b-rm84bldzrg] {
        color: #1f2833;
    }

.mef-tab-on[b-rm84bldzrg] {
    color: #6d8f28;
    border-bottom-color: var(--bs-primary);
}

.mef-dot[b-rm84bldzrg] {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: #e0a516;
    flex: none;
}

.mef-sub[b-rm84bldzrg] {
    margin: 0;
    font-size: 12px;
    color: #9aa4b2;
}

.mef-error[b-rm84bldzrg] {
    font-size: 12px;
    color: var(--bs-danger);
    margin-top: 4px;
}

/* Ce que le référentiel des pages sait de la destination saisie. */
.mef-route[b-rm84bldzrg] {
    display: flex;
    gap: 8px;
    align-items: flex-start;
    border-radius: 8px;
    padding: 9px 11px;
    font-size: 12px;
}

    .mef-route i[b-rm84bldzrg] {
        flex: none;
        margin-top: 1px;
        font-size: 15px;
    }

.mef-route-ok[b-rm84bldzrg] {
    background: #e6f6f0;
    color: #1f2833;
}

    .mef-route-ok i[b-rm84bldzrg] {
        color: #19ad79;
    }

.mef-route-warn[b-rm84bldzrg] {
    background: #fdf5e3;
    color: #1f2833;
}

    .mef-route-warn i[b-rm84bldzrg] {
        color: #e0a516;
    }

.mef-route-neutral[b-rm84bldzrg] {
    background: #eef1f5;
    color: #6b7684;
}

/* Profils cochés qui n'ouvriront pas la page. */
.mef-gap[b-rm84bldzrg] {
    display: flex;
    gap: 9px;
    align-items: flex-start;
    background: #fdf5e3;
    border: 1px solid #f0dda6;
    border-radius: 8px;
    padding: 10px 12px;
    font-size: 12px;
}

    .mef-gap i[b-rm84bldzrg] {
        flex: none;
        margin-top: 1px;
        color: #e0a516;
        font-size: 15px;
    }

    .mef-gap b[b-rm84bldzrg] {
        display: block;
        margin-bottom: 2px;
        color: #8a5d00;
    }

    .mef-gap ul[b-rm84bldzrg] {
        margin: 5px 0;
        padding-left: 17px;
    }

.mef-inherited[b-rm84bldzrg] {
    background: #eef1f5;
    border-radius: 8px;
    padding: 11px 12px;
    font-size: 12px;
    color: #6b7684;
}

    .mef-inherited b[b-rm84bldzrg] {
        display: block;
        margin-bottom: 4px;
        color: #1f2833;
        font-size: 12.5px;
    }
/* /Features/Settings/MenuEditor/MenuEditor.razor.rz.scp.css */
/* Arbre du menu. Tout est propre à cet écran : rien à promouvoir dans app.css tant qu'un second
   écran n'en aura pas besoin.

   ⚠ theme.css impose « label, input, button, select, textarea { font-size: 12px !important } »
   (bloc [15. Form Elements]). Toute taille posée ici sur un de ces éléments est donc silencieusement
   perdue — et un picto placé dans un <button> hérite de 12px. D'où deux habitudes dans ce fichier :
   les contrôles de formulaire gardent le 12px de la maison, et les pictos sont dimensionnés sur le
   <i>, jamais sur le bouton qui les porte. */

/* ── Barre d'outils ─────────────────────────────────────────────── */
.mt-toolbar[b-18di7ls9nx] {
    display: flex;
    gap: 8px;
    align-items: center;
    flex-wrap: wrap;
    margin-bottom: 12px;
}

.mt-search[b-18di7ls9nx] {
    position: relative;
    flex: 1;
    min-width: 210px;
    max-width: 340px;
}

    .mt-search i[b-18di7ls9nx] {
        position: absolute;
        left: 10px;
        top: 50%;
        transform: translateY(-50%);
        color: #9aa4b2;
    }

    .mt-search input[b-18di7ls9nx] {
        width: 100%;
        height: 36px;
        padding: 0 10px 0 31px;
        border: 1px solid #cfd6e0;
        border-radius: 8px;
    }

.mt-asrole[b-18di7ls9nx] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    height: 36px;
    padding: 0 4px 0 11px;
    border: 1px solid #cfd6e0;
    border-radius: 8px;
    color: #6b7684;
}

.mt-asrole-on[b-18di7ls9nx] {
    border-color: var(--bs-primary);
    background: #f0f6e3;
    color: #6d8f28;
}

.mt-asrole select[b-18di7ls9nx] {
    height: 28px;
    border: none;
    background: transparent;
    font-weight: 600;
    color: inherit;
}

.mt-spacer[b-18di7ls9nx] {
    flex: 1;
}

/* ── Bandeau de synthèse ────────────────────────────────────────── */
.mt-summary[b-18di7ls9nx] {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-bottom: 14px;
}

.mt-chip[b-18di7ls9nx] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    height: 30px;
    padding: 0 11px;
    border: 1px solid #e2e7ee;
    border-radius: 999px;
    background: #fff;
    font-size: 12px;
    color: #6b7684;
}

.mt-chip-btn[b-18di7ls9nx] {
    cursor: pointer;
}

.mt-chip-warn[b-18di7ls9nx] {
    background: #fdf5e3;
    border-color: #f0dda6;
    color: #8a5d00;
}

.mt-chip-on[b-18di7ls9nx] {
    box-shadow: 0 0 0 3px #f0f6e3;
    border-color: var(--bs-primary);
}

/* ── Grille ─────────────────────────────────────────────────────── */
.mt-card[b-18di7ls9nx] {
    overflow: hidden;
}

.mt-head[b-18di7ls9nx],
.mt-row[b-18di7ls9nx] {
    display: grid;
    grid-template-columns: 34px minmax(220px, 1.5fr) minmax(180px, 1.1fr) minmax(200px, 1.2fr) 96px 132px;
    align-items: center;
    gap: 10px;
    padding: 0 12px;
}

.mt-head[b-18di7ls9nx] {
    height: 38px;
    background: #f7f9fb;
    border-bottom: 1px solid #e2e7ee;
    font-size: 10.5px;
    letter-spacing: .07em;
    text-transform: uppercase;
    color: #9aa4b2;
    font-weight: 600;
}

.mt-right[b-18di7ls9nx] {
    text-align: right;
}

.mt-empty[b-18di7ls9nx] {
    padding: 26px;
    text-align: center;
    color: #6b7684;
    font-size: 13px;
    margin: 0;
}

.mt-row[b-18di7ls9nx] {
    min-height: 52px;
    border-bottom: 1px solid #e2e7ee;
    position: relative;
    background: #fff;
}

    .mt-row:hover[b-18di7ls9nx] {
        background: #f7f9fb;
    }

.mt-row-sel[b-18di7ls9nx] {
    background: #f0f6e3;
}

    .mt-row-sel[b-18di7ls9nx]::before {
        content: "";
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        width: 3px;
        background: var(--bs-primary);
    }

.mt-row-hidden .mt-name[b-18di7ls9nx],
.mt-row-hidden .mt-dest[b-18di7ls9nx] {
    opacity: .5;
}

.mt-row-drop[b-18di7ls9nx] {
    background: #f0f6e3;
    box-shadow: inset 0 0 0 2px #cfe3a4;
}

/* Cible de dépôt entre deux lignes. Haute de 6 px au repos pour rester attrapable, et signalée par un
   trait plein pendant le survol — pas de mesure du curseur, donc pas d'aller-retour JavaScript. */
.mt-drop[b-18di7ls9nx] {
    height: 6px;
    margin: -3px 0;
    position: relative;
    z-index: 1;
}

.mt-drop-on[b-18di7ls9nx]::after {
    content: "";
    position: absolute;
    left: 34px;
    right: 12px;
    top: 2px;
    height: 2px;
    background: var(--bs-primary);
}

.mt-grip[b-18di7ls9nx] {
    display: flex;
    align-items: center;
    justify-content: center;
    color: #9aa4b2;
    cursor: grab;
}

/* ── Libellé et indentation ─────────────────────────────────────── */
.mt-label[b-18di7ls9nx] {
    display: flex;
    align-items: center;
    gap: 9px;
    min-width: 0;
}

.mt-guide[b-18di7ls9nx] {
    display: block;
    flex: none;
    width: 20px;
    align-self: stretch;
    margin-left: 9px;
    border-left: 1px solid #dfe5ee;
}

.mt-ico[b-18di7ls9nx] {
    width: 26px;
    height: 26px;
    flex: none;
    border-radius: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #eef1f5;
    color: #6b7684;
}

.mt-ico i[b-18di7ls9nx] {
    font-size: 15px;
}

.mt-ico-dir[b-18di7ls9nx] {
    background: #f0f6e3;
    color: #6d8f28;
}

.mt-name[b-18di7ls9nx] {
    min-width: 0;
    overflow: hidden;
}

    .mt-name b[b-18di7ls9nx] {
        display: block;
        font-size: 13.5px;
        font-weight: 600;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

.mt-toggle[b-18di7ls9nx] {
    width: 22px;
    height: 22px;
    border: none;
    background: none;
    color: #6b7684;
    border-radius: 4px;
    padding: 0;
    cursor: pointer;
}

    .mt-toggle:hover[b-18di7ls9nx] {
        background: #eef1f5;
    }

    .mt-toggle i[b-18di7ls9nx] {
        font-size: 14px;
    }

/* ── Destination ────────────────────────────────────────────────── */
.mt-dest[b-18di7ls9nx] {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

    .mt-dest code[b-18di7ls9nx] {
        font-size: 11.5px;
        color: #6b7684;
        background: #eef1f5;
        padding: 1px 6px;
        border-radius: 4px;
        align-self: flex-start;
        max-width: 100%;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

.mt-guard[b-18di7ls9nx] {
    font-size: 10.5px;
    color: #9aa4b2;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.mt-guard-warn[b-18di7ls9nx] {
    color: #8a5d00;
}

/* ── Accès ──────────────────────────────────────────────────────── */
.mt-acc[b-18di7ls9nx] {
    display: flex;
    align-items: center;
    gap: 5px;
    flex-wrap: wrap;
    min-width: 0;
}

/* Les profils venus de l'annuaire portent leur nom technique tant qu'aucun libellé n'a été saisi
   (« A_GBL_ALL_AE01_KDC_Technicien_CVCS » : 34 caractères). Sans plafond, un seul badge occupe la
   colonne entière et chaque ligne du tableau enfle à trois hauteurs. Le nom complet reste en
   infobulle. */
.mt-rb[b-18di7ls9nx] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    max-width: 130px;
    height: 21px;
    padding: 0 8px;
    border-radius: 999px;
    font-size: 11.5px;
    background: #eef1f5;
    color: #6b7684;
    border: 1px solid transparent;
    white-space: nowrap;
    overflow: hidden;
}

    .mt-rb > i[b-18di7ls9nx] {
        flex: none;
    }

.mt-rb-t[b-18di7ls9nx] {
    overflow: hidden;
    text-overflow: ellipsis;
}

.mt-rb-gap[b-18di7ls9nx] {
    background: #fdf5e3;
    color: #8a5d00;
    border-color: #f0dda6;
}

.mt-rb-more[b-18di7ls9nx] {
    background: transparent;
    color: #9aa4b2;
    border: 1px dashed #cfd6e0;
}

.mt-derived[b-18di7ls9nx],
.mt-norole[b-18di7ls9nx] {
    font-size: 11.5px;
    display: inline-flex;
    align-items: center;
    gap: 5px;
}

.mt-derived[b-18di7ls9nx] {
    color: #9aa4b2;
    font-style: italic;
}

.mt-norole[b-18di7ls9nx] {
    color: var(--bs-danger);
}

/* ── Visibilité ─────────────────────────────────────────────────── */
.mt-sw[b-18di7ls9nx] {
    width: 38px;
    height: 21px;
    border-radius: 999px;
    background: #cfd6e0;
    border: none;
    position: relative;
    cursor: pointer;
    padding: 0;
    transition: background .14s;
}

    .mt-sw[b-18di7ls9nx]::after {
        content: "";
        position: absolute;
        top: 2px;
        left: 2px;
        width: 17px;
        height: 17px;
        border-radius: 50%;
        background: #fff;
        box-shadow: 0 1px 2px rgba(0,0,0,.25);
        transition: transform .14s;
    }

    .mt-sw[aria-checked="true"][b-18di7ls9nx] {
        background: var(--bs-primary);
    }

        .mt-sw[aria-checked="true"][b-18di7ls9nx]::after {
            transform: translateX(17px);
        }

/* ── Actions ────────────────────────────────────────────────────── */
/* Les actions de ligne communes (RowAction, app.css § 49), toujours visibles. Ici ne reste que leur rangée. */
.mt-acts[b-18di7ls9nx] {
    display: flex;
    justify-content: flex-end;
}

@media (prefers-reduced-motion: reduce) {
    .mt-sw[b-18di7ls9nx],
    .mt-sw[b-18di7ls9nx]::after {
        transition: none;
    }
}
/* /Features/Settings/NotificationGroups/Components/EmailListEditor.razor.rz.scp.css */
/* Adresses d'un groupe de notification, en étiquettes. Même gabarit que le sélecteur de profils de la
   gestion du menu (aujourd'hui RolePicker), en jetons de tokens.css plutôt qu'en hexadécimal : il suit l'habillage
   client. Aucune taille de police ici, elles se posent dans le markup (.fs-*). */

.nge[b-wvyai3i5cu] {
    border: 1px solid var(--kd-border);
    border-radius: var(--kd-radius-lg);
    background: var(--kd-surface);
    overflow: hidden;
}

.nge-has-invalid[b-wvyai3i5cu] {
    border-color: var(--bs-danger);
}

/* Adresses retenues. Une adresse longue passe à la ligne plutôt que de déborder du drawer. */
.nge-tags[b-wvyai3i5cu] {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    padding: 8px;
    min-height: 40px;
    align-items: center;
    border-bottom: 1px solid var(--kd-border);
    max-height: 240px;
    overflow-y: auto;
}

.nge-empty[b-wvyai3i5cu] {
    color: var(--kd-text-muted);
    padding-left: 3px;
}

.nge-tag[b-wvyai3i5cu] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    max-width: 100%;
    min-height: 23px;
    padding: 1px 4px 1px 9px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--kd-primary) 12%, transparent);
    border: 1px solid color-mix(in srgb, var(--kd-primary) 35%, transparent);
    color: var(--kd-primary-text);
    font-weight: 600;
}

.nge-tag-text[b-wvyai3i5cu] {
    min-width: 0;
    overflow-wrap: anywhere;
}

/* Pas de font-size sur le bouton : theme.css l'écrase (!important). La croix hérite de l'étiquette. */
.nge-tag button[b-wvyai3i5cu] {
    width: 18px;
    height: 18px;
    flex: none;
    border: none;
    background: transparent;
    color: inherit;
    cursor: pointer;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
}

    .nge-tag button:hover[b-wvyai3i5cu],
    .nge-tag button:focus-visible[b-wvyai3i5cu] {
        background: color-mix(in srgb, var(--kd-primary) 25%, transparent);
    }

.nge-input[b-wvyai3i5cu] {
    display: flex;
    gap: 6px;
    align-items: flex-start;
    padding: 8px;
}

    .nge-input textarea[b-wvyai3i5cu] {
        flex: 1;
        min-width: 0;
        resize: vertical;
    }

    .nge-input .btn[b-wvyai3i5cu] {
        flex: none;
    }

.nge-error[b-wvyai3i5cu] {
    color: var(--bs-danger);
    margin-top: 4px;
    overflow-wrap: anywhere;
}
/* /Features/Settings/NotificationGroups/Components/NotificationGroupForm.razor.rz.scp.css */
/* Formulaire d'un groupe de notification, rendu dans le drawer. */

.ngf[b-oo7nl2p0vy] {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.ngf-error[b-oo7nl2p0vy] {
    color: var(--bs-danger);
    margin-top: 4px;
}

/* Où le groupe sert : informatif, pas une alerte. */
.ngf-usages[b-oo7nl2p0vy] {
    display: flex;
    gap: 8px;
    align-items: flex-start;
    padding: 9px 11px;
    border-radius: var(--kd-radius-lg);
    background: var(--kd-page-bg);
    color: var(--kd-text);
}

    .ngf-usages i[b-oo7nl2p0vy] {
        flex: none;
        margin-top: 2px;
        color: var(--kd-text-muted);
    }
/* /Features/Settings/NotificationGroups/NotificationGroupsSettings.razor.rz.scp.css */
/* Groupes de notification (/settings/notification-groups) : barre d'outils, cartes, écran vide.
   Styles propres à cet écran (cf. .claude/rules/styles-css.md). Couleurs en jetons de tokens.css, tailles de
   police posées dans le markup (.fs-*) : une déclaration font-size locale perdrait l'interligne de l'échelle. */

.ngs-toolbar[b-8kr76tas8o] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin-bottom: 18px;
}

.ngs-hint[b-8kr76tas8o] {
    flex: 1 1 320px;
    min-width: 0;
    max-width: 760px;
}

.ngs-toolbar .btn[b-8kr76tas8o] {
    margin-left: auto;
}

/* --- carte de groupe ---------------------------------------------------- */
.ngs-card[b-8kr76tas8o] {
    height: 100%;
    margin-bottom: 0;
}

    .ngs-card:hover[b-8kr76tas8o] {
        border-color: color-mix(in srgb, var(--kd-primary) 45%, transparent);
    }

/* Groupe inactif : il ne reçoit plus rien, la carte s'efface sans disparaître. */
.ngs-card-inactive .ngs-card-title[b-8kr76tas8o],
.ngs-card-inactive .ngs-emails[b-8kr76tas8o] {
    opacity: .6;
}

/* Carte ouverte dans le drawer : on garde le repère de ce qu'on édite. */
.ngs-card-editing[b-8kr76tas8o] {
    border-color: var(--kd-primary);
    box-shadow: 0 0 0 1px var(--kd-primary);
}

.ngs-card-head[b-8kr76tas8o] {
    min-width: 0;
}

.ngs-card-title[b-8kr76tas8o] {
    margin: 0 0 4px;
    line-height: 1.3;
    overflow-wrap: anywhere;
}

.ngs-emails[b-8kr76tas8o] {
    margin: 12px 0 10px;
    padding: 8px 10px;
    border-radius: var(--kd-radius);
    background: var(--kd-page-bg);
}

.ngs-email[b-8kr76tas8o] {
    color: var(--kd-text-strong);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* --- où le groupe sert -------------------------------------------------- */
.ngs-usages[b-8kr76tas8o] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
}

.ngs-chip[b-8kr76tas8o] {
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    border-radius: var(--kd-radius);
    background: color-mix(in srgb, var(--kd-primary) 14%, transparent);
    color: var(--kd-primary-text);
    text-decoration: none;
}

a.ngs-chip:hover[b-8kr76tas8o],
a.ngs-chip:focus-visible[b-8kr76tas8o] {
    background: color-mix(in srgb, var(--kd-primary) 26%, transparent);
    color: var(--kd-primary-text);
}

/* --- écran vide --------------------------------------------------------- */
.ngs-empty[b-8kr76tas8o] {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 48px 16px;
    border: 1px dashed var(--kd-border);
    border-radius: var(--kd-radius-lg);
    background: var(--kd-surface);
}

    .ngs-empty i[b-8kr76tas8o] {
        color: var(--kd-text-muted);
        margin-bottom: 12px;
    }
/* /Features/Settings/Provisioning/Provisioning.razor.rz.scp.css */
/* État du raccordement à l'annuaire — styles propres à cet écran (cf. .claude/rules/styles-css.md).

   Ne sont écrites ici que les règles sans équivalent existant : le thème prime, et ce qu'il fournit se
   pose dans le markup. En particulier AUCUNE typographie ici — ni famille, ni taille, ni graisse, ni
   capitales : .font-monospace, l'échelle .fs-10 … .fs-40 (qui porte aussi interlettrage et interligne),
   .fw-normal / .fw-medium / .fw-semibold / .fw-bold et .all-caps existent déjà.

   Couleurs : variables du thème sans repli hexadécimal. Les replis d'origine (--bs-primary, #2196f3)
   étaient trompeurs — un bleu là où la primaire du produit est verte. */

.prov-page[b-md73mgob4e] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.prov-intro[b-md73mgob4e] {
    max-width: 70ch;
    margin-bottom: 0;
}

.prov-connection[b-md73mgob4e] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
}

/* Rouge réservé à ce qui demande une action : raccordement muet, opérations refusées. */
.prov-alert[b-md73mgob4e] {
    color: var(--bs-danger);
}

/* Compteurs : une grille qui se replie plutôt qu'un rang qui déborde. */
.prov-stats[b-md73mgob4e] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 0.75rem;
}

.prov-stat[b-md73mgob4e] {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.75rem 1rem;
    border: 1px solid var(--bs-border-color);
    border-radius: 6px;
    text-decoration: none;
    color: inherit;
    background: var(--bs-body-bg);
}

a.prov-stat:hover[b-md73mgob4e] {
    border-color: var(--primary-color);
}

.prov-stat-value[b-md73mgob4e] {
    line-height: 1.1;
}

.prov-stat-label[b-md73mgob4e] {
    color: var(--gray-color);
}

/* Un compteur qui doit alerter garde ses chiffres lisibles : seul le liseré change. */
.prov-stat-alert[b-md73mgob4e] {
    border-color: var(--bs-danger);
}

.prov-stat-alert .prov-stat-value[b-md73mgob4e] {
    color: var(--bs-danger);
}

.prov-table th[b-md73mgob4e] {
    color: var(--gray-color);
    white-space: nowrap;
}

.prov-cell-time[b-md73mgob4e] {
    white-space: nowrap;
}

.prov-cell-account[b-md73mgob4e] {
    word-break: break-all;
}

/* Les métadonnées peuvent être longues : elles cèdent la largeur avant les autres colonnes. */
.prov-cell-detail[b-md73mgob4e] {
    color: var(--gray-color);
    word-break: break-word;
}

/* Création de groupe, désactivation, refus… : ce qu'on vient chercher dans cette liste. */
.prov-row-notable td:first-child[b-md73mgob4e] {
    box-shadow: inset 3px 0 0 0 var(--bs-warning);
}

/* Les deux boutons du jeton : sans `gap`, ils se touchent — « Générer » et « Supprimer » méritent
   d'être distincts au clic. `wrap` pour que le second passe dessous plutôt que de déborder de la
   carte sur un écran étroit. */
.prov-token-actions[b-md73mgob4e] {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}
/* /Features/Settings/Reports/ReportsSettingsThemes.razor.rz.scp.css */
/* Le formulaire d'ajout ou de modification d'un thème, sur une ligne au-dessus du tableau. */
.rst-form[b-y8rwot4as0] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 12px;
    margin-bottom: 16px;
}

.rst-field[b-y8rwot4as0] {
    flex: 1 1 220px;
    max-width: 320px;
}

.rst-buttons[b-y8rwot4as0] {
    display: flex;
    gap: 8px;
}

.rst-label[b-y8rwot4as0] {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}
/* /Features/Settings/Roles/Roles.razor.rz.scp.css */
/* Liste des rôles (/settings/roles) — barre d'outils, en-têtes de groupe et carte de rôle.
   Styles propres à cet écran : rien ici n'est réutilisé ailleurs (cf. .claude/rules/styles-css.md).

   Ne sont écrites ici que les règles sans équivalent existant. Le reste vient du thème et est posé
   directement dans le markup : .card / .card-body (composant Card), .progress + .progress-bar-primary
   pour la jauge, .badge pour la pastille « rôle local », .text-muted / .all-caps / .bold /
   .m-t-5 / .normal pour la typographie.

   ⚠️ AUCUNE taille de police en dur ici : le thème définit une échelle .fs-10 … .fs-20 qui porte aussi
   l'interlettrage et l'interligne propres à chaque corps. Une déclaration `font-size` locale prendrait
   la taille en perdant les deux autres. Les tailles se posent dans le markup, avec la classe du thème.

   Les actions de la carte reprennent la forme des autres écrans d'administration : icône Phosphor
   portée par le bouton lui-même (.ph-duotone.ph-pencil-simple / .ph-trash) en .fs-6, sur un
   .btn.btn-link — l'équivalent HTML de ce que rend `DxButton RenderStyle="Link"` dans les DxGrid.

   Accentuations : dérivées de --primary-color (le vert du thème, #8EB937 — celui qu'utilise déjà
   app.css), jamais d'hexadécimal en dur.
   ℹ️ Ce commentaire disait de NE PAS utiliser --bs-primary-bg-subtle ni --bs-primary-text-emphasis,
   parce qu'ils gardaient les valeurs d'usine de Bootstrap — du bleu. Ce n'est plus vrai : tokens.css
   les câble désormais sur --kd-primary. Le color-mix ci-dessous reste valable et donne des teintes
   voisines ; le remplacer par les variables Bootstrap est possible, mais c'est un changement visuel
   à mesurer, pas un simple ménage. */
.roles-page[b-5yrytn6ei8] {
    --roles-accent-bg: color-mix(in srgb, var(--primary-color) 14%, transparent);
    --roles-accent-ink: color-mix(in srgb, var(--primary-color) 72%, black);
}

/* --- barre d'outils --------------------------------------------------- */
.roles-toolbar[b-5yrytn6ei8] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-bottom: 18px;
}

.roles-search[b-5yrytn6ei8] {
    position: relative;
    flex: 1 1 220px;
    max-width: 420px;
}

    .roles-search i[b-5yrytn6ei8] {
        position: absolute;
        left: 10px;
        top: 50%;
        transform: translateY(-50%);
        color: var(--gray-color);
        pointer-events: none;
    }

    .roles-search .form-control[b-5yrytn6ei8] {
        padding-left: 32px;
    }

.roles-select[b-5yrytn6ei8] {
    width: auto;
    min-width: 190px;
}

/* --- en-tête de groupe (origine du rôle) ------------------------------ */
.roles-group-head[b-5yrytn6ei8] {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 22px 0 12px;
}

    .roles-group-head h2[b-5yrytn6ei8] {
        margin: 0;
        letter-spacing: .04em;
    }

.roles-group-hint[b-5yrytn6ei8] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 2px 8px;
    border-radius: 3px;
    background: var(--roles-accent-bg);
    color: var(--roles-accent-ink);
}

.roles-group-rule[b-5yrytn6ei8] {
    flex: 1;
    height: 1px;
    background: var(--lightgray-color);
}

/* --- carte de rôle ----------------------------------------------------
   ::deep : .card et .card-body sont rendus par le composant Card, ils ne portent donc pas
   l'attribut d'isolation de cette page. */
.roles-page[b-5yrytn6ei8]  .role-card {
    height: 100%;
    margin-bottom: 0;
}

.roles-page[b-5yrytn6ei8]  .role-card:hover {
    border-color: color-mix(in srgb, var(--primary-color) 45%, transparent);
}

/* Rôle ni attribué ni permissionné : liseré d'alerte, sans crier plus fort que le contenu. */
.roles-page[b-5yrytn6ei8]  .role-card-unused {
    border-left: 3px solid var(--bs-warning);
}

/* Rôle technique d'administration : même grammaire de liseré, dans la teinte que porte déjà sa
   pastille (.badge-danger) et le badge Sysadmin de RoleBadge. Ce n'est pas une alerte — c'est le
   repère qui dit « celle-ci ne se gère pas comme les autres ». */
.roles-page[b-5yrytn6ei8]  .role-card-system {
    border-left: 3px solid var(--bs-danger);
}

.role-card-title[b-5yrytn6ei8] {
    margin: 0;
    line-height: 1.3;
}

.role-card-tech[b-5yrytn6ei8] {
    word-break: break-all;
}

/* --- compteurs -------------------------------------------------------- */
.role-card-stats[b-5yrytn6ei8] {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px;
    margin: 12px 0 10px;
}

.role-stat[b-5yrytn6ei8] {
    background: var(--page-bg-color);
    border-radius: 3px;
    padding: 7px 10px;
}

.role-stat-warn[b-5yrytn6ei8] {
    background: var(--bs-warning-bg-subtle);
}

    .role-stat-warn .role-stat-value[b-5yrytn6ei8] {
        color: var(--bs-warning-text-emphasis);
    }

.role-stat-value[b-5yrytn6ei8] {
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
}

/* Case « permissions » du rôle technique : un libellé remplace le compteur et la jauge. Il est plus
   long qu'un nombre, d'où le centrage vertical qui lui redonne la hauteur des deux cases voisines. */
.role-stat-full[b-5yrytn6ei8] {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

    .role-stat-full .role-stat-value[b-5yrytn6ei8] {
        color: var(--bs-danger-text-emphasis);
    }


.role-stat .progress[b-5yrytn6ei8] {
    margin: 6px 0 0;
}

/* --- configurations rattachées ---------------------------------------- */
.role-card-chips[b-5yrytn6ei8] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    min-height: 24px;
}

.role-chip[b-5yrytn6ei8] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 7px;
    border-radius: 3px;
    background: var(--roles-accent-bg);
    color: var(--roles-accent-ink);
}

.role-card-flag[b-5yrytn6ei8] {
    display: flex;
    align-items: center;
    gap: 5px;
    margin-top: 10px;
    color: var(--bs-warning-text-emphasis);
}

.roles-count[b-5yrytn6ei8] {
    margin-top: 16px;
}
/* /Features/Settings/Shared/ColorField.razor.rz.scp.css */
/* Champ couleur partagé (Apparence, Options spatiales). Ses styles vivaient dans la page Apparence
   (`.ap-page ::deep`) : hors de cette page, le champ était nu. La page garde ses règles, qu'elle
   partage avec ses logos ; ce sont les mêmes valeurs. */

.ap-field-head[b-t29fgzoa0z] {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .25rem;
}

.ap-reset[b-t29fgzoa0z] {
    font-size: .75rem;
    text-decoration: none;
}

.ap-reset:disabled[b-t29fgzoa0z] {
    opacity: .4;
}

.ap-field-picker[b-t29fgzoa0z] {
    display: flex;
    align-items: center;
    gap: .6rem;
}

/* Le sélecteur remplace son input par son propre bouton : on borne l'enveloppe, et le widget construit
   en JavaScript (hors portée Blazor) est atteint en ::deep — cf. AppearanceSettings.razor.css. */
.ap-field-picker > div:first-child[b-t29fgzoa0z] {
    flex: 0 0 auto;
    width: 150px;
}

.ap-field-picker[b-t29fgzoa0z]  .color-picker {
    width: 100%;
    max-width: 100%;
}

.ap-field-picker[b-t29fgzoa0z]  .cp_input {
    flex: 1 1 auto;
    width: auto;
    min-width: 0;
}

.ap-field-state[b-t29fgzoa0z] {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    font-size: .75rem;
    color: var(--bs-secondary-color);
}

.ap-state-value[b-t29fgzoa0z] {
    font-family: var(--bs-font-monospace);
    color: var(--kd-text-strong);
}

.ap-swatch[b-t29fgzoa0z] {
    flex: 0 0 auto;
    width: .85rem;
    height: .85rem;
    border: 1px solid var(--kd-border);
    border-radius: 3px;
    background-color: var(--ap-swatch, transparent);
}
/* /Features/Settings/Shared/SettingsFormFooter.razor.rz.scp.css */
/* Pied collant du drawer de saisie des réglages. Le conteneur (.layout-drawer-foot) est posé par le Drawer :
   ici, seuls les états propres au formulaire. */

.sff-unsaved[b-tpjc7ntop2] {
    flex: 1;
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
    font-size: 11.5px;
    font-weight: 600;
    color: #8a5d00;
}

    .sff-unsaved i[b-tpjc7ntop2] {
        flex: none;
    }

/* Demande d'abandon : remplace les boutons pour qu'on ne puisse pas fermer par réflexe. */
.sff-discard[b-tpjc7ntop2] {
    flex: 1;
    background: #fdf5e3;
    border: 1px solid #f0dda6;
    border-radius: 8px;
    padding: 10px 12px;
}

    .sff-discard p[b-tpjc7ntop2] {
        margin: 0 0 9px;
        font-size: 12.5px;
        color: #8a5d00;
        font-weight: 600;
    }

.sff-discard-actions[b-tpjc7ntop2] {
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}
/* /Features/Settings/Shared/SettingsSectionsNav.razor.rz.scp.css */
/* Menu de sections des écrans de réglages.
   L'habillage vient du thème : Card + NavLinks (.nav-tabs-simple.nav-tabs-left) portent la bordure, le
   fond, le liseré d'onglet actif et le survol. Ne restent ici que les trois choses que le thème ne
   couvre pas : l'en-tête de groupe, la note de fonctionnalité éteinte, et l'état « indisponible ».
   Scopé : ces classes n'ont de sens que dans ce composant (cf. .claude/rules/styles-css.md). */

/* Pas de règle de position sur .ssn-nav : le menu suit le flux, comme les autres pages de réglages.
   La classe sert surtout d'ancêtre de portée aux règles ::deep. */

/* La liste des sections a un fond blanc et des angles droits ; la carte, un arrondi de 8 px. Sans
   découpe, le premier enfant de la carte repeint donc ses coins — visible dès qu'aucun en-tête de
   groupe ne s'interpose, c'est-à-dire sur tout menu à plat (réglages généraux). Le liseré de l'onglet
   actif est un ::after INTERNE au lien : rien ne déborde, la découpe ne coupe rien.
   ::deep est nécessaire : la carte est rendue par le composant Card, donc sans attribut de portée. */
.ssn-nav[b-rg84j9pzeg]  .card {
    overflow: hidden;
}

/* Survol. Le thème ne fait apparaître que le liseré de 3 px sur le bord droit — assez discret pour
   qu'on doute d'avoir survolé la bonne ligne, dans un menu dont plusieurs entrées portent le même
   libellé (« Affichage » côté 2D et côté 3D). On teinte donc la ligne, avec la variable dont se sert
   déjà le rail de facettes de la liste des utilisateurs : deux menus latéraux de Réglages n'ont pas à
   se survoler différemment.
   `:not(.active)` volontaire : le thème rend l'entrée active transparente au survol, et son liseré
   permanent la distingue déjà. */
.ssn-nav[b-rg84j9pzeg]  .nav-tabs-left > li > a:not(.active):hover {
    background: var(--page-bg-color);
}

.ssn-nav-group[b-rg84j9pzeg] {
    padding: 14px 16px 2px;
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--bs-secondary-color);
}

.ssn-nav-note[b-rg84j9pzeg] {
    margin: 2px 16px 12px;
    padding: 8px 10px;
    font-size: .75rem;
    color: var(--bs-secondary-color);
    background: var(--bs-tertiary-bg);
    border: 1px dashed var(--bs-border-color);
    border-radius: 6px;
}

/* Fonctionnalité désactivée sur l'instance : la section reste VISIBLE (la note explique ce qui manque)
   mais n'est pas atteignable — la masquer ferait croire à un bug d'affichage.
   ::deep est nécessaire : le lien est rendu par NavLinksItem, donc sans l'attribut de scope. */
.ssn-off[b-rg84j9pzeg],
.ssn-nav[b-rg84j9pzeg]  a.ssn-disabled {
    opacity: .45;
    pointer-events: none;
}
/* /Features/Settings/SpatialOptions/Sections/SectionBim3DLoading.razor.rz.scp.css */
/* Bloc repliable d'un bâtiment dans le tableau « Chargement par bâtiment ».
   Scopé : cette mise en forme n'a de sens que pour cette liste. Un patrimoine se règle bâtiment par
   bâtiment, donc la liste peut être longue — d'où le repli par défaut, ouvert seulement si le bâtiment
   porte déjà une surcharge. */

.so-building[b-cez8mbusei] {
    border: 1px solid var(--bs-border-color);
    border-radius: var(--bs-border-radius);
    padding: 0.5rem 0.75rem;
}

.so-building > summary[b-cez8mbusei] {
    cursor: pointer;
    /* Sans list-style, le marqueur natif disparaît sur WebKit : on garde le chevron par défaut. */
    padding: 0.125rem 0;
}

.so-building[open] > summary[b-cez8mbusei] {
    margin-bottom: 0.75rem;
    border-bottom: 1px solid var(--bs-border-color);
    padding-bottom: 0.5rem;
}

.so-building-body[b-cez8mbusei] {
    padding-left: 0.25rem;
}

/* Les disciplines sont nombreuses et courtes : en colonnes, elles tiennent sans faire défiler. */
.so-building-disciplines[b-cez8mbusei] {
    columns: 2;
    max-width: 32rem;
}

@media (max-width: 575.98px) {
    .so-building-disciplines[b-cez8mbusei] {
        columns: 1;
    }
}
/* /Features/Settings/Users/Users.razor.rz.scp.css */
/* Liste des utilisateurs (/settings/users) — barre d'outils, rail de facettes, sections et lignes.
   Styles propres à cet écran : rien ici n'est réutilisé ailleurs (cf. .claude/rules/styles-css.md).

   Ne sont écrites ici que les règles sans équivalent existant. Le reste vient du thème et est posé
   directement dans le markup : .card (composant Card), .form-control / .form-select / .form-check-input,
   .badge, .btn / .btn-link, .text-muted / .text-danger / .all-caps / .bold / .text-truncate.

   ⚠️ AUCUNE taille de police en dur ici : le thème définit une échelle .fs-10 … .fs-20 qui porte aussi
   l'interlettrage et l'interligne propres à chaque corps. Une déclaration `font-size` locale prendrait
   la taille en perdant les deux autres, et sortirait de l'échelle (13px, 11.5px…). Les tailles se
   posent donc dans le markup, avec la classe du thème.

   Les actions de ligne reprennent la forme des autres écrans d'administration : icône Phosphor portée
   par le bouton lui-même (.ph-duotone.ph-pencil-simple / .ph-trash) en .fs-6, sur un .btn.btn-link —
   l'équivalent HTML de ce que rend `DxButton RenderStyle="Link"` dans les écrans à DxGrid.

   Accentuations : dérivées de --primary-color (le vert du thème, #8EB937), jamais d'hexadécimal en dur.
   ℹ️ Ce commentaire disait de NE PAS utiliser --bs-primary-bg-subtle ni --bs-primary-text-emphasis,
   parce qu'ils gardaient les valeurs d'usine de Bootstrap — du bleu. Ce n'est plus vrai : tokens.css
   les câble désormais sur --kd-primary. Le color-mix ci-dessous reste valable et donne des teintes
   voisines ; le remplacer par les variables Bootstrap est possible, mais c'est un changement visuel
   à mesurer, pas un simple ménage. */
.users-page[b-5h8m8ukkmu] {
    --users-accent-bg: color-mix(in srgb, var(--primary-color) 14%, transparent);
    --users-accent-ink: color-mix(in srgb, var(--primary-color) 72%, black);
    --users-accent-bd: color-mix(in srgb, var(--primary-color) 35%, transparent);
}

/* --- barre d'outils --------------------------------------------------- */
.users-toolbar[b-5h8m8ukkmu] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-bottom: 18px;
}

.users-search[b-5h8m8ukkmu] {
    position: relative;
    flex: 1 1 220px;
    max-width: 400px;
}

    .users-search i[b-5h8m8ukkmu] {
        position: absolute;
        left: 10px;
        top: 50%;
        transform: translateY(-50%);
        color: var(--gray-color);
        pointer-events: none;
    }

    .users-search .form-control[b-5h8m8ukkmu] {
        padding-left: 32px;
    }

.users-select[b-5h8m8ukkmu] {
    width: auto;
    min-width: 190px;
}

/* --- mise en page : rail + contenu ------------------------------------ */
.users-layout[b-5h8m8ukkmu] {
    display: grid;
    grid-template-columns: 232px 1fr;
    gap: 18px;
    align-items: start;
}

@media (max-width: 991.98px) {
    .users-layout[b-5h8m8ukkmu] {
        grid-template-columns: 1fr;
    }

    .users-rail[b-5h8m8ukkmu] {
        position: static;
    }
}

/* --- rail de facettes -------------------------------------------------- */
.users-rail[b-5h8m8ukkmu] {
    background: var(--card-bg, #fff);
    border: 1px solid var(--lightgray-color);
    border-radius: 8px;
    padding: 6px 0 10px;
    position: sticky;
    top: 16px;
}

    .users-rail h4[b-5h8m8ukkmu] {
        margin: 12px 14px 6px;
    }

    .users-rail hr[b-5h8m8ukkmu] {
        margin: 8px 0;
        opacity: .5;
    }

.users-facet[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 14px;
    cursor: pointer;
    margin: 0;
}

    .users-facet:hover[b-5h8m8ukkmu] {
        background: var(--page-bg-color);
    }

    .users-facet .form-check-input[b-5h8m8ukkmu] {
        margin: 0;
        flex: none;
    }

.users-facet-count[b-5h8m8ukkmu] {
    margin-left: auto;
    color: var(--gray-color);
    font-variant-numeric: tabular-nums;
}

.users-facet-on[b-5h8m8ukkmu] {
    background: var(--users-accent-bg);
    color: var(--users-accent-ink);
}

    .users-facet-on .users-facet-count[b-5h8m8ukkmu] {
        color: inherit;
    }

/* Les deux facettes « à traiter » ne sont pas des filtres comme les autres : elles pointent des
   comptes en défaut, la teinte doit le dire avant même de lire le libellé. */
.users-facet-alert[b-5h8m8ukkmu] {
    color: var(--bs-warning-text-emphasis);
}

.users-facet-alert.users-facet-on[b-5h8m8ukkmu] {
    background: var(--bs-warning-bg-subtle);
}

/* --- barre de sélection ------------------------------------------------ */
.users-bulk[b-5h8m8ukkmu] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    background: var(--users-accent-bg);
    border: 1px solid var(--users-accent-bd);
    border-radius: 8px;
    padding: 8px 12px;
    margin-bottom: 12px;
    color: var(--users-accent-ink);
}

.users-bulk-select[b-5h8m8ukkmu] {
    width: auto;
    min-width: 180px;
    height: 32px;
    padding-top: 0;
    padding-bottom: 0;
}

/* --- en-tête de section ------------------------------------------------ */
.users-section[b-5h8m8ukkmu] {
    margin-bottom: 18px;
}

.users-section-head[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0 0 8px;
}

    .users-section-head h2[b-5h8m8ukkmu] {
        margin: 0;
    }

    .users-section-head .form-check-input[b-5h8m8ukkmu] {
        margin: 0;
        flex: none;
    }


.users-section-rule[b-5h8m8ukkmu] {
    flex: 1;
    height: 1px;
    background: var(--lightgray-color);
}

.users-hint[b-5h8m8ukkmu] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 2px 8px;
    border-radius: 3px;
    background: var(--users-accent-bg);
    color: var(--users-accent-ink);
    white-space: nowrap;
}

.users-hint-alert[b-5h8m8ukkmu],
.users-hint-info[b-5h8m8ukkmu] {
    background: var(--bs-warning-bg-subtle);
    color: var(--bs-warning-text-emphasis);
}

.users-hint-danger[b-5h8m8ukkmu] {
    background: var(--bs-danger-bg-subtle);
    color: var(--bs-danger-text-emphasis);
}

/* --- liste ------------------------------------------------------------
   ::deep : .card est rendu par le composant Card, il ne porte donc pas l'attribut d'isolation
   de cette page. */
.users-page[b-5h8m8ukkmu]  .users-list {
    margin-bottom: 0;
    overflow: hidden;
}

.users-page[b-5h8m8ukkmu]  .users-list-alert {
    border-left: 3px solid var(--bs-warning);
}

.users-page[b-5h8m8ukkmu]  .users-list-danger {
    border-left: 3px solid var(--bs-danger);
}

/* --- ligne ------------------------------------------------------------- */
.users-row[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 7px 14px;
    border-bottom: 1px solid var(--lightgray-color);
}

    .users-row:last-child[b-5h8m8ukkmu] {
        border-bottom: none;
    }

    .users-row:hover[b-5h8m8ukkmu] {
        background: var(--page-bg-color);
    }

    .users-row .form-check-input[b-5h8m8ukkmu] {
        margin: 0;
        flex: none;
    }

.users-row-on[b-5h8m8ukkmu] {
    background: var(--users-accent-bg);
}

.users-avatar[b-5h8m8ukkmu] {
    width: 32px;
    height: 32px;
    flex: none;
    border-radius: 50%;
    display: grid;
    place-items: center;
    background: var(--users-accent-bg);
    color: var(--users-accent-ink);
}

.users-avatar-dim[b-5h8m8ukkmu] {
    background: var(--page-bg-color);
    color: var(--gray-color);
}

.users-identity[b-5h8m8ukkmu] {
    min-width: 0;
    flex: 1;
}

.users-name[b-5h8m8ukkmu] {
    line-height: 1.25;
}

    .users-name a[b-5h8m8ukkmu] {
        color: inherit;
    }

.users-mail[b-5h8m8ukkmu] {
    line-height: 1.3;
    word-break: break-all;
}


.users-meta[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    gap: 12px;
    flex: none;
    flex-wrap: wrap;
    justify-content: flex-end;
}

.users-tag[b-5h8m8ukkmu] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--gray-color);
    white-space: nowrap;
}

.users-tag-directory[b-5h8m8ukkmu] {
    color: var(--bs-info-text-emphasis);
}

.users-tag-dormant[b-5h8m8ukkmu] {
    color: var(--bs-warning-text-emphasis);
}

/* Les deux états d'accès. Assez appuyés pour se repérer en balayant une centaine de lignes : ce sont
   les seules étiquettes qui disent « cette personne ne peut pas entrer ». */
.users-tag-off[b-5h8m8ukkmu] {
    color: var(--bs-danger-text-emphasis);
}

.users-tag-locked[b-5h8m8ukkmu] {
    color: var(--bs-warning-text-emphasis);
}

.users-tag-active[b-5h8m8ukkmu] {
    color: var(--users-accent-ink);
}

/* --- actions -----------------------------------------------------------
   Les actions de ligne communes (RowAction, app.css § 49), toujours visibles — plus de révélation au survol,
   introuvable sur un écran tactile (03/10/2026). Largeur réservée pour deux actions : la corbeille d'un compte
   incomplet, seule, reste à la même place que sur les autres lignes. */
.users-actions[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex: none;
    width: 58px;
}

.users-count[b-5h8m8ukkmu] {
    margin-top: 16px;
}
/* /Features/Settings/Users/UsersEdit.razor.rz.scp.css */
/* Colonne d'identité et de sécurité à gauche (1 part, 260 px au moins), formulaires à droite (3 parts,
   520 px au moins) ; sous 780 px de contenu, les deux passent l'une sous l'autre, pleine largeur. */
.users-edit-layout[b-bz4swvd3c4] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 0 16px;
}

.users-edit-side[b-bz4swvd3c4] {
    flex: 1 1 260px;
    min-width: 0;
}

.users-edit-main[b-bz4swvd3c4] {
    flex: 3 1 520px;
    min-width: 0;
}

/* Carte d'identité de la fiche : dernière connexion et rôle l'un sous l'autre, libellé puis valeur. */
.users-edit-facts[b-bz4swvd3c4] {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

    .users-edit-facts > div[b-bz4swvd3c4] {
        display: flex;
        flex-direction: column;
        gap: 1px;
    }

    .users-edit-facts dt[b-bz4swvd3c4] {
        font-size: 12px;
        font-weight: 400;
    }

    .users-edit-facts dd[b-bz4swvd3c4] {
        margin: 0;
        font-weight: 600;
        overflow-wrap: anywhere;
    }
