@import '_content/Blazor.Bootstrap/Blazor.Bootstrap.7t9tbfaemk.bundle.scp.css';
@import '_content/KDCockpit.Viewers.ForgeAps/KDCockpit.Viewers.ForgeAps.vl3om78sph.bundle.scp.css';
@import '_content/KDCockpit.WebComponents/KDCockpit.WebComponents.1vniz2h638.bundle.scp.css';

/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/Features/Alarms/AlarmsConsole.razor.rz.scp.css */
/* Onglets de catégorie : Défauts physiques / Santé système.
   État actif en vert primary du thème (var(--primary-color)). */
.alarm-tab[b-37iz59ilqn] {
    border: 1px solid var(--bs-border-color, #ced4da);
    background-color: var(--kd-surface);
    color: var(--bs-body-color, #212529);
    transition: all .15s ease;
}

    .alarm-tab:hover[b-37iz59ilqn] {
        background-color: var(--kd-surface);
        border-color: var(--primary-color);
        color: var(--primary-color);
    }

    .alarm-tab.active[b-37iz59ilqn],
    .alarm-tab.active:hover[b-37iz59ilqn],
    .alarm-tab.active:focus[b-37iz59ilqn] {
        background-color: var(--primary-color);
        border-color: var(--primary-color);
        color: var(--kd-on-primary);
    }

/* Badges de compteur des onglets : le .badge global (theme.css) impose un padding asymétrique
   (L/R 6px, bas 4px, sans haut) qui ovalise et décentre la pastille. On corrige localement
   (padding symétrique + min-width pour une pastille ronde) sans toucher au .badge global. */
.alarm-tab .badge[b-37iz59ilqn] {
    min-width: 1.15rem;
    padding: 0.15rem 0.35rem;
    line-height: 1;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/Features/Alarms/Console/PhysicalFaults/PhysicalFaultsPanel.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-aduxjvyrp0] {
    cursor: pointer;
}

    .status-card[b-aduxjvyrp0]  .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-aduxjvyrp0]  .card {
        box-shadow: 0 2px 12px rgba(0, 0, 0, .10);
    }

    /* Carte active (filtre courant) : fine bordure primary (1px). */
    .status-card.active[b-aduxjvyrp0]  .card {
        border-color: var(--primary-color);
    }
/* _content/KDCockpit.Web/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);
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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 Plans 2D : maquette repliable imbriquée sous l'en-tête de discipline (léger retrait). */
.forge-aps-2d-model[b-gac6a82gsf] {
    padding-left: .35rem;
}

.forge-aps-2d-model + .forge-aps-2d-model[b-gac6a82gsf] {
    margin-top: .15rem;
}

/* Tag « type de vue » (déduit du nom de feuille) sur un plan 2D — pastille neutre en fin de ligne. */
.forge-aps-2d-type[b-gac6a82gsf] {
    flex: 0 0 auto;
    font-size: .6rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: var(--bs-secondary-color, #6c757d);
    background: var(--bs-tertiary-bg, #f1f3f5);
    border-radius: .65rem;
    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);
}
/* _content/KDCockpit.Web/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 ».

   ⚠️ C'est le SEUL décalage vertical du dépôt qu'un rembourrage hérité ne peut pas porter : 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. D'où la variable, 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. Ne reste que le décalage éventuel d'un
       bandeau de page (--kd-forge-top-offset, posé en ligne par l'appelant).
       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. */
    top: var(--kd-forge-top-offset, 0px);
    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;
}

.forge-host-close[b-u5yvp6fqtl] {
    position: absolute;
    top: 12px;
    right: 16px;
    z-index: 1060;   /* au-dessus des panneaux internes du viewer (loading/indisponible = z-index 2) */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border: none;
    border-radius: 50%;
    background: rgba(0, 0, 0, 0.55);
    color: #fff;
    font-size: 18px;
    line-height: 1;
    cursor: pointer;
    transition: background 0.15s ease;
}

.forge-host-close:hover[b-u5yvp6fqtl] {
    background: rgba(0, 0, 0, 0.78);
}

/* 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 stacking interne sous la croix. */
.forge-host[b-u5yvp6fqtl]  .forge-aps-root {
    height: 100%;
    width: 100%;
    z-index: 0;
}
/* _content/KDCockpit.Web/Features/Explorers/Lists/Components/ExplorerListEntitySelector.razor.rz.scp.css */
/* Même gabarit que les pills de portée des explorateurs 2D / 3D (ExplorerScopeSelector) : 30 px de haut,
   --kd-border, rayon 8, texte 12 px — le sélecteur flotte au même coin de la vue qu'elles.
   Le libellé « Lister » est DANS la surface, comme « Campus » l'est dans sa pill : posé à côté, il
   flotterait seul sur le fond de la vue. Couleurs par jetons, pour suivre un habillage client. */
.exl-entity[b-9g7hazpb8v] {
    display: inline-flex;
    align-items: stretch;
    height: 30px;
    border: 1px solid var(--kd-border);
    border-radius: 8px;
    overflow: hidden;
    background: var(--kd-surface);
    font-size: 12px;
    line-height: 1;
}

.exl-entity-label[b-9g7hazpb8v] {
    display: inline-flex;
    align-items: center;
    padding: 0 8px;
    color: var(--kd-text-muted);
}

.exl-entity-seg[b-9g7hazpb8v] {
    display: inline-flex;
}

.exl-entity-btn[b-9g7hazpb8v] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    border: none;
    border-left: 1px solid var(--kd-border);
    background: transparent;
    padding: 0 10px;
    font-size: 12px;
    color: var(--kd-text);
    cursor: pointer;
    transition: background .12s ease;
}

    .exl-entity-btn i[b-9g7hazpb8v] {
        font-size: 15px;
        color: var(--kd-text-muted);
    }

    .exl-entity-btn:hover:not(:disabled):not(.exl-entity-btn--on)[b-9g7hazpb8v] {
        background: var(--kd-page-bg);
    }

    .exl-entity-btn:disabled[b-9g7hazpb8v] {
        opacity: .5;
        cursor: not-allowed;
    }

.exl-entity-btn--on[b-9g7hazpb8v] {
    background: var(--kd-primary);
    color: var(--kd-on-primary);
    font-weight: 600;
}

    .exl-entity-btn--on i[b-9g7hazpb8v] {
        color: var(--kd-on-primary);
    }
/* _content/KDCockpit.Web/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; }
}
/* _content/KDCockpit.Web/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);
    }
/* _content/KDCockpit.Web/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;
    }
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}

.exl-tools-clear[b-fru8frk52z] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 30px;
    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 + 30px + 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 : pictos serrés, liens ET boutons au même gabarit. */
.exl-root[b-fru8frk52z]  .exl-act {
    width: 26px;
    height: 26px;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: #9499a1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    text-decoration: none;
    font-size: 15px;
}

    .exl-root[b-fru8frk52z]  .exl-act:hover {
        background: #f1f2f4;
        color: #4c4c5c;
    }

.exl-root[b-fru8frk52z]  .exl-act--teal {
    color: #1f9b8e;
}

.exl-root[b-fru8frk52z]  .exl-act--warning {
    color: #eb3d63;
}

/* Picto sans destination (équipement non placé en 2D / absent de la maquette 3D) : visible mais inerte,
   pour que la colonne garde sa forme et que l'absence se lise. */
.exl-root[b-fru8frk52z]  .exl-act--off {
    color: #d3d6db;
    cursor: not-allowed;
}

    .exl-root[b-fru8frk52z]  .exl-act--off:hover {
        background: transparent;
        color: #d3d6db;
    }

/* ------------------------------------------------------------------ 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;
    }
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
    }
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
    }
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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);
}
/* _content/KDCockpit.Web/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);
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
    }
/* _content/KDCockpit.Web/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);
}

.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;
}
/* _content/KDCockpit.Web/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);
}
/* _content/KDCockpit.Web/Features/FileExplorer/Explorer.razor.rz.scp.css */
.margin-2em[b-vt22u94aqo] {
    margin: 2em;
}

.pdf-viewer[b-vt22u94aqo] {
    width: 100%;
    height: 100%;
    border: none;
}

/* .no-padding retiré : son seul appelant (HeaderCssClass/BodyCssClass du popup) est passé à
   l'utilitaire Bootstrap p-0. La règle était de toute façon inopérante ici — le CSS scopé
   n'atteint pas le markup rendu par un composant DevExpress, c'est la règle globale de
   theme.css qui faisait le travail. */

.textRight[b-vt22u94aqo] {
    text-align: right;
}
/* _content/KDCockpit.Web/Features/MetricsExplorer/MetricsExplorer.razor.rz.scp.css */
/* Conteneur embarqué (rendu dans MetricsExplorerPopup) : occupe la hauteur du corps de la
   modale (≈ 90vh moins l'en-tête DevExpress) ; la sidebar et la zone de contenu défilent
   chacune de leur côté (classes overflow-y-auto sur les enfants). À ajuster si l'en-tête change. */
.metrics-explorer-embedded[b-37r9hxtrmz] {
    height: calc(90vh - 56px);
    overflow: hidden;
}

/* Sidebar de sélection : largeur fixe (300px en inline). flex-shrink:0 l'empêche d'être
   comprimée par le panneau de contenu (le graphe large pousserait sinon la sidebar). */
.metrics-explorer-embedded > .left-sidebar[b-37r9hxtrmz] {
    flex-shrink: 0;
}

/* Panneau de contenu : min-width:0 lève le min-width:auto par défaut des items flex, pour
   qu'il se réduise (et que le graphe ApexCharts se redimensionne) au lieu de déborder
   et d'écraser la sidebar. */
.metrics-explorer-embedded > div[b-37r9hxtrmz] {
    min-width: 0;
}

/* Cellule du DxGrid : la div remplit la cellule pour offrir une cible de clic complète. */
.basket-cell[b-37r9hxtrmz] {
    display: block;
    width: 100%;
    cursor: pointer;
}

/* Surbrillance d'une cellule lorsqu'on survole le point correspondant dans le graphique. */
.basket-cell-active[b-37r9hxtrmz] {
    background-color: var(--bs-primary-bg-subtle, #cfe2ff) !important;
    box-shadow: inset 0 0 0 2px var(--bs-primary, #0d6efd);
    font-weight: 600;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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);
}
/* _content/KDCockpit.Web/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;
}

.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);
}
/* _content/KDCockpit.Web/Features/Settings/CapabilityThresholds/CapabilityThresholdsSettings.razor.rz.scp.css */
/* Écran des seuils de mesures — propre à cette page (cf. .claude/rules/styles-css.md).
   Aucune classe utilitaire de taille de texte n'existe dans app.css, et Bootstrap n'offre rien à cette
   échelle (.small vaut 0.875em) : le scopé est le bon endroit tant qu'un seul écran en a besoin. */

.kdc-thresholds-hint[b-65ybl61jzz],
.kdc-thresholds-note[b-65ybl61jzz] {
    font-size: 0.82rem;
}

/* Renvois d'aide (surcharge par profil, cohabitation avec les tableaux de bord) : mêmes gabarits que
   les alertes Bootstrap, resserrés — ce sont des renvois de lecture, pas des avertissements. */
.kdc-thresholds-note[b-65ybl61jzz] {
    padding: 0.5rem 0.75rem;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/Features/Settings/Components/CapabilityThresholdsEditor.razor.rz.scp.css */
/* Tableau des seuils de mesures — propre à ce composant (cf. .claude/rules/styles-css.md) */

.kdc-thresholds[b-gbw6laa6rf] {
    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: 12rem;
}

/* 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);
}
/* _content/KDCockpit.Web/Features/Settings/Components/SettingsNav.razor.rz.scp.css */
/* Navigation de section — la liste permanente des Réglages.

   Volontairement en clair et non dans l'ardoise du menu principal : cette
   navigation est de niveau CONTENU. Deux surfaces sombres côte à côte se
   liraient comme deux menus concurrents, et rien ne dirait lequel est le
   niveau supérieur. */

/* Depuis le 13/09/2026, la colonne monte au bord comme le panneau d'un
   explorateur : app.css (§ 28) retire le `p-2` de PageWrapper et son
   défilement. C'est donc la liste qui porte les deux.

   Le rembourrage horizontal de 8 px reprend exactement celui que `p-2`
   donnait, et le 12 px du haut vaut l'ancien 8 + 4 : DANS la colonne, les
   entrées ne bougent pas d'un pixel. C'est la colonne entière qui monte des
   10 px de gouttière qu'elle a perdus.

   ⚠️ `min-height: 0` n'est pas décoratif : sans lui, un enfant flex refuse de
   se contracter sous sa hauteur de contenu et le défilement se reporte sur
   l'ancêtre — c'est-à-dire nulle part, puisqu'il est en overflow hidden. */
.kd-section-nav[b-u1y03ljvfz] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    gap: 1px;
    width: 100%;
    min-height: 0;
    padding: 12px 8px 16px;
    overflow-y: auto;
}

/* Intertitre de groupe. Il reprend les blocs de l'ancienne page-annuaire :
   l'utilisateur retrouve son classement, pas un nouveau. */
.kd-section-group[b-u1y03ljvfz] {
    padding: 14px 10px 5px;
    font-size: 9.5px;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--kd-text-muted);
}

.kd-section-group:first-child[b-u1y03ljvfz] {
    padding-top: 4px;
}

/* ⚠️ ::deep est INDISPENSABLE ici. Les entrées sont des <NavLink>, donc des
   COMPOSANTS : Blazor n'appose l'attribut de portée (b-xxxxx) que sur le markup
   propre au composant, jamais sur le rendu d'un composant enfant. Sans ::deep,
   `.kd-section-item[b-xxxxx]` ne matchait rien — mesuré : display « block » au
   lieu de « flex », rembourrage nul, libellés débordant de la colonne
   (scrollWidth 276 pour clientWidth 182). Le <nav> parent, lui, est un élément
   ordinaire : c'est lui qui porte la portée. */
.kd-section-nav[b-u1y03ljvfz]  .kd-section-item {
    display: flex;
    align-items: center;
    gap: 10px;
    min-height: 34px;
    padding: 0 10px;
    border-radius: 8px;
    font-size: 12.5px;
    color: var(--kd-text);
    text-decoration: none;
    transition: background-color 140ms ease, color 140ms ease;
}

.kd-section-nav[b-u1y03ljvfz]  .kd-section-item > i {
    flex: none;
    font-size: 16px;
    color: var(--kd-text-muted);
}

.kd-section-nav[b-u1y03ljvfz]  .kd-section-item > span {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.kd-section-nav[b-u1y03ljvfz]  .kd-section-item:hover {
    background-color: var(--kd-page-bg);
    color: var(--kd-text-strong);
}

/* NavLink pose .active tout seul sur la route courante — la même mécanique que
   les items du menu principal, et la même pilule pour le dire. */
.kd-section-nav[b-u1y03ljvfz]  .kd-section-item.active {
    background-color: color-mix(in srgb, var(--kd-primary) 14%, transparent);
    color: var(--kd-primary-dark);
    font-weight: 600;
}

.kd-section-nav[b-u1y03ljvfz]  .kd-section-item.active > i {
    color: var(--kd-primary-dark);
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
    }
/* _content/KDCockpit.Web/Features/Settings/MenuEditor/Components/MenuEditorFormFooter.razor.rz.scp.css */
/* Pied collant du drawer de saisie. Le conteneur (.layout-drawer-foot) est posé par le Drawer :
   ici, seuls les états propres au formulaire de menu. */

.mef-unsaved[b-zqexe4fjph] {
    flex: 1;
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
    font-size: 11.5px;
    font-weight: 600;
    color: #8a5d00;
}

    .mef-unsaved i[b-zqexe4fjph] {
        flex: none;
    }

/* Demande d'abandon : remplace les boutons pour qu'on ne puisse pas fermer par réflexe. */
.mef-discard[b-zqexe4fjph] {
    flex: 1;
    background: #fdf5e3;
    border: 1px solid #f0dda6;
    border-radius: 8px;
    padding: 10px 12px;
}

    .mef-discard p[b-zqexe4fjph] {
        margin: 0 0 9px;
        font-size: 12.5px;
        color: #8a5d00;
        font-weight: 600;
    }

.mef-discard-actions[b-zqexe4fjph] {
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}
/* _content/KDCockpit.Web/Features/Settings/MenuEditor/Components/MenuRolePicker.razor.rz.scp.css */
/* Sélection des profils, avec l'état du droit en regard de chacun. */

.mrp[b-cby2ai5spr] {
    border: 1px solid #cfd6e0;
    border-radius: 8px;
    overflow: hidden;
    background: #fff;
}

/* Profils retenus, en étiquettes. */
.mrp-tags[b-cby2ai5spr] {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    padding: 8px;
    border-bottom: 1px solid #e2e7ee;
    min-height: 40px;
    align-items: center;
}

.mrp-empty[b-cby2ai5spr] {
    font-size: 11.5px;
    color: #9aa4b2;
    padding-left: 3px;
}

.mrp-tag[b-cby2ai5spr] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    max-width: 100%;
    height: 23px;
    padding: 0 4px 0 9px;
    border-radius: 999px;
    background: #f0f6e3;
    border: 1px solid #cfe3a4;
    color: #6d8f28;
    font-size: 11.5px;
    font-weight: 600;
    overflow: hidden;
    white-space: nowrap;
}

.mrp-tag-gap[b-cby2ai5spr] {
    background: #fdf5e3;
    border-color: #f0dda6;
    color: #8a5d00;
}

.mrp-tag button[b-cby2ai5spr] {
    width: 16px;
    height: 16px;
    flex: none;
    border: none;
    background: transparent;
    color: inherit;
    cursor: pointer;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    font-size: 9px;
}

    .mrp-tag button:hover[b-cby2ai5spr] {
        background: rgba(0, 0, 0, .09);
    }

/* Recherche — indispensable : un client peut avoir des dizaines de profils, aux noms d'annuaire
   longs et préfixés à l'identique. */
.mrp-search[b-cby2ai5spr] {
    position: relative;
    border-bottom: 1px solid #e2e7ee;
}

    .mrp-search i[b-cby2ai5spr] {
        position: absolute;
        left: 9px;
        top: 50%;
        transform: translateY(-50%);
        color: #9aa4b2;
    }

    .mrp-search input[b-cby2ai5spr] {
        width: 100%;
        height: 34px;
        border: none;
        background: transparent;
        font-size: 12.5px;
        padding: 0 10px 0 30px;
    }

        .mrp-search input:focus[b-cby2ai5spr] {
            outline: none;
            background: #f7f9fb;
        }

.mrp-list[b-cby2ai5spr] {
    max-height: 206px;
    overflow: auto;
}

.mrp-none[b-cby2ai5spr] {
    padding: 14px;
    text-align: center;
    color: #9aa4b2;
    font-size: 12px;
}

.mrp-item[b-cby2ai5spr] {
    display: flex;
    align-items: center;
    gap: 9px;
    width: 100%;
    padding: 7px 10px;
    cursor: pointer;
    border: none;
    border-bottom: 1px solid #e2e7ee;
    background: #fff;
    text-align: left;
}

    .mrp-item:last-child[b-cby2ai5spr] {
        border-bottom: none;
    }

    .mrp-item:hover[b-cby2ai5spr] {
        background: #f7f9fb;
    }

.mrp-box[b-cby2ai5spr] {
    width: 16px;
    height: 16px;
    flex: none;
    border: 1.5px solid #cfd6e0;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 10px;
}

    .mrp-box i[b-cby2ai5spr] {
        opacity: 0;
    }

.mrp-item-on .mrp-box[b-cby2ai5spr] {
    background: var(--bs-primary);
    border-color: var(--bs-primary);
}

    .mrp-item-on .mrp-box i[b-cby2ai5spr] {
        opacity: 1;
    }

.mrp-name[b-cby2ai5spr] {
    flex: 1;
    min-width: 0;
}

    .mrp-name b[b-cby2ai5spr] {
        display: block;
        font-size: 12.5px;
        font-weight: 600;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

    .mrp-name > span[b-cby2ai5spr] {
        display: block;
        font-family: ui-monospace, Consolas, monospace;
        font-size: 10px;
        color: #9aa4b2;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

/* L'état du droit : c'est toute la valeur de ce sélecteur par rapport à une simple liste à cocher. */
.mrp-state[b-cby2ai5spr] {
    font-size: 10.5px;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex: none;
    padding: 2px 7px;
    border-radius: 999px;
}

.mrp-state-ok[b-cby2ai5spr] {
    background: #e6f6f0;
    color: #19ad79;
}

.mrp-state-gap[b-cby2ai5spr] {
    background: #fdf5e3;
    color: #8a5d00;
}

.mrp-state-free[b-cby2ai5spr],
.mrp-state-unknown[b-cby2ai5spr] {
    background: #eef1f5;
    color: #9aa4b2;
}

.mrp-foot[b-cby2ai5spr] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 10px;
    background: #f7f9fb;
    border-top: 1px solid #e2e7ee;
    font-size: 11.5px;
    color: #6b7684;
    justify-content: space-between;
}

.mrp-link[b-cby2ai5spr] {
    background: none;
    border: none;
    padding: 0;
    color: #6d8f28;
    font: inherit;
    font-size: 11.5px;
    font-weight: 600;
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 2px;
}

    .mrp-link:hover[b-cby2ai5spr] {
        color: var(--bs-primary);
    }

.mrp-note[b-cby2ai5spr] {
    font-size: 11.5px;
    color: #9aa4b2;
    margin-top: 5px;
}
/* _content/KDCockpit.Web/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 ────────────────────────────────────────────────────── */
/* Actions toujours visibles, comme partout ailleurs dans Réglages (cf. TableActionsButtons dans les
   grilles). Elles ont d'abord été révélées au survol : c'est plus sobre, mais seul l'écran des
   utilisateurs procède ainsi, et une action qu'on ne voit pas est une action qu'on ne trouve pas.

   Leur taille est posée sur le <i>, en classe « fs-14 » (theme.css, échelle .fs-10 … .fs-40). */
.mt-acts[b-18di7ls9nx] {
    display: flex;
    gap: 2px;
    justify-content: flex-end;
}

.mt-iconbtn[b-18di7ls9nx] {
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 6px;
    border: 1px solid transparent;
    background: transparent;
    color: #6b7684;
    cursor: pointer;
}

    .mt-iconbtn:hover[b-18di7ls9nx] {
        background: #eef1f5;
        color: #1f2833;
    }

.mt-iconbtn-danger:hover[b-18di7ls9nx] {
    background: #fdecea;
    color: var(--bs-danger);
}

.mt-iconbtn[disabled][b-18di7ls9nx] {
    opacity: .28;
    cursor: not-allowed;
}

@media (prefers-reduced-motion: reduce) {
    .mt-sw[b-18di7ls9nx],
    .mt-sw[b-18di7ls9nx]::after {
        transition: none;
    }
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
}
/* _content/KDCockpit.Web/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;
    }
}
/* _content/KDCockpit.Web/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 -----------------------------------------------------------
   Révélées au survol : sur une centaine de lignes, deux icônes par ligne affichées en permanence
   font plus de bruit que la donnée elle-même. Le focus clavier les révèle aussi. */
.users-actions[b-5h8m8ukkmu] {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex: none;
    /* Largeur réservée en permanence, pas seulement au survol : sans elle, la révélation des icônes
       décalerait toute la ligne. Dimensionnée pour deux .btn.btn-link. */
    width: 92px;
    opacity: 0;
    transition: opacity .12s;
}

.users-row:hover .users-actions[b-5h8m8ukkmu],
.users-row:focus-within .users-actions[b-5h8m8ukkmu] {
    opacity: 1;
}

.users-count[b-5h8m8ukkmu] {
    margin-top: 16px;
}
/* _content/KDCockpit.Web/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;
    }
