/* =============================================================================
   ISIS Solution — Thème Flat++ (refonte expressive 2026-05-16)
   ----------------------------------------------------------------------------
   Navigation Rail (72px, icône + libellé) + sub-nav collapsible (240px) + header (56px).
   Palette resaturée, modules à identité forte, accent secondaire chaud,
   relief à 2 tiers d'élévation, motion formalisée.
   ============================================================================= */

/* =============================================================================
   Geist + Geist Mono — self-hostés (souveraineté data : aucun appel CDN externe).
   woff2 latin dans wwwroot/fonts/. font-display: swap (pas de FOIT).
   Relift typo 2026 : avant, 'Geist' était déclaré mais jamais chargé → l'app
   tournait en police système. Désormais Geist est réellement servi.
   ============================================================================= */
@font-face { font-family: 'Geist'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/geist-sans-latin-400-normal.woff2') format('woff2'); }
@font-face { font-family: 'Geist'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/geist-sans-latin-500-normal.woff2') format('woff2'); }
@font-face { font-family: 'Geist'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/geist-sans-latin-600-normal.woff2') format('woff2'); }
@font-face { font-family: 'Geist'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/geist-sans-latin-700-normal.woff2') format('woff2'); }
@font-face { font-family: 'Geist Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/geist-mono-latin-500-normal.woff2') format('woff2'); }
@font-face { font-family: 'Geist Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/geist-mono-latin-600-normal.woff2') format('woff2'); }

:root {
    /* === Surfaces & neutres === */
    /* Thème « Instrument » promu global 2026-06-04 (ex-pilote .isis-cmd-v2) :
       canvas cool near-white (jamais cream), encre near-black froide, hairlines.
       Valeurs OKLCH. Identité par module + sémantique préservées plus bas. */
    --isis-bg:            oklch(0.984 0.0025 250);
    --isis-surface:       oklch(1 0 0);
    --isis-surface-alt:   oklch(0.967 0.004 250);
    --isis-border:        oklch(0.905 0.005 250);
    --isis-border-soft:   oklch(0.945 0.004 250);
    --isis-border-strong: oklch(0.84 0.006 250);
    --isis-text:          oklch(0.24 0.012 262);
    --isis-text-muted:    oklch(0.495 0.014 262);    /* ~5.4:1 sur blanc */
    --isis-text-soft:     oklch(0.60 0.012 262);

    /* === Accent principal — PÉTROLE/ACIER (thème Instrument, ex-indigo SaaS) ===
           Accent par défaut + fallback de --isis-current-mod (contextes sans module).
           Les couleurs PAR MODULE (plus bas) gardent leur identité propre. */
    --isis-accent:        oklch(0.52 0.094 218);
    --isis-accent-soft:   oklch(0.962 0.024 218);
    --isis-accent-strong: oklch(0.43 0.10 220);    /* hover/active */

    /* === Accent secondaire chaud (nouveau)
           Terre cuite — badges "nouveau", CTA secondaires, highlight KPI hero.
           Choix culturellement aligné (cible CI/MA/FR), contraste 4.6:1. */
    --isis-accent-warm:        #c2410c;
    --isis-accent-warm-soft:   #fff1ec;
    --isis-accent-warm-strong: #9a3412;

    /* === Sémantique (resaturés AA solide) === */
    --isis-success:       #15803d;
    --isis-success-soft:  #dcfce7;
    --isis-warning:       #b45309;
    --isis-warning-soft:  #fef3c7;
    --isis-danger:        #b91c1c;
    --isis-danger-soft:   #fee2e2;

    /* === Accents par module — RESATURÉS (S~55%, L~45%)
           Utilisés sur sidebar active, breadcrumbs, CTAs primaires, KPI values,
           border accent gauche des grilles, identité de l'espace courant. */
    --isis-mod-gescom:         #2563eb;
    --isis-mod-gescom-soft:    #dbeafe;
    --isis-mod-gescompta:      #7c3aed;
    --isis-mod-gescompta-soft: #ede9fe;
    --isis-mod-sirh:           #059669;
    --isis-mod-sirh-soft:      #d1fae5;
    --isis-mod-admin:          #475569;
    --isis-mod-admin-soft:     #e2e8f0;
    --isis-mod-gesproj:        #0e7490;
    --isis-mod-gesproj-soft:   #cffafe;
    --isis-mod-gesmaff:        #b45309;
    --isis-mod-gesmaff-soft:   #fef3c7;
    --isis-mod-gesst:          #be185d;   /* pink-700 — sous-traitance (distinct des autres accents) */
    --isis-mod-gesst-soft:     #fce7f3;
    --isis-mod-gesmat:         #44403c;   /* stone-700 — matériel terrain (warm gray, distinct de admin slate) */
    --isis-mod-gesmat-soft:    #f5f5f4;
    --isis-mod-gespark:        #1e40af;   /* blue-700 — parc auto / véhicules (post-split gesmat 2026-05-24) */
    --isis-mod-gespark-soft:   #dbeafe;
    --isis-mod-gesinfo:        #4338ca;   /* indigo-700 — parc informatique (post-split gesmat 2026-05-25) */
    --isis-mod-gesinfo-soft:   #e0e7ff;
    --isis-mod-gesmob:         #92400e;   /* amber-800/brown — mobilier de chantier (post-split gesmat 2026-05-25) */
    --isis-mod-gesmob-soft:    #fef3c7;
    --isis-mod-gesfac:         #be185d;   /* pink-700 — facility / emplacements physiques (2026-05-25) */
    --isis-mod-gesfac-soft:    #fce7f3;
    --isis-mod-gespla:         #0f766e;   /* teal-700 — planning (distinct de tous les autres modules) */
    --isis-mod-gespla-soft:    #ccfbf1;
    --isis-mod-gesqhse:        #9333ea;   /* violet-600 — QHSE & risques (distinct de tous les autres modules) */
    --isis-mod-gesqhse-soft:   #f3e8ff;
    --isis-mod-ged:            #6366f1;   /* indigo — identité GED désormais distincte */
    --isis-mod-ged-soft:       #e0e7ff;

    /* === Élévation (Flat++ 3 tiers — calibrée pour être perceptible)
           Refonte B "Branded depth" 2026-05-17 : palette bumpée d'un cran.
           elevation-1 = Tailwind shadow-lg (repos cartes/KPI/sidepanels)
           elevation-hover = Tailwind shadow-xl (lift visible au survol)
           elevation-2 = Tailwind shadow-2xl (dialogs/dropdowns réellement flottants) */
    --isis-elevation-0:     none;
    /* Bump 2026-05-26 : rayons +33%, opacité +30% sur elevation-1 pour donner plus
       de relief aux cards/KPI/sidepanels (retour utilisateur "trop plat").
       elevation-hover bumpé proportionnellement pour préserver le "lift" perçu
       au survol — sinon repos et hover se confondent visuellement. */
    /* Relift 2026 : ombres affinées en 2 couches (relief présent mais élégant, moins « lourd »). */
    --isis-elevation-1:     0 1px 2px rgba(16, 24, 40, 0.05),
                            0 10px 22px -6px rgba(16, 24, 40, 0.13);
    --isis-elevation-hover: 0 2px 6px rgba(16, 24, 40, 0.07),
                            0 18px 34px -8px rgba(16, 24, 40, 0.18);
    --isis-elevation-2:     0 28px 54px -14px rgba(16, 24, 40, 0.28);
    --isis-elevation-focus: 0 0 0 4px rgba(79, 70, 229, 0.22);    /* fallback indigo si --isis-current-mod absent */

    /* === Motion (nouveau — formalisme) === */
    --isis-motion-fast:   120ms ease-out;
    --isis-motion-base:   180ms cubic-bezier(0.2, 0, 0, 1);

    --isis-sidebar-w:   84px;
    /* Élargi 2026-05-27 : 240px → 280px. Les libellés métier ISIS sont longs
       (« Comptes et interlocuteurs », « Bordereaux de prix unitaires »,
       « Règles d'approbation ») et le dropdown picker module en tête consomme
       de la largeur visuelle. 280px donne ~30 % de marge sur ces libellés sans
       être démesuré (Notion = 240, Slack = 260, VS Code = 240-280).
       Impact en cascade : la zone 1 du header (qui lit --isis-subnav-w) s'élargit
       aussi → workspace switcher mieux respiré. */
    --isis-subnav-w:           280px;
    /* Mode icon-only (refonte 2026-05-26 sub-nav persistant). 64px = un bouton 44px
       confortable centré dans une colonne 64px + 10px de gouttière de chaque côté. */
    --isis-subnav-w-collapsed: 64px;
    --isis-header-h:    56px;
    --isis-radius:      8px;     /* Instrument 2026-06-04 : rayons resserrés (ex-12px) */
    --isis-radius-sm:   5px;     /* ex-9px */
    /* --isis-radius-lg = grands conteneurs/sections ; --isis-radius-pill = badges/chips. */
    --isis-radius-lg:   12px;    /* ex-16px */
    --isis-radius-pill: 999px;

    /* === Échelle d'espacement (tokenisation DESIGN.md §6 — additif 2026-06)
           La grille xs→2xl était documentée comme opposable mais jamais exposée en
           variables CSS. Tokenisée ici pour câblage progressif (rythme cohérent).
           Aucune règle ne les consomme tant qu'on ne les branche pas → zéro régression. */
    --isis-space-xs:  0.25rem;   /* intra-élément (icône+texte) */
    --isis-space-sm:  0.5rem;    /* boutons inline, badges */
    --isis-space-md:  1rem;      /* défaut : gap stack, padding card */
    --isis-space-lg:  1.5rem;    /* sections principales */
    --isis-space-xl:  2rem;      /* blocs majeurs (rare) */
    --isis-space-2xl: 3rem;      /* marge page grand écran (rare) */
}

html, body {
    background-color: var(--isis-bg);
    color: var(--isis-text);
    font-family: 'Geist', system-ui, -apple-system, sans-serif;
    /* Relift typo 2026 : rendu net (Geist est géométrique → le lissage évite le gras
       perçu), micro-tracking négatif pour un grain plus moderne/dense. */
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    letter-spacing: -0.006em;
}

/* Élévation maîtrisée — Flat++ (cf. DESIGN.md §1 Profondeur) :
   2 tiers d'ombre + halo focus. Les composants qui doivent rester plats
   surchargent localement (form linear inputs, segmented control, action buttons). */
.rz-card {
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: var(--isis-elevation-1);
}
.rz-dialog,
.rz-profile-menu {
    box-shadow: var(--isis-elevation-2);
}
.rz-button {
    box-shadow: none;
    transition: background-color var(--isis-motion-fast),
                color var(--isis-motion-fast),
                box-shadow var(--isis-motion-fast);
}
.rz-button:focus-visible {
    /* Halo focus à la couleur du module courant (color-mix : ~98 % browser support).
       Fallback sur --isis-elevation-focus si le browser ne supporte pas color-mix. */
    box-shadow: var(--isis-elevation-focus);
    box-shadow: 0 0 0 4px color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 22%, transparent);
}
.rz-datagrid { box-shadow: none; }
.rz-datagrid .rz-data-row:nth-child(even) {
    background-color: var(--isis-surface-alt);
}
.rz-datagrid .rz-grid-table {
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    overflow: hidden;
}
.rz-datagrid thead {
    background-color: var(--isis-surface-alt);
}

/* ============================================================================
   Material Symbols Outlined — alias global (2026-05-22)
   ============================================================================
   Radzen charge le fichier MaterialSymbolsOutlined.woff2 sous le nom de font
   « Material Symbols » (cf. material-base.css). Mais beaucoup de templates
   tiers + le code ISIS utilisent la convention class="material-symbols-outlined".
   Sans cette règle, les ligatures s'affichent en texte brut (« flag », « assignment »).
   Cette règle remappe la class générique vers la font Radzen — couvre tous les
   usages dans l'app d'un coup. */
.material-symbols-outlined {
    font-family: 'Material Symbols';
    font-weight: normal;
    font-style: normal;
    font-size: inherit;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    display: inline-block;
    white-space: nowrap;
    word-wrap: normal;
    direction: ltr;
    font-feature-settings: 'liga';
    -webkit-font-feature-settings: 'liga';
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    vertical-align: middle;
}

/* Même remappage pour la convention « material-symbols-rounded » (utilisée par
   les markers de plan d'étage gesfac dans isis-plan-etage.js). Sans cette règle,
   les icônes des emplacements s'affichaient en texte brut (« place », « person »,
   « desktop_windows »). Radzen ne fournit qu'une seule font « Material Symbols » —
   on l'utilise pour les deux conventions. Ajout 2026-05-30. */
.material-symbols-rounded {
    font-family: 'Material Symbols';
    font-weight: normal;
    font-style: normal;
    font-size: inherit;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    display: inline-block;
    white-space: nowrap;
    word-wrap: normal;
    direction: ltr;
    font-feature-settings: 'liga';
    -webkit-font-feature-settings: 'liga';
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    vertical-align: middle;
}

/* ============================================================================
   Shell général
   ============================================================================ */
.isis-shell {
    display: flex;
    flex-direction: column;
    /* Shell verrouillé à la hauteur du viewport : header + rail restent fixes,
       seul .isis-shell__content scrolle. 100dvh = dynamic viewport (mobile/tablette),
       fallback 100vh pour anciens navigateurs. */
    height: 100vh;
    height: 100dvh;
    overflow: hidden;
    background-color: var(--isis-bg);
    position: relative; /* repère pour le skip-link absolu */
}

/* Skip link a11y (WCAG 2.4.1) — invisible au repos, devient visible au focus
   clavier (1re Tab pression sur la page). Permet aux utilisateurs SR/clavier
   de sauter directement au <main id="main-content">. Refonte shell 2026-05-27. */
.isis-shell__skip-link {
    position: absolute;
    left: 0;
    top: 0;
    transform: translateY(-200%);
    z-index: 9999;
    padding: 0.65rem 1rem;
    background: var(--isis-accent);
    color: #ffffff;
    font-weight: 600;
    font-size: 0.875rem;
    border-radius: 0 0 var(--isis-radius-sm) 0;
    text-decoration: none;
    transition: transform 120ms ease-out;
    box-shadow: 0 4px 12px rgba(15, 23, 42, 0.18);
}
.isis-shell__skip-link:focus,
.isis-shell__skip-link:focus-visible {
    transform: translateY(0);
    outline: 2px solid #ffffff;
    outline-offset: -4px;
}
/* Quand on cible #main-content via le skip link, retire le focus ring browser
   (visuellement inutile, l'user vient juste d'arriver via le skip link). */
.isis-shell__content:focus {
    outline: none;
}

.isis-shell__body {
    display: flex;
    flex: 1;
    min-height: 0;
    position: relative; /* repère pour le sub-nav fixed */
}

/* ----------------------------------------------------------------------------
   Colonne gauche du shell — refonte 2026-05-28.
   Contient empilées verticalement :
     1. .isis-shell__workspace-bar (~44px)  — sélecteur de workspace
     2. <AppSubNav>                          — picker module + items (reste)
   Largeur = var(--isis-subnav-w) (280px étendu / 64px collapsé), synchronisée
   avec le header zone 1 via la classe is-subnav-collapsed sur .isis-shell.
   ---------------------------------------------------------------------------- */
.isis-shell__sidebar {
    display: flex;
    flex-direction: column;
    flex-shrink: 0;
    width: var(--isis-subnav-w);
    background-color: var(--isis-surface);
    /* Bordure droite alignée avec la zone 1 du header (continuité visuelle). */
    border-right: 1px solid var(--isis-border-strong);
    transition: width 200ms cubic-bezier(0.4, 0, 0.2, 1);
    position: relative;
    z-index: 30;
    min-height: 0;
}
.isis-shell.is-subnav-collapsed .isis-shell__sidebar {
    width: var(--isis-subnav-w-collapsed, 64px);
}

/* Bande dédiée au workspace switcher, au-dessus du sub-nav.
   Refonte 2026-05-28 (avec label uppercase au-dessus) :
   - flex column pour empiler label + switcher verticalement
   - hauteur cible ~54px (label 12 + gap 4 + switcher 36 + padding 2)
   - Border-bottom retirée : la séparation entre WS et Module est portée par les
     2 mini-labels uppercase « ESPACE DE TRAVAIL » / « MODULE » qui catégorisent
     visuellement. Ajouter une bordure faisait visuellement triple séparation. */
.isis-shell__workspace-bar {
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
    /* Padding-bottom réduit (10 → 2) pour rapprocher du sub-nav header. */
    padding: 8px 12px 2px;
    min-height: 54px;
}
/* Le WorkspaceSwitcher étire pour occuper toute la largeur dispo de la WS bar. */
.isis-shell__workspace-bar .isis-header__workspace {
    flex: 0 0 auto;
    width: 100%;
    height: 36px;
    padding: 0 0.5rem 0 0.35rem;
}
.isis-shell__workspace-bar .isis-header__workspace-chevron {
    margin-left: auto;
}

/* Label « Espace de travail » au-dessus du switcher — pattern Notion/Linear.
   Mini-caption uppercase 10px très muted, pour catégoriser sans saturer.
   Refonte 2026-05-28 revisée : pas de bouton chevron propre — le seul toggle
   est sur le sub-nav et collapse toute la sidebar. */
.isis-shell__workspace-bar-label {
    font-size: 0.625rem;        /* 10px */
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--isis-text-soft);
    line-height: 1;
    padding-left: 2px;          /* alignement optique avec l'avatar squircle dessous */
    user-select: none;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ── Mode collapsed de la WS bar (forcé par sub-nav collapsed) ──
   Refonte 2026-05-28 revisée : un seul bouton de collapse sur le sub-nav
   pilote la sidebar entière (WS bar + sub-nav). Quand is-subnav-collapsed
   est posée sur .isis-shell :
   - la WS bar passe en flex row centré (44px de hauteur)
   - le label « ESPACE DE TRAVAIL » disparait (côté Razor : @if conditionnel)
   - le WorkspaceSwitcher reçoit le param IsCollapsed=true et change son markup
     (cf. WorkspaceSwitcher.razor : juste l'avatar 36×36, pas de name/chevron).
   Le DOM change donc plus de risque de conflit CSS — pas besoin de !important. */
.isis-shell.is-subnav-collapsed .isis-shell__workspace-bar {
    flex-direction: row;
    justify-content: center;
    align-items: center;
    padding: 6px 0;
    gap: 0;
    min-height: 44px;
    /* PAS d'overflow:hidden ici : le menu déroulant du workspace (position:absolute)
       doit pouvoir s'afficher quand l'user clique sur l'avatar en mode collapsed. */
}

/* Variante du WorkspaceSwitcher en mode collapsed (markup minimaliste,
   géré côté Razor via le param IsCollapsed). Conteneur 36×36 centré
   contenant juste l'avatar. */
.isis-header__workspace.isis-header__workspace--collapsed {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    padding: 0;
    gap: 0;
    flex: 0 0 auto;
    max-width: 36px;
    border-radius: 8px;
}

/* Variante du même label dans le sub-nav header (au-dessus du picker module).
   Même style typo, légère différence d'alignement gérée via le contexte parent. */
.isis-subnav__hint {
    font-size: 0.625rem;        /* 10px — strictement identique au label WS */
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--isis-text-soft);
    line-height: 1;
    padding-left: 2px;
    user-select: none;
    display: block;
}

/* Wrapper en mode étendu dans le sub-nav header : empile hint + picker.
   En mode collapsé, ce wrapper n'est pas rendu (cf. Razor). */
.isis-subnav__header-main {
    display: flex;
    flex-direction: column;
    gap: 4px;
    flex: 1 1 auto;
    min-width: 0;
}

.isis-shell__content {
    flex: 1;
    min-width: 0;
    overflow-y: auto;
    overflow-x: hidden;
    /* Refonte 2026-05-26 : fond blanc pur. La teinte module 4 % (Branded depth
       2026-05-17, via color-mix sur --isis-current-mod) a été retirée — elle
       tirait vers le violet pâle sur les pages sans module (fallback accent ISIS
       indigo). L'identité chromatique du module passe désormais par le rail
       sombre + breadcrumb header coloré + accent CTA/KPI, sans teindre la zone
       de lecture principale.
       Les cartes/grilles posent leur propre fond .isis-surface-alt là où elles
       ont besoin de contraste contre le shell. */
    background-color: var(--isis-surface);
    /* Variables d'identité module — surchargées par .mod-{code} ci-dessus
       (sur .isis-shell + .isis-shell__content). Tout le contenu en dessous lit
       var(--isis-current-mod) avec accent en fallback. */
    --isis-current-mod:       var(--isis-accent);
    --isis-current-mod-soft:  var(--isis-accent-soft);
    transition: background-color 200ms ease;
}
/* Tokens module — déclarés sur .isis-shell ET .isis-shell__content :
   - .isis-shell : pour que le header (soeur du content) puisse lire --isis-current-mod
   - .isis-shell__content : rétro-compat (sélecteur historique consommé par pages ;
     également utile car le content surcharge --isis-current-mod-soft pour son fond teinté). */
.isis-shell.mod-gescom,    .isis-shell__content.mod-gescom    { --isis-current-mod: var(--isis-mod-gescom);    --isis-current-mod-soft: var(--isis-mod-gescom-soft); }
.isis-shell.mod-gescompta, .isis-shell__content.mod-gescompta { --isis-current-mod: var(--isis-mod-gescompta); --isis-current-mod-soft: var(--isis-mod-gescompta-soft); }
.isis-shell.mod-sirh,      .isis-shell__content.mod-sirh      { --isis-current-mod: var(--isis-mod-sirh);      --isis-current-mod-soft: var(--isis-mod-sirh-soft); }
.isis-shell.mod-admin,     .isis-shell__content.mod-admin     { --isis-current-mod: var(--isis-mod-admin);     --isis-current-mod-soft: var(--isis-mod-admin-soft); }
.isis-shell.mod-ged,       .isis-shell__content.mod-ged       { --isis-current-mod: var(--isis-mod-ged);       --isis-current-mod-soft: var(--isis-mod-ged-soft); }
.isis-shell.mod-gesproj,   .isis-shell__content.mod-gesproj   { --isis-current-mod: var(--isis-mod-gesproj);   --isis-current-mod-soft: var(--isis-mod-gesproj-soft); }
.isis-shell.mod-gesmaff,   .isis-shell__content.mod-gesmaff   { --isis-current-mod: var(--isis-mod-gesmaff);   --isis-current-mod-soft: var(--isis-mod-gesmaff-soft); }
.isis-shell.mod-gesst,     .isis-shell__content.mod-gesst     { --isis-current-mod: var(--isis-mod-gesst);     --isis-current-mod-soft: var(--isis-mod-gesst-soft); }
.isis-shell.mod-gesmat,    .isis-shell__content.mod-gesmat    { --isis-current-mod: var(--isis-mod-gesmat);    --isis-current-mod-soft: var(--isis-mod-gesmat-soft); }
.isis-shell.mod-gespark,   .isis-shell__content.mod-gespark   { --isis-current-mod: var(--isis-mod-gespark);   --isis-current-mod-soft: var(--isis-mod-gespark-soft); }
.isis-shell.mod-gesinfo,   .isis-shell__content.mod-gesinfo   { --isis-current-mod: var(--isis-mod-gesinfo);   --isis-current-mod-soft: var(--isis-mod-gesinfo-soft); }
.isis-shell.mod-gesmob,    .isis-shell__content.mod-gesmob    { --isis-current-mod: var(--isis-mod-gesmob);    --isis-current-mod-soft: var(--isis-mod-gesmob-soft); }
.isis-shell.mod-gesfac,    .isis-shell__content.mod-gesfac    { --isis-current-mod: var(--isis-mod-gesfac);    --isis-current-mod-soft: var(--isis-mod-gesfac-soft); }
.isis-shell.mod-gespla,    .isis-shell__content.mod-gespla    { --isis-current-mod: var(--isis-mod-gespla);    --isis-current-mod-soft: var(--isis-mod-gespla-soft); }
.isis-shell.mod-gesqhse,   .isis-shell__content.mod-gesqhse   { --isis-current-mod: var(--isis-mod-gesqhse);   --isis-current-mod-soft: var(--isis-mod-gesqhse-soft); }

/* Transition 200ms sur tous les éléments porteurs de --isis-current-mod —
   évite le "flash" de couleur quand l'utilisateur switche de module via le rail.
   Conforme DESIGN.md §1 motion 3/10 (≤300ms ease). */
.isis-rich-page::before,
.isis-rich-toolbar__btn--primary,
.isis-rich-header__main,
.isis-kpi-card__value {
    transition: background-color 200ms ease, color 200ms ease, border-color 200ms ease;
}

/* ============================================================================
   Empty state (composant IsisEmptyState)
   ============================================================================ */
.isis-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 0.75rem;
    padding: 3.5rem 1.5rem;
    max-width: 480px;
    margin: 0 auto;
}
.isis-empty__icon-wrap {
    width: 96px;
    height: 96px;
    border-radius: 50%;
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background-color 200ms ease, color 200ms ease;
}
.isis-empty__icon-wrap .rzi { font-size: 44px; }
.isis-empty__title {
    font-size: 1.15rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0.5rem 0 0;
    line-height: 1.3;
}
.isis-empty__hint {
    font-size: 0.875rem;
    color: var(--isis-text-muted);
    margin: 0;
    line-height: 1.5;
    max-width: 360px;
}
.isis-empty__actions {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.5rem;
    flex-wrap: wrap;
    justify-content: center;
}

/* Variant neutre — pour les écrans sans contexte module (login, error pages…) */
.isis-empty--neutral .isis-empty__icon-wrap {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text-muted);
}

/* ============================================================================
   Header (56px)
   ============================================================================ */
.isis-header {
    height: var(--isis-header-h);
    background-color: var(--isis-surface);
    border-bottom: 1px solid var(--isis-border);
    /* Relief structurel amplifié — refonte 2026-05-26 « branded depth ».
       Shadow 4× plus marquée que l'ancienne 1px : décolle visuellement le header
       du content, signal d'autorité du shell. Exception documentée DESIGN.md §1. */
    box-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
    /* Refonte 2026-05-27 — 2 zones structurées :
       Zone 1 (var(--isis-subnav-w) = 240px, alignée pixel-perfect avec le sub-nav
       en dessous) : brand + workspace switcher (= identité)
       Zone 2 (1fr, alignée avec le content) : breadcrumb module + search + notif + user
       En mode sub-nav collapsé (.isis-shell.is-subnav-collapsed), la zone 1 se
       compresse à 64px en synchro avec le sub-nav (transition 200ms). */
    display: grid;
    grid-template-columns: var(--isis-subnav-w) 1fr;
    transition: grid-template-columns 200ms cubic-bezier(0.4, 0, 0.2, 1);
    flex-shrink: 0;
    position: relative;
    z-index: 50;
}
.isis-shell.is-subnav-collapsed .isis-header {
    grid-template-columns: var(--isis-subnav-w-collapsed, 64px) 1fr;
}

/* Zone 1 — identité (brand + workspace switcher).
   Bordure droite alignée pixel-perfect avec celle du sub-nav en dessous.

   PAS d'overflow:hidden ici : le menu déroulant du WorkspaceSwitcher fait
   ~300px et doit pouvoir déborder dans la zone 2 par-dessus le crumb (il a
   son propre z-index 100 et un backdrop pour fermer au click outside).
   Le nom « ISIS SOLUTION » est masqué via display:none plutôt qu'overflow. */
.isis-header__zone-1 {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0 0.85rem;
    border-right: 1px solid var(--isis-border-strong);
    min-width: 0;
}
/* DÉPRÉCIÉ 2026-05-28 : .isis-header__zone-1-ws contenait le WorkspaceSwitcher.
   Le switcher a déménagé dans .isis-shell__workspace-bar (au-dessus du sub-nav,
   dans la colonne gauche). Markup retiré de AppHeader.razor. CSS conservé pour
   compat (display:none au cas où il resterait des consommateurs). */
.isis-header__zone-1-ws {
    display: none;
}
/* Le nom ISIS SOLUTION se masque en mode collapsé (pas la place dans 64px). */
.isis-shell.is-subnav-collapsed .isis-header__brand-name {
    display: none;
}

/* Zone 2 — module + actions (crumb + search + notif + user). */
.isis-header__zone-2 {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0 1rem;
    min-width: 0;
}

.isis-header__brand {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 0.625rem;
    text-decoration: none;
    color: inherit;
    transition: opacity 120ms;
    /* Plus de padding-right ni border-right : la séparation visuelle est désormais
       portée par .isis-header__zone-1 (border-right). */
    flex-shrink: 0;
    min-width: 0;
}
.isis-header__brand:hover { opacity: 0.75; }
.isis-header__brand:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
    border-radius: 4px;
}
.isis-header__brand-logo {
    width: 36px;
    height: 36px;
    flex-shrink: 0;
    object-fit: contain;
    display: block;
}
/* Nom marque en deux lignes empilées : "ISIS" punchy + "SOLUTION" en tagline */
.isis-header__brand-name {
    display: flex;
    flex-direction: column;
    line-height: 1;
    gap: 2px;
}
.isis-header__brand-name-l1 {
    font-size: 0.95rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    color: var(--isis-text);
}
.isis-header__brand-name-l2 {
    font-size: 0.7rem;
    font-weight: 500;
    letter-spacing: 0.18em;
    color: var(--isis-text-muted);
}
/* ----------------------------------------------------------------------------
   Bloc tenant historique — DÉPRÉCIÉ depuis refonte shell 2026-05-26.
   Markup retiré de AppHeader.razor ; le tenant vit désormais en tête du dropdown
   AppUserMenu. CSS conservé temporairement (rien ne le rend, coût ≈ 0) pour le
   cas où une page custom le réutiliserait — à supprimer définitivement V1.1.
   ---------------------------------------------------------------------------- */
.isis-header__tenant {
    display: flex;
    flex-direction: column;
    line-height: 1;
}
.isis-header__tenant-label {
    font-size: 0.65rem;
    letter-spacing: 0.1em;
    color: var(--isis-text-soft);
}
.isis-header__tenant-name {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    margin-top: 2px;
}

/* ----------------------------------------------------------------------------
   Breadcrumb module courant (.isis-header__crumb)
   Refonte shell 2026-05-26 : remplace le bloc tenant historique. Donne un repère
   chromatique permanent du module où l'on est, en plus du rail (qui peut être
   hors de vue sur écran étroit) et de la teinte 4 % du content.

   Visible uniquement si Nav.CurrentModule != null (pages hors-module : caché).
   ---------------------------------------------------------------------------- */
.isis-header__crumb {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    height: 32px;
    padding: 0 0.75rem 0 0.6rem;
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    border-radius: var(--isis-radius-pill);
    color: var(--isis-text);
    font-size: 0.875rem;
    font-weight: 600;
    line-height: 1;
    transition: background-color 200ms ease, color 200ms ease;
    /* Sécurise contre l'écrasement par les autres éléments à droite (workspace,
       search…) — le crumb ne tronque jamais avant les autres éléments flexibles. */
    flex-shrink: 0;
    max-width: 240px;
}
.isis-header__crumb-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    color: var(--isis-current-mod, var(--isis-accent));
}
.isis-header__crumb-icon .rzi {
    font-size: 18px;
    transition: color 200ms ease;
}
.isis-header__crumb-label {
    color: var(--isis-current-mod, var(--isis-accent));
    /* Stretch + ellipsis si nom module long (« Marchés & Affaires », « Matériel TP », etc.) */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: color 200ms ease;
}
@media (max-width: 900px) {
    .isis-header__crumb-label { display: none; }
    .isis-header__crumb { padding: 0 0.5rem; }
}

.isis-header__spacer { flex: 1; }

.isis-header__search {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    height: 36px;
    width: 320px;
    max-width: 100%;
    padding: 0 0.6rem 0 0.85rem;
    /* Refonte 2026-05-26 : porte la couleur du module courant en fond très diluté.
       Réagit au changement de module via --isis-current-mod-soft (transition
       déjà déclarée sur .isis-shell__content). Plus de "champ désactivé". */
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    border: 1px solid transparent;
    border-radius: var(--isis-radius-pill);
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    cursor: pointer;
    transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease;
}
.isis-header__search .rzi {
    color: var(--isis-current-mod, var(--isis-accent));
    transition: color 150ms ease;
}
.isis-header__search:hover:not(:disabled) {
    background-color: var(--isis-surface);
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: var(--isis-text);
}
.isis-header__search:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-header__search:disabled { cursor: not-allowed; opacity: 0.75; }
.isis-header__search-label {
    flex: 1;
    text-align: left;
}
.isis-header__kbd {
    display: inline-flex;
    align-items: center;
    height: 20px;
    padding: 0 0.4rem;
    background-color: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text-soft);
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.65rem;
    letter-spacing: 0.04em;
    line-height: 1;
}

@media (max-width: 900px) {
    .isis-header__search-label { display: none; }
    .isis-header__kbd { display: none; }
    .isis-header__search { width: 36px; padding: 0; justify-content: center; }
}

.isis-header__actions {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

/* ─────────────────────────────────────────────────────────────────────────
   Workspace switcher — refonte 2026-05-28 « moderne SaaS »
   Pill horizontal avec avatar squircle 26 + nom inline + chevron Material.
   Pill compteur subtle en couleur module courant (pas en accent rouge).
   Responsive < 1024px : nom + pill masqués, garde avatar + chevron.
   ───────────────────────────────────────────────────────────────────────── */
.isis-header__workspace {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    height: 32px;
    padding: 0 0.5rem 0 0.25rem;
    border-radius: 8px;
    user-select: none;
    background-color: transparent;
    transition: background-color 120ms ease, box-shadow 120ms ease;
    max-width: 100%;
    min-width: 0;
}
.isis-header__workspace.is-switchable {
    cursor: pointer;
}
.isis-header__workspace.is-switchable:hover,
.isis-header__workspace.is-switchable:focus-visible {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    outline: none;
}
.isis-header__workspace.is-switchable:focus-visible {
    box-shadow: 0 0 0 2px var(--isis-current-mod, var(--isis-accent));
}
.isis-header__workspace.is-locked {
    cursor: default;
}

.isis-header__workspace-avatar {
    width: 26px; height: 26px;
    /* Squircle 7px au lieu de cercle 50% — pattern moderne 2026 (Linear, Vercel) */
    border-radius: 7px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    overflow: hidden;
    flex-shrink: 0;
}
.isis-header__workspace-avatar img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}

/* Nom du workspace inline — ajouté 2026-05-28, ajusté pour éviter le débordement.
   Stratégie : flex:1 + min-width:0 → s'adapte à la place dispo (ellipsis
   automatique). Masqué <1280px car place trop étroite à côté du brand
   "ISIS SOLUTION" (qui pèse ~120px de la zone 1 = 280px). */
.isis-header__workspace-name {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--isis-text);
    line-height: 1.2;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* Refonte 2026-05-28 : remplace max-width:140px par flex auto-shrink.
       Permet au name d'occuper la place disponible et de tronquer en ellipsis
       de manière fluide selon la largeur du shell. */
    flex: 1 1 auto;
    min-width: 0;
}

/* Pill compteur — DÉPRÉCIÉ 2026-05-28. Markup retiré de WorkspaceSwitcher.razor
   pour libérer ~24px de place dans la zone 1. L'info "N entreprises accessibles"
   reste dans aria-label + en tête du dropdown menu. CSS conservé temporairement
   au cas où le pill serait réactivé (à supprimer V1.1 si confirmé). */
.isis-header__workspace-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px; height: 18px;
    padding: 0 5px;
    border-radius: var(--isis-radius-pill);
    background-color: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 18%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    font-size: 0.7rem;
    font-weight: 600;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    flex-shrink: 0;
}

.isis-header__workspace-chevron {
    display: inline-flex;
    align-items: center;
    color: var(--isis-text-muted);
    line-height: 1;
    flex-shrink: 0;
    transition: transform 150ms ease;
}
/* Chevron pivote quand le menu est ouvert (signal visuel "panneau ouvert"). */
.isis-header__workspace[aria-expanded="true"] .isis-header__workspace-chevron {
    transform: rotate(180deg);
}

/* Refonte 2026-05-28 : le WorkspaceSwitcher vit désormais dans .isis-shell__workspace-bar
   (280px dédiés au-dessus du sub-nav, pas dans le header). Le workspace-name a toute
   la place pour s'afficher en entier. La règle de masquage en mode collapsed est
   désormais consolidée plus haut avec is-ws-bar-collapsed (cf. ~ligne 360). */

/* Backdrop transparent qui ferme le menu au clic dehors */
.isis-header__workspace-backdrop {
    position: fixed;
    inset: 0;
    z-index: 90;
}

/* Menu déroulant — refonte 2026-05-28 :
   - 320px fixe (au lieu de 300-360 variable)
   - Coins 12px (au lieu de 8) — plus moderne
   - Shadow renforcée + animation 120ms (au lieu de 140) */
.isis-header__workspace-menu {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    z-index: 100;
    width: 320px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 12px;
    padding: 6px;
    box-shadow: var(--isis-elevation-2);   /* dropdown app — token (était ad-hoc, §2 elevation-2 = menus) */
    transform-origin: top left;
    animation: isis-workspace-menu-in 120ms cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes isis-workspace-menu-in {
    from { opacity: 0; transform: translateY(-4px) scale(0.985); }
    to   { opacity: 1; transform: translateY(0)    scale(1); }
}
@media (prefers-reduced-motion: reduce) {
    .isis-header__workspace-menu { animation: none; }
}

/* Header du menu — refonte 2026-05-28 : title case en place du UPPERCASE
   ERP, séparé du count par un séparateur visuel " · " plutôt que justify-between. */
.isis-header__workspace-menu-header {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    padding: 10px 12px 8px;
    border-bottom: 1px solid var(--isis-border-soft, var(--isis-border));
    margin: -6px -6px 6px;        /* étend aux bords */
}
.isis-header__workspace-menu-title {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    /* Title case respecté tel que stocké — pas de UPPERCASE forcé. */
    text-transform: none;
    letter-spacing: 0;
}
.isis-header__workspace-menu-count {
    font-size: 0.7rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    text-transform: none;
    letter-spacing: 0;
}
.isis-header__workspace-menu-count::before {
    content: "·";
    margin-right: 0.35rem;
    opacity: 0.5;
}

/* Champ de recherche — refonte 2026-05-28 : style plus moderne, icône Material
   inline, focus ring accent module. */
.isis-header__workspace-menu-search {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
    margin: 0 0 6px;
    border-radius: 8px;
    background: var(--isis-surface-alt);
    border: 1px solid transparent;
    transition: border-color 120ms ease, background-color 120ms ease;
}
.isis-header__workspace-menu-search:focus-within {
    border-color: var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-surface);
}
.isis-header__workspace-menu-search input {
    flex: 1;
    border: none;
    outline: none;
    background: transparent;
    font: inherit;
    font-size: 0.875rem;
    color: var(--isis-text);
    padding: 2px 0;
    min-width: 0;
}
.isis-header__workspace-menu-search input::placeholder {
    color: var(--isis-text-soft);
}
.isis-header__workspace-menu-clear {
    border: none;
    background: transparent;
    cursor: pointer;
    color: var(--isis-text-muted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 3px;
    border-radius: 4px;
    flex-shrink: 0;
}
.isis-header__workspace-menu-clear:hover {
    background: rgba(15, 23, 42, 0.06);
    color: var(--isis-text);
}

/* Empty state quand aucun résultat pour le filtre courant */
.isis-header__workspace-menu-empty {
    padding: 18px 14px;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
    text-align: center;
    line-height: 1.4;
}
.isis-header__workspace-menu-empty strong {
    color: var(--isis-text);
    font-weight: 600;
}

/* Items du menu — refonte 2026-05-28 :
   - Indentation pure CSS via --ws-depth (16px par niveau, lisible sans bullet)
   - Avatar squircle 28px (cohérence trigger)
   - Bloc texte vertical (nom + sublabel short code)
   - Coins 8px (vs 6) — équilibré avec le menu 12px */
.isis-header__workspace-menu-item {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px 8px calc(10px + var(--ws-depth, 0) * 16px);
    background: transparent;
    border: 0;
    border-radius: 8px;
    cursor: pointer;
    font-family: inherit;
    font-size: 0.875rem;
    color: var(--isis-text);
    text-align: left;
    transition: background-color 100ms ease;
    min-height: 44px;             /* cible tactile a11y AA */
}
.isis-header__workspace-menu-item:hover,
.isis-header__workspace-menu-item:focus-visible {
    background: var(--isis-surface-alt);
    outline: none;
}
.isis-header__workspace-menu-item:focus-visible {
    box-shadow: inset 0 0 0 2px var(--isis-current-mod, var(--isis-accent));
}
.isis-header__workspace-menu-item.is-active {
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
}
.isis-header__workspace-menu-item.is-active .isis-header__workspace-menu-name {
    font-weight: 600;
    color: var(--isis-current-mod, var(--isis-accent));
}
.isis-header__workspace-menu-avatar {
    width: 28px; height: 28px;
    border-radius: 7px;     /* squircle cohérent avec le trigger */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.7rem;
    font-weight: 700;
    text-transform: uppercase;
    overflow: hidden;
    flex-shrink: 0;
}
.isis-header__workspace-menu-avatar img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}

/* Bloc texte vertical (nom + sublabel short code) — nouveau 2026-05-28. */
.isis-header__workspace-menu-text {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 1px;
    line-height: 1.2;
}
.isis-header__workspace-menu-name {
    color: inherit;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Sublabel = short code de l'entreprise (ex: "DAT", "KAD"). Affiché seulement
   si présent dans la BDD (sirh.entreprise.entreprise_short_code). */
.isis-header__workspace-menu-subname {
    font-size: 0.7rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.isis-header__icon-btn {
    position: relative;
    width: 36px; height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    border-radius: 8px;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 120ms;
}
.isis-header__icon-btn:hover {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-header__badge {
    position: absolute;
    top: 2px; right: 2px;
    min-width: 18px; height: 18px;
    padding: 0 5px;
    border-radius: 9px;
    background-color: #ef4444;
    color: white;
    font-size: 0.65rem;
    font-weight: 600;
    line-height: 18px;
    text-align: center;
}
.isis-header__login-link {
    display: inline-flex;
    align-items: center;
    padding: 0.5rem;
    color: var(--isis-text-muted);
    text-decoration: none;
    border-radius: 8px;
}

/* User pill (style maquette NetLogger) */
.isis-user-pill.rz-profile-menu,
.isis-user-pill .rz-profile-menu {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-pill);
    padding: 0.25rem 0.5rem 0.25rem 0.85rem;
    transition: background-color 120ms;
}
.isis-user-pill:hover,
.isis-user-pill:hover .rz-profile-menu {
    background-color: var(--isis-surface-alt);
}
.isis-user-pill__inner {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}
.isis-user-pill__text {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    line-height: 1.1;
}
.isis-user-pill__name {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-user-pill__role {
    font-size: 0.65rem;
    color: var(--isis-text-soft);
    margin-top: 2px;
}
.isis-user-pill__avatar-wrap {
    position: relative;
    display: inline-flex;
}
.isis-user-pill__photo {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    object-fit: cover;
    display: block;
}
.isis-user-pill__photo--initials {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    line-height: 1;
    user-select: none;
}
.isis-user-pill__status {
    position: absolute;
    right: 0; bottom: 0;
    width: 10px; height: 10px;
    border-radius: 50%;
    background-color: #10b981;
    border: 2px solid var(--isis-surface);
}

/* ----------------------------------------------------------------------------
   En-tête tenant dans le dropdown du menu user — refonte shell 2026-05-26.
   Bloc d'identité ("où je suis"), pas un item de menu cliquable.
   Visuellement détaché des items via border-bottom + un cran de fond.
   ---------------------------------------------------------------------------- */
.isis-user-menu-tenant {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 14px 14px;
    margin: -6px -2px 4px;       /* compense le padding interne du dropdown Radzen */
    background-color: var(--isis-accent-soft);
    border-bottom: 1px solid var(--isis-border);
    /* Pas de hover/cursor: pointer — ce n'est pas une action, c'est un libellé. */
    user-select: none;
}
.isis-user-menu-tenant__avatar {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background-color: var(--isis-accent);
    color: #ffffff;
    font-size: 0.8125rem;        /* 13px */
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1;
}
.isis-user-menu-tenant__text {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
    min-width: 0;
}
.isis-user-menu-tenant__name {
    font-size: 0.9375rem;        /* 15px */
    font-weight: 600;
    color: var(--isis-text);
    /* Title Case respecté tel que stocké en DB ; pas de UPPERCASE forcé. */
    text-transform: none;
    /* Ellipsis sur nom long pour rester dans la largeur fixe du dropdown. */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 220px;
}
.isis-user-menu-tenant__label {
    font-size: 0.6875rem;        /* 11px */
    font-weight: 500;
    color: var(--isis-text-muted);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-top: 2px;
}

/* ============================================================================
   Sidebar (Navigation Rail 84px, icône + libellé module sous l'icône)
   Refonte 2026-05-26 : rail blanc conservé (essai darkmode reverté pour rester
   dans la voix produit), tuile active reste en couleur module pleine (vs
   ancien pastel 14% qui était trop fade — c'était le vrai problème).
   ============================================================================ */
.isis-sidebar {
    width: var(--isis-sidebar-w);
    flex-shrink: 0;
    background-color: var(--isis-surface);
    border-right: 1px solid var(--isis-border-strong);
    /* Relief structurel — exception documentée DESIGN.md §1 (shell uniquement) */
    box-shadow: 2px 0 4px rgba(15, 23, 42, 0.04);
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 0.5rem 0;
    gap: 0.25rem;
    overflow-y: auto;
    overflow-x: hidden;
    position: relative;
    z-index: 40;
}
.isis-sidebar__items {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    flex: 1;
    width: 100%;
}
.isis-sidebar__bottom {
    margin-top: auto;
    padding-top: 0.5rem;
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
}

/* Bouton de la rail : tuile icône + libellé module (petit, 2 lignes max).
   Refonte 2026-05-26 : on garde la largeur 76px + label 12.5px (lisibilité +30 %)
   et la tuile active 100 % couleur module (les 2 vraies frictions résolues).
   Le rail reste blanc (voix produit), la palette est celle d'origine. */
.isis-rail-btn {
    position: relative;
    width: 76px;
    min-height: 66px;
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 5px;
    padding: 7px 4px 6px;
    border: none;
    background: transparent;
    color: var(--isis-text-muted);
    cursor: pointer;
    border-radius: var(--isis-radius-sm);
    transition: background-color 0.15s ease, color 0.15s ease;
}
.isis-rail-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
/* Icône en pastille arrondie au repos : fond pâle uniforme pour ancrer l'œil
   (toutes les icônes lisibles à la même hauteur visuelle, peu importe leur masse). */
.isis-rail-btn__icon-wrap {
    width: 36px; height: 36px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: rgba(15, 23, 42, 0.05);
    border-radius: 10px;
    transition: background-color 0.15s ease;
}
.isis-rail-btn:hover .isis-rail-btn__icon-wrap {
    background-color: rgba(15, 23, 42, 0.09);
}
/* Quand le module est actif, c'est le bouton tout entier qui prend la couleur
   module (cf. règles .mod-X ci-dessous) → on rend l'icône-wrap transparente
   pour ne pas avoir une pastille dans la pastille. */
.isis-rail-btn--active .isis-rail-btn__icon-wrap,
.isis-rail-btn--active:hover .isis-rail-btn__icon-wrap {
    background-color: transparent;
}
.isis-rail-btn__icon-wrap .rzi,
.isis-rail-btn .rzi { font-size: 22px; transition: color 0.15s ease; }

/* Preview chromatique au hover (pas actif) : l'icône prend la couleur du module.
   Permet de deviner la cible avant de cliquer. Les règles --active prennent le
   relais ensuite et colorent tout le bouton. */
.isis-rail-btn:hover.mod-gescom    .rzi { color: var(--isis-mod-gescom); }
.isis-rail-btn:hover.mod-gescompta .rzi { color: var(--isis-mod-gescompta); }
.isis-rail-btn:hover.mod-sirh      .rzi { color: var(--isis-mod-sirh); }
.isis-rail-btn:hover.mod-admin     .rzi { color: var(--isis-mod-admin); }
.isis-rail-btn:hover.mod-gesproj   .rzi { color: var(--isis-mod-gesproj); }
.isis-rail-btn:hover.mod-gesmaff   .rzi { color: var(--isis-mod-gesmaff); }
.isis-rail-btn:hover.mod-gesst     .rzi { color: var(--isis-mod-gesst); }
.isis-rail-btn:hover.mod-gesmat    .rzi { color: var(--isis-mod-gesmat); }
.isis-rail-btn:hover.mod-gespark   .rzi { color: var(--isis-mod-gespark); }
.isis-rail-btn:hover.mod-gesinfo   .rzi { color: var(--isis-mod-gesinfo); }
.isis-rail-btn:hover.mod-gesmob    .rzi { color: var(--isis-mod-gesmob); }
.isis-rail-btn:hover.mod-gesfac    .rzi { color: var(--isis-mod-gesfac); }
.isis-rail-btn:hover.mod-gespla    .rzi { color: var(--isis-mod-gespla); }
.isis-rail-btn:hover.mod-gesqhse   .rzi { color: var(--isis-mod-gesqhse); }
.isis-rail-btn:hover.mod-ged       .rzi { color: var(--isis-mod-ged); }
.isis-rail-btn:hover.mod-monespace .rzi { color: var(--isis-accent); }

.isis-rail-btn__label {
    font-size: 0.78125rem;    /* 12.5px — refonte rail sombre 2026-05-26, lisibilité +30% */
    line-height: 1.2;
    font-weight: 500;
    text-align: center;
    color: inherit;
    max-width: 100%;
    /* Clamp à 2 lignes — au-delà ellipsis */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    word-break: break-word;
    hyphens: auto;
}

/* Séparateur de groupe — fin trait gris centré entre 2 zones (perso/métier/transverse) */
.isis-sidebar__separator {
    width: 40px;
    height: 1px;
    background-color: var(--isis-border-strong);
    margin: 6px auto;
    flex-shrink: 0;
}
/* En actif, le bouton entier est en couleur module pleine → label en blanc + bold */
.isis-rail-btn--active .isis-rail-btn__label { font-weight: 600; color: #ffffff; }

/* État actif — tuile colorée à 100 % de la couleur module (vs ancien color-mix 14 %).
   Le texte et l'icône passent en blanc pour le contraste, ce qui fait fortement
   ressortir le module courant sur le rail sombre. */
.isis-rail-btn--active {
    color: #ffffff;
}
.isis-rail-btn--active .rzi {
    color: #ffffff !important;
}

.isis-rail-btn--active.mod-gescom    { background-color: var(--isis-mod-gescom); }
.isis-rail-btn--active.mod-gescompta { background-color: var(--isis-mod-gescompta); }
.isis-rail-btn--active.mod-sirh      { background-color: var(--isis-mod-sirh); }
.isis-rail-btn--active.mod-admin     { background-color: var(--isis-mod-admin); }
.isis-rail-btn--active.mod-gesproj   { background-color: var(--isis-mod-gesproj); }
.isis-rail-btn--active.mod-gesmaff   { background-color: var(--isis-mod-gesmaff); }
.isis-rail-btn--active.mod-gesst     { background-color: var(--isis-mod-gesst); }
.isis-rail-btn--active.mod-gesmat    { background-color: var(--isis-mod-gesmat); }
.isis-rail-btn--active.mod-gespark   { background-color: var(--isis-mod-gespark); }
.isis-rail-btn--active.mod-gesinfo   { background-color: var(--isis-mod-gesinfo); }
.isis-rail-btn--active.mod-gesmob    { background-color: var(--isis-mod-gesmob); }
.isis-rail-btn--active.mod-gesfac    { background-color: var(--isis-mod-gesfac); }
.isis-rail-btn--active.mod-gespla    { background-color: var(--isis-mod-gespla); }
.isis-rail-btn--active.mod-gesqhse   { background-color: var(--isis-mod-gesqhse); }
.isis-rail-btn--active.mod-ged       { background-color: var(--isis-mod-ged); }
/* Mon espace n'a pas de couleur module dédiée — accent ISIS pour identité produit */
.isis-rail-btn--active.mod-monespace { background-color: var(--isis-accent); }

/* Hover sur item actif : éclairci très légèrement plutôt qu'assombri (la tuile
   est déjà saturée, brightness +5% maintient le caractère "vivant"). */
.isis-rail-btn--active:hover { filter: brightness(1.08); }

/* ----------------------------------------------------------------------------
   Signal non-chromatique sur l'item actif — barre blanche verticale gauche.
   Garantit WCAG 1.4.1 (les daltoniens distinguent l'actif même si la teinte
   module leur échappe) puisque le bouton entier est désormais coloré au lieu
   d'un signal couleur faible.
   ---------------------------------------------------------------------------- */
.isis-rail-btn--active::before {
    content: "";
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 3px;
    height: 28px;
    border-radius: 0 2px 2px 0;
    background-color: rgba(255, 255, 255, 0.85);
}

/* ----------------------------------------------------------------------------
   Point rouge en haut-droite de l'icône — signal agrégé d'éléments en attente.
   Halo --isis-surface (blanc) pour rester lisible sur le rail clair.
   Sur item actif (fond couleur module), on garde un halo blanc qui reste lisible.
   ---------------------------------------------------------------------------- */
.isis-rail-btn__dot {
    position: absolute;
    top: 6px;
    right: 14px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background-color: var(--isis-danger, #ef4444);
    box-shadow: 0 0 0 2px var(--isis-surface);
    pointer-events: none;
}
.isis-rail-btn--active .isis-rail-btn__dot {
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9);
}

/* ----------------------------------------------------------------------------
   Respect de prefers-reduced-motion (WCAG 2.3.3) — désactive les transitions
   du rail et du sub-nav pour les utilisateurs sensibles aux animations.
   ---------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    .isis-rail-btn,
    .isis-rail-btn .rzi,
    .isis-rail-btn__icon-wrap,
    .isis-subnav,
    .isis-subnav__items,
    .isis-subnav__item,
    /* Refonte shell 2026-05-27 — désactive aussi les transitions header 2 zones
       (grid-template-columns 200ms) + workspace switcher opacity + subnav width
       qui ont été ajoutées avec le sub-nav persistant. */
    .isis-header,
    .isis-header__zone-1-ws,
    .isis-header__brand-name {
        transition: none !important;
    }
}

/* ============================================================================
   Sub-nav PERSISTANT (refonte 2026-05-26 « SaaS premium »)
   Plus de position:fixed ni d'animation open/close. Vit dans le flow flex de
   .isis-shell__body aux côtés du rail, toujours visible. L'utilisateur peut
   compresser via le bouton chevron (mode icon-only 64px).

   Largeurs :
     --isis-subnav-w           = 240px (mode étendu, défaut)
     --isis-subnav-w-collapsed = 64px  (mode icon-only — items centrés sans label)
   ============================================================================ */
.isis-subnav {
    /* Refonte 2026-05-28 : .isis-subnav est désormais enfant de .isis-shell__sidebar
       qui porte la largeur (var(--isis-subnav-w)) et le border-right. Le sub-nav lui-même
       prend juste 100% de la place dispo dans son parent (flex column). */
    flex: 1 1 auto;
    width: 100%;
    background-color: var(--isis-surface);
    display: flex;
    flex-direction: column;
    overflow-y: auto;
    overflow-x: hidden;
    min-height: 0;
}
.isis-subnav--expanded,
.isis-subnav--collapsed {
    /* Les modificateurs ne portent plus de largeur (gérée par le parent .isis-shell__sidebar
       via la classe .is-subnav-collapsed sur .isis-shell). Préservés comme classes-état
       qui peuvent toujours servir aux modificateurs internes du sub-nav. */
}
.isis-subnav__header {
    display: flex;
    /* align-items: flex-end → le bouton chevron collapse s'aligne avec le bas
       du wrapper main (= à côté du bouton picker, pas du label uppercase au-dessus). */
    align-items: flex-end;
    justify-content: space-between;
    gap: 0.5rem;
    /* Refonte 2026-05-28 : padding-top réduit (12 → 2) pour rapprocher de la
       WS bar au-dessus. Padding-bottom conservé (10) pour séparer du 1er item nav. */
    padding: 2px 0.85rem 0.75rem;
    flex-shrink: 0;
    /* Hauteur ajustée : label 12 + gap 4 + picker 36 + padding 12 ≈ 64px. */
    min-height: 60px;
}
.isis-subnav--collapsed .isis-subnav__header {
    padding: 1rem 0.5rem 0.75rem;
    justify-content: center;
}
.isis-subnav__title {
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    flex: 1;
    min-width: 0;
}
.isis-subnav__collapse {
    width: 28px; height: 28px;
    background: transparent;
    border: none;
    color: var(--isis-text-soft);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 6px;
    flex-shrink: 0;
    transition: background-color 120ms, color 120ms;
}
.isis-subnav__collapse:hover {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-subnav__collapse:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
.isis-subnav__collapse .rzi { font-size: 18px; }

/* Refonte 2026-05-28 : en mode collapsed (sidebar 64px), le bouton chevron
   collapse + le picker icon-only (36px) ne tiennent pas côte à côte (= 36 + 8
   + 28 = 72px requis > 64px disponibles). On masque le chevron — le picker
   icon-only lui-même est cliquable pour ré-étendre (cf. AppSubNav.razor,
   @onclick="ToggleCollapseAsync" sur le bouton .isis-subnav__picker--collapsed). */
.isis-shell.is-subnav-collapsed .isis-subnav__collapse {
    display: none;
}

.isis-subnav__items {
    display: flex;
    flex-direction: column;
    padding: 0.25rem 0.5rem 1rem;
    gap: 2px;
}
.isis-subnav--collapsed .isis-subnav__items {
    padding: 0.25rem 0.4rem 1rem;
    align-items: center;
}
.isis-subnav__group-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 0.5rem 0.65rem 0.4rem;
    margin-top: 0.5rem;
    border: none;
    background: transparent;
    color: var(--isis-text-soft);
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    cursor: pointer;
    border-radius: 6px;
    transition: color 120ms;
}
.isis-subnav__group-header:hover {
    color: var(--isis-text-muted);
}
.isis-subnav__group-header > span:first-child {
    flex: 1;
    text-align: left;
}
.isis-subnav__group-items {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.isis-subnav__item {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    padding: 0.5rem 0.7rem;
    border-radius: 7px;
    color: var(--isis-text-muted);
    text-decoration: none;
    font-size: 0.875rem;
    line-height: 1.3;
    transition: background-color 120ms, color 120ms;
    position: relative;
}
.isis-subnav__item:hover:not(.isis-subnav__item--disabled) {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-subnav__item.active {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 500;
}
/* Mode collapsé : items centrés (icône seule), padding réduit, tooltip native */
.isis-subnav--collapsed .isis-subnav__item {
    width: 44px;
    height: 40px;
    padding: 0;
    justify-content: center;
    border-radius: 8px;
}
.isis-subnav--collapsed .isis-subnav__group-items {
    align-items: center;
}

/* Badge compteur à droite de l'item (mode étendu). */
.isis-subnav__badge {
    margin-left: auto;
    min-width: 20px;
    padding: 0.05rem 0.4rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-danger);
    color: #fff;
    font-size: 0.7rem;
    font-weight: 600;
    line-height: 1.4;
    text-align: center;
    font-variant-numeric: tabular-nums;
}
.isis-subnav__item.active .isis-subnav__badge {
    background: var(--isis-current-mod, var(--isis-accent));
}
/* Mode collapsé : dot rouge en haut-droite de l'item au lieu d'un badge texte. */
.isis-subnav__badge-dot {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background-color: var(--isis-danger);
    box-shadow: 0 0 0 2px var(--isis-surface);
    pointer-events: none;
}

/* Placeholder quand aucun module n'est sélectionné (rare). */
.isis-subnav__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-soft);
    font-size: 0.85rem;
    text-align: center;
}

/* ----------------------------------------------------------------------------
   Sélecteur module (dropdown picker dans le header du sub-nav)
   Refonte shell 2026-05-26 3e étape : remplace le rail (AppSidebar) supprimé.
   Le bouton trigger occupe la majeure partie du header du sub-nav et ouvre
   un menu listant tous les modules accessibles groupés par catégorie.
   ---------------------------------------------------------------------------- */
.isis-subnav__picker {
    flex: 1;
    min-width: 0;
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    height: 36px;
    padding: 0 0.45rem 0 0.55rem;
    background-color: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    cursor: pointer;
    color: var(--isis-text);
    font-size: 0.875rem;
    font-weight: 500;
    text-align: left;
    transition: background-color 120ms, border-color 120ms;
}
.isis-subnav__picker:hover,
.isis-subnav__picker.is-open {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    border-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-subnav__picker:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-subnav__picker-icon {
    width: 24px; height: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 5px;
    flex-shrink: 0;
    color: var(--isis-current-mod, var(--isis-accent));
}
.isis-subnav__picker-icon .rzi { font-size: 18px; }
.isis-subnav__picker-label {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Variante en mode collapsé : juste l'icône, centrée, format carré 36px. */
.isis-subnav__picker--collapsed {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    padding: 0;
    justify-content: center;
}

/* Backdrop transparent qui capture le click outside pour fermer le menu. */
.isis-subnav__picker-backdrop {
    position: fixed;
    inset: 0;
    z-index: 250;
    background: transparent;
}

/* Menu dropdown — position absolue sous le header du sub-nav. */
.isis-subnav__picker-menu {
    position: absolute;
    top: calc(48px + 0.5rem);     /* hauteur du header sub-nav + gouttière */
    left: 0.85rem;
    right: 0.85rem;
    z-index: 260;
    max-height: calc(100vh - var(--isis-header-h) - 80px);
    overflow-y: auto;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-2);   /* dropdown picker module — token (était ad-hoc) */
    padding: 0.4rem;
    display: flex;
    flex-direction: column;
    gap: 1px;
    animation: isis-picker-pop 120ms cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes isis-picker-pop {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}
.isis-subnav__picker-sep {
    height: 1px;
    background-color: var(--isis-border-soft);
    margin: 0.3rem 0.5rem;
}
.isis-subnav__picker-item {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.55rem 0.7rem;
    border: none;
    background: transparent;
    border-radius: 7px;
    color: var(--isis-text);
    font-size: 0.875rem;
    font-weight: 500;
    cursor: pointer;
    text-align: left;
    width: 100%;
    transition: background-color 80ms;
}
.isis-subnav__picker-item:hover {
    background-color: var(--isis-surface-alt);
}
.isis-subnav__picker-item.is-active {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
}
.isis-subnav__picker-item-icon {
    width: 28px; height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    border-radius: 6px;
    flex-shrink: 0;
    transition: background-color 80ms, color 80ms;
}
.isis-subnav__picker-item-icon .rzi { font-size: 18px; }
.isis-subnav__picker-item-label {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Couleur d'icône par module — mêmes mappings que rail-btn (cohérence visuelle). */
.isis-subnav__picker-item.mod-gescom    .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gescom-soft);    color: var(--isis-mod-gescom); }
.isis-subnav__picker-item.mod-gescompta .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-subnav__picker-item.mod-sirh      .isis-subnav__picker-item-icon { background-color: var(--isis-mod-sirh-soft);      color: var(--isis-mod-sirh); }
.isis-subnav__picker-item.mod-admin     .isis-subnav__picker-item-icon { background-color: var(--isis-mod-admin-soft);     color: var(--isis-mod-admin); }
.isis-subnav__picker-item.mod-ged       .isis-subnav__picker-item-icon { background-color: var(--isis-mod-ged-soft);       color: var(--isis-mod-ged); }
.isis-subnav__picker-item.mod-gesproj   .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesproj-soft);   color: var(--isis-mod-gesproj); }
.isis-subnav__picker-item.mod-gesmaff   .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesmaff-soft);   color: var(--isis-mod-gesmaff); }
.isis-subnav__picker-item.mod-gesst     .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesst-soft);     color: var(--isis-mod-gesst); }
.isis-subnav__picker-item.mod-gesmat    .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesmat-soft);    color: var(--isis-mod-gesmat); }
.isis-subnav__picker-item.mod-gespark   .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gespark-soft);   color: var(--isis-mod-gespark); }
.isis-subnav__picker-item.mod-gesinfo   .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesinfo-soft);   color: var(--isis-mod-gesinfo); }
.isis-subnav__picker-item.mod-gesmob    .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesmob-soft);    color: var(--isis-mod-gesmob); }
.isis-subnav__picker-item.mod-gesfac    .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesfac-soft);    color: var(--isis-mod-gesfac); }
.isis-subnav__picker-item.mod-gespla    .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gespla-soft);    color: var(--isis-mod-gespla); }
.isis-subnav__picker-item.mod-gesqhse   .isis-subnav__picker-item-icon { background-color: var(--isis-mod-gesqhse-soft);   color: var(--isis-mod-gesqhse); }
.isis-subnav__picker-item.mod-monespace .isis-subnav__picker-item-icon { background-color: var(--isis-accent-soft);        color: var(--isis-accent); }

/* Le sub-nav doit être 'position: relative' pour ancrer le picker-menu en absolu. */
.isis-subnav { position: relative; }

/* prefers-reduced-motion : désactive l'animation pop du menu picker. */
@media (prefers-reduced-motion: reduce) {
    .isis-subnav__picker-menu { animation: none !important; }
}

/* ============================================================================
   Tenant badge (legacy — désormais dans le header.tenant)
   ============================================================================ */
.isis-tenant-badge { display: none; }

/* ============================================================================
   Page d'accueil (Dashboard)
   ============================================================================ */
.isis-home {
    max-width: none;
    margin: 0;
    padding: 2rem;
    display: flex;
    flex-direction: column;
    gap: 1.75rem;
}
.isis-home__greeting {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-home__title {
    /* Refonte 2026-05-26 : statement plus marqué (1.4rem → 1.75rem) pour ancrer
       la home comme « tableau de bord du matin », pas un menu décoré. */
    font-size: 1.75rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0;
    line-height: 1.2;
    letter-spacing: -0.01em;
}
.isis-home__meta {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-home__meta-sep {
    color: var(--isis-text-soft);
    opacity: 0.5;
    font-weight: 600;
}
.isis-home__meta-pill {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.2rem 0.6rem;
    background-color: var(--isis-accent-soft);
    color: var(--isis-accent);
    border-radius: var(--isis-radius-pill);
    font-size: 0.75rem;
    font-weight: 600;
}
.isis-home__meta-date {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
}
.isis-home__tip {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.5rem;
    color: var(--isis-text-soft);
    font-size: 0.8rem;
}

/* ── Alert banner ─────────────────────────────────────────────────────────
   Bandeau d'alerte généralisable. Variante par défaut = warning (jaune ambré).
   Modificateurs :
     .isis-alert-banner--pending   → orange tamisé (état transitoire, ex : en cours)
     .isis-alert-banner--warning   → jaune ambré (alerte non bloquante)
     .isis-alert-banner--danger    → rouge (état critique)

   Structure attendue (Phase 1.4) :
     <div class="isis-alert-banner isis-alert-banner--X" role="alert|status">
       <RadzenIcon ... />
       <div>
         <strong>Titre court</strong>
         <span>Description</span>
       </div>
       <RadzenButton ... />
     </div>

   Le sélecteur `> div` est intentionnellement laissé permissif — toutes les
   utilisations historiques (home, etc.) suivent désormais ce contrat.
*/
.isis-alert-banner {
    display: flex;
    /* center (et pas stretch) : sinon le bouton d'action s'étire sur toute la
       hauteur du bandeau (2 lignes) et paraît surdimensionné. */
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.75rem 1rem;
    background-color: var(--isis-warning-soft);
    border: 1px solid var(--isis-warning);
    border-radius: var(--isis-radius);
}
.isis-alert-banner > div {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    flex: 1;
    justify-content: center;
}
.isis-alert-banner > div > strong { color: inherit; font-weight: 600; }
.isis-alert-banner > div > span { font-size: 0.82rem; opacity: 0.92; }

.isis-alert-banner--pending {
    background-color: color-mix(in srgb, var(--isis-mod-gesmat-soft, #f5f5f4) 70%, #fef3c7);
    border-color: var(--isis-warning, #fbbf24);
    color: #92400e;
}
.isis-alert-banner--warning {
    background-color: var(--isis-warning-soft, #fef3c7);
    border-color: var(--isis-warning, #fbbf24);
    color: #92400e;
}
.isis-alert-banner--danger {
    background-color: var(--isis-danger-soft, #fef2f2);
    border-color: var(--isis-danger, #fca5a5);
    color: #991b1b;
}

/* Variants historiques (.isis-alert-banner__main / __icon) — conservées pour
   les call-sites existants (home, etc.) qui les consomment encore. */
.isis-alert-banner__main {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    color: #92400e;
    font-size: 0.9rem;
}
.isis-alert-banner__icon {
    width: 28px; height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: rgba(245, 158, 11, 0.15);
    color: #d97706;
    border-radius: 8px;
}

/* Sections */
.isis-home__section { display: flex; flex-direction: column; gap: 1rem; }
.isis-home__section-header h2 {
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0 0 0.25rem;
}
.isis-home__section-header p {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
    margin: 0;
}

/* ============================================================================
   Actions rapides (primary CTA grid sur la home)
   ============================================================================ */
.isis-actions-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 0.75rem;
}
.isis-action-card {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    padding: 0.9rem 1rem;
    background-color: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    color: var(--isis-text);
    text-decoration: none;
    transition: background-color 120ms, border-color 120ms;
}
.isis-action-card:hover {
    /* F8 — lift d'ombre subtil + bordure module : signal tactile de cliquabilité.
       Pas de translateY pour éviter la danse du layout. */
    background-color: var(--isis-surface-alt);
    border-color: var(--isis-current-mod, var(--isis-accent));
    box-shadow: var(--isis-elevation-hover);
}
.isis-action-card:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
.isis-action-card__icon-wrap {
    width: 40px; height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--isis-radius-sm);
    flex-shrink: 0;
}
.isis-action-card__icon-wrap .rzi { font-size: 22px; }
.isis-action-card__text { display: flex; flex-direction: column; line-height: 1.2; min-width: 0; }
.isis-action-card__label {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-action-card__module {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin-top: 3px;
}
/* Couleurs accent par module */
.isis-action-card.mod-gescom    .isis-action-card__icon-wrap { background-color: var(--isis-mod-gescom-soft); color: var(--isis-mod-gescom); }
.isis-action-card.mod-gescompta .isis-action-card__icon-wrap { background-color: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-action-card.mod-sirh      .isis-action-card__icon-wrap { background-color: var(--isis-mod-sirh-soft); color: var(--isis-mod-sirh); }
.isis-action-card.mod-admin     .isis-action-card__icon-wrap { background-color: var(--isis-mod-admin-soft); color: var(--isis-mod-admin); }
.isis-action-card.mod-ged       .isis-action-card__icon-wrap { background-color: var(--isis-accent-soft);     color: var(--isis-accent); }

/* Grille des modules — secondaire, avec border-top accent */
.isis-modules-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 0.85rem;
}
.isis-module-card {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 1rem 1.25rem;
    background-color: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-top-width: 3px;
    border-radius: var(--isis-radius);
    text-decoration: none;
    transition: border-color 120ms, transform 120ms;
}
.isis-module-card:hover {
    transform: translateY(-1px);
    border-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-module-card__icon-wrap {
    width: 44px; height: 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 10px;
    flex-shrink: 0;
}
.isis-module-card__title {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-module-card__subtitle {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    margin-top: 2px;
}
/* Couleurs accent par module */
.isis-module-card.mod-gescom    { border-top-color: var(--isis-mod-gescom); }
.isis-module-card.mod-gescom    .isis-module-card__icon-wrap { background-color: var(--isis-mod-gescom-soft); color: var(--isis-mod-gescom); }
.isis-module-card.mod-gescompta { border-top-color: var(--isis-mod-gescompta); }
.isis-module-card.mod-gescompta .isis-module-card__icon-wrap { background-color: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-module-card.mod-sirh      { border-top-color: var(--isis-mod-sirh); }
.isis-module-card.mod-sirh      .isis-module-card__icon-wrap { background-color: var(--isis-mod-sirh-soft); color: var(--isis-mod-sirh); }
.isis-module-card.mod-admin     { border-top-color: var(--isis-mod-admin); }
.isis-module-card.mod-admin     .isis-module-card__icon-wrap { background-color: var(--isis-mod-admin-soft); color: var(--isis-mod-admin); }
.isis-module-card.mod-ged       { border-top-color: var(--isis-accent); }
.isis-module-card.mod-ged       .isis-module-card__icon-wrap { background-color: var(--isis-accent-soft); color: var(--isis-accent); }

/* ============================================================================
   Home refondue 2026-05-26 — Dashboard cross-modules
   Section KPI hero cliquable + 2 colonnes (Activité récente / Actions rapides).
   Les anciennes classes .isis-actions-grid / .isis-action-card / .isis-modules-grid
   restent au-dessus (gardées pour rétro-compat si réutilisées ailleurs).
   ============================================================================ */

/* Override léger du KPI hero sur la home : grid plus généreux (cards plus larges
   que sur les pages list où on en a 5-6 alignés). */
.isis-home__kpi-hero {
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    padding: 1.1rem 1.25rem;
}

/* Variante cliquable du .isis-kpi-card (utilisée sur la home).
   Le .isis-kpi-card de base est un <div> non-interactif ; --link ajoute le
   cursor, le hover lift et la couleur module au survol. */
.isis-kpi-card.isis-kpi-card--link {
    text-decoration: none;
    color: inherit;
    cursor: pointer;
    border-radius: var(--isis-radius-sm);
    padding: 0.25rem 0.7rem;
    transition: background-color 150ms ease, transform 150ms ease;
}
.isis-kpi-card.isis-kpi-card--link:hover {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    /* Garde border-left du KPI standard mais ajoute un highlight discret. */
}
.isis-kpi-card.isis-kpi-card--link:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}

/* Layout 2 colonnes — Activité récente (gauche, plus large) + Actions (droite).
   Sur tablette ≤900px : empilé. */
.isis-home__cols {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 340px;
    gap: 1.25rem;
}
@media (max-width: 900px) {
    .isis-home__cols { grid-template-columns: 1fr; }
}

/* Card générique pour les blocs de la home (activité, actions). */
.isis-home-card {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: var(--isis-elevation-1);
    padding: 1.1rem 1.25rem 1rem;
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    min-height: 0;
}
.isis-home-card__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-home-card__title {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin: 0;
}
.isis-home-card__more {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.8rem;
    font-weight: 500;
    color: var(--isis-current-mod, var(--isis-accent));
    text-decoration: none;
    padding: 2px 6px;
    border-radius: 6px;
    transition: background-color 120ms;
}
.isis-home-card__more:hover {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
    text-decoration: none;
}
.isis-home-card__loading,
.isis-home-card__empty {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-muted);
    font-size: 0.875rem;
}

/* ── Activité récente — liste de notifications horodatées ─────────────────── */
.isis-home-activity__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}
.isis-home-activity__item {
    display: grid;
    grid-template-columns: 8px minmax(0, 1fr) auto;
    align-items: start;
    gap: 0.75rem;
    padding: 0.625rem 0;
    border-bottom: 1px solid var(--isis-border-soft);
    font-size: 0.875rem;
    line-height: 1.4;
}
.isis-home-activity__item:last-child { border-bottom: none; }
.isis-home-activity__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    margin-top: 6px;
    flex-shrink: 0;
    background-color: var(--isis-text-soft);
}
/* Couleur du dot par module source de la notification. */
.isis-home-activity__dot.is-gescom    { background-color: var(--isis-mod-gescom); }
.isis-home-activity__dot.is-gescompta { background-color: var(--isis-mod-gescompta); }
.isis-home-activity__dot.is-sirh      { background-color: var(--isis-mod-sirh); }
.isis-home-activity__dot.is-admin     { background-color: var(--isis-mod-admin); }
.isis-home-activity__dot.is-ged       { background-color: var(--isis-mod-ged); }
.isis-home-activity__dot.is-gesproj   { background-color: var(--isis-mod-gesproj); }
.isis-home-activity__dot.is-gesmaff   { background-color: var(--isis-mod-gesmaff); }
.isis-home-activity__dot.is-gesst     { background-color: var(--isis-mod-gesst); }
.isis-home-activity__dot.is-gesmat    { background-color: var(--isis-mod-gesmat); }
.isis-home-activity__dot.is-gespark   { background-color: var(--isis-mod-gespark); }
.isis-home-activity__dot.is-gesinfo   { background-color: var(--isis-mod-gesinfo); }
.isis-home-activity__dot.is-gesmob    { background-color: var(--isis-mod-gesmob); }
.isis-home-activity__dot.is-gesfac    { background-color: var(--isis-mod-gesfac); }
.isis-home-activity__dot.is-gespla    { background-color: var(--isis-mod-gespla); }
.isis-home-activity__dot.is-gesqhse   { background-color: var(--isis-mod-gesqhse); }
.isis-home-activity__dot.is-platform,
.isis-home-activity__dot.is-neutral   { background-color: var(--isis-text-soft); }

.isis-home-activity__body {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
}
.isis-home-activity__title {
    color: var(--isis-text);
    font-weight: 500;
    text-decoration: none;
    /* Tronque sur 1 ligne — pas besoin de plus dans un widget compact. */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
a.isis-home-activity__title:hover { color: var(--isis-current-mod, var(--isis-accent)); }
.isis-home-activity__body-text {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-home-activity__time {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
    white-space: nowrap;
    align-self: start;
    margin-top: 2px;
}
.isis-home-activity__item.is-unread .isis-home-activity__title {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-home-activity__item.is-unread .isis-home-activity__dot {
    /* Halo subtil pour signaler le "non lu" sans dépendre du seul gras. */
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--isis-accent) 18%, transparent);
}

/* ── Actions rapides — liste verticale compacte (1 par ligne) ─────────────── */
.isis-home-quickactions__list {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-home-action {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    padding: 0.6rem 0.75rem;
    border-radius: var(--isis-radius-sm);
    background-color: var(--isis-surface);
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    text-decoration: none;
    transition: background-color 120ms, border-color 120ms, transform 120ms;
}
.isis-home-action:hover {
    background-color: var(--isis-surface-alt);
    border-color: var(--isis-current-mod, var(--isis-accent));
    transform: translateX(2px);
}
.isis-home-action:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-home-action__icon {
    width: 32px;
    height: 32px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    background-color: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    flex-shrink: 0;
}
.isis-home-action__icon .rzi { font-size: 18px; }
.isis-home-action__text {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1;
    line-height: 1.2;
}
.isis-home-action__label {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--isis-text);
    /* Pas d'ellipsis : les libellés sont courts (« Nouveau devis »…). */
}
.isis-home-action__module {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-top: 2px;
}
/* Couleur d'icône par module — la couleur passe automatiquement via les vars. */
.isis-home-action.mod-gescom    .isis-home-action__icon { background-color: var(--isis-mod-gescom-soft);    color: var(--isis-mod-gescom); }
.isis-home-action.mod-gescompta .isis-home-action__icon { background-color: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-home-action.mod-sirh      .isis-home-action__icon { background-color: var(--isis-mod-sirh-soft);      color: var(--isis-mod-sirh); }
.isis-home-action.mod-admin     .isis-home-action__icon { background-color: var(--isis-mod-admin-soft);     color: var(--isis-mod-admin); }
.isis-home-action.mod-ged       .isis-home-action__icon { background-color: var(--isis-mod-ged-soft);       color: var(--isis-mod-ged); }
.isis-home-action.mod-gesproj   .isis-home-action__icon { background-color: var(--isis-mod-gesproj-soft);   color: var(--isis-mod-gesproj); }
.isis-home-action.mod-gesmaff   .isis-home-action__icon { background-color: var(--isis-mod-gesmaff-soft);   color: var(--isis-mod-gesmaff); }
.isis-home-action.mod-gesst     .isis-home-action__icon { background-color: var(--isis-mod-gesst-soft);     color: var(--isis-mod-gesst); }
.isis-home-action.mod-gesmat    .isis-home-action__icon { background-color: var(--isis-mod-gesmat-soft);    color: var(--isis-mod-gesmat); }
.isis-home-action.mod-monespace .isis-home-action__icon { background-color: var(--isis-accent-soft);        color: var(--isis-accent); }

/* Realtime grid */
.isis-realtime-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 1rem;
}
.isis-realtime-card { padding: 1rem; }

/* ============================================================================
   Login page — carte de connexion multi-étapes (organisation → identifiant → mdp)
   ============================================================================ */
.isis-empty-layout { min-height: 100vh; background-color: var(--isis-surface-alt); }
.isis-login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; }

/* ─────────────────────────────────────────────────────────────────────────
   Workspace choose — page splash post-login pour user multi-entreprises
   ───────────────────────────────────────────────────────────────────────── */
.isis-ws-choose {
    min-height: 100vh;
    display: flex; align-items: center; justify-content: center;
    padding: 2rem;
}
.isis-ws-choose__card {
    width: 100%; max-width: 760px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 2.5rem;
    display: flex; flex-direction: column; gap: 1.2rem;
}
.isis-ws-choose__brand {
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    color: var(--isis-text-muted);
    text-transform: uppercase;
}
.isis-ws-choose__title {
    font-size: 1.5rem;
    font-weight: 600;
    margin: 0;
    color: var(--isis-text);
}
.isis-ws-choose__sub {
    margin: 0;
    color: var(--isis-text-muted);
    font-size: 0.95rem;
    line-height: 1.5;
}
.isis-ws-choose__hint {
    margin: 0;
    padding: 0.6rem 0.8rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
    color: var(--isis-text-muted);
    font-size: 0.85rem;
}
.isis-ws-choose__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 0.75rem;
    margin-top: 0.5rem;
}
.isis-ws-choose__item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.85rem 1rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    cursor: pointer;
    font-family: inherit;
    font-size: 0.95rem;
    color: var(--isis-text);
    text-align: left;
    transition: border-color 120ms, background-color 120ms, transform 80ms;
}
.isis-ws-choose__item:hover:not(:disabled),
.isis-ws-choose__item:focus-visible:not(:disabled) {
    border-color: var(--isis-accent);
    background: var(--isis-accent-soft);
    outline: none;
}
.isis-ws-choose__item:active:not(:disabled) {
    transform: translateY(1px);
}
.isis-ws-choose__item:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}
.isis-ws-choose__item.is-busy {
    border-color: var(--isis-accent);
    background: var(--isis-accent-soft);
    opacity: 0.9;
}
.isis-ws-choose__avatar {
    width: 40px; height: 40px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.85rem;
    font-weight: 700;
    text-transform: uppercase;
    overflow: hidden;
    flex-shrink: 0;
}
.isis-ws-choose__avatar img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}
.isis-ws-choose__name {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-weight: 500;
}

.isis-login__card {
    width: 100%; max-width: 400px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 2rem;
    display: flex; flex-direction: column; gap: 1.1rem;
}

.isis-login__brand { display: flex; flex-direction: column; align-items: center; gap: 0.2rem; }
.isis-login__brand-logo { width: 56px; height: 56px; margin-bottom: 0.35rem; border-radius: 12px; box-shadow: var(--isis-elevation-1, 0 4px 12px rgba(0, 0, 0, 0.08)); }

/* Progression — pastilles décoratives + libellé textuel (lu par les lecteurs d'écran) */
.isis-login__progress { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; }
.isis-login__dots { display: flex; gap: 0.35rem; }
.isis-login__dot {
    width: 22px; height: 4px; border-radius: 2px;
    background: var(--isis-border-strong);
    transition: background-color 160ms, opacity 160ms;
}
.isis-login__dot.is-active { background: var(--isis-accent); }
.isis-login__dot.is-done   { background: var(--isis-accent); opacity: 0.4; }
.isis-login__progress-label { font-size: 0.72rem; color: var(--isis-text-muted); white-space: nowrap; }

/* Bandeau d'erreur serveur (identifiants invalides, compte verrouillé, rate limit).
   Fond clair + barre d'accent danger : le texte danger garde un contraste AA (≥4.5:1)
   sur la surface blanche, ce qui ne serait pas le cas sur un fond danger-soft. */
.isis-login__alert {
    display: flex; align-items: flex-start; gap: 0.5rem;
    padding: 0.65rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-danger-soft);
    border-left: 3px solid var(--isis-danger);
    border-radius: var(--isis-radius-sm);
    color: var(--isis-danger);
    font-size: 0.82rem; line-height: 1.4;
}
.isis-login__alert > span { padding-top: 1px; }
.isis-login__alert--info {
    /* Variante info (confirmation envoi reset password) — neutre, pas alarmiste. */
    border-color: var(--isis-accent-soft);
    border-left-color: var(--isis-accent);
    color: var(--isis-text);
}
.isis-login__alert--info .rzi { color: var(--isis-accent); }

/* Lien textuel discret (retour à la connexion, mot de passe oublié) */
.isis-login__link {
    color: var(--isis-accent);
    text-decoration: none;
    font-size: 0.82rem;
}
.isis-login__link:hover { text-decoration: underline; }
.isis-login__link:focus-visible {
    outline: 2px solid var(--isis-accent); outline-offset: 2px; border-radius: 2px;
}

/* Lien "Mot de passe oublié ?" sous l'input password, aligné à droite */
.isis-login__forgot { display: flex; justify-content: flex-end; }

/* Pied de carte (lien de retour) */
.isis-login__footer {
    display: flex; justify-content: center;
    padding-top: 0.25rem;
    border-top: 1px solid var(--isis-border-subtle, rgba(0,0,0,0.06));
    margin-top: 0.25rem;
}

/* Étape — apparition en fondu/glissé (entrée seule, sobre, flat) */
.isis-login__step {
    display: flex; flex-direction: column; gap: 0.9rem;
    animation: isis-login-step-in 180ms ease both;
}
@keyframes isis-login-step-in {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
    .isis-login__step { animation: none; }
}

/* Rappel de contexte — l'organisation / l'identifiant déjà choisis, cliquables
   pour revenir en arrière les modifier */
.isis-login__context { display: flex; flex-direction: column; gap: 0.4rem; }
.isis-login__chip {
    display: flex; align-items: center; gap: 0.6rem;
    width: 100%; text-align: left;
    min-height: 44px; padding: 0.45rem 0.7rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-text-muted);
    border-radius: var(--isis-radius-sm);
    color: var(--isis-text); cursor: pointer;
    font-family: inherit;
    transition: border-color 120ms, background-color 120ms;
}
.isis-login__chip:hover { border-color: var(--isis-accent); background: var(--isis-accent-soft); }
.isis-login__chip-text { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; line-height: 1.25; }
.isis-login__chip-label {
    font-size: 0.7rem; color: var(--isis-text-muted);
    text-transform: uppercase; letter-spacing: 0.03em;
}
.isis-login__chip-value {
    font-size: 0.85rem; color: var(--isis-text); font-weight: 500;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Champs — bordure contrastée (≥3:1, WCAG 1.4.11) : l'input blanc doit rester
   perceptible sur la carte blanche. */
.isis-login__field { display: flex; flex-direction: column; gap: 0.35rem; }
.isis-login__field label { font-size: 0.8rem; color: var(--isis-text-muted); font-weight: 500; }
.isis-login__field input {
    height: 42px; padding: 0 0.75rem;
    border: 1px solid var(--isis-text-muted);
    border-radius: var(--isis-radius-sm); background: var(--isis-surface);
    color: var(--isis-text); font-size: 0.9rem; outline: none;
    font-family: inherit;
    transition: border-color 120ms;
}
.isis-login__field input:hover { border-color: var(--isis-accent); }
.isis-login__field input:focus-visible {
    border-color: var(--isis-accent);
    outline: 2px solid var(--isis-accent); outline-offset: 1px;
}
.isis-login__field input[aria-invalid="true"] { border-color: var(--isis-danger); }
.isis-login__hint { font-size: 0.75rem; color: var(--isis-text-muted); margin: 0; }
.isis-login__step-error { font-size: 0.8rem; color: var(--isis-danger); margin: 0; }

/* Actions — bouton principal pleine largeur (le retour se fait via les chips de contexte) */
.isis-login__actions { display: flex; gap: 0.6rem; }
.isis-login__submit {
    flex: 1 1 auto;
    height: 44px; border: none; border-radius: var(--isis-radius-sm);
    background-color: var(--isis-accent); color: #fff;
    font-size: 0.9rem; font-weight: 600; cursor: pointer;
    font-family: inherit;
    transition: opacity 120ms;
}
.isis-login__submit:hover { opacity: 0.92; }
.isis-login__submit:active { transform: translateY(1px); }
.isis-login__submit:disabled { opacity: 0.55; cursor: not-allowed; }
.isis-login__submit:focus-visible,
.isis-login__chip:focus-visible {
    outline: 2px solid var(--isis-accent); outline-offset: 2px;
}

/* Petits écrans (terminaux d'entrée de gamme courants) — densifie la carte */
@media (max-width: 440px) {
    .isis-login { padding: 1rem; }
    .isis-login__card { padding: 1.25rem; gap: 0.85rem; }
    .isis-login__step { gap: 0.7rem; }
}

/* ============================================================================
   Rich-page (pages métier à haute densité — pattern NetLogger V3)
   ============================================================================ */
.isis-rich-page {
    position: relative;
    padding: 0.75rem 1rem 0.75rem;
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    /* Pleine largeur du body — cf. décision 2026-05-14 (DESIGN.md §219 : 100% privilégié) */
    max-width: none;
    margin: 0;
    /* Hauteur stricte = celle du scroll container parent (.isis-shell__content).
       Avec flex: 1 + min-height: 0 sur les enfants, le .isis-grid interne
       se contraint et scrolle, jamais la page entière. */
    height: 100%;
    box-sizing: border-box;
    overflow: hidden;
}

/* Variante --scrollable : pour les dashboards composés de sections empilées
   verticalement sans grille interne scrollable. La page entière déborde et
   scrolle naturellement dans .isis-shell__content (qui a overflow-y: auto).
   À appliquer en plus de .isis-rich-page sur les pages dashboard.
   Cf. correctif 2026-05-21 — le pattern par défaut (height 100% + overflow hidden)
   était optimisé pour les pages liste avec grille scrollable, et masquait tout
   ce qui dépassait l'écran sur les dashboards verticalement longs. */
.isis-rich-page.isis-rich-page--scrollable {
    height: auto;
    min-height: 100%;
    overflow: visible;
}
/* Bande accent module 3px en haut de chaque page métier — identité forte.
   Refonte B "Branded depth" 2026-05-17 : dégradé horizontal (module pleine
   couleur à gauche → 60 % à droite) pour donner du mouvement au liseré. */
.isis-rich-page::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background-color: var(--isis-current-mod, var(--isis-accent));
    background-image: linear-gradient(90deg,
        var(--isis-current-mod, var(--isis-accent)) 0%,
        color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 55%, white) 100%);
    z-index: 1;
}

/* Breadcrumb + toolbar (ligne du haut) */
.isis-rich-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    font-size: 0.85rem;
}
.isis-breadcrumb {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    color: var(--isis-text-muted);
}
.isis-breadcrumb__sep { color: var(--isis-text-soft); opacity: 0.7; }
.isis-breadcrumb__current { color: var(--isis-text); font-weight: 500; }
.isis-breadcrumb__link {
    color: inherit;
    text-decoration: none;
    transition: color 120ms;
}
.isis-breadcrumb__link:hover { color: var(--isis-text); }
.isis-breadcrumb__link:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
    border-radius: 4px;
}
.isis-rich-toolbar__actions {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-rich-toolbar__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    height: 32px;
    padding: 0 0.7rem;
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    background: var(--isis-surface);
    color: var(--isis-text-muted);
    cursor: pointer;
    font-size: 0.8rem;
    text-decoration: none;
    transition: background-color 120ms, color 120ms;
}
.isis-rich-toolbar__btn:hover { background-color: var(--isis-surface-alt); color: var(--isis-text); }
.isis-rich-toolbar__btn:disabled,
.isis-rich-toolbar__btn[disabled] {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
}
/* Variante primaire (ex. bouton « Exporter » du dashboard, calque mockup ARCHITECT).
   Polish 2026-06 : hardcode --isis-mod-gescom neutralisé en --isis-current-mod
   (le 2e bloc plus bas gagnait déjà la cascade, mais on retire le latent cross-module). */
.isis-rich-toolbar__btn--primary {
    background: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: #fff;
    font-weight: 600;
}
.isis-rich-toolbar__btn--primary:hover {
    background-color: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 85%, var(--isis-text));
    color: #fff;
}
.isis-rich-toolbar__btn--primary .rzi { color: #fff; }
.isis-rich-toolbar__btn:disabled:hover,
.isis-rich-toolbar__btn[disabled]:hover {
    background-color: transparent;
}
/* État ouvert d'un bouton toolbar qui pilote un popover (ex. dropdown « Type & portée »). */
.isis-rich-toolbar__btn.is-active {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text);
    border-color: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 45%, var(--isis-border));
}

/* Dropdown toolbar — popover ancré sous le bouton déclencheur (ex. /gescom/devis). */
.isis-toolbar-dropdown { position: relative; display: inline-flex; }
.isis-toolbar-dropdown__backdrop {
    position: fixed;
    inset: 0;
    z-index: 930;
    background: transparent;
}
.isis-toolbar-dropdown__panel {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    z-index: 931;
    min-width: 264px;
    padding: 0.85rem 0.95rem;
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-2, 0 12px 32px rgba(0, 0, 0, 0.16));
    animation: isis-toolbar-dropdown-in 140ms ease-out;
}
@keyframes isis-toolbar-dropdown-in {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}
/* Options empilées verticalement (une par ligne, pleine largeur) dans les dropdowns toolbar. */
.isis-toolbar-dropdown__panel .isis-filter-panel__chips {
    flex-direction: column;
    flex-wrap: nowrap;
    align-items: stretch;
}
.isis-toolbar-dropdown__panel .isis-chip {
    justify-content: space-between;
    width: 100%;
}
.isis-rich-toolbar__btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
/* Badge informatif dans la toolbar (ex: « Source externe » quand le sujet est
   ExternalOwned par un provider RH). Style discret, pas un bouton. */
.isis-rich-toolbar__badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.4rem 0.75rem;
    border-radius: 6px;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    font-weight: 500;
    cursor: help;
}
.isis-rich-toolbar__btn--primary {
    /* Couleur du module courant (fallback accent global) — chaque module
       a un CTA primaire à sa couleur, signal d'identité fort. */
    background: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: white;
}
.isis-rich-toolbar__btn--primary:hover {
    /* F3 — feedback tactile perceptible : assombrissement + lift d'ombre.
       Ne change PAS le layout (pas de translateY), uniquement ombre + brightness. */
    filter: brightness(0.92);
    box-shadow: var(--isis-elevation-2);
    color: white;
    background: var(--isis-current-mod, var(--isis-accent));
}
/* Variante icon-only — bouton carré 32×32 pour les actions secondaires de la
   toolbar (toggle élargir/réduire, etc.) qui se contentent d'une icône + tooltip.
   Refonte 2026-05-29 (pilote DevisListPage drawer overlay). */
.isis-rich-toolbar__btn--icon {
    width: 32px;
    padding: 0;
    justify-content: center;
}

/* F6 — tokens ISIS (resaturés AA) plutôt que fallback Radzen non-refonte. */
.isis-rich-toolbar__btn--success { color: var(--isis-success); }
.isis-rich-toolbar__btn--success:hover { background: var(--isis-success-soft); color: var(--isis-success); }
.isis-rich-toolbar__btn--danger { color: var(--isis-danger); }
.isis-rich-toolbar__btn--danger:hover { background: var(--isis-danger-soft); color: var(--isis-danger); }
.isis-rich-toolbar__btn--warning { color: var(--isis-warning); }
.isis-rich-toolbar__btn--warning:hover { background: var(--isis-warning-soft); color: var(--isis-warning); }

/* État stale : bordure ambre sur le bouton qui sert un artefact obsolète
   (ex: « Voir PDF » quand le devis a été modifié après la génération). */
.isis-rich-toolbar__btn.is-stale {
    border-color: #f59e0b;
    color: #b45309;
}
.isis-rich-toolbar__btn.is-stale:hover {
    background: #fef3c7;
    color: #92400e;
}
.isis-rich-toolbar__btn-badge {
    display: inline-block;
    padding: 0.05rem 0.4rem;
    margin-left: 0.35rem;
    font-size: 0.65rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    background: #f59e0b;
    color: white;
    border-radius: 10px;
    line-height: 1.3;
}

/* V1.0quinquies (2026-05-29) — Séparateur visuel vertical entre groupes
   de boutons dans la toolbar (cf. audit cohérence FactureEmiseDetail).
   Utilisé pour découper [PDF block] | [Workflow] | [Destructive]. */
.isis-rich-toolbar__sep {
    width: 1px;
    height: 24px;
    margin: 0 0.4rem;
    background: var(--isis-border, #e5e7eb);
    flex-shrink: 0;
    align-self: center;
}

/* Header de page (titre + sous-titre + badges + toggle droite) */
.isis-rich-header {
    /* Branded depth 2026-05-26 : élévation tokenisée + gradient module 4 %
       (cohérence avec .isis-kpi-hero qui utilise déjà ce pattern à 6 %).
       Plus léger ici car le header est moins data-centric — la teinte module
       reste un signal d'identité subtil, pas une surface emphasised. */
    background: linear-gradient(135deg,
        var(--isis-surface) 0%,
        color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 4%, var(--isis-surface)) 100%);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 1rem 1.25rem;
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    box-shadow: var(--isis-elevation-1);
}
.isis-rich-header__icon {
    width: 44px; height: 44px;
    border-radius: 10px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-rich-header__main {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    /* Barre verticale accent module — renforcée 2026-05-26 (1px → 3px) pour
       donner du relief : la bande devient un vrai signal d'identité aligné
       sur la bande horizontale 3px de .isis-rich-page::before. */
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    border-radius: 2px;
    padding-left: 0.95rem;
    transition: border-color 200ms ease;
}
.isis-rich-header__context {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
}
.isis-rich-header__subtitle {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    margin-top: 0.25rem;
}
/* Échelle typo alignée NetLogger V3 (CommandDetailsV3.razor.css = 20px/600, mono -0.01em
   sur les KPIs). ISIS prend +2px (densité 6 vs NetLogger 7-8) sans gonfler les weights. */
.isis-rich-header__title {
    font-size: 1.375rem;
    font-weight: 600;    /* DESIGN.md §3 : 600 max sur les titres (était 700 — Geist rend mal le bold serré). */
    color: var(--isis-text);
    line-height: 1.18;
    letter-spacing: -0.02em;    /* relift typo : tightening display moderne */
    margin: 0;
}

/* ────────────────────────────────────────────────────────────────────────────
   Variante --with-kpi : header qui consomme le KPI hero (gain ~70px).
   Pattern opt-in introduit 2026-05-26 sur les pages liste denses (devis pilote).
   Layout : identité (icône + main) à gauche, KPIs en grille auto-fit à droite,
   séparés par un trait vertical. Sous 1024px → stack vertical (fallback).
   Le bloc <div class="isis-kpi-hero"> séparé doit être supprimé quand on
   applique cette variante (sinon doublon).
   ──────────────────────────────────────────────────────────────────────────── */
.isis-rich-header.isis-rich-header--with-kpi {
    display: flex;
    align-items: center;
    gap: 1.5rem;
}
.isis-rich-header__identity {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    flex: 0 0 auto;
}
/* Compacté à droite via margin-left:auto (pousse les KPIs en fin de bandeau).
   Les cards prennent leur largeur naturelle (max-content), pas 1fr — l'espace
   au centre reste neutre, identité à gauche / données à droite. */
.isis-rich-header__kpis {
    display: flex;
    align-items: center;
    gap: 0;
    margin-left: auto;
    border-left: 1px solid var(--isis-border);
    padding-left: 1.25rem;
    flex: 0 0 auto;
}
/* KPI cards en mode compact dans le header (1/3 plus petits que le KPI hero standard) */
.isis-rich-header__kpis .isis-kpi-card {
    padding: 0.15rem 0.85rem;
    gap: 0.1rem;
    border-left: 1px solid var(--isis-border);
    min-width: 96px;
}
.isis-rich-header__kpis .isis-kpi-card:first-child {
    border-left: none;
    padding-left: 0.2rem;
}
.isis-rich-header__kpis .isis-kpi-card__label {
    font-size: 0.62rem;
}
.isis-rich-header__kpis .isis-kpi-card__value {
    font-size: 1.15rem;
}
.isis-rich-header__kpis .isis-kpi-card__hint {
    font-size: 0.65rem;
}
/* Responsive : viewport < 1024px → stack vertical, séparateur passe en top border */
@media (max-width: 1024px) {
    .isis-rich-header.isis-rich-header--with-kpi {
        flex-direction: column;
        align-items: stretch;
        gap: 0.85rem;
    }
    .isis-rich-header__kpis {
        margin-left: 0;
        border-left: none;
        padding-left: 0;
        border-top: 1px solid var(--isis-border);
        padding-top: 0.85rem;
        flex-wrap: wrap;
    }
}

/* ============================================================================
   .isis-form — formulaires de saisie ERP
   ----------------------------------------------------------------------------
   Applique width:100% sur tous les RadzenFormField/TextBox/DropDown enfants.
   Évite la répétition de Style="width: 100%;" inline sur chaque champ.
   ============================================================================ */
.isis-form .rz-form-field,
.isis-form .rz-form-field .rz-textbox,
.isis-form .rz-form-field .rz-textarea,
.isis-form .rz-form-field .rz-dropdown,
.isis-form .rz-form-field .rz-spinner,
.isis-form .rz-form-field .rz-numeric {
    width: 100%;
}

/* Astérisque "obligatoire" visuel, ignoré par les lecteurs d'écran
   (l'attribut aria-required + helper text portent l'info sémantique). */
.isis-form__required {
    color: var(--rz-danger, #dc2626);
    margin-left: 2px;
    font-weight: 600;
}

/* Actions de formulaire — sticky au bas du scroll container parent. */
.isis-form__actions {
    position: sticky;
    bottom: 0;
    background: var(--isis-surface);
    padding: 0.75rem 0 0.25rem 0;
    margin-top: 0.5rem;
    border-top: 1px solid var(--isis-border);
    z-index: 5;
}

/* ============================================================================
   .isis-form-linear — Style "Linear minimal" (maquette 1 retenue 2026-05-12)
   ----------------------------------------------------------------------------
   Container 720px centré, inputs underline-only, labels au-dessus, sections
   séparées par un trait subtil. Scope strict : ne s'applique QU'à un container
   .isis-form-linear. Aucun impact sur les autres pages.
   ============================================================================ */

/* Container global — max 720px centré, padding contenu (variante densifiée) */
.isis-form-linear {
    max-width: none;
    margin: 0;
    padding: 1.25rem 1.5rem 2.5rem;
    font-size: 14px;
    color: var(--isis-text);
    line-height: 1.45;
}

/* Header — icône + titre + sous-titre, pas de carte */
.isis-form-linear__header {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    margin-bottom: 1.5rem;
}
.isis-form-linear__header-icon {
    width: 44px;
    height: 44px;
    border-radius: 10px;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-form-linear__header h1 {
    font-size: 1.5rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1.2;
    margin: 0;
    color: var(--isis-text);
}
.isis-form-linear__header-subtitle {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
    margin-top: 0.15rem;
}

/* Section — titre, séparé par trait subtil (densifié) */
.isis-form-linear__section {
    margin-bottom: 1.5rem;
}
.isis-form-linear__section:last-of-type {
    margin-bottom: 1rem;
}
.isis-form-linear__section-title {
    font-size: 1rem;
    font-weight: 600;
    letter-spacing: -0.005em;
    color: var(--isis-text);
    margin-bottom: 0.85rem;
    padding-bottom: 0.45rem;
    border-bottom: 1px solid var(--isis-border);
    position: relative;
}
.isis-form-linear__section-title::before {
    content: "";
    position: absolute;
    left: 0;
    bottom: -1px;
    width: 36px;
    height: 2px;
    /* Trait de section coloré au module courant (propagé via .isis-shell__content.mod-X).
       Fallback accent global si --isis-current-mod n'est pas défini (cas dialog
       qui ne reçoit pas le shell parent). Audit 2026-05-19 — était hardcodé gescom. */
    background: var(--isis-current-mod, var(--isis-accent));
}

/* Section-title hint (« optionnel », « obligatoire »…) — petit complément
   typographique pour distinguer les sections requises des optionnelles. */
.isis-form-linear__section-hint {
    font-size: 0.78rem;
    font-weight: 400;
    color: var(--isis-text-muted);
    margin-left: 0.4rem;
    letter-spacing: 0;
}

/* Picker + bouton "+" inline pour création à la volée d'une valeur référentiel.
   Pattern : <div class="isis-form-linear__inline-add">
                <RadzenDropDown ... />
                <button class="isis-form-linear__inline-add-btn">+</button>
             </div>
   Ajouté 2026-05-19 pour gesmat (types/marques/modèles création inline). */
.isis-form-linear__inline-add {
    display: flex;
    align-items: stretch;
    gap: 0.4rem;
}
.isis-form-linear__inline-add > :first-child {
    flex: 1;
    min-width: 0;
}
.isis-form-linear__inline-add-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    flex-shrink: 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    color: var(--isis-current-mod, var(--isis-accent));
    cursor: pointer;
    transition: background-color 120ms ease, border-color 120ms ease;
}
.isis-form-linear__inline-add-btn:hover:not(:disabled) {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 8%, white);
    border-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-form-linear__inline-add-btn:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-form-linear__inline-add-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

/* Flash visuel auto-fill : signale à l'user qu'un dropdown a été pré-rempli par
   cascade (typiquement EquipementFormDialog quand on choisit un modèle qui
   auto-remplit type/catégorie/marque). Animation 1.4s, fond couleur module
   soft puis fade out. Audit ui-ux 2026-05-19 bloquant#1. */
@keyframes isis-autofill-pulse {
    0%   { background-color: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, white); }
    60%  { background-color: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, white); }
    100% { background-color: transparent; }
}
.isis-autofill-flash .rz-dropdown {
    animation: isis-autofill-pulse 1.4s ease forwards;
    border-radius: var(--isis-radius);
}

/* Switch densifié : switch + hint sur la même ligne. */
.isis-form-linear__switch-wrap {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
}
.isis-form-linear__switch-hint {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    line-height: 1.4;
    padding-top: 0.2rem;
    flex: 1;
}
/* Hint sous un champ (descriptif court). */
.isis-form-linear__field-hint {
    display: block;
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    margin-top: 0.2rem;
    line-height: 1.4;
}

/* Field — label au-dessus, input en dessous, helper (densifié) */
.isis-form-linear .field {
    margin-bottom: 0.75rem;
}
.isis-form-linear .field-row {
    display: grid;
    gap: 0.75rem;
    margin-bottom: 0;
}
.isis-form-linear .field-row > .field {
    margin-bottom: 0.75rem;
}
.isis-form-linear .field-row.cols-4-8 { grid-template-columns: 4fr 8fr; }
.isis-form-linear .field-row.cols-3-9 { grid-template-columns: 3fr 9fr; }
.isis-form-linear .field-row.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.isis-form-linear .field-row.cols-4 { grid-template-columns: 1fr 1fr 1fr 1fr; }
.isis-form-linear .field-row.cols-2 { grid-template-columns: 1fr 1fr; }

.isis-form-linear .label {
    display: block;
    font-size: 0.72rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    margin-bottom: 0.25rem;
    letter-spacing: 0.01em;
}
.isis-form-linear .label .required {
    color: var(--rz-danger, #dc2626);
    margin-left: 2px;
}

.isis-form-linear .helper {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    margin-top: 0.2rem;
    line-height: 1.35;
}
.isis-form-linear .error {
    font-size: 0.7rem;
    color: var(--rz-danger, #dc2626);
    margin-top: 0.2rem;
}

/* Inputs (RadzenTextBox / RadzenDropDown / RadzenTextArea) — fond subtil + underline accent au focus
   Le fond `--isis-bg-input` matérialise la zone d'édition sans casser le minimalisme. */
.isis-form-linear .rz-textbox,
.isis-form-linear .rz-textarea,
.isis-form-linear .rz-dropdown,
.isis-form-linear .rz-numeric,
.isis-form-linear input[type="text"],
.isis-form-linear input[type="email"],
.isis-form-linear input[type="tel"],
.isis-form-linear textarea {
    width: 100% !important;
    font-family: inherit !important;
    font-size: 0.9rem !important;
    color: var(--isis-text) !important;
    background: #f7f8fa !important;
    border: 1px solid var(--isis-border-soft, #f1f2f5) !important;
    border-bottom: 1px solid var(--isis-border) !important;
    border-radius: 6px !important;
    padding: 0.35rem 0.65rem !important;
    box-shadow: none !important;
    outline: none !important;
    height: auto !important;
    min-height: 0 !important;
    transition: background-color 150ms ease, border-color 150ms ease !important;
}
.isis-form-linear .rz-textarea,
.isis-form-linear textarea {
    resize: vertical;
    line-height: 1.45;
}
.isis-form-linear .rz-textbox::placeholder,
.isis-form-linear .rz-textarea::placeholder,
.isis-form-linear input::placeholder,
.isis-form-linear textarea::placeholder {
    color: var(--isis-text-soft);
    opacity: 1;
}
.isis-form-linear .rz-textbox:hover:not(:focus),
.isis-form-linear .rz-textarea:hover:not(:focus),
.isis-form-linear .rz-dropdown:hover:not(.rz-state-focused),
.isis-form-linear input:hover:not(:focus),
.isis-form-linear textarea:hover:not(:focus) {
    background: #f1f3f6 !important;
    border-color: var(--isis-border) !important;
}
.isis-form-linear .rz-textbox:focus,
.isis-form-linear .rz-textarea:focus,
.isis-form-linear .rz-dropdown.rz-state-focused,
.isis-form-linear input:focus,
.isis-form-linear textarea:focus {
    background: var(--isis-surface) !important;
    border-color: var(--isis-border) !important;
    /* F9 — underline focus à la couleur du module courant. */
    border-bottom-color: var(--isis-current-mod, var(--isis-accent)) !important;
    border-bottom-width: 2px !important;
    padding-bottom: calc(0.35rem - 1px) !important;
}

/* RadzenTextArea — toujours pleine largeur (toutes pages, hors et dans .isis-form-linear).
   Radzen rend `<textarea class="rz-textarea">` ; le wrapper `.rz-textarea-wrapper` doit
   aussi être étendu sinon le textarea reste contraint à la largeur native (~150px). */
.rz-textarea,
.rz-textarea-wrapper {
    width: 100% !important;
    box-sizing: border-box;
}

/* RadzenDropDown — même affordance que les inputs */
.isis-form-linear .rz-dropdown {
    display: flex;
    align-items: center;
}
.isis-form-linear .rz-dropdown .rz-inputtext {
    background: transparent !important;
    border: none !important;
    padding: 0 !important;
}

/* SelectBar (Type de compte) — segmented control sobre */
.isis-form-linear .rz-selectbutton {
    display: inline-flex;
    background: var(--isis-surface-alt);
    border-radius: 8px;
    padding: 3px;
    gap: 2px;
    border: none !important;
}
.isis-form-linear .rz-selectbutton .rz-button {
    border: none !important;
    background: transparent !important;
    color: var(--isis-text-muted) !important;
    border-radius: 6px !important;
    padding: 0.45rem 0.95rem !important;
    font-size: 0.82rem !important;
    font-weight: 400 !important;
    height: auto !important;
    box-shadow: none !important;
    transition: background-color 150ms, color 150ms;
}
.isis-form-linear .rz-selectbutton .rz-button:hover {
    color: var(--isis-text) !important;
    background: transparent !important;
}
.isis-form-linear .rz-selectbutton .rz-button.rz-state-active,
.isis-form-linear .rz-selectbutton .rz-button.rz-selected {
    background: var(--isis-surface) !important;
    color: var(--isis-text) !important;
    font-weight: 500 !important;
}

/* Actions footer — trait haut + alignement droite */
.isis-form-linear__actions {
    display: flex;
    justify-content: flex-end;
    gap: 0.5rem;
    padding-top: 1.5rem;
    border-top: 1px solid var(--isis-border-soft, #f1f2f5);
    margin-top: 2rem;
}
.isis-form-linear__actions .rz-button,
.isis-form-linear__actions .rz-splitbutton .rz-button {
    border-radius: 7px !important;
    padding: 0.4rem 0.85rem !important;
    font-size: 0.8rem !important;
    font-weight: 500 !important;
    box-shadow: none !important;
    min-height: 0 !important;
    height: auto !important;
}
.isis-form-linear__actions .rz-button .rzi {
    font-size: 14px !important;
}

/* Alert d'erreur — sobre */
.isis-form-linear .rz-alert {
    border-radius: 10px;
    border: none;
    margin-bottom: 1rem;
}

/* Modifier dialog — le dialog Radzen gère le titre + padding extérieur, on
   neutralise le chrome page (max-width / padding container / margins lourds)
   et on compacte verticalement. À combiner : <div class="isis-form-linear isis-form-linear--dialog"> */
.isis-form-linear--dialog {
    max-width: none;
    margin: 0;
    padding: 0;
}
.isis-form-linear--dialog .isis-form-linear__section {
    margin-bottom: 1.1rem;
}
.isis-form-linear--dialog .isis-form-linear__section:last-of-type {
    margin-bottom: 0.5rem;
}
.isis-form-linear--dialog .isis-form-linear__actions {
    padding-top: 1rem;
    margin-top: 1.25rem;
}

/* Mini-calculateur PU à partir du coût (Phase 2 réconciliation coût/prix).
   Layout compact dans un dialog 480px. Le bloc .isis-pricing-calc__result
   affiche les valeurs en grille label/valeur tabulaire.                       */
.isis-pricing-calc__readonly {
    padding: 0.4rem 0.6rem;
    background: var(--isis-surface-soft, #f8fafc);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 4px;
    font-variant-numeric: tabular-nums;
    font-weight: 500;
    color: var(--isis-text, #1f2328);
}
.isis-pricing-calc__result {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding: 0.65rem 0.85rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-radius: 6px;
    border-left: 3px solid var(--isis-accent, #4b5fad);
}
.isis-pricing-calc__row {
    display: flex;
    justify-content: space-between;
    font-size: 0.82rem;
    font-variant-numeric: tabular-nums;
}
.isis-pricing-calc__row--effective {
    margin-top: 0.4rem;
    padding-top: 0.4rem;
    border-top: 1px solid var(--isis-border, #e2e8f0);
    font-size: 0.9rem;
}
.isis-pricing-calc__pct.is-on-target    { color: var(--isis-success, #16a34a); }
.isis-pricing-calc__pct.is-below-target { color: var(--isis-warning, #d97706); }
.isis-pricing-calc__pct.is-below-floor  { color: var(--isis-danger,  #c62828); }
.isis-pricing-calc__pct.is-no-cost,
.isis-pricing-calc__pct.is-unclassified { color: var(--isis-text, #1f2328); }
.isis-pricing-calc__status {
    margin-left: 0.4rem;
    font-size: 0.78rem;
    font-weight: 500;
    opacity: 0.85;
}
.isis-rich-toolbar__btn--ghost {
    background: transparent;
    border: 1px dashed var(--isis-border, #cbd5e1);
    color: var(--isis-text-muted, #475569);
}
.isis-rich-toolbar__btn--ghost:hover:not(:disabled) {
    background: var(--isis-surface-soft, #f1f5f9);
    color: var(--isis-text, #1f2328);
}

/* ============================================================================
   .isis-audit-trail — timeline d'activité d'un enregistrement
   ----------------------------------------------------------------------------
   Affichée dans le panneau latéral droit des listes (mode compact, 5 items)
   ou dans un dialog/onglet "Activité" (mode full).
   ============================================================================ */
.isis-audit-trail {
    display: flex;
    flex-direction: column;
    gap: 0;
}
.isis-audit-trail__loading,
.isis-audit-trail__empty {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.75rem 0;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
}
.isis-audit-trail__empty .rzi {
    font-size: 18px;
    opacity: 0.55;
}
.isis-audit-trail__item {
    display: flex;
    gap: 0.65rem;
    padding: 0.55rem 0;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
}
.isis-audit-trail__item:last-child {
    border-bottom: none;
}

/* Item de timeline issu d'une cascade automatique (cf. SourceGainCascadeMarkers).
   Trait gauche accent module gescom (la cascade vient toujours d'un devis) +
   fond très légèrement teinté pour distinguer du flux manuel. */
.isis-audit-trail__item.is-cascade {
    border-left: 2px solid var(--isis-mod-gescom);
    padding-left: 0.5rem;
    background: color-mix(in srgb, var(--isis-mod-gescom) 4%, transparent);
    border-radius: 4px;
}

/* Badge inline « auto » à côté du type d'event sur les transitions cascade. */
.isis-audit-trail__badge {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    border-radius: 8px;
    background: color-mix(in srgb, var(--isis-mod-gescom) 14%, transparent);
    color: var(--isis-mod-gescom);
    font-size: 0.7rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    vertical-align: middle;
}
.isis-audit-trail__dot {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-audit-trail__dot .rzi {
    font-size: 15px;
}
.isis-audit-trail__dot.op-I { background: #e8f5e9; color: #2e7d32; }
.isis-audit-trail__dot.op-U { background: #e3f2fd; color: #1565c0; }
.isis-audit-trail__dot.op-D { background: #ffebee; color: #c62828; }
.isis-audit-trail__dot.ged-evt-upload   { background: #ecfdf5; color: #047857; }
.isis-audit-trail__dot.ged-evt-version  { background: #eef2ff; color: #4338ca; }
.isis-audit-trail__dot.ged-evt-download { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.ged-evt-view     { background: #fef3c7; color: #92400e; }
/* Workflow devis — pastilles d'événement (cf. gescom_devis_workflow_event) */
.isis-audit-trail__dot.devis-wf-evt-created              { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.devis-wf-evt-submitted            { background: #eef2ff; color: #4338ca; }
.isis-audit-trail__dot.devis-wf-evt-approved_auto        { background: #ecfdf5; color: #047857; }
.isis-audit-trail__dot.devis-wf-evt-approval_granted     { background: #ecfdf5; color: #047857; }
.isis-audit-trail__dot.devis-wf-evt-approved             { background: #dcfce7; color: #15803d; }
.isis-audit-trail__dot.devis-wf-evt-approval_rejected    { background: #fef2f2; color: #b91c1c; }
.isis-audit-trail__dot.devis-wf-evt-approval_invalidated { background: #fef3c7; color: #92400e; }
.isis-audit-trail__dot.devis-wf-evt-sent                 { background: var(--isis-accent-soft); color: var(--isis-accent); }
.isis-audit-trail__dot.devis-wf-evt-accepted             { background: #dcfce7; color: #15803d; }
.isis-audit-trail__dot.devis-wf-evt-rejected             { background: #fef2f2; color: #b91c1c; }
.isis-audit-trail__dot.devis-wf-evt-expired              { background: #fef3c7; color: #92400e; }
.isis-audit-trail__dot.devis-wf-evt-cancelled            { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.devis-wf-evt-revised              { background: #eef2ff; color: #4338ca; }
.isis-audit-trail__dot.devis-wf-evt-converted            { background: #dcfce7; color: #15803d; }
.isis-audit-trail__reason {
    font-size: 0.7rem;
    font-style: italic;
    color: var(--isis-text-muted);
    margin-top: 0.15rem;
    line-height: 1.3;
}
/* Variante "motif" plus visible : encadré + label */
.isis-audit-trail__reason--motif {
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
    margin-top: 0.35rem;
    padding: 0.35rem 0.55rem;
    background: color-mix(in srgb, var(--isis-warning) 8%, white);
    border-left: 3px solid var(--isis-warning);
    border-radius: 3px;
    font-style: normal;
    color: var(--isis-text);
    font-size: 0.78rem;
}
.isis-audit-trail__reason-label {
    flex-shrink: 0;
    font-size: 0.65rem;
    font-weight: 700;
    color: var(--isis-warning);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    padding-top: 0.1rem;
}
.isis-audit-trail__reason-text {
    flex: 1;
    min-width: 0;
    line-height: 1.4;
    word-wrap: break-word;
}
.isis-audit-trail__body {
    flex: 1;
    min-width: 0;
}
.isis-audit-trail__line {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-audit-trail__user {
    font-size: 0.8rem;
    font-weight: 500;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-audit-trail__time {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
    flex-shrink: 0;
}
.isis-audit-trail__what {
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    margin-top: 0.1rem;
    line-height: 1.35;
}
.isis-audit-trail__cols {
    font-style: italic;
}
.isis-audit-trail__more {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-top: 0.6rem;
    padding: 0.3rem 0.55rem;
    background: transparent;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-size: 0.72rem;
    color: var(--isis-text);
    cursor: pointer;
    align-self: flex-start;
}
.isis-audit-trail__more:hover {
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-audit-trail__more .rzi {
    font-size: 14px;
    opacity: 0.7;
}

/* ── Variante "row" : pastille (icône) à GAUCHE + corps (workflow commande/livraison).
   __row n'était pas en flex → la pastille s'empilait au-dessus du texte. ── */
.isis-audit-trail__row {
    display: flex;
    gap: 0.65rem;
    padding: 0.55rem 0;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
}
.isis-audit-trail__row:last-child { border-bottom: none; }
.isis-audit-trail__head {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
}
.isis-audit-trail__label {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-audit-trail__when {
    margin-left: auto;
    flex-shrink: 0;
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
}
.isis-audit-trail__transition {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
}
.isis-audit-trail__meta {
    font-size: 0.78rem;
    color: var(--isis-text-soft, var(--isis-text-muted));
    margin-top: 0.1rem;
}
.isis-audit-trail__note {
    margin-top: 0.4rem;
    font-size: 0.74rem;
    color: var(--isis-text-muted);
}

/* Mode compact (sidepanel) : police + pastille réduites, métadonnées resserrées. */
.isis-audit-trail--compact .isis-audit-trail__row { padding: 0.4rem 0; gap: 0.5rem; }
.isis-audit-trail--compact .isis-audit-trail__dot { width: 20px; height: 20px; }
.isis-audit-trail--compact .isis-audit-trail__dot .rzi { font-size: 12px; }
.isis-audit-trail--compact .isis-audit-trail__label { font-size: 0.76rem; }
.isis-audit-trail--compact .isis-audit-trail__when { font-size: 0.68rem; }
.isis-audit-trail--compact .isis-audit-trail__transition { font-size: 0.7rem; }
.isis-audit-trail--compact .isis-audit-trail__meta { font-size: 0.7rem; margin-top: 0.05rem; }
.isis-audit-trail--compact .isis-audit-trail__note { font-size: 0.68rem; margin-top: 0.3rem; }

/* Variante dialog plein écran : padding aéré */
.isis-audit-trail-dialog {
    padding: 0.5rem 0;
}

/* Tableau d'édition des taux dans le TaxTemplateFormDialog (mêmes styles que devis-items) */
.isis-tax-rates {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.78rem;
}
.isis-tax-rates thead th {
    text-align: left;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.65rem;
    color: var(--isis-text-muted);
    padding: 0.4rem 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-tax-rates tbody td {
    padding: 0.35rem 0.4rem;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
    vertical-align: middle;
}
.isis-tax-rates tbody tr:hover { background: var(--isis-surface-soft, #f8fafc); }

/* Conversion devise figée sur fiche détail devis (snapshot SEND) */
.isis-detail-summary__conversion {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    padding: 0.5rem 0.65rem;
    margin-top: 0.6rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-radius: 6px;
    font-size: 0.78rem;
    color: var(--isis-text);
    line-height: 1.4;
}
.isis-detail-summary__conversion strong {
    font-weight: 600;
}
.isis-detail-summary__conversion-meta {
    display: block;
    color: var(--isis-text-muted);
    font-size: 0.7rem;
    margin-top: 0.1rem;
}
.isis-detail-summary__conversion--warning {
    background: #fef3c7;
    color: #92400e;
}
.isis-detail-summary__conversion--warning .rzi {
    color: #d97706;
}

/* Layout 2 colonnes sur fiche détail devis : contenu principal + sidepanel
   approbation/partages. Sidepanel 480px fixe à droite, sticky. */
.isis-detail-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 480px;
    gap: 1rem;
    /* stretch : les deux colonnes occupent toute la hauteur de la ligne ;
       flex:1 + min-height:0 : la grille prend le reste du .isis-rich-page et
       contraint ses enfants → la carte d'onglets scrolle en interne. */
    align-items: stretch;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-detail-layout__main {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    min-width: 0;
    min-height: 0;
}
.isis-detail-layout__side {
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    min-height: 0;
}
/* Modificateur « carte » — visuel symétrique au .isis-master-detail__master.
   Border + radius + bg + padding interne pour que le sidepanel se présente
   comme une seconde carte distincte de la grille (cf. DevisCounterListPage).
   Refonte 2026-05-29 : renommé de `.isis-detail-layout__side--card` (legacy)
   vers `.isis-master-detail__detail--card` pour cohérence avec le wrapper
   master-detail standard. */
.isis-master-detail__detail--card {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 0.85rem 1rem;
    overflow: hidden;
}
/* Cartes de .isis-detail-layout__main — divs plats portant rz-card rz-variant-flat
   (visuel Radzen identique) + ces modificateurs (chaîne flex sous notre contrôle
   total — le composant RadzenCard a été retiré, son passthrough class/Style
   s'étant révélé non fiable). display:flex en !important : bat la règle .rz-card
   de Radzen quel que soit l'ordre de chargement des feuilles. */
.isis-detail-card--summary {
    flex-shrink: 0;
}
.isis-detail-card--tabs,
.isis-detail-card--list {
    flex: 1 1 auto;
    min-height: 0;
    display: flex !important;
    flex-direction: column;
}
@media (max-width: 1200px) {
    .isis-detail-layout {
        grid-template-columns: 1fr;
        /* En une colonne (tablette) : on relâche la chaîne flex stricte et on
           laisse la zone détail scroller comme un bloc. */
        overflow-y: auto;
    }
}

/* Blocs du sidepanel (approbation, partages…) */
.isis-side-block {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    padding: 0.85rem 1rem;
}
.isis-side-block__head {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.7rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    margin-bottom: 0.65rem;
}
.isis-side-block__empty {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    line-height: 1.4;
}
.isis-side-block__hint {
    margin-top: 0.5rem;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    font-style: italic;
}
.isis-side-block__action {
    margin-left: auto;
    background: transparent;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    width: 22px; height: 22px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--isis-text-muted);
    cursor: pointer;
}
.isis-side-block__action:hover {
    background: var(--isis-surface-soft, #f8fafc);
    color: var(--isis-text);
    border-color: var(--isis-text-soft);
}
.isis-share-list__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.4rem;
}
.isis-share-list__remove,
.isis-share-list__edit {
    background: transparent;
    border: none;
    width: 20px; height: 20px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--isis-text-soft);
    cursor: pointer;
}
/* Édition = action neutre → survol accent. Distinct du rouge destructif du retrait. */
.isis-share-list__edit:hover {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}
.isis-share-list__remove:hover {
    background: #ffebee;
    color: #c62828;
}

/* Chaîne d'approbation : liste verticale style timeline */
.isis-approval-chain {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
}
.isis-approval-chain__step {
    padding: 0.5rem 0.6rem;
    border-radius: 6px;
    background: var(--isis-surface-soft, #f8fafc);
    border-left: 3px solid var(--isis-border);
}
.isis-approval-chain__step.is-pending  { border-left-color: #d97706; }
.isis-approval-chain__step.is-approved { border-left-color: #16a34a; }
.isis-approval-chain__step.is-rejected { border-left-color: #c62828; }
.isis-approval-chain__step.is-skipped  { border-left-color: var(--isis-text-soft); opacity: 0.6; }

.isis-approval-chain__head {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    margin-bottom: 0.2rem;
}
.isis-approval-chain__level {
    font-size: 0.65rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
.isis-approval-chain__user {
    font-size: 0.82rem;
    font-weight: 500;
    color: var(--isis-text);
}
.isis-approval-chain__meta {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.72rem;
}
.isis-approval-chain__date {
    color: var(--isis-text-muted);
}
.isis-approval-chain__comment {
    margin-top: 0.4rem;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    font-style: italic;
    line-height: 1.35;
}
.isis-approval-chain__reason {
    margin-top: 0.35rem;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    line-height: 1.35;
}
.isis-approval-chain__step.is-preview {
    border-left-color: var(--isis-mod-gescom);
    border-left-style: dashed;
    opacity: 0.95;
}
.isis-approval-chain__actions {
    display: flex;
    gap: 0.4rem;
    margin-top: 0.5rem;
}
.isis-approval-chain__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.25rem 0.6rem;
    border-radius: 4px;
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    cursor: pointer;
    font-size: 0.72rem;
    font-weight: 500;
    transition: background-color 100ms ease, color 100ms ease, border-color 100ms ease;
}
.isis-approval-chain__btn:disabled { opacity: 0.5; cursor: not-allowed; }
.isis-approval-chain__btn.is-approve { color: var(--rz-success, #16a34a); }
.isis-approval-chain__btn.is-approve:hover:not(:disabled) {
    background: var(--rz-success-lighter, #ecfdf5);
    border-color: var(--rz-success, #16a34a);
}
.isis-approval-chain__btn.is-reject { color: var(--rz-danger, #dc2626); }
.isis-approval-chain__btn.is-reject:hover:not(:disabled) {
    background: var(--rz-danger-lighter, #fef2f2);
    border-color: var(--rz-danger, #dc2626);
}
.isis-side-block__head-tag {
    margin-left: auto;
    padding: 0.05rem 0.4rem;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    border-radius: 3px;
    font-size: 0.62rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
}

/* Liste de partages */
.isis-share-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-share-list__item {
    padding: 0.4rem 0.55rem;
    border-radius: 6px;
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-share-list__user {
    font-size: 0.82rem;
    font-weight: 500;
    color: var(--isis-text);
}
.isis-share-list__rights {
    display: flex;
    gap: 0.3rem;
    margin-top: 0.2rem;
    flex-wrap: wrap;
}
.isis-share-list__tag {
    font-size: 0.68rem;
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-weight: 500;
}
.isis-share-list__granted {
    margin-top: 0.3rem;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
}

/* Contexte propriété du devis (Créé par / Propriétaire) en tête de la section Partages */
.isis-share-meta {
    margin: 0 0 0.6rem;
    padding: 0.5rem 0.55rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-radius: 6px;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-share-meta__row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-share-meta dt {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin: 0;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    flex-shrink: 0;
}
.isis-share-meta dd {
    margin: 0;
    font-size: 0.8rem;
    font-weight: 500;
    color: var(--isis-text);
    text-align: right;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Suggestions d'interlocuteurs sur le dialog Partage (migration 0092). */
.isis-share-suggest {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin-bottom: 0.6rem;
}
.isis-share-suggest__label {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-right: 0.2rem;
}
.isis-share-suggest__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.25rem 0.55rem;
    font-size: 0.74rem;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-pill);
    cursor: pointer;
    transition: background 0.15s ease, border-color 0.15s ease;
}
.isis-share-suggest__chip:hover {
    background: var(--isis-surface);
    border-color: var(--isis-mod-gescom);
}
.isis-share-suggest__chip.is-picked {
    background: var(--isis-mod-gescom-soft);
    border-color: var(--isis-mod-gescom);
    color: var(--isis-text);
}
.isis-share-suggest__chip-meta {
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    font-size: 0.66rem;
}

/* Ventilation TVA par taux sur fiche détail devis (Q4 : calcul à la volée) */
.isis-vat-summary {
    margin-top: 1rem;
    padding: 0.85rem 1rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-radius: 8px;
    /* Dans le panneau --footed : pied collé au bas, ne se comprime jamais. */
    flex-shrink: 0;
}
.isis-vat-summary__title {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.7rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    margin-bottom: 0.6rem;
}
.isis-vat-summary__exempt,
.isis-vat-summary__empty {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-vat-summary__table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.78rem;
}
.isis-vat-summary__table thead th {
    text-align: left;
    font-weight: 500;
    font-size: 0.65rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    padding: 0.3rem 0.4rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-vat-summary__table tbody td,
.isis-vat-summary__table tfoot td {
    padding: 0.3rem 0.4rem;
}
.isis-vat-summary__table tbody tr {
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
}
.isis-vat-summary__table tfoot td {
    border-top: 1px solid var(--isis-border);
    padding-top: 0.5rem;
}

/* Bloc Remise globale et totaux (onglet Lignes — lecture seule calque dialog).
   Layout 2 colonnes : remise (gauche, ratio 3) + totaux (droite, ratio 9).     */
.isis-totals-grid {
    display: grid;
    grid-template-columns: minmax(220px, 3fr) minmax(280px, 9fr);
    gap: 1.5rem;
    align-items: start;
}
.isis-totals-grid__discount {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-inline-edit {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-height: 32px;
}
.isis-inline-edit__value {
    font-variant-numeric: tabular-nums;
    font-weight: 500;
    color: var(--isis-text, #1f2328);
    font-size: 0.95rem;
}
@media (max-width: 720px) {
    .isis-totals-grid {
        grid-template-columns: 1fr;
        gap: 1rem;
    }
}

/* ============================================================================
   .isis-devis-items-dialog — layout du dialog d'édition des lignes
   ----------------------------------------------------------------------------
   Trois zones empilées en flex column sur toute la hauteur du dialog :
     1) lignes (scroll interne quand la liste s'allonge)
     2) footer sticky (boutons d'ajout + totaux + mode simu + actions)
   La chaîne flex impose `min-height: 0` sur chaque maillon (sans ça, le scroll
   interne ne se déclenche jamais et c'est le dialog entier qui scrolle).
   ============================================================================ */
/* La chaîne flex doit traverser .rz-dialog → .rz-dialog-content → wrapper
   interne. Les 2 classes ci-dessous sont appliquées via DialogOptions
   (CssClass + ContentCssClass) du caller — pas via :has(), qui matchait mais
   imposait un padding: 0 qui tuait les bordures latérales visuelles.
   Ne touche PAS au padding hérité du thème Radzen — préserve l'apparence. */
.rz-dialog.isis-dialog-flex {
    display: flex;
    flex-direction: column;
}
.rz-dialog.isis-dialog-flex > .rz-dialog-content {
    flex: 1 1 auto;
    min-height: 0;
}
.rz-dialog-content.isis-dialog-content-flex {
    display: flex;
    flex-direction: column;
    min-height: 0;
}
.isis-devis-items-dialog {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
    gap: 0.75rem;
    /* Override du padding-bottom 2.5rem hérité d'isis-form-linear — le footer
       collé en bas porte sa propre marge. */
    padding-bottom: 0.5rem;
}

/* ── Coût de revient en dialog (calque structurel isis-devis-items-dialog) ── */
.isis-devis-costing-dialog {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
    gap: 0.75rem;
    padding-bottom: 0.5rem;
}
.isis-devis-costing-dialog__scroll {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
    /* Préserve la marge interne du composant DevisCostingTab (gap entre sections). */
}
.isis-devis-costing-dialog__footer {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding-top: 0.5rem;
    border-top: 1px solid var(--isis-border);
}
.isis-devis-costing-dialog__footer-hint {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: var(--isis-text-muted);
    font-size: 0.8rem;
}
.isis-devis-items-dialog__lines {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
}
.isis-devis-items-dialog__lines-scroll {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
}
.isis-devis-items-dialog__lines-scroll .isis-devis-items thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--isis-surface-alt);
}
.isis-devis-items-dialog__footer {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.75rem 0 0;
    border-top: 1px solid var(--isis-border);
    background: var(--isis-surface);
}
.isis-devis-items-dialog__footer .isis-form-linear__section {
    margin: 0;
}
.isis-devis-items-dialog__totals .isis-devis-totals {
    margin-top: 0;
}

/* ============================================================================
   .isis-devis-items — tableau d'édition des lignes d'un devis
   ============================================================================ */
.isis-devis-items {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.78rem;
}

/* Dans le dialog d'édition, on impose table-layout: fixed pour que les widths
   déclarés sur les <th> soient respectés strictement — sinon la colonne
   Entreprise (140px) s'élargit dynamiquement dès qu'un nom de cotraitant ou
   tiers est long, et pousse les autres colonnes. Fixed + overflow hidden +
   ellipsis sur les chips/dropdowns à l'intérieur = colonnes stables. */
.isis-devis-items-dialog .isis-devis-items {
    table-layout: fixed;
}
.isis-devis-items-dialog .isis-devis-items td {
    overflow: hidden;
}
.isis-devis-items-dialog .isis-devis-items td .isis-entreprise-tag,
.isis-devis-items-dialog .isis-devis-items td .isis-imputation-picker {
    max-width: 100%;
}
.isis-devis-items thead th {
    text-align: left;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.65rem;
    color: var(--isis-text-muted);
    padding: 0.4rem 0.5rem;
    border-bottom: 1px solid var(--isis-border);
    background: transparent;
}
.isis-devis-items tbody td {
    padding: 0.35rem 0.4rem;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
    /* Aligné en haut : si la Désignation grandit en hauteur (textarea
       auto-resize), les autres cellules (Qté, PU, Remise, actions…) restent
       collées au sommet de la ligne au lieu de flotter au milieu. */
    vertical-align: top;
}

/* Alignement vertical strict des inputs/contrôles dans la table d'édition.
   Radzen wrappe différemment chaque type (RadzenNumeric = span avec spinners,
   RadzenDropDown = div avec chevron, RadzenTextBox = input direct), ce qui
   produit naturellement des écarts de 1-3px de hauteur. On force une grille
   uniforme via :
     1) une hauteur unique de 32px sur tous les wrappers externes
     2) un reset margin: 0 sur tous les enfants directs des <td>
     3) box-sizing: border-box pour que la hauteur inclut padding+bordure
     4) line-height: 32px sur les cellules text-only pour aligner la baseline. */
.isis-devis-items tbody td > * {
    margin: 0;
    box-sizing: border-box;
}
.isis-devis-items tbody .rz-textbox,
.isis-devis-items tbody .rz-numeric,
.isis-devis-items tbody .rz-dropdown,
.isis-devis-items tbody input.rz-textbox-input,
.isis-devis-items tbody .rz-numeric .rz-spinner-input,
.isis-devis-items tbody .rz-dropdown .rz-dropdown-label {
    height: 32px;
    min-height: 32px;
    max-height: 32px;
    box-sizing: border-box;
    line-height: 1.4;
}
/* Le wrapper RadzenNumeric contient un <input> et des <button> spinners
   parfois flexés différemment selon le browser. On force display: flex pour
   que les enfants se centrent verticalement à coup sûr. */
.isis-devis-items tbody .rz-numeric {
    display: inline-flex;
    align-items: stretch;
    padding: 0;
}
.isis-devis-items tbody .rz-numeric .rz-spinner-input,
.isis-devis-items tbody .rz-numeric .rz-spinner-button {
    margin: 0;
}
/* Le wrapper RadzenDropDown contient le label et le chevron — ils doivent
   être centrés verticalement dans les 32px. */
.isis-devis-items tbody .rz-dropdown {
    display: inline-flex;
    align-items: center;
    padding: 0 0.5rem;
}
/* Textarea Description : garde son min-height 32px pour s'aligner sur les
   autres inputs au repos, libre de grandir au-delà via field-sizing. */
.isis-devis-items tbody .rz-textarea,
.isis-devis-items tbody textarea.rz-textarea {
    min-height: 32px;
    box-sizing: border-box;
    line-height: 1.4;
}
/* Cellules text-only (SECTION/COMMENT, totaux affichés sans input) :
   line-height 32px pour aligner la baseline du texte sur les inputs voisins.
   Exclut les rows historique inline (compactes par design). */
.isis-devis-items tbody tr:not(.isis-devis-items__history-row) td:not(:has(.rz-textbox, .rz-numeric, .rz-dropdown, .rz-textarea, .isis-devis-items__actions, .isis-devis-items__drag-handle, .isis-devis-items__drag-cell)) {
    line-height: 32px;
}
.isis-devis-items tbody tr:hover {
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-devis-items tbody tr.is-structural td {
    background: var(--isis-surface-soft, #f8fafc);
    color: var(--isis-text-muted);
}
.isis-devis-items tbody tr.is-structural td .rz-textbox {
    font-weight: 500;
}
.isis-devis-items__remove {
    background: none;
    border: none;
    color: #c62828;
    cursor: pointer;
    padding: 0.2rem;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-devis-items__remove:hover:not(:disabled) {
    background: #ffebee;
}
.isis-devis-items__remove:disabled {
    color: var(--isis-text-soft, #94a3b8);
    cursor: not-allowed;
    opacity: 0.5;
}
.isis-devis-items__actions {
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
}

/* Textarea Description auto-redimensionnable (DevisItemsEditDialog).
   `field-sizing: content` (CSS moderne — Chrome 123+, Safari 17.4+, Edge 123+,
   Firefox 144+) fait croître/réduire le textarea selon le contenu réel, sans
   scrollbar interne. Firefox plus ancien : retombe sur 1 row + scroll natif. */
.isis-row-desc-textarea {
    field-sizing: content;
    min-height: 2rem;
    max-height: 280px;
    resize: none;
    overflow: hidden;
    line-height: 1.4;
    padding: 0.3rem 0.5rem;
}
/* Radzen wrappe son textarea — on cible aussi le sélecteur interne. */
.isis-row-desc-textarea textarea,
.isis-row-desc-textarea > textarea,
textarea.rz-textarea.isis-row-desc-textarea {
    field-sizing: content;
    min-height: 2rem;
    max-height: 280px;
    resize: none;
    overflow: hidden;
    line-height: 1.4;
}

/* Phase 5 v2 — colorisation gauche des lignes selon classification marge.
   Border-left 3px discrète, ne bouge pas le layout. Mêmes codes couleurs que
   MarginClassifier côté DevisCostingTab → cohérence visuelle entre les 2 onglets. */
.isis-devis-items tbody tr.is-margin-on-target    { box-shadow: inset 3px 0 0 0 var(--isis-success, #16a34a); }
.isis-devis-items tbody tr.is-margin-below-target { box-shadow: inset 3px 0 0 0 var(--isis-warning, #d97706); }
.isis-devis-items tbody tr.is-margin-below-floor  { box-shadow: inset 3px 0 0 0 var(--isis-danger,  #dc2626); }
.isis-devis-items tbody tr.is-margin-above-max    { box-shadow: inset 3px 0 0 0 var(--isis-accent,  #4b5fad); }

/* Colonne Marge — badge pill compact (au lieu de colorer la cellule entière).
   4 classes alignées sur le MarginClassifier (cohérent avec liseré row + bandeau
   Coût de revient). Le span concentre la couleur, la cellule reste neutre. */
.isis-margin-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 56px;
    padding: 0.15rem 0.55rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.78rem;
    font-weight: 600;
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.01em;
    border: 1px solid transparent;
    white-space: nowrap;
}
.isis-margin-badge.is-margin-cell-on-target {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 35%, transparent);
}
.isis-margin-badge.is-margin-cell-below-target {
    background: color-mix(in srgb, var(--isis-warning, #d97706) 16%, var(--isis-surface));
    color: var(--isis-warning, #d97706);
    border-color: color-mix(in srgb, var(--isis-warning, #d97706) 40%, transparent);
}
.isis-margin-badge.is-margin-cell-below-floor {
    background: color-mix(in srgb, var(--isis-danger, #dc2626) 16%, var(--isis-surface));
    color: var(--isis-danger, #dc2626);
    border-color: color-mix(in srgb, var(--isis-danger, #dc2626) 40%, transparent);
}
.isis-margin-badge.is-margin-cell-above-max {
    background: color-mix(in srgb, var(--isis-accent, #4b5fad) 14%, var(--isis-surface));
    color: var(--isis-accent, #4b5fad);
    border-color: color-mix(in srgb, var(--isis-accent, #4b5fad) 35%, transparent);
}
.isis-margin-badge--neutral {
    /* Cellule sans coût alloué : tiret sobre, pas de couleur (juste typo). */
    color: var(--isis-text-muted);
    background: transparent;
    border-color: transparent;
    font-weight: 400;
    min-width: auto;
}

/* ═══════════════════════════════════════════════════════════════════════════
   .isis-btn — boutons de dialog inline (alternatif à RadzenButton pour les
   footers de form-linear). 3 variantes : --ghost (secondaire/annuler),
   --accent (action principale), --danger (destructif).
   Aligné visuellement sur .rz-button-md mais piloté en CSS pur — plus léger
   et compatible avec icônes Material inline + spans inline.
   ═══════════════════════════════════════════════════════════════════════════ */
.isis-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 0.5rem 0.95rem;
    min-height: 36px;
    border-radius: 4px;
    border: 1px solid transparent;
    font-family: inherit;
    font-size: 0.85rem;
    font-weight: 500;
    line-height: 1.2;
    cursor: pointer;
    transition: background 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 60ms ease;
    text-decoration: none;
    background: transparent;
    color: var(--isis-text);
    white-space: nowrap;
    /* Relief subtil — donne corps au bouton sans flat-design pur. */
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06), 0 0 0 1px rgba(15, 23, 42, 0.02);
}
.isis-btn:hover:not([disabled]) {
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.10), 0 0 0 1px rgba(15, 23, 42, 0.04);
}
.isis-btn:active:not([disabled]) {
    transform: translateY(1px);
    box-shadow: 0 1px 1px rgba(15, 23, 42, 0.06);
}
.isis-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
.isis-btn:disabled,
.isis-btn[disabled] {
    opacity: 0.55;
    cursor: not-allowed;
    box-shadow: none;
}
.isis-btn .rz-icon,
.isis-btn .rzi {
    font-size: 14px;
}

/* ── Variante ghost / Light : feutré mais contraste suffisant pour rester
       visible sur n'importe quel fond (surface OU surface-alt). ─────────── */
.isis-btn--ghost,
.isis-btn--light {
    background: color-mix(in srgb, var(--isis-text) 5%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-text) 22%, var(--isis-border));
    color: var(--isis-text);
    font-weight: 500;
}
.isis-btn--ghost:hover:not([disabled]),
.isis-btn--light:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-text) 10%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-text) 38%, var(--isis-border));
}

/* ── Variante base : standard sobre, plus de poids que ghost ──────────── */
.isis-btn--base {
    background: color-mix(in srgb, var(--isis-text) 4%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-text) 18%, var(--isis-border));
    color: var(--isis-text);
    font-weight: 500;
}
.isis-btn--base:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-text) 8%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-text) 32%, var(--isis-border));
}

/* ── Variante secondary : un peu plus emphatique, teinte accent atténuée ─ */
.isis-btn--secondary {
    background: color-mix(in srgb, var(--isis-accent) 6%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-accent) 30%, var(--isis-border));
    color: color-mix(in srgb, var(--isis-accent) 75%, var(--isis-text));
    font-weight: 600;
}
.isis-btn--secondary:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-accent) 50%, transparent);
    color: var(--isis-accent);
}

/* ── Variante accent : action principale ───────────────────────────────── */
.isis-btn--accent,
.isis-btn--primary {
    background: var(--isis-accent);
    border-color: var(--isis-accent);
    color: var(--isis-surface);
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-accent) 30%, transparent);
}
.isis-btn--accent:hover:not([disabled]),
.isis-btn--primary:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-accent) 88%, black);
    border-color: color-mix(in srgb, var(--isis-accent) 88%, black);
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.15), 0 2px 6px color-mix(in srgb, var(--isis-accent) 40%, transparent);
}

/* ── Variante danger : action destructive ──────────────────────────────── */
.isis-btn--danger {
    background: var(--isis-danger);
    border-color: var(--isis-danger);
    color: var(--isis-surface);
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-danger) 30%, transparent);
}
.isis-btn--danger:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-danger) 88%, black);
    border-color: color-mix(in srgb, var(--isis-danger) 88%, black);
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.15), 0 2px 6px color-mix(in srgb, var(--isis-danger) 40%, transparent);
}

/* ── Variante warning ──────────────────────────────────────────────────── */
.isis-btn--warning {
    background: var(--isis-warning);
    border-color: var(--isis-warning);
    color: var(--isis-surface);
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-warning) 30%, transparent);
}
.isis-btn--warning:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-warning) 88%, black);
    border-color: color-mix(in srgb, var(--isis-warning) 88%, black);
}

/* ── Variante success ──────────────────────────────────────────────────── */
.isis-btn--success {
    background: var(--isis-success);
    border-color: var(--isis-success);
    color: var(--isis-surface);
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-success) 30%, transparent);
}
.isis-btn--success:hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-success) 88%, black);
    border-color: color-mix(in srgb, var(--isis-success) 88%, black);
}

/* ═══════════════════════════════════════════════════════════════════════════
   Override global RadzenButton — alignement sur l'identité .isis-btn.
   Tous les <RadzenButton> de l'app prennent désormais l'aspect isis-btn selon
   leur ButtonStyle. Mapping :
     ButtonStyle.Primary   → .isis-btn--accent
     ButtonStyle.Light     → .isis-btn--ghost   (244 usages, plus fréquent)
     ButtonStyle.Secondary → .isis-btn--ghost
     ButtonStyle.Base      → .isis-btn--ghost
     ButtonStyle.Danger    → .isis-btn--danger
     ButtonStyle.Warning   → .isis-btn--warning
     ButtonStyle.Info      → .isis-btn--accent (variante info bleue)
     ButtonStyle.Success   → couleur success (bouton vert)

   Préservé : RadzenIconButton (rz-button-icon-only), boutons tailles spéciales
   (rz-button-sm/lg), variant filled/outlined/text (rendent à leur style natif
   pour les usages qui sortent du pattern « bouton plein flat »).
   ═══════════════════════════════════════════════════════════════════════════ */

/* Base : reset Radzen aligné sur .isis-btn (padding, gap, alignement, radius,
   relief subtil). Les couleurs sont posées plus bas par shade pour différencier
   Light / Base / Secondary (qui se ressemblaient trop). */
.rz-button:not(.rz-button-icon-only) {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 0.5rem 0.95rem;
    min-height: 36px;
    border-radius: 4px;
    border: 1px solid transparent;
    font-family: inherit;
    font-size: 0.85rem;
    font-weight: 500;
    line-height: 1.2;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06), 0 0 0 1px rgba(15, 23, 42, 0.02);
    transition: background 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 60ms ease;
}
.rz-button:not(.rz-button-icon-only):hover:not([disabled]) {
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.10), 0 0 0 1px rgba(15, 23, 42, 0.04);
}
.rz-button:not(.rz-button-icon-only):active:not([disabled]) {
    transform: translateY(1px);
    box-shadow: 0 1px 1px rgba(15, 23, 42, 0.06);
}
.rz-button:not(.rz-button-icon-only):focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
.rz-button:not(.rz-button-icon-only):disabled,
.rz-button:not(.rz-button-icon-only)[disabled] {
    opacity: 0.55;
    cursor: not-allowed;
    box-shadow: none;
}
.rz-button:not(.rz-button-icon-only) .rzi,
.rz-button:not(.rz-button-icon-only) .rz-icon {
    font-size: 14px;
}

/* ── ButtonStyle.Primary (79 usages) + Info → accent ──────────────────────
   !important nécessaire pour battre les sélecteurs Radzen natifs plus
   spécifiques (.rz-variant-filled.rz-primary, .rz-shade-default.rz-primary). */
.rz-button.rz-primary:not(.rz-button-icon-only),
.rz-button.rz-info:not(.rz-button-icon-only) {
    background: var(--isis-accent) !important;
    border-color: var(--isis-accent) !important;
    color: var(--isis-surface) !important;
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-accent) 30%, transparent);
}
.rz-button.rz-primary:not(.rz-button-icon-only):hover:not([disabled]),
.rz-button.rz-info:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-accent) 88%, black) !important;
    border-color: color-mix(in srgb, var(--isis-accent) 88%, black) !important;
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.15), 0 2px 6px color-mix(in srgb, var(--isis-accent) 40%, transparent);
}

/* ── ButtonStyle.Light (244 usages) — action secondaire, mais contraste
   suffisant pour rester visible sur fond surface (sidepanels, dialogs).
   Fond légèrement teinté (text 5%) + bordure marquée (text 22%) → le bouton
   ressort même quand son parent est sur var(--isis-surface). */
.rz-button.rz-light:not(.rz-button-icon-only) {
    background: color-mix(in srgb, var(--isis-text) 5%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-text) 22%, var(--isis-border)) !important;
    color: var(--isis-text) !important;
    font-weight: 500;
}
.rz-button.rz-light:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-text) 10%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-text) 38%, var(--isis-border)) !important;
}

/* ── ButtonStyle.Base — standard sobre, plus de poids que Light ──────── */
.rz-button.rz-base:not(.rz-button-icon-only) {
    background: color-mix(in srgb, var(--isis-text) 4%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-text) 18%, var(--isis-border)) !important;
    color: var(--isis-text) !important;
    font-weight: 500;
}
.rz-button.rz-base:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-text) 8%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-text) 32%, var(--isis-border)) !important;
}

/* ── ButtonStyle.Secondary — emphatique, teinte accent atténuée ──────── */
.rz-button.rz-secondary:not(.rz-button-icon-only) {
    background: color-mix(in srgb, var(--isis-accent) 6%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-accent) 30%, var(--isis-border)) !important;
    color: color-mix(in srgb, var(--isis-accent) 75%, var(--isis-text)) !important;
    font-weight: 600;
}
.rz-button.rz-secondary:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface)) !important;
    border-color: color-mix(in srgb, var(--isis-accent) 50%, transparent) !important;
    color: var(--isis-accent) !important;
}

/* ── ButtonStyle.Danger ────────────────────────────────────────────────── */
.rz-button.rz-danger:not(.rz-button-icon-only) {
    background: var(--isis-danger) !important;
    border-color: var(--isis-danger) !important;
    color: var(--isis-surface) !important;
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-danger) 30%, transparent);
}
.rz-button.rz-danger:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-danger) 88%, black) !important;
    border-color: color-mix(in srgb, var(--isis-danger) 88%, black) !important;
    box-shadow: 0 2px 4px rgba(15, 23, 42, 0.15), 0 2px 6px color-mix(in srgb, var(--isis-danger) 40%, transparent);
}

/* ── ButtonStyle.Warning ───────────────────────────────────────────────── */
.rz-button.rz-warning:not(.rz-button-icon-only) {
    background: var(--isis-warning) !important;
    border-color: var(--isis-warning) !important;
    color: var(--isis-surface) !important;
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-warning) 30%, transparent);
}
.rz-button.rz-warning:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-warning) 88%, black) !important;
    border-color: color-mix(in srgb, var(--isis-warning) 88%, black) !important;
}

/* ── ButtonStyle.Success ───────────────────────────────────────────────── */
.rz-button.rz-success:not(.rz-button-icon-only) {
    background: var(--isis-success) !important;
    border-color: var(--isis-success) !important;
    color: var(--isis-surface) !important;
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(15, 23, 42, 0.10), 0 1px 3px color-mix(in srgb, var(--isis-success) 30%, transparent);
}
.rz-button.rz-success:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, var(--isis-success) 88%, black) !important;
    border-color: color-mix(in srgb, var(--isis-success) 88%, black) !important;
}

/* Variant outlined : conserve le pattern Radzen natif d'outline mais aligne
   le radius/padding sur isis-btn. */
.rz-button.rz-variant-outlined:not(.rz-button-icon-only) {
    background: transparent;
}
.rz-button.rz-primary.rz-variant-outlined:not(.rz-button-icon-only) {
    border-color: var(--isis-accent);
    color: var(--isis-accent);
}
.rz-button.rz-danger.rz-variant-outlined:not(.rz-button-icon-only) {
    border-color: var(--isis-danger);
    color: var(--isis-danger);
}

/* Variant text : transparent + couleur d'accent, pas de bordure. */
.rz-button.rz-variant-text:not(.rz-button-icon-only) {
    background: transparent;
    border-color: transparent;
}
.rz-button.rz-primary.rz-variant-text:not(.rz-button-icon-only) {
    color: var(--isis-accent);
}
.rz-button.rz-variant-text:not(.rz-button-icon-only):hover:not([disabled]) {
    background: color-mix(in srgb, currentColor 8%, transparent);
}

/* Tailles : préservées au format Radzen mais avec radius isis-btn cohérent. */
.rz-button-sm:not(.rz-button-icon-only) {
    min-height: 28px;
    padding: 0.3rem 0.7rem;
    font-size: 0.78rem;
}
.rz-button-lg:not(.rz-button-icon-only) {
    min-height: 44px;
    padding: 0.6rem 1.2rem;
    font-size: 0.95rem;
}

/* Boutons d'action ligne (apply / history / unmerge / merge). */
.isis-devis-items__action {
    background: none;
    border: 1px solid transparent;
    color: var(--isis-text-muted);
    cursor: pointer;
    padding: 0.2rem 0.35rem;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    gap: 2px;
    transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}
.isis-devis-items__action:hover {
    background: var(--isis-surface-alt, #f8fafc);
    color: var(--isis-text);
}
.isis-devis-items__action--apply {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 12%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 35%, transparent);
}
.isis-devis-items__action--apply:hover {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 22%, var(--isis-surface));
}
.isis-devis-items__action--history {
    background: color-mix(in srgb, var(--isis-accent) 10%, var(--isis-surface));
    color: var(--isis-accent);
    border-color: color-mix(in srgb, var(--isis-accent) 30%, transparent);
}
.isis-devis-items__action--history:hover {
    background: color-mix(in srgb, var(--isis-accent) 18%, var(--isis-surface));
}
/* Variante dépliée : fond accent plein, signal visuel fort que l'historique est ouvert. */
.isis-devis-items__action--history.is-expanded {
    background: var(--isis-accent);
    color: var(--isis-surface, #ffffff);
    border-color: var(--isis-accent);
}
.isis-devis-items__action--history.is-expanded:hover {
    background: color-mix(in srgb, var(--isis-accent) 85%, black);
}

/* Phase 5 v3 — Section décomposition tarifaire interne (EngagementDetail).
   Visible owner uniquement, fond accent atténué + badge "INTERNE" pour la
   distinguer comme info confidentielle qui ne doit jamais sortir vers le ST. */
.isis-engagement-decomposition {
    background: color-mix(in srgb, var(--isis-accent) 5%, var(--isis-surface));
    border-left: 3px solid var(--isis-accent);
    padding: 0.85rem 1rem;
    border-radius: 6px;
}
.isis-engagement-decomposition__badge {
    display: inline-block;
    margin-left: 0.6rem;
    padding: 0.1rem 0.45rem;
    border-radius: 3px;
    background: var(--isis-warning, #d97706);
    color: white;
    font-size: 0.65rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    vertical-align: middle;
}
.isis-decomposition-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
    background: var(--isis-surface);
    border-radius: 4px;
    overflow: hidden;
}
.isis-decomposition-table th,
.isis-decomposition-table td {
    padding: 0.4rem 0.55rem;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
}
.isis-decomposition-table thead th {
    text-align: left;
    font-weight: 600;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt, #f8fafc);
}
.isis-decomposition-table tfoot td {
    background: color-mix(in srgb, var(--isis-accent) 6%, transparent);
    border-top: 2px solid var(--isis-border);
}
.isis-decomposition-table .num { text-align: right; font-variant-numeric: tabular-nums; }
.isis-decomposition-table tbody tr:hover { background: var(--isis-surface-alt, #f8fafc); }
.isis-decomposition-table__margin-pct { font-weight: 600; color: var(--isis-accent); }
.isis-decomposition-table__no-margin { color: var(--isis-text-muted); font-style: italic; }
.isis-decomposition-table__margin { color: var(--isis-success, #16a34a); font-weight: 600; }
.isis-engagement-decomposition__summary {
    margin-top: 0.6rem;
    display: flex;
    gap: 1.5rem;
    padding: 0.5rem 0.8rem;
    background: var(--isis-surface);
    border-radius: 4px;
    font-size: 0.82rem;
    flex-wrap: wrap;
}
.isis-engagement-decomposition__summary strong { color: var(--isis-text-muted); font-weight: 600; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; margin-right: 0.3rem; }

/* Phase BPU (migration 0187) — Bannière contextuelle en tête de DevisFormDialog
   quand le user choisit "Bordereau de prix" (BPU). Compense le titre du titlebar
   Radzen qui reste statique. */
.isis-devis-bpu-banner {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    padding: 0.7rem 0.9rem;
    margin-bottom: 1rem;
    background: color-mix(in srgb, var(--isis-info, #0ea5e9) 8%, var(--isis-surface));
    color: var(--isis-info, #0ea5e9);
    border-left: 3px solid var(--isis-info, #0ea5e9);
    border-radius: 4px;
}
.isis-devis-bpu-banner__body {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    flex: 1;
}
.isis-devis-bpu-banner__body strong { font-size: 0.95rem; color: var(--isis-text); }
.isis-devis-bpu-banner__hint {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}

/* Phase BPU (migration 0187) — Badge inline « BPU » sur la liste devis +
   fiche détail. Sobre, signale qu'il s'agit d'un bordereau de prix unitaires. */
.isis-devis-bpu-tag {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    font-size: 0.65rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    border-radius: 3px;
    background: color-mix(in srgb, var(--isis-info, #0ea5e9) 14%, var(--isis-surface));
    color: var(--isis-info, #0ea5e9);
    border: 1px solid color-mix(in srgb, var(--isis-info, #0ea5e9) 40%, transparent);
    vertical-align: middle;
}

/* Phase 5 v3 — Bouton « Historique tarifaire client » (icône query_stats).
   Sobre, neutre — c'est une info, pas une alerte. Hover marqué pour signaler
   qu'il est cliquable. */
.isis-devis-items__action--price-history {
    background: color-mix(in srgb, var(--isis-info, #0ea5e9) 10%, var(--isis-surface));
    color: var(--isis-info, #0ea5e9);
    border-color: color-mix(in srgb, var(--isis-info, #0ea5e9) 30%, transparent);
}
.isis-devis-items__action--price-history:hover {
    background: color-mix(in srgb, var(--isis-info, #0ea5e9) 20%, var(--isis-surface));
}

/* Table du dialog historique tarifaire (DevisItemPriceHistoryDialog). */
.isis-price-history {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
    margin-top: 0.4rem;
}
.isis-price-history th,
.isis-price-history td {
    padding: 0.4rem 0.55rem;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
}
.isis-price-history thead th {
    text-align: left;
    font-weight: 600;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt, #f8fafc);
}
.isis-price-history .num { text-align: right; font-variant-numeric: tabular-nums; }
.isis-price-history tbody tr:hover { background: var(--isis-surface-alt, #f8fafc); }
.isis-price-history tbody tr.is-accepted td { background: color-mix(in srgb, var(--isis-success, #16a34a) 5%, transparent); }
.isis-price-history tbody tr.is-rejected td { background: color-mix(in srgb, var(--isis-danger,  #dc2626) 4%, transparent); color: var(--isis-text-muted); }
.isis-price-history__status {
    font-size: 0.72rem;
    padding: 0.1rem 0.4rem;
    border-radius: 3px;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
}
.isis-price-history__devis-link {
    appearance: none;
    background: none;
    border: none;
    padding: 0;
    color: var(--isis-accent);
    cursor: pointer;
    font-weight: 600;
    font-size: 0.78rem;
    text-decoration: underline dotted;
}
.isis-price-history__devis-link:hover {
    text-decoration: underline solid;
}
.isis-price-history__margin {
    font-weight: 600;
}
.isis-price-history__margin.is-low { color: var(--isis-warning, #d97706); }
.isis-price-history__margin.is-negative { color: var(--isis-danger, #dc2626); }
.isis-price-history__summary {
    margin-top: 0.75rem;
    display: flex;
    gap: 1.5rem;
    padding: 0.55rem 0.85rem;
    background: var(--isis-surface-alt, #f8fafc);
    border-radius: 6px;
    font-size: 0.82rem;
    flex-wrap: wrap;
}
.isis-price-history__summary strong { color: var(--isis-text-muted); margin-right: 0.3rem; font-weight: 600; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; }

/* Phase 5 v2 — Bouton « Acquitter la marge » (cadenas ouvert).
   Sobre, neutre — c'est une option, pas une alerte. */
.isis-devis-items__action--ack {
    background: transparent;
    color: var(--isis-text-muted);
    border-color: color-mix(in srgb, var(--isis-text-muted) 30%, transparent);
}
.isis-devis-items__action--ack:hover {
    background: color-mix(in srgb, var(--isis-text-muted) 8%, var(--isis-surface));
    color: var(--isis-text);
}
/* Phase 5 v2 — Badge « Marge acceptée » (cadenas fermé vert).
   Marqueur stable d'un état terminal volontaire. */
.isis-devis-items__action--acked {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 40%, transparent);
}
.isis-devis-items__action--acked:hover {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 22%, var(--isis-surface));
}
/* Atténuation visuelle des lignes acquittées : la classification reste lisible
   (barre de couleur conservée) mais l'opacité réduite signale que l'écart est assumé. */
.isis-devis-items tbody tr.is-margin-acked { opacity: 0.85; }
.isis-devis-items tbody tr.is-margin-acked.is-margin-below-floor  { box-shadow: inset 3px 0 0 0 color-mix(in srgb, var(--isis-danger,  #dc2626) 40%, transparent); }
.isis-devis-items tbody tr.is-margin-acked.is-margin-below-target { box-shadow: inset 3px 0 0 0 color-mix(in srgb, var(--isis-warning, #d97706) 40%, transparent); }
.isis-devis-items tbody tr.is-margin-acked.is-margin-above-max    { box-shadow: inset 3px 0 0 0 color-mix(in srgb, var(--isis-accent,  #4b5fad) 40%, transparent); }

/* Cellule Désignation onglet « Lignes » fiche détail — interligne resserré
   pour gagner de l'espace vertical sur les descriptions multi-lignes. */
.isis-devis-items tbody td.isis-devis-detail__desc-cell {
    line-height: 1.35;
    padding-top: 0.55rem;
}

/* Cellule Marge ST onglet « Lignes » fiche détail — % en pastille discrète
   pour distinguer du % de remise (qui apparaît juste à gauche). */
.isis-devis-detail__st-margin {
    display: inline-block;
    padding: 0.1rem 0.45rem;
    border-radius: 4px;
    background: color-mix(in srgb, var(--isis-accent) 8%, var(--isis-surface));
    color: var(--isis-accent);
    font-weight: 600;
    font-size: 0.78rem;
}

/* Phase 5 v2 — Badges informatifs lecture seule dans la cellule actions de
   la fiche détail devis (onglet « Lignes »). Compact, alignés à droite. */
.isis-devis-detail__row-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    justify-content: flex-end;
}
.isis-devis-detail__ack-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 4px;
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border: 1px solid color-mix(in srgb, var(--isis-success, #16a34a) 40%, transparent);
}
.isis-devis-detail__history-btn {
    appearance: none;
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 0.18rem 0.35rem;
    background: color-mix(in srgb, var(--isis-accent) 10%, var(--isis-surface));
    color: var(--isis-accent);
    border: 1px solid color-mix(in srgb, var(--isis-accent) 30%, transparent);
    border-radius: 4px;
    font-size: 0.72rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-devis-detail__history-btn:hover {
    background: color-mix(in srgb, var(--isis-accent) 18%, var(--isis-surface));
}
.isis-devis-detail__history-btn.is-expanded {
    background: var(--isis-accent);
    color: var(--isis-surface, #ffffff);
    border-color: var(--isis-accent);
}
.isis-devis-detail__history-btn.is-expanded:hover {
    background: color-mix(in srgb, var(--isis-accent) 85%, black);
}
.isis-devis-items__action-count {
    font-size: 0.7rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* Bouton bulk « Appliquer N ajustements » dans le footer toolbar. */
.isis-devis-items__add--apply-reaj {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 12%, var(--isis-surface)) !important;
    color: var(--isis-success, #16a34a) !important;
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 35%, transparent) !important;
    border-style: solid !important;
    font-weight: 600;
    margin-left: auto;
}
.isis-devis-items__add--apply-reaj:hover {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 22%, var(--isis-surface)) !important;
    box-shadow: inset 0 0 0 1px var(--isis-success, #16a34a) !important;
}

/* Lignes filles d'historique d'ajustements (Phase 5 v2). Indentées, fond
   surface-alt, typo plus petite, icône trending colorée. */
.isis-devis-items tbody tr.isis-devis-items__history-row td {
    background: var(--isis-surface-alt, #f8fafc);
    border-top: 1px dashed var(--isis-border-soft, #e2e8f0);
    padding: 0.25rem 0.45rem;
    font-size: 0.74rem;
    color: var(--isis-text-muted);
}
.isis-devis-items__history-tree {
    color: var(--isis-text-soft, #94a3b8);
    margin-right: 0.25rem;
    font-family: monospace;
}
.isis-devis-items__history-label {
    color: var(--isis-text);
    font-weight: 500;
    margin-left: 0.3rem;
}
.isis-devis-items__history-reason {
    font-style: italic;
    margin-left: 0.35rem;
}
.isis-devis-items__history-pu,
.isis-devis-items__history-margin {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}

/* Drag & drop des lignes (SortableJS) — handle + états visuels */
.isis-devis-items__drag-cell {
    text-align: center;
    width: 28px;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
.isis-devis-items__drag-handle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--isis-text-soft, #94a3b8);
    cursor: grab;
    padding: 0.2rem;
    border-radius: 4px;
    user-select: none;
}
.isis-devis-items__drag-handle:hover {
    color: var(--isis-text-muted, #475569);
    background: var(--isis-surface-soft, #f1f5f9);
}
.isis-devis-items__drag-handle:active {
    cursor: grabbing;
}
/* États SortableJS pendant le drag */
.isis-devis-items__row--ghost {
    opacity: 0.4;
    background: var(--isis-accent-soft, rgba(75, 95, 173, 0.08)) !important;
}
.isis-devis-items__row--ghost td {
    background: transparent !important;
}
.isis-devis-items__row--chosen {
    background: var(--isis-surface-soft, #f8fafc) !important;
}
.isis-devis-items__row--drag {
    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.08);
}
.isis-devis-items__action {
    background: none;
    border: none;
    color: var(--isis-text-muted, #475569);
    cursor: pointer;
    padding: 0.2rem;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-devis-items__action:hover {
    background: var(--isis-surface-soft, #f1f5f9);
    color: var(--isis-accent, #4b5fad);
}

/* Fusion ligne (migration 0113) — tag mère / fille + indentation visuelle */
.isis-merge-tag {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.1rem 0.4rem;
    border-radius: 10px;
    font-size: 0.68rem;
    font-weight: 500;
    margin-right: 0.4rem;
    vertical-align: middle;
}
.isis-merge-tag.is-child {
    background: var(--isis-surface-soft, #f1f5f9);
    color: var(--isis-text-muted, #475569);
}
.isis-merge-tag.is-parent {
    background: rgba(75, 95, 173, 0.08);
    color: var(--isis-accent, #4b5fad);
}
.isis-devis-items tbody tr.is-merge-child td {
    background: rgba(241, 245, 249, 0.6);
}
.isis-devis-items tbody tr.is-merge-parent td {
    border-top: 1px solid var(--isis-accent-soft, rgba(75, 95, 173, 0.2));
}

/* Toolbar style typographique SECTION/COMMENT (migration 0119).
   Affichée à droite du champ description sur la même ligne, uniquement quand
   la ligne est structurante. Compacte pour ne pas casser la densité.           */
.isis-row-desc-inline {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    width: 100%;
}
.isis-row-style-bar {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    flex: 0 0 auto;
}
.isis-row-style-btn {
    appearance: none;
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border, #e2e8f0);
    color: var(--isis-text-muted, #475569);
    border-radius: 4px;
    height: 24px;
    min-width: 24px;
    padding: 0 0.4rem;
    font-size: 0.78rem;
    line-height: 1;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-family: var(--isis-font, inherit);
}
.isis-row-style-btn:hover:not(:disabled) {
    background: var(--isis-surface-soft, #f1f5f9);
    border-color: var(--isis-text-muted, #94a3b8);
    color: var(--isis-text, #1f2328);
}
.isis-row-style-btn:focus-visible {
    outline: 2px solid var(--isis-accent, #4b5fad);
    outline-offset: 1px;
}
.isis-row-style-btn:disabled {
    opacity: 0.45;
    cursor: not-allowed;
}
.isis-row-style-btn--bold {
    font-weight: 700;
}
.isis-row-style-btn--italic {
    font-style: italic;
    font-weight: 600;
}
.isis-row-style-btn.is-active {
    background: var(--isis-accent-soft, rgba(75, 95, 173, 0.12));
    border-color: var(--isis-accent, #4b5fad);
    color: var(--isis-accent, #4b5fad);
}
.isis-row-style-color-wrap {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.7rem;
    color: var(--isis-text-muted, #475569);
}
.isis-row-style-color {
    appearance: none;
    -webkit-appearance: none;
    width: 24px;
    height: 24px;
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 4px;
    padding: 0;
    cursor: pointer;
    background: transparent;
}
.isis-row-style-color::-webkit-color-swatch-wrapper { padding: 0; }
.isis-row-style-color::-webkit-color-swatch { border: none; border-radius: 3px; }
.isis-row-style-color::-moz-color-swatch { border: none; border-radius: 3px; }
.isis-row-style-color:focus-visible {
    outline: 2px solid var(--isis-accent, #4b5fad);
    outline-offset: 1px;
}
.isis-row-style-size {
    width: 48px;
    height: 24px;
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 4px;
    padding: 0 0.25rem;
    font-size: 0.78rem;
    text-align: center;
    background: var(--isis-surface, #ffffff);
    color: var(--isis-text, #1f2328);
    font-variant-numeric: tabular-nums;
}
.isis-row-style-size:focus-visible {
    outline: 2px solid var(--isis-accent, #4b5fad);
    outline-offset: 1px;
}

/* Tag entreprise — distingue Titulaire des cotraitants */
.isis-entreprise-tag {
    display: inline-block;
    padding: 0.15rem 0.5rem;
    border-radius: 10px;
    font-size: 0.7rem;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
.isis-entreprise-tag.is-titulaire {
    background: var(--isis-surface-soft, #f1f5f9);
    color: var(--isis-text-muted, #475569);
}
.isis-entreprise-tag.is-partner {
    background: rgba(217, 119, 6, 0.1);
    color: #b45309;
}

/* ── Récap conversion devis (onglet « Conversion », migrations 0140/0141) ── */
.isis-conversion-recap-header {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem;
    background: var(--isis-surface-alt, #f8fafc);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    margin-bottom: 0.5rem;
}
.isis-conversion-recap-header__pill {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.6rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.78rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
}
.isis-conversion-recap-header__pill strong {
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-conversion-recap-header__pill.is-commande {
    border-color: rgba(75, 95, 173, 0.35);
    color: #3b4d8a;
    background: rgba(75, 95, 173, 0.06);
}
.isis-conversion-recap-header__pill.is-st-int {
    border-color: rgba(217, 119, 6, 0.35);
    color: #b45309;
    background: rgba(217, 119, 6, 0.06);
}
.isis-conversion-recap-header__pill.is-st-ext {
    border-color: rgba(194, 65, 12, 0.35);
    color: #9a3412;
    background: rgba(194, 65, 12, 0.06);
}
.isis-conversion-recap-header__pill.is-cot-ext {
    border-color: rgba(22, 163, 74, 0.35);
    color: #166534;
    background: rgba(22, 163, 74, 0.06);
}

/* Table simple réutilisable pour les récaps (non liée à .isis-grid div-based) */
.isis-recap-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
}
.isis-recap-table thead th {
    text-align: left;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.65rem;
    color: var(--isis-text-muted);
    padding: 0.45rem 0.55rem;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface-alt, #f8fafc);
    white-space: nowrap;
}
.isis-recap-table tbody td {
    padding: 0.4rem 0.55rem;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
    vertical-align: middle;
}
.isis-recap-table tbody tr:hover {
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-recap-table tbody tr.is-total td {
    background: var(--isis-surface-alt, #f8fafc);
    font-weight: 600;
    border-top: 2px solid var(--isis-border);
}

/* Récap financier (en tête de l'onglet Conversion d'un devis) — synthèse vente/coût/marge. */
.isis-conversion-recap-financial {
    margin: 0.75rem 0 0.5rem;
    padding: 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
}
.isis-conversion-recap-financial__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
    margin-bottom: 0.5rem;
}
.isis-conversion-recap-financial__head h2 {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-conversion-recap-financial__warning {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.75rem;
    color: #b45309;
}
.isis-recap-table--financial tbody tr.is-source td {
    background: var(--isis-surface-alt, #f8fafc);
    border-bottom: 2px solid var(--isis-border);
}
.isis-recap-table--financial tbody tr.is-marge td {
    background: rgba(75, 95, 173, 0.05);
    border-top: 2px solid var(--isis-border);
    font-weight: 500;
}
.isis-recap-table--financial tbody tr.is-marge.is-negative td {
    background: rgba(220, 38, 38, 0.06);
    color: var(--isis-danger, #dc2626);
}
.isis-conversion-recap-financial__balance {
    margin-top: 0.6rem;
    padding: 0.4rem 0.6rem;
    border-radius: var(--isis-radius);
    font-size: 0.78rem;
}
.isis-conversion-recap-financial__balance .is-ok {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: var(--isis-success, #16a34a);
}
.isis-conversion-recap-financial__balance .is-warn {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: #b45309;
}

/* Picker d'imputation analytique d'une ligne devis (saisie libre, migration 0140) */
.isis-imputation-picker {
    font-size: 0.7rem;
}
.isis-imputation-picker.is-partner :deep(.rz-inputtext) {
    color: #b45309;
    font-weight: 500;
}

/* Hint sous une cellule de grille (info contextuelle) */
.isis-grid__hint--info {
    color: var(--isis-text-muted, #475569);
    font-size: 0.7rem;
    line-height: 1.2;
}

/* Picker fusion — liste de candidats cliquables */
.isis-merge-candidates {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-merge-candidates__item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.6rem 0.75rem;
    background: var(--isis-surface, #fff);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 6px;
    cursor: pointer;
    text-align: left;
    transition: all 0.12s ease;
}
.isis-merge-candidates__item:hover {
    border-color: var(--isis-accent, #4b5fad);
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-merge-candidates__position {
    font-weight: 600;
    color: var(--isis-text-muted, #475569);
    font-size: 0.85rem;
    flex-shrink: 0;
    min-width: 32px;
}
.isis-merge-candidates__main {
    flex: 1;
    min-width: 0;
}
.isis-merge-candidates__desc {
    font-size: 0.85rem;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-merge-candidates__meta {
    font-size: 0.72rem;
    color: var(--isis-text-muted, #475569);
    margin-top: 0.1rem;
}
.isis-devis-items__add-row {
    display: flex;
    gap: 0.4rem;
    margin-top: 0.6rem;
}
.isis-devis-items__add {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.35rem 0.7rem;
    background: transparent;
    /* border-style identique au repos et au hover : évite le "saut" de
       layout dû au rendu pixel différent dashed vs solid sur certains browsers.
       Le hover utilise box-shadow inset pour simuler une bordure solide
       expressive sans déformer la box. */
    border: 1px dashed var(--isis-border);
    border-radius: 6px;
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 140ms ease, color 140ms ease,
                box-shadow 140ms ease, transform 90ms ease;
}
.isis-devis-items__add:hover {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 10%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    /* Anneau interne solide en couleur module : effet "pastille allumée"
       sans agrandir la box (box-shadow ne participe pas au layout, ≠ border). */
    box-shadow: inset 0 0 0 1px var(--isis-current-mod, var(--isis-accent)),
                0 1px 2px rgba(15, 23, 42, 0.06);
}
.isis-devis-items__add:active {
    /* Feedback tactile au clic : très léger enfoncement (transform translateY
       n'affecte pas le layout des frères) + ombre réduite. */
    transform: translateY(1px);
    box-shadow: inset 0 0 0 1px var(--isis-current-mod, var(--isis-accent));
}

.isis-devis-totals {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    font-size: 0.82rem;
    background: var(--isis-surface-soft, #f8fafc);
    padding: 0.85rem 1rem;
    border-radius: 8px;
}
.isis-devis-totals__row {
    display: flex;
    justify-content: space-between;
    font-variant-numeric: tabular-nums;
}
.isis-devis-totals__row--ttc {
    padding-top: 0.4rem;
    margin-top: 0.2rem;
    border-top: 1px solid var(--isis-border);
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}

/* Split vertical du panneau latéral droit (TiersListPage) : aperçu en haut,
   activité récente en bas séparée par un trait. */
.isis-detail-split {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}
.isis-detail-split__top {
    flex: 0 0 auto;
    padding-bottom: 1rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-detail-split__middle {
    flex: 0 1 auto;
    padding: 0.85rem 0;
    border-bottom: 1px solid var(--isis-border);
    max-height: 35%;
    min-height: 80px;
    overflow-y: auto;
}
.isis-detail-split__bottom {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding-top: 0.85rem;
}
.isis-detail-split__title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.7rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-muted);
    margin-bottom: 0.5rem;
}
.isis-detail-split__title-action {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: transparent;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.isis-detail-split__title-action:hover,
.isis-detail-split__title-action:focus-visible {
    /* Polish 2026-06 : était hardcodé sur gescompta (violet) → hover violet sur page bleue.
       Suit désormais la couleur du module courant. */
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 8%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}
.isis-detail-split__empty {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    padding: 0.5rem 0.2rem;
}
.isis-detail-split__empty kbd {
    display: inline-block;
    padding: 0 4px;
    font-family: inherit;
    font-size: 0.78rem;
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    background: var(--isis-bg-soft, #f7f8fa);
    color: var(--isis-text);
}

/* Variante grille StructureTypeListPage : 6 colonnes (status / code / libellé / portée / ordre / actions) */
.isis-grid--structure-types .isis-grid__head,
.isis-grid--structure-types .isis-grid__row {
    grid-template-columns: 32px 140px minmax(220px, 1.6fr) 180px 90px 90px;
    min-width: 820px;
}

/* Variante grille jalons AO (migration 0258) : 6 colonnes
   (type / description / statut / prévu / effectué / actions). */
.isis-grid--jalons .isis-grid__head,
.isis-grid--jalons .isis-grid__row {
    grid-template-columns: 200px minmax(220px, 2fr) 140px 160px 160px 220px;
    min-width: 1100px;
}
.isis-grid--jalons .isis-grid__row.is-effectue { opacity: 0.85; }
.isis-grid--jalons .isis-grid__row.is-annule   { opacity: 0.55; text-decoration: line-through; }
.isis-grid--jalons .isis-grid__row.is-reporte  {
    background: var(--isis-accent-warm-soft);
}

/* Variante grille AccrualRuleListPage : 8 colonnes (status / type / pays / période / j-mois / plafond / validité / actions) */
.isis-grid--accrual .isis-grid__head,
.isis-grid--accrual .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1.4fr) 110px 200px 90px 110px 180px 90px;
    min-width: 1040px;
}

/* Variante grille AdminModuleRolesPanel : 5 colonnes (status / code / libellé / statut / actions) */
.isis-grid--admin-roles .isis-grid__head,
.isis-grid--admin-roles .isis-grid__row {
    grid-template-columns: 32px 160px minmax(220px, 1.6fr) 130px 80px;
    min-width: 720px;
}

/* Variante grille AdminModuleUsersPanel : 7 colonnes (status / login / nom / accès / rôles module / statut compte / actions) */
.isis-grid--admin-users .isis-grid__head,
.isis-grid--admin-users .isis-grid__row {
    grid-template-columns: 32px 160px minmax(180px, 1.2fr) 120px minmax(200px, 1.4fr) 140px 100px;
    min-width: 1080px;
}
.isis-grid--admin-users .isis-grid__row.is-muted { opacity: 0.65; }
.isis-grid--admin-users .isis-grid__col-roles {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem;
}

/* Variante grille PermissionsPage : 3 colonnes (page / action / accordée) */
.isis-grid--permissions .isis-grid__head,
.isis-grid--permissions .isis-grid__row {
    grid-template-columns: minmax(220px, 1.4fr) minmax(220px, 1.4fr) 110px;
    min-width: 640px;
}
/* Marque le début d'un groupe de page : bordure haute renforcée + bande de fond.
   Sans cela, dans une longue liste, l'utilisateur perd vite à quelle page
   appartient l'action affichée. */
.isis-grid--permissions .isis-grid__row--group-start {
    border-top: 2px solid var(--isis-border);
    background: var(--isis-surface-alt);
}
.isis-grid--permissions .isis-grid__row--group-start:hover {
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
}
.isis-grid--permissions .isis-grid__row--group-start:first-child {
    border-top: none;
}

/* ─────────────────────────────────────────────────────────────────────────
   Matrice de permissions 2D : pages (lignes) × actions (colonnes)
   Pattern dédié, distinct de .isis-grid--permissions (l'ancienne grille 3-col
   est conservée par compatibilité au cas où d'autres écrans s'y réfèrent ;
   PermissionsPage.razor utilise désormais .isis-perm-matrix).
   ───────────────────────────────────────────────────────────────────────── */
.isis-perm-matrix {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: auto;
}

.isis-perm-matrix__head,
.isis-perm-matrix__row,
.isis-perm-matrix__foot {
    display: grid;
    /* Page label (flex) | batch row 56px | N × action 72px chacune */
    grid-template-columns: minmax(280px, 1.4fr) 56px repeat(var(--isis-perm-actions, 8), 72px);
    min-width: 920px;
    align-items: center;
}

.isis-perm-matrix__head {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--isis-surface);
    border-bottom: 1px solid var(--isis-border);
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    padding: 0.5rem 0;
}
.isis-perm-matrix__head > div {
    padding: 0 0.5rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.1rem;
}
.isis-perm-matrix__head > div:first-child {
    align-items: flex-start;
    padding-left: 0.75rem;
}

.isis-perm-matrix__col-label {
    font-weight: 600;
}
.isis-perm-matrix__col-code {
    font-family: var(--isis-font-mono, "JetBrains Mono", Menlo, monospace);
    font-size: 0.68rem;
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
    opacity: 0.6;
}

.isis-perm-matrix__row {
    border-bottom: 1px solid var(--isis-border-soft, rgba(0, 0, 0, 0.04));
    padding: 0.35rem 0;
    transition: background-color 120ms ease;
}
.isis-perm-matrix__row:hover {
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
}
/* Hint visuel : ligne sans aucune permission accordée = teinte discrète.
   Ligne avec TOUTES les permissions = bandeau gauche teinté.
   Permet de scanner verticalement les pages "vides" ou "complètes". */
.isis-perm-matrix__row.is-empty {
    opacity: 0.72;
}
.isis-perm-matrix__row.is-full {
    box-shadow: inset 3px 0 0 0 var(--isis-current-mod, var(--isis-accent));
}

.isis-perm-matrix__cell-page {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0 0.75rem;
    min-width: 0;
}
.isis-perm-matrix__page-label {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-perm-matrix__page-code {
    font-family: var(--isis-font-mono, "JetBrains Mono", Menlo, monospace);
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.isis-perm-matrix__cell-batch,
.isis-perm-matrix__cell-action {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 32px;
}
.isis-perm-matrix__cell-batch {
    border-right: 1px dashed var(--isis-border);
}

.isis-perm-matrix__foot {
    position: sticky;
    bottom: 0;
    z-index: 2;
    background: var(--isis-surface-alt);
    border-top: 2px solid var(--isis-border);
    padding: 0.4rem 0;
    font-size: 0.78rem;
    font-weight: 500;
}
.isis-perm-matrix__foot-label {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    padding: 0 0.75rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: 600;
}

/* Toolbar : pavé "Copier depuis ... [Appliquer]" */
.isis-perm-copy {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.5rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-perm-copy__label {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
}

/* Champ recherche en 3ème ligne de la filter-bar (après chips Module + Rôle). */
.isis-filter-bar__search {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0 0.65rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    height: 34px;
    min-width: 280px;
    max-width: 420px;
}
.isis-filter-bar__search-input {
    flex: 1;
    border: 0;
    outline: 0;
    background: transparent;
    font-family: inherit;
    font-size: 0.875rem;
    color: var(--isis-text);
    padding: 0;
    min-width: 0;
}
.isis-filter-bar__search-input::placeholder {
    color: var(--isis-text-muted);
}
.isis-filter-bar__search-clear {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: 0;
    color: var(--isis-text-muted);
    cursor: pointer;
    padding: 2px;
    border-radius: 4px;
}
.isis-filter-bar__search-clear:hover,
.isis-filter-bar__search-clear:focus-visible {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

/* Variante grille DocumentKindListPage : 7 colonnes (status / libellé / module-entité / kind / pays / ordre / actions) */
.isis-grid--doc-kinds .isis-grid__head,
.isis-grid--doc-kinds .isis-grid__row {
    grid-template-columns: 32px minmax(200px, 1.4fr) minmax(180px, 1fr) 150px 110px 80px 90px;
    min-width: 1000px;
}

/* Variante grille LegalTemplateListPage : 7 colonnes (status / pays / slot / libellé / regex / ordre / actions) */
.isis-grid--legal-fields .isis-grid__head,
.isis-grid--legal-fields .isis-grid__row {
    grid-template-columns: 32px 90px 130px minmax(180px, 1.2fr) minmax(160px, 1fr) 80px 90px;
    min-width: 920px;
}

/* Variante grille DevisCounterListPage : 5 colonnes consultation (status / structure / portée / valeur / date) */
.isis-grid--devis-counters .isis-grid__head,
.isis-grid--devis-counters .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.6fr) 200px 160px 200px;
    min-width: 820px;
}

/* Variante grille AppelOffreListPage (gesmaff) : 7 colonnes
   status / référence / intitulé / maître d'ouvrage / date limite / montant / actions */
.isis-grid--ao .isis-grid__head,
.isis-grid--ao .isis-grid__row {
    grid-template-columns: 32px 140px minmax(260px, 2fr) minmax(180px, 1.2fr) 110px 160px 90px;
    min-width: 1100px;
}

/* Variante grille MarcheListPage (gesmaff) : 7 colonnes
   status / numéro / intitulé / maître d'ouvrage / signature / montant TTC / actions */
.isis-grid--marche .isis-grid__head,
.isis-grid--marche .isis-grid__row {
    grid-template-columns: 32px 160px minmax(260px, 2fr) minmax(180px, 1.2fr) 110px 160px 90px;
    min-width: 1100px;
}

/* Variante grille EngagementListPage (gesst) : 8 colonnes
   status / numéro / intitulé / type ST / sous-traitant / affaire / montant HT / actions */
.isis-grid--engagement .isis-grid__head,
.isis-grid--engagement .isis-grid__row {
    grid-template-columns: 32px 150px minmax(220px, 1.8fr) 110px minmax(180px, 1.2fr) minmax(180px, 1.2fr) 140px 90px;
    min-width: 1180px;
}

/* Variante grille référentiels gesmat (page admin) : 6 colonnes
   libellé / 2è col contextuel / 3è col contextuel / tri / badges / actions */
.isis-grid--gesmat-ref .isis-grid__head,
.isis-grid--gesmat-ref .isis-grid__row {
    grid-template-columns: minmax(220px, 2fr) minmax(160px, 1fr) minmax(140px, 1fr) 90px 100px 90px;
    min-width: 880px;
}

/* Variante grille catalogue compétences SIRH : 6 colonnes
   libellé / catégorie / description / renouv / période / actions */
.isis-grid--sirh-competence .isis-grid__head,
.isis-grid--sirh-competence .isis-grid__row {
    grid-template-columns: minmax(220px, 2fr) 160px minmax(220px, 2fr) 100px 110px 90px;
    min-width: 980px;
}

/* Sprint U H2 — grille objectifs gespla : 7 colonnes
   type / ref / libellé / cible / plancher / note / actions */
.isis-grid--gespla-objectifs .isis-grid__head,
.isis-grid--gespla-objectifs .isis-grid__row {
    grid-template-columns: 130px 130px minmax(180px, 2fr) 100px 100px minmax(160px, 1.5fr) 100px;
    min-width: 960px;
}
.isis-grid--gespla-objectifs .isis-grid__code {
    font-family: monospace;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-grid--gespla-objectifs .isis-grid__note {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Variante grille compétences attribuées à un collab : 7 colonnes
   compétence / catégorie / niveau / acquise / périmé / source / actions */
.isis-grid--sirh-collab-comp .isis-grid__head,
.isis-grid--sirh-collab-comp .isis-grid__row {
    grid-template-columns: minmax(200px, 2fr) 140px 130px 110px 160px 130px 90px;
    min-width: 1020px;
}

/* État de péremption (visuel sobre pour les dates) */
.isis-grid__perime--ok      { color: var(--isis-text); }
.isis-grid__perime--soon    { color: var(--isis-warning); font-weight: 600; }
.isis-grid__perime--expired { color: var(--isis-danger); font-weight: 600; }
.isis-grid__perime--none    { color: var(--isis-text-muted); }

/* Variante grille dashboard péremption SIRH : 8 colonnes
   collab / compétence / catégorie / niveau / acquise / périmé / reste / actions */
.isis-grid--sirh-peremption .isis-grid__head,
.isis-grid--sirh-peremption .isis-grid__row {
    grid-template-columns: minmax(180px, 1.5fr) minmax(160px, 1.5fr) 140px 130px 110px 110px 110px 70px;
    min-width: 1120px;
}

/* Variante grille matrice compétences MASTER (gauche) : 3 colonnes
   compétence / catégorie / count (cliquable) */
.isis-grid--sirh-matrice-master .isis-grid__head,
.isis-grid--sirh-matrice-master .isis-grid__row {
    grid-template-columns: minmax(180px, 2fr) 140px 100px;
    min-width: 460px;
}

/* Variante grille matrice DETAIL (droite, dans le sidepanel) : 5 colonnes
   collab / niveau / acquise / péremption / actions */
.isis-grid--sirh-matrice-detail .isis-grid__head,
.isis-grid--sirh-matrice-detail .isis-grid__row {
    grid-template-columns: minmax(160px, 2fr) 130px 100px 110px 70px;
    min-width: 600px;
}

/* Badge compteur (pour la matrice master — affiche "X détenteurs") */
.isis-grid__count-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 28px;
    height: 22px;
    padding: 0 0.5rem;
    border-radius: var(--isis-radius-pill);
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 12%, white);
    color: var(--isis-current-mod, var(--isis-accent));
    font-size: 0.72rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}
/* Variante 3 colonnes pour Marques (simple : libellé / pays / actions) */
.isis-grid--gesmat-ref-3col .isis-grid__head,
.isis-grid--gesmat-ref-3col .isis-grid__row {
    grid-template-columns: minmax(280px, 2fr) 160px 90px;
    min-width: 540px;
}

/* Variante grille FactureListPage (gesst) : 7 colonnes
   numéro externe / engagement (numéro+intitulé) / date / échéance / montant TTC / payé / actions */
.isis-grid--gesst-facture .isis-grid__head,
.isis-grid--gesst-facture .isis-grid__row {
    grid-template-columns: 160px minmax(240px, 2fr) 110px 110px 140px 130px 90px;
    min-width: 1100px;
}

/* Variante grille FactureEmiseListPage (gescompta) : 8 colonnes
   status / numéro / date / client / intitulé / montant TTC / payé / actions */
.isis-grid--factures-emises .isis-grid__head,
.isis-grid--factures-emises .isis-grid__row {
    grid-template-columns: 32px 160px 110px minmax(200px, 1.4fr) minmax(220px, 2fr) 140px 130px 110px;
    min-width: 1180px;
}

/* Variante grille FactureRecueListPage (gescompta) : 8 colonnes
   status / numéro externe / date / fournisseur / intitulé / montant TTC / payé / actions */
.isis-grid--factures-recues .isis-grid__head,
.isis-grid--factures-recues .isis-grid__row {
    grid-template-columns: 32px 160px 110px minmax(200px, 1.4fr) minmax(220px, 2fr) 140px 130px 110px;
    min-width: 1180px;
}

/* Édition inline des lignes facture (dialog FormLinear) */
.isis-facture-items {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-facture-item-row {
    display: flex;
    gap: 0.5rem;
    align-items: flex-end;
    flex-wrap: wrap;
    padding: 0.55rem 0.65rem;
    background: var(--isis-surface-soft);
    border-radius: 6px;
    border: 1px solid var(--isis-border);
}
.isis-facture-item-row .field { margin: 0; }

/* Totaux récap (sous la liste de lignes) */
.isis-facture-totals {
    display: flex;
    gap: 1.5rem;
    margin-top: 0.75rem;
    padding: 0.65rem 0.85rem;
    background: var(--isis-mod-gescompta-soft);
    border-radius: 6px;
    border: 1px solid var(--isis-border);
    font-size: 0.88rem;
    font-variant-numeric: tabular-nums;
}
.isis-facture-totals div { display: flex; flex-direction: column; gap: 0.15rem; }
.isis-facture-totals .lbl {
    color: var(--isis-text-muted);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-facture-totals .val { font-weight: 600; }
.isis-facture-totals__ttc { color: var(--isis-mod-gescompta); font-size: 1.05rem; }

/* Tableau lecture-seule des lignes / paiements (page détail) */
.isis-facture-items-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.88rem;
}
.isis-facture-items-table thead th {
    text-align: left;
    text-transform: uppercase;
    font-size: 0.72rem;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 500;
    padding: 0.55rem 0.65rem;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface);
}
.isis-facture-items-table tbody td {
    padding: 0.55rem 0.65rem;
    border-bottom: 1px solid var(--isis-border);
    vertical-align: top;
}
.isis-facture-items-table tbody tr:last-child td { border-bottom: none; }
.isis-facture-items-table tbody tr:hover td { background: var(--isis-surface-soft); }

/* Badge miroir intra-tenant (facture reçue créée auto par une facture émise) */
.isis-mirror-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.6rem;
    background: var(--isis-mod-gescompta-soft);
    color: var(--isis-text);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-size: 0.78rem;
    font-weight: 500;
}
.isis-mirror-badge a {
    color: var(--isis-text);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
}

/* Status dot warning (suspendu) */
.isis-grid__status-dot.is-warning { background: #f59e0b; }

/* Variante grille DemandeClientListPage (gesmaff) : 7 colonnes
   référence / intitulé / client / date / canal / statut / actions
   (migration 0234 — colonne statut ajoutée pour pilotage commercial) */
.isis-grid--demande-client .isis-grid__head,
.isis-grid--demande-client .isis-grid__row {
    grid-template-columns: 140px minmax(260px, 2fr) minmax(180px, 1.2fr) 130px 130px 130px 90px;
    min-width: 1080px;
}

/* Statuts AO (réutilise les status-dot existants).
   Ajoute des classes sémantiques génériques pour les badges. */
.isis-grid__status-dot.is-ok     { background: #16a34a; } /* obtenu */
.isis-grid__status-dot.is-draft  { background: #6b7280; } /* prévu */
.isis-grid__status-dot.is-danger { background: #dc2626; } /* perdu / annulé */
.isis-grid__status-dot.is-muted  { background: #9ca3af; opacity: 0.7; } /* abandonné */

/* Status dots facturation : contraste renforcé (WCAG 1.4.11 ≥3:1).
   Override local pour ne pas impacter les autres grilles du système. */
.isis-grid--factures-emises .isis-grid__status-dot.is-warning,
.isis-grid--factures-recues .isis-grid__status-dot.is-warning,
.isis-grid--factures-corbeille .isis-grid__status-dot.is-warning {
    background: #d97706; /* terre cuite, ratio 3.37:1 sur blanc */
}
.isis-grid--factures-emises .isis-grid__status-dot.is-ok,
.isis-grid--factures-recues .isis-grid__status-dot.is-ok,
.isis-grid--factures-corbeille .isis-grid__status-dot.is-ok {
    background: #15803d; /* vert plus saturé, ratio 3.30:1 sur surface-alt */
}

/* Variante grille « Formats par structure » de DevisCounterListPage :
   6 colonnes (status-dot personnalisé/défaut / structure+shortcode / pays /
   pattern / aperçu / compteurs). Sélectionnable au clavier (Enter ouvre dialog,
   Space sélectionne) — le sidepanel suit la sélection. */
.isis-grid--devis-formats .isis-grid__head,
.isis-grid--devis-formats .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1.3fr) 70px minmax(220px, 1.6fr) minmax(180px, 1.1fr) 90px;
    min-width: 880px;
}

/* Variante dialog « Transformer en commande » — étape preview :
   3 colonnes (Entreprise + badge / Lignes / Montant HT). L'entreprise prend
   tout l'espace restant pour absorber le nom long + le shortcode + le badge
   « principale ». Les colonnes numériques restent tabular-nums. */
.isis-grid--transform-groups .isis-grid__head,
.isis-grid--transform-groups .isis-grid__row {
    grid-template-columns: minmax(280px, 1fr) 90px 160px;
    min-width: 600px;
    column-gap: 0.75rem;
}
.isis-grid--transform-groups .isis-grid__row > div {
    white-space: normal;
    word-break: break-word;
}

/* Variante dialog « Transformer en commande » — étape result : 4 colonnes
   (Numéro mono / Entreprise / Lignes / Montant HT). */
.isis-grid--transform-result .isis-grid__head,
.isis-grid--transform-result .isis-grid__row {
    grid-template-columns: 160px minmax(240px, 1fr) 90px 160px;
    min-width: 700px;
    column-gap: 0.75rem;
}
.isis-grid--transform-result .isis-grid__row > div {
    white-space: normal;
    word-break: break-word;
}
.isis-grid__short-code {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
    border-radius: 4px;
}
.isis-grid__badge-default {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    font-size: 0.65rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
}
/* Badge « jamais émis » : remplace la valeur 0 brute dans la colonne
   compteur (page /gescom/config/numerotation). Plus explicite que « 0 »
   et signale visuellement les structures inactives sans alarmer. */
.isis-grid__badge-never {
    display: inline-block;
    padding: 0.05rem 0.45rem;
    font-size: 0.7rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
    border: 1px dashed var(--isis-border);
    border-radius: 10px;
    font-variant-numeric: normal;
}
.isis-fmt-pattern,
.isis-fmt-preview-inline {
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.78rem;
    background: var(--isis-surface-alt);
    padding: 0.1rem 0.4rem;
    border-radius: 4px;
    word-break: break-all;
}
/* Distinction sémantique : "pattern" = code source, "preview" = rendu (italique) */
.isis-fmt-pattern { color: var(--isis-text); }
.isis-fmt-preview-inline { color: var(--isis-text-muted); font-style: italic; }

/* Titre de section au sein d'une rich-page (sépare deux grilles) */
/* ============================================================================
   Bandeau Participants (cotraitants / soustraitants) — DevisDetail
   ============================================================================ */
.isis-participants-ribbon {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-sm);
    flex-shrink: 0;
}
.isis-participants-ribbon__label {
    flex-shrink: 0;
    font-size: 0.66rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-muted);
}
.isis-participants-ribbon__items {
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    min-width: 0;
}
.isis-participants-ribbon__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.18rem 0.55rem;
    font-size: 0.74rem;
    border-radius: 4px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    white-space: nowrap;
}
.isis-participants-ribbon__chip strong {
    font-size: 0.62rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    padding: 0.05rem 0.3rem;
    border-radius: 3px;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
}
/* Titulaire : couleur module courant (propagée par .isis-shell__content.mod-*),
   fallback accent transverse — pas de hardcode sur gescom. */
.isis-participants-ribbon__chip.is-titulaire strong {
    background: var(--isis-current-mod-soft);
    color: var(--isis-current-mod);
}
/* Cotraitant : accent transverse (4b5fad sur eef0f9 = 5.21:1, AA pass). */
.isis-participants-ribbon__chip.is-cotraitant strong {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}
/* Sous-traitant : neutre. L'orange warning suggérait à tort un état d'alerte et
   donnait 2.86:1 (échec AA). Bg surface-alt + texte dark = identité distincte
   du cotraitant + contraste >9:1. */
.isis-participants-ribbon__chip.is-soustraitant strong {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-participants-ribbon__share {
    font-size: 0.68rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
/* Drapeau « ext. » pour les partenaires externes (P3). */
.isis-participants-ribbon__ext-flag {
    font-size: 0.58rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    padding: 0 0.3rem;
    border-radius: 3px;
}
.isis-participants-ribbon__empty {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
/* Interlocuteur déclaré sur un participant (migration 0092) : icône + nom court. */
.isis-participants-ribbon__interloc {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin-left: 0.25rem;
    padding: 0 0.3rem;
    font-size: 0.66rem;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
}
.isis-participants-ribbon__interloc .rzi { font-size: 11px; }

.isis-rich-section-title {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin: 1.5rem 0 0.6rem;
}

/* Dialog DevisNumberFormatDialog — input pattern, aperçu, erreurs, tokens */
.isis-fmt-input {
    width: 100%;
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.88rem;
    padding: 0.55rem 0.7rem;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
    color: var(--isis-text);
}
.isis-fmt-input:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
    border-color: var(--isis-accent);
}
.isis-fmt-errors {
    list-style: disc;
    padding-left: 1.25rem;
    margin: 0.4rem 0 0;
    color: var(--isis-danger);
    font-size: 0.78rem;
}
.isis-fmt-preview {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.6rem 0.85rem;
}
.isis-fmt-preview__value {
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 1rem;
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-fmt-preview__placeholder {
    font-size: 1rem;
    color: var(--isis-text-muted);
}
.isis-fmt-preview__hint {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-fmt-tokens {
    padding: 0;
    margin: 0;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.35rem 0.85rem;
}
.isis-fmt-tokens > div {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    font-size: 0.78rem;
}
.isis-fmt-tokens dt { margin: 0; }
.isis-fmt-tokens dd { margin: 0; color: var(--isis-text-muted); }
.isis-fmt-tokens code {
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.74rem;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    padding: 0.05rem 0.35rem;
    border-radius: 3px;
    white-space: nowrap;
}
@media (max-width: 720px) {
    .isis-fmt-tokens { grid-template-columns: 1fr; }
}

/* Sidepanel de DevisCounterListPage — détails du format + compteurs */
.isis-fmt-side-pattern,
.isis-fmt-side-preview {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-fmt-preview-block {
    display: inline-block;
    align-self: flex-start;
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.92rem;
    font-weight: 600;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    padding: 0.35rem 0.65rem;
    border-radius: 6px;
    font-variant-numeric: tabular-nums;
}
.isis-fmt-counters {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-fmt-counters__row {
    display: grid;
    grid-template-columns: 14px 1fr auto 70px;
    gap: 0.5rem;
    align-items: center;
    padding: 0.3rem 0.4rem;
    border: 1px solid var(--isis-border-soft);
    border-radius: 5px;
    background: var(--isis-surface);
    font-size: 0.8rem;
}
.isis-fmt-counters__scope { color: var(--isis-text); }
.isis-fmt-counters__value {
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-fmt-counters__when {
    text-align: right;
    color: var(--isis-text-muted);
    font-size: 0.74rem;
    font-variant-numeric: tabular-nums;
}
.isis-fmt-counters__empty {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    padding: 0.4rem 0;
}

/* Variante grille TarifListPage : 7 colonnes (status / article / entreprise / libellé / prix+devise / validité / actions) */
.isis-grid--tarifs .isis-grid__head,
.isis-grid--tarifs .isis-grid__row {
    grid-template-columns: 32px minmax(200px, 1.4fr) minmax(160px, 1fr) minmax(140px, 1fr) 200px 180px 90px;
    min-width: 1100px;
}

/* Variante grille CountryListPage : 8 colonnes (status / code / nom / iso3 / devise / réf compta / indicatif / actions) */
.isis-grid--countries .isis-grid__head,
.isis-grid--countries .isis-grid__row {
    grid-template-columns: 32px 90px minmax(200px, 1.6fr) 90px 100px 160px 120px 80px;
    min-width: 880px;
}

/* Bannière de filtre actif (ex: "Filtré par article X" sur TarifListPage) -- */
.isis-active-filter {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.55rem 0.85rem;
    margin: 0 0 0.55rem 0;
    /* Module-agnostique : suit la couleur du module courant (--isis-current-mod
       posée par .isis-shell__content.mod-*), accent générique en repli. */
    border: 1px solid var(--isis-current-mod, var(--isis-accent));
    border-radius: 4px;
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
    color: var(--isis-text);
    font-size: 0.82rem;
}
.isis-active-filter strong {
    color: var(--isis-current-mod, var(--isis-accent));
}
.isis-active-filter__clear {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.2rem 0.5rem;
    font-size: 0.78rem;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: var(--isis-surface, #fff);
    color: var(--isis-text);
    cursor: pointer;
    transition: background 0.12s, color 0.12s;
}
.isis-active-filter__clear:hover,
.isis-active-filter__clear:focus-visible {
    background: var(--isis-current-mod, var(--isis-accent));
    color: var(--isis-surface, #fff);
    outline: none;
}

/* Liste de prix dans le sidepanel catalogue ------------------------------- */
.isis-price-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-price-list__item {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.5rem 0.55rem;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: var(--isis-surface, #fff);
}
.isis-price-list__item.is-default {
    border-color: var(--isis-mod-gescompta, #4b5fad);
    background: var(--isis-mod-gescompta-soft, #eef0f8);
}
.isis-price-list__item.is-expired {
    opacity: 0.6;
}
.isis-price-list__main {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.18rem;
}
.isis-price-list__price {
    display: flex;
    align-items: baseline;
    gap: 0.25rem;
    font-variant-numeric: tabular-nums;
    font-size: 0.95rem;
    color: var(--isis-text);
}
.isis-price-list__currency {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-weight: 500;
}
.isis-price-list__ht {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-left: 0.2rem;
}
.isis-price-list__meta {
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    display: flex;
    flex-wrap: wrap;
    gap: 0.15rem;
}
.isis-price-list__sep {
    opacity: 0.5;
}
.isis-price-list__badges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    margin-top: 0.15rem;
}
.isis-price-list__badge {
    display: inline-block;
    padding: 1px 6px;
    font-size: 0.66rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    border-radius: var(--isis-radius-pill);
    border: 1px solid currentColor;
    color: var(--isis-text-muted);
    background: transparent;
}
.isis-price-list__badge.is-default {
    color: var(--isis-mod-gescompta, #4b5fad);
    background: var(--isis-surface, #fff);
}
.isis-price-list__badge.is-expired {
    color: var(--isis-warning, #a66f02);
}
.isis-price-list__actions {
    display: flex;
    gap: 0.15rem;
    flex: 0 0 auto;
}

/* WCAG : cacher visuellement mais garder accessible aux lecteurs d'écran */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.isis-rich-header__badges {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-top: 0.2rem;
}
.isis-rich-header__pill {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.2rem 0.6rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.72rem;
    font-weight: 500;
    /* Teinte module par défaut — accent global en fallback hors-module */
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    transition: background-color 200ms ease, color 200ms ease;
}
/* Variantes sémantiques — priorité sur la teinte module */
.isis-rich-header__pill--warning { background: var(--isis-warning-soft); color: #92400e; }
.isis-rich-header__pill--danger  { background: var(--isis-danger-soft);  color: #991b1b; }
.isis-rich-header__pill--success { background: var(--isis-success-soft); color: #065f46; }
/* Variante cliquable : un <a> stylé comme un pill, avec hover discret. */
a.isis-rich-header__pill {
    text-decoration: none;
    cursor: pointer;
}
a.isis-rich-header__pill:hover {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
}
a.isis-rich-header__pill:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-rich-header__scope {
    display: inline-flex;
    background: var(--isis-surface-alt);
    border-radius: 8px;
    padding: 2px;
    gap: 1px;
    align-self: flex-start;
}
.isis-rich-header__scope button {
    height: 28px;
    padding: 0 0.7rem;
    border: none;
    background: transparent;
    color: var(--isis-text-muted);
    font-size: 0.75rem;
    border-radius: 6px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
}
.isis-rich-header__scope button.active {
    background: var(--isis-surface);
    color: var(--isis-text);
    border-color: var(--isis-border);
    font-weight: 500;
}

/* KPI hero — refonte B "Branded depth" 2026-05-17 : gradient subtil module 135°
   (blanc → tinte module 6%). Donne un léger relief volumétrique et une touche
   d'identité module au bandeau principal de chaque page. */
.isis-kpi-hero {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
    gap: 0.5rem;
    background: var(--isis-surface);
    background: linear-gradient(135deg,
        var(--isis-surface) 0%,
        color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 6%, var(--isis-surface)) 100%);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 0.85rem 1rem;
    box-shadow: var(--isis-elevation-1);
    /* Audit UX 2026 : top-align les cartes. Sans ça, une carte plus haute
       (ex: KPI-ancre avec sparkline) étire les autres en stretch et fait
       flotter leur contenu verticalement. Neutre quand toutes ont la même hauteur. */
    align-items: start;
}
.isis-kpi-card {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.2rem 0.6rem;
    border-left: 1px solid var(--isis-border);
}
.isis-kpi-card:first-child { border-left: none; padding-left: 0.2rem; }

/* KPI card cliquable (drill-down filtre statut). Hérite des styles .isis-kpi-card
   mais ajoute interactivité : cursor pointer, hover subtle, état actif marqué. */
button.isis-kpi-card--clickable {
    background: transparent;
    text-align: left;
    cursor: pointer;
    font-family: inherit;
    border-top: none;
    border-right: none;
    border-bottom: none;
    /* Garde le border-left de .isis-kpi-card pour la séparation */
    transition: background 120ms ease, transform 60ms ease;
    position: relative;
}
button.isis-kpi-card--clickable:hover {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 4%, transparent);
}
button.isis-kpi-card--clickable:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}
button.isis-kpi-card--clickable.is-active {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 10%, transparent);
}
button.isis-kpi-card--clickable.is-active::after {
    content: "";
    position: absolute;
    left: 50%;
    bottom: -0.4rem;
    transform: translateX(-50%);
    width: 60%;
    height: 2px;
    background: var(--isis-current-mod, var(--isis-accent));
    border-radius: 1px;
}
.isis-kpi-card__label {
    font-size: 0.65rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--isis-text-soft);
}
.isis-kpi-card__value {
    /* Aligné NetLogger V3 (cdv3-kpi-num = 20px/600 mono -0.01em). ISIS détendu = 22px.
       KPI ≤ Titre H5 : hiérarchie respectée (KPI accent rythme le scan, titre reste roi). */
    font-size: 1.375rem;
    font-weight: 600;
    /* Couleur du module courant par défaut — pop sur le total/principal.
       Les classes .is-warning/.is-danger/.is-success/.is-info gardent la priorité
       quand la sémantique l'exige (cf. ci-dessous). */
    color: var(--isis-current-mod, var(--isis-text));
    line-height: 1.15;
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.01em;
}
.isis-kpi-card__value.is-info    { color: var(--isis-mod-gescom); }
/* Audit V1.5 2026-05-19 : hex hardcodés remplacés par les variables sémantiques
   (#d97706 / #dc2626 / #10b981 violaient DESIGN.md « palette --isis-* uniquement ». */
.isis-kpi-card__value.is-warning { color: var(--isis-warning); }
.isis-kpi-card__value.is-danger  { color: var(--isis-danger); }
.isis-kpi-card__value.is-success { color: var(--isis-success); }
.isis-kpi-card__value.is-neutral { color: var(--isis-text); }
/* is-module : utilise la couleur du module courant (--isis-current-mod défini
   par .isis-shell__content.mod-{code}). Préférer à is-info quand on veut
   l'identité couleur de la page courante plutôt que le bleu gescom en dur. */
.isis-kpi-card__value.is-module  { color: var(--isis-current-mod); }
.isis-kpi-card__hint {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
}
/* Sparkline compacte sous un KPI hero (tendance 12 mois de la métrique-ancre).
   Rendu inline SVG par RenderSparkline ; vide si pas d'historique réel. */
.isis-kpi-card__spark {
    display: block;
    width: 100%;
    height: 22px;
    margin-top: 0.3rem;
    /* opacity volontairement >= 0.85 : le trait terre-cuite (#c2410c) sur fond
       blanc donne ~5.2:1 à pleine opacité (passe WCAG 1.4.11 graphique 3:1).
       L'audit UX proposait 0.5 mais ça tombe à ~2.2:1 → refusé (a11y prime,
       la sparkline porte une info de tendance). */
    opacity: 0.85;
    overflow: hidden;
}

/* ════════════════════════════════════════════════════════════════════════════
   Dashboard gescom — look « DASHBOARD ARCHITECT » (SaaS clair, cartes élevées).
   Scopé .isis-gescom-dash : KPI cards à puce d'icône + valeur mono, sections en
   cartes blanches arrondies, charts Chart.js. N'impacte aucune autre page.
   ════════════════════════════════════════════════════════════════════════════ */
:root { --isis-cockpit-mono: 'Geist Mono', var(--isis-font-mono, ui-monospace), SFMono-Regular, Menlo, monospace; }

/* ── KPI hero : grille de cartes élevées ── */
.isis-gescom-dash .isis-kpi-hero {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 0.75rem;
    background: transparent;
    border: 0;
    box-shadow: none;
    padding: 0;
    align-items: stretch;
}
@media (max-width: 1100px) { .isis-gescom-dash .isis-kpi-hero { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px)  { .isis-gescom-dash .isis-kpi-hero { grid-template-columns: 1fr; } }
.isis-gescom-dash .isis-kpi-card {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 0.75rem;
    box-shadow: var(--isis-elevation-1);
    padding: 0.85rem 0.9rem;
    gap: 0.2rem;
    transition: box-shadow .14s ease, transform .08s ease;
}
.isis-gescom-dash .isis-kpi-card:hover { box-shadow: var(--isis-elevation-hover); transform: translateY(-1px); }
.isis-gescom-dash .isis-kpi-card__head { display: flex; align-items: center; gap: 0.5rem; }
.isis-gescom-dash .isis-kpi-card__chip {
    width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;
    display: inline-grid; place-items: center;
    background: color-mix(in srgb, var(--isis-mod-gescom) 11%, var(--isis-surface));
    color: var(--isis-mod-gescom);
}
.isis-gescom-dash .isis-kpi-card__chip .rzi { font-size: 1rem; line-height: 1; }
.isis-gescom-dash .isis-kpi-card__label {
    font-size: 11px; letter-spacing: .04em; text-transform: uppercase;
    color: var(--isis-text-muted); font-weight: 600; margin: 0;
}
.isis-gescom-dash .isis-kpi-card__value {
    font-family: var(--isis-cockpit-mono);
    font-size: 1.5rem; font-weight: 700; letter-spacing: -.02em; line-height: 1.02;
    margin-top: 0.3rem;
}
.isis-gescom-dash .isis-kpi-card__hint { font-size: 11px; margin-top: 0.25rem; color: var(--isis-text-muted); line-height: 1.25; }
/* Indicateur de tendance KPI (style mockup : flèche + % coloré + contexte gris) */
.isis-gescom-dash .isis-kpi-card__delta-row { display: flex; align-items: center; gap: 0.4rem; margin-top: 0.3rem; font-size: 11.5px; }
.isis-gescom-dash .isis-kpi-card__delta { display: inline-flex; align-items: center; gap: 0.1rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.isis-gescom-dash .isis-kpi-card__delta .rzi { font-size: 14px; }
.isis-gescom-dash .isis-kpi-card__delta.is-up { color: var(--isis-success); }
.isis-gescom-dash .isis-kpi-card__delta.is-down { color: var(--isis-danger); }
.isis-gescom-dash .isis-kpi-card__delta-ctx { color: var(--isis-text-muted); }
/* narrative anchor terre-cuite : 1re carte (CA signé) */
.isis-gescom-dash .isis-kpi-hero > .isis-kpi-card:first-child {
    background: linear-gradient(160deg, var(--isis-accent-warm-soft), var(--isis-surface) 70%);
    border-color: color-mix(in srgb, var(--isis-accent-warm) 22%, var(--isis-border));
}
.isis-gescom-dash .isis-kpi-hero > .isis-kpi-card:first-child .isis-kpi-card__chip {
    background: color-mix(in srgb, var(--isis-accent-warm) 13%, var(--isis-surface));
    color: var(--isis-accent-warm);
}
.isis-gescom-dash .isis-kpi-hero > .isis-kpi-card:first-child .isis-kpi-card__value { color: var(--isis-accent-warm-strong); }

/* ── Sections en cartes blanches ── */
.isis-gescom-dash .isis-rich-section {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 0.75rem;
    box-shadow: var(--isis-elevation-1);
    padding: 1.1rem 1.2rem;
}
.isis-gescom-dash .isis-dash-2col > .isis-rich-section { margin-top: 0; }
.isis-gescom-dash .isis-rich-section__header { border-bottom: 0; padding: 0; margin-bottom: 0.6rem; }
.isis-gescom-dash .isis-rich-section__title { font-size: 0.9rem; font-weight: 700; color: var(--isis-text); text-transform: none; letter-spacing: 0; }
.isis-gescom-dash .isis-rich-section__subtitle { font-size: 11.5px; color: var(--isis-text-muted); font-weight: 400; }

/* ── Densité : sections de listes plus compactes (marges, rejets, top clients,
   à relancer, services) — demande 2026 « plus compact ». ── */
.isis-gescom-dash .isis-rich-section { padding: 0.95rem 1.05rem; }
.isis-gescom-dash .isis-rich-section__header { margin-bottom: 0.45rem; }
.isis-gescom-dash .isis-leaderboard__row { padding: 0.26rem 0; }
.isis-gescom-dash .isis-leaderboard__name { font-size: 0.8rem; line-height: 1.25; }
.isis-gescom-dash .isis-leaderboard__sub { font-size: 0.7rem; line-height: 1.2; }
.isis-gescom-dash .isis-leaderboard__value { font-size: 0.8rem; }
.isis-gescom-dash .isis-margin-perf { gap: 0.55rem; }
.isis-gescom-dash .isis-margin-perf__list { gap: 0.05rem; }
.isis-gescom-dash .isis-margin-perf__row { padding: 0.24rem 0; }
.isis-gescom-dash .isis-margin-perf__name { font-size: 0.8rem; }
.isis-gescom-dash .isis-margin-perf__hint { font-size: 0.68rem; line-height: 1.2; }
.isis-gescom-dash .isis-margin-perf__count,
.isis-gescom-dash .isis-margin-perf__value { font-size: 0.75rem; }
.isis-gescom-dash .isis-dash-2col { gap: 1rem; }

/* ── Conteneur de canvas Chart.js (hauteur fixe pour le responsive Chart.js) ── */
.isis-gescom-dash .isis-dash-canvas { position: relative; height: 240px; }
.isis-gescom-dash .isis-dash-canvas--sm { position: relative; height: 200px; }

/* ── Funnel (dans carte) : barres arrondies, compteur mono ── */
.isis-gescom-dash .isis-funnel { align-items: stretch; }
.isis-gescom-dash .isis-funnel__row { grid-template-columns: 104px minmax(0, 1fr) 150px; gap: 12px; }
.isis-gescom-dash .isis-funnel__bar-wrap { height: 24px; border-radius: 7px; background: var(--isis-surface-alt); }
.isis-gescom-dash .isis-funnel__bar { border-radius: 7px; background-image: linear-gradient(180deg, rgba(255,255,255,.22), rgba(255,255,255,0) 55%); }
.isis-gescom-dash .isis-funnel__count { font-family: var(--isis-cockpit-mono); font-size: 11px; left: 9px; }
.isis-gescom-dash .isis-funnel__sub { font-size: 11px; }

/* ── Leaderboard : barre qui REMPLIT le milieu (libellé | barre | valeur) ── */
.isis-gescom-dash .isis-leaderboard__value,
.isis-gescom-dash .isis-donut__legend-value,
.isis-gescom-dash .isis-donut__total { font-family: var(--isis-cockpit-mono); }
.isis-gescom-dash .isis-leaderboard__row {
    grid-template-columns: minmax(170px, 1fr) minmax(0, 2.2fr) auto;
    background: transparent; padding: 0.4rem 0; border-radius: 0;
    border-bottom: 1px solid var(--isis-border);
}
.isis-gescom-dash .isis-leaderboard__row:hover { background: transparent; }
.isis-gescom-dash .isis-leaderboard__bar-wrap { height: 8px; border-radius: var(--isis-radius-pill); }
.isis-gescom-dash .isis-leaderboard__bar {
    border-radius: var(--isis-radius-pill); background: var(--isis-mod-gescom);
    background-image: linear-gradient(180deg, rgba(255,255,255,.25), rgba(255,255,255,0) 60%);
}

/* ── Cycle : timeline fine ── */
.isis-gescom-dash .isis-cycle-detail__stack { height: 24px; }
.isis-gescom-dash .isis-donut-wrap { gap: 1.4rem; }

/* ────────────────────────────────────────────────────────────────────────────
   KPIs étendus : graphique tendance + top liste + alerte (factures, etc.)
   Pattern Phase 2.B.3 facturation, réutilisable par toute page liste qui veut
   enrichir son KPI hero avec une dimension temporelle + un top + une alerte.
   ──────────────────────────────────────────────────────────────────────────── */
.isis-kpi-extended {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: 1.25rem;
    margin: 0;
    align-items: stretch;
}
.isis-kpi-extended__chart,
.isis-kpi-extended__top {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 0.85rem 1rem;
    box-shadow: var(--isis-elevation-1);
    min-width: 0;
}
.isis-kpi-extended__chart h3,
.isis-kpi-extended__top h3 {
    font-size: 0.7rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--isis-text-soft);
    margin: 0 0 0.6rem 0;
    font-weight: 600;
}
.isis-kpi-extended__charts-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.25rem;
    align-items: start;
}
.isis-kpi-extended__chart-col {
    min-width: 0;
}
.isis-kpi-extended__chart-col + .isis-kpi-extended__chart-col {
    padding-left: 1.25rem;
    border-left: 1px solid var(--isis-border);
}
@media (max-width: 1100px) {
    .isis-kpi-extended__charts-row {
        grid-template-columns: 1fr;
    }
    .isis-kpi-extended__chart-col + .isis-kpi-extended__chart-col {
        padding-left: 0;
        padding-top: 0.85rem;
        border-left: 0;
        border-top: 1px solid var(--isis-border);
    }
}
.isis-kpi-extended__chart svg {
    width: 100%;
    height: auto;
    max-height: 200px;
    display: block;
}
.isis-kpi-extended__empty {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    text-align: center;
    padding: 1rem 0.5rem;
}
.isis-kpi-extended__alert {
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    background: color-mix(in srgb, var(--isis-danger, #dc2626) 8%, var(--isis-surface));
    border-left: 3px solid var(--isis-danger, #dc2626);
    border-radius: 4px;
    padding: 0.7rem 0.95rem;
    color: var(--isis-text);
}
.isis-kpi-extended__alert > svg,
.isis-kpi-extended__alert > i,
.isis-kpi-extended__alert > .rz-icon {
    color: var(--isis-danger, #dc2626);
    flex-shrink: 0;
}
.isis-kpi-extended__alert div {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}
.isis-kpi-extended__alert strong {
    font-size: 0.9rem;
    font-weight: 600;
}
.isis-kpi-extended__alert span {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
@media (max-width: 900px) {
    .isis-kpi-extended {
        grid-template-columns: 1fr;
    }
}

/* Top liste (Top 5 clients/fournisseurs/etc.) — items numérotés en rang */
.isis-top-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
.isis-top-list li {
    display: grid;
    grid-template-columns: 24px 1fr auto;
    align-items: center;
    gap: 0.55rem;
    font-size: 0.85rem;
    min-width: 0;
}
.isis-top-list__rank {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 12%, transparent);
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
    font-size: 0.75rem;
    font-variant-numeric: tabular-nums;
}
.isis-top-list__name {
    display: flex;
    flex-direction: column;
    gap: 0.05rem;
    min-width: 0;
    overflow: hidden;
}
.isis-top-list__name > :first-child,
.isis-top-list__name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-top-list__meta {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-top-list__amount {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: var(--isis-text);
    white-space: nowrap;
}

/* Bande de filtres : search + chips */
.isis-filter-bar {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.5rem 0.85rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    flex-wrap: wrap;
}
.isis-filter-bar__search {
    flex: 1;
    min-width: 220px;
    max-width: 360px;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.isis-filter-bar__search input {
    flex: 1;
    height: 32px;
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    border-radius: 8px;
    padding: 0 0.7rem;
    font-size: 0.85rem;
    color: var(--isis-text);
    outline: none;
}
.isis-filter-bar__search input:focus { border-color: var(--isis-accent); }
/* Libellé d'axe filtre (ex: "Statut", "Type") devant un groupe de chips —
   utilisé sur plusieurs pages liste (devis, commandes, articles, etc.). */
.isis-filter-bar__axis {
    font-size: 0.65rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-muted);
    white-space: nowrap;
    align-self: center;
    margin-right: 0.15rem;
}
.isis-filter-bar__chips {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    flex-wrap: wrap;
    margin-left: auto;
}
/* Page commandes : le cluster « Statut + pills » reste groupé et poussé à droite
   (design d'origine). On déplace le margin-left:auto des chips vers le GROUPE pour
   que le libellé « Statut » parte à droite AVEC ses pills (et non détaché à gauche). */
.isis-filter-bar--cmd .isis-filter-bar__group { margin-left: auto; }
.isis-filter-bar--cmd .isis-filter-bar__chips { margin-left: 0; }
/* Filtre sous forme de champ (combobox multi-sélection) dans la filter-bar. */
.isis-filter-bar__field {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    height: 28px;
    padding: 0 0.7rem;
    border-radius: var(--isis-radius-pill);
    background: transparent;
    border: 1px solid var(--isis-border);
    color: var(--isis-text-muted);
    font-size: 0.75rem;
    cursor: pointer;
    transition: background-color 120ms, color 120ms, border-color 120ms;
}
.isis-chip:hover { background: var(--isis-surface-alt); color: var(--isis-text); }
.isis-chip:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-chip__dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--isis-text-soft);
}
.isis-chip__dot.is-info    { background: #3b82f6; }
.isis-chip__dot.is-success { background: #10b981; }
.isis-chip__dot.is-warning { background: #f59e0b; }
.isis-chip__dot.is-danger  { background: #ef4444; }
/* Facettes tiers (migration 0096) — palette dérivée des facettes métier. */
.isis-chip__dot.is-client      { background: #10b981; }
.isis-chip__dot.is-prospect    { background: #3b82f6; }
.isis-chip__dot.is-fournisseur { background: #f59e0b; }
.isis-chip__dot.is-partenaire  { background: #8b5cf6; }
/* Variantes par module — utilisées sur le sous-bandeau de filtres /ged/documents.
   Reprennent les couleurs d'identité module pour une lecture instantanée. */
.isis-chip__dot.is-module-gescom    { background: var(--isis-mod-gescom); }
.isis-chip__dot.is-module-gescompta { background: var(--isis-mod-gescompta); }
.isis-chip__dot.is-module-sirh      { background: var(--isis-mod-sirh); }
.isis-chip__dot.is-module-admin     { background: var(--isis-mod-admin); }
.isis-chip__dot.is-module-ged       { background: var(--isis-accent); }
.isis-chip__dot.is-module-gesproj   { background: var(--isis-mod-gesproj); }
.isis-chip.is-active {
    background: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: white;
}
.isis-chip.is-active .isis-chip__dot { background: white; }
.isis-chip__count {
    font-variant-numeric: tabular-nums;
    opacity: 0.85;
}

/* Master-detail : grille à gauche + panneau d'aperçu à droite */
.isis-master-detail {
    display: grid;
    /* Sidepanel : 30 % de la largeur de page, plancher 300px, plafond 400px
       (refonte 2026-06-04, remplace 28vw/520px jugé trop large). Le sidepanel
       intelligent reste lisible (micro-KPIs auto-fit s'adaptent de 3→2→1 colonnes). */
    grid-template-columns: minmax(0, 1fr) clamp(300px, 30%, 400px);
    gap: 0.75rem;
    align-items: stretch;
    /* Prend toute la hauteur restante dans .isis-rich-page (flex parent).
       min-height: 0 indispensable pour que les enfants puissent eux-mêmes
       être height-constrained et activer leur overflow interne. */
    flex: 1 1 auto;
    min-height: 0;
}
/* Variante 3 colonnes : volet entreprises (scope) | arbre | sidepanel détail.
   Onglet « Structures internes » de la page Organisation. Sidepanel idem fluide
   mais 26vw (compense la colonne rail 230px à gauche qui mange déjà de la largeur). */
.isis-master-detail--rail {
    grid-template-columns: 230px minmax(0, 1fr) clamp(300px, 30%, 400px);
}

/* ============================================================================
   .isis-master-detail--no-side — Mode élargi avec sidepanel drawer rétractable
   ----------------------------------------------------------------------------
   Refonte 2026-05-29 : la grille datagrid prend 100% de la largeur, le sidepanel
   sort du flux et devient un drawer flottant accessible via une languette
   verticale sur le bord droit du viewport. Pattern drawer overlay similaire à
   Material Design / Slack sidebars. Persistance localStorage par page (clé
   `isis.<page>.list-expanded`).

   2 états indépendants :
     1. `--no-side` posé sur le wrapper = mode élargi actif (toolbar toggle)
     2. `.is-drawer-open` posé sur le wrapper = drawer ouvert (languette toggle)
   ============================================================================ */
.isis-master-detail--no-side {
    /* Grille pleine largeur — le sidepanel sort du flux via position:fixed. */
    grid-template-columns: minmax(0, 1fr);
}

/* Sidepanel devient drawer flottant collé à droite, slide-out par défaut. */
.isis-master-detail--no-side .isis-master-detail__detail {
    position: fixed;
    top: var(--isis-header-h, 56px);
    right: 0;
    bottom: 0;
    width: clamp(360px, 28vw, 520px);
    z-index: 940;                              /* < focus-zone (950), < dialogs Radzen (1010+) */
    background: var(--isis-surface);
    border-left: 1px solid var(--isis-border);
    box-shadow: -10px 0 30px rgba(0, 0, 0, 0.12);
    overflow-y: auto;
    transform: translateX(100%);               /* slide-out par défaut */
    transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);
    visibility: hidden;                        /* hors tab order + non lu par AT quand fermé */
}
.isis-master-detail--no-side.is-drawer-open .isis-master-detail__detail {
    transform: translateX(0);                  /* slide-in */
    visibility: visible;
}

/* Languette verticale sticky bord droit — visible uniquement en mode élargi.
   Toujours visible (drawer ouvert ou fermé) — c'est la commande permanente
   d'ouverture/fermeture du drawer. */
.isis-master-detail__drawer-tab {
    display: none;
}
.isis-master-detail--no-side .isis-master-detail__drawer-tab {
    display: flex;
    align-items: center;
    justify-content: center;
    position: fixed;
    top: 50%;
    right: 0;
    transform: translateY(-50%);
    width: 28px;
    height: 80px;
    z-index: 942;                              /* au-dessus du drawer (940) et backdrop (939) */
    background: var(--isis-surface);
    color: var(--isis-text-muted);
    border: 1px solid var(--isis-border);
    border-right: none;
    border-radius: 6px 0 0 6px;
    cursor: pointer;
    box-shadow: -4px 2px 12px rgba(0, 0, 0, 0.08);
    transition: right 200ms cubic-bezier(0.4, 0, 0.2, 1),
                background-color 120ms,
                color 120ms;
    padding: 0;
}
.isis-master-detail__drawer-tab:hover,
.isis-master-detail__drawer-tab:focus-visible {
    background: var(--isis-surface-alt);
    color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}
/* Quand drawer ouvert : la languette se déplace avec, collée au bord gauche du drawer. */
.isis-master-detail--no-side.is-drawer-open .isis-master-detail__drawer-tab {
    right: clamp(360px, 28vw, 520px);
}

/* Backdrop semi-transparent — visible seulement quand drawer ouvert.
   Click backdrop = ferme le drawer (cf. Q4 option C : 3 mécanismes de fermeture). */
.isis-master-detail__drawer-backdrop {
    display: none;
}
.isis-master-detail--no-side.is-drawer-open .isis-master-detail__drawer-backdrop {
    display: block;
    position: fixed;
    top: var(--isis-header-h, 56px);
    right: 0;
    bottom: 0;
    /* `left` ne couvre PAS le subnav : cohérent avec le focus zone détail. */
    left: var(--isis-subnav-w, 280px);
    background: rgba(0, 0, 0, 0.18);
    backdrop-filter: blur(1px);
    z-index: 939;                              /* < drawer (940) */
    animation: isis-drawer-backdrop-in 200ms ease-out;
    cursor: pointer;
}
.isis-shell.is-subnav-collapsed .isis-master-detail--no-side.is-drawer-open .isis-master-detail__drawer-backdrop {
    left: var(--isis-subnav-w-collapsed, 64px);
}
@keyframes isis-drawer-backdrop-in {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* ── Volet « Entreprises » — sélecteur de scope de l'arbre des structures ── */
.isis-org-rail {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
}
.isis-org-rail__head {
    font-size: 0.65rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--isis-text-soft);
    padding: 0.7rem 0.85rem 0.5rem;
    border-bottom: 1px solid var(--isis-border-soft);
    flex-shrink: 0;
}
.isis-org-rail__list {
    overflow-y: auto;
    padding: 0.35rem;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-height: 0;
}
.isis-org-rail__item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    padding: 0.42rem 0.5rem;
    border: none;
    border-left: 2px solid transparent;
    background: transparent;
    border-radius: 6px;
    cursor: pointer;
    text-align: left;
    color: var(--isis-text);
    font-size: 0.82rem;
    transition: background-color 120ms ease;
}
.isis-org-rail__item:hover { background: var(--isis-surface-alt); }
.isis-org-rail__item.is-active {
    background: var(--isis-mod-sirh-soft);
    border-left-color: var(--isis-mod-sirh);
    border-radius: 0 6px 6px 0;
    font-weight: 600;
}
.isis-org-rail__item:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: -2px;
}
.isis-org-rail__item--all { margin-bottom: 0.25rem; }
.isis-org-rail__dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--isis-mod-sirh);
    flex-shrink: 0;
}
.isis-org-rail__name {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-org-rail__count {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    font-variant-numeric: tabular-nums;
    flex-shrink: 0;
}
/* Texte en --isis-text : --isis-mod-sirh sur --isis-mod-sirh-soft ne donne que
   2.4:1 (échec WCAG AA texte). Le fond vert pâle de l'item actif porte l'identité. */
.isis-org-rail__item.is-active .isis-org-rail__count { color: var(--isis-text); }
.isis-master-detail__master {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    /* Mise en conformité 2026-05-26 avec CLAUDE.md §4 « élévation tokenisée 3 tiers
       — elevation-1 cartes/sidepanels ». Le bandeau KPI hero portait déjà l'ombre,
       les 2 cards master + detail l'avaient oubliée → la zone principale était plate. */
    box-shadow: var(--isis-elevation-1);
    overflow: hidden;
    /* Flex column pour permettre à .isis-grid interne de prendre la hauteur dispo. */
    display: flex;
    flex-direction: column;
    min-height: 0;
}
.isis-master-detail__detail {
    position: sticky;
    top: 0.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: var(--isis-elevation-1);
    padding: 1rem;
    min-height: 320px;
}
.isis-detail-empty {
    height: 100%;
    min-height: 280px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    color: var(--isis-text-soft);
    text-align: center;
    padding: 1rem;
}
.isis-detail-empty .rzi { font-size: 32px; opacity: 0.35; }
.isis-detail-empty p { margin: 0; font-size: 0.85rem; line-height: 1.4; }
.isis-detail-empty strong { color: var(--isis-text-muted); }

/* Variante --rich : empty state enrichi (raccourcis clavier + mini-stats globaux).
   Chantier sidepanel intelligent 2026-05-26 — répond au #9 du brief UX. */
.isis-detail-empty--rich .isis-detail-empty__hints {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    font-size: 0.78rem;
}
.isis-detail-empty--rich .isis-detail-empty__hints li {
    color: var(--isis-text-soft);
}
.isis-detail-empty--rich .isis-detail-empty__hints kbd {
    display: inline-block;
    padding: 1px 5px;
    margin: 0 1px;
    font-family: inherit;
    font-size: 0.72rem;
    line-height: 1.2;
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    background: var(--isis-bg-soft, #f7f8fa);
    color: var(--isis-text);
}
.isis-detail-empty--rich .isis-detail-empty__stats {
    margin-top: 0.85rem;
    padding-top: 0.7rem;
    border-top: 1px solid var(--isis-border);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    width: 100%;
    max-width: 280px;
}
.isis-detail-empty--rich .isis-detail-empty__stats strong {
    color: var(--isis-text);
    font-weight: 600;
}

/* Sur tablette : masque le panel détail au-dessous de 1200px */
@media (max-width: 1200px) {
    .isis-master-detail,
    .isis-master-detail--rail { grid-template-columns: 1fr; }
    .isis-master-detail__detail { display: none; }
}

/* Dot de statut dans la 1re colonne de grille */
.isis-row-dot {
    display: inline-block;
    width: 8px; height: 8px;
    border-radius: 50%;
    margin-left: 0.25rem;
    box-shadow: 0 0 0 3px rgba(255,255,255,0.85);
}

/* Classes utilitaires fond accent par module (pour les icônes de header) */
.mod-gescom-soft    { background: var(--isis-mod-gescom-soft); }
.mod-gescompta-soft { background: var(--isis-mod-gescompta-soft); }
.mod-sirh-soft      { background: var(--isis-mod-sirh-soft); }
.mod-admin-soft     { background: var(--isis-mod-admin-soft); }
.mod-gesproj-soft   { background: var(--isis-mod-gesproj-soft); }
.mod-gesmaff-soft   { background: var(--isis-mod-gesmaff-soft); }
.mod-gesst-soft     { background: var(--isis-mod-gesst-soft); }
.mod-gesmat-soft    { background: var(--isis-mod-gesmat-soft); }
.mod-gespla-soft    { background: var(--isis-mod-gespla-soft); }
.mod-gesqhse-soft   { background: var(--isis-mod-gesqhse-soft); }
.mod-gesinfo-soft   { background: var(--isis-mod-gesinfo-soft); }
.mod-gespark-soft   { background: var(--isis-mod-gespark-soft); }
.mod-gesmob-soft    { background: var(--isis-mod-gesmob-soft); }
.mod-gesfac-soft    { background: var(--isis-mod-gesfac-soft); }

/* ============================================================================
   Console plateforme (/master/*)
   ============================================================================ */
.isis-master-shell {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background-color: var(--isis-surface-alt);
}
.isis-master-header {
    height: 64px;
    flex-shrink: 0;
    background-color: var(--isis-surface);
    border-bottom: 1px solid var(--isis-border);
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 1.5rem;
}
.isis-master-header__brand {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}
.isis-master-header__title {
    font-size: 0.95rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    color: var(--isis-text);
}
.isis-master-header__subtitle {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
}
.isis-master-header__actions {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}
.isis-master-header__user {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-master-header__nav {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    flex: 1;
    margin-left: 2rem;
}
.isis-master-header__navlink {
    padding: 0.4rem 0.85rem;
    border-radius: 8px;
    text-decoration: none;
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    font-weight: 500;
    transition: background-color 120ms;
}
.isis-master-header__navlink:hover {
    background-color: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-master-content {
    flex: 1;
    padding: 1.5rem;
    overflow-y: auto;
}

.isis-master-page { max-width: none; margin: 0; display: flex; flex-direction: column; gap: 1rem; }

/* En-tête de section repliable (boutonné, accessible) */
.isis-collapse-toggle {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    width: 100%;
    padding: 0;
    background: none;
    border: none;
    cursor: pointer;
    text-align: left;
    color: var(--isis-text-muted);
}
.isis-collapse-toggle:hover { color: var(--isis-text); }
.isis-collapse-toggle:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
    border-radius: 4px;
}
.isis-master-page__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}
.isis-master-page__title {
    font-size: 1.4rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0;
}
.isis-master-page__subtitle {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
    margin: 0;
}
.isis-master-page__primary-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.5rem 1rem;
    background-color: var(--isis-accent);
    color: white;
    border-radius: 6px;
    text-decoration: none;
    font-size: 0.85rem;
    font-weight: 500;
    transition: opacity 120ms;
}
.isis-master-page__primary-btn:hover { opacity: 0.92; color: white; }
.isis-master-page__primary-btn:focus-visible {
    outline: 2px solid white;
    outline-offset: 2px;
    box-shadow: 0 0 0 4px var(--isis-accent);
}

.isis-master-form { max-width: none; margin: 0; display: flex; flex-direction: column; gap: 1rem; }
.isis-master-form__header h1 {
    font-size: 1.4rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0 0 0.25rem;
}
.isis-master-form__header p {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
    margin: 0;
}
.isis-master-form__body { display: flex; flex-direction: column; gap: 1.25rem; padding: 0.5rem 0; }
.isis-master-form__section { display: flex; flex-direction: column; gap: 0.75rem; }
.isis-master-form__section-title {
    font-size: 0.7rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    color: var(--isis-text-soft);
    text-transform: uppercase;
}
.isis-master-form__row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.isis-master-form__hint {
    display: block;
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    margin-top: 0.25rem;
}
.isis-master-form__actions {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.5rem;
    margin-top: 0.5rem;
}
.isis-master-form__cancel {
    padding: 0.5rem 1rem;
    border-radius: 6px;
    color: var(--isis-text-muted);
    text-decoration: none;
    font-size: 0.85rem;
}
.isis-master-form__cancel:hover { background-color: var(--isis-surface-alt); }

/* ============================================================================
   .isis-grid — Grille tabulaire custom (inspirée NetLogger PrdcommandsV3)
   ----------------------------------------------------------------------------
   Alternative à RadzenDataGrid pour les listes denses haute densité.
   CSS Grid layout, header sticky, sort buttons, rows clickable.
   ============================================================================ */

.isis-grid {
    display: flex;
    flex-direction: column;
    font-size: 0.85rem;
    flex: 1;
    min-height: 0;
    overflow: auto;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
}

/* Layout colonnes : status | code | raison | type | email | phone | ville | actions
   Total min-width ~ 1000px pour scroll horizontal sur petits écrans */
.isis-grid__head,
.isis-grid__row {
    display: grid;
    grid-template-columns: 32px 130px minmax(180px, 1.4fr) 130px minmax(160px, 1fr) 150px 120px 90px;
    align-items: center;
    padding: 0 0.85rem;
    min-width: 1000px;
    gap: 0;
}

.isis-grid__head {
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: 0.65rem;
    font-weight: 600;
    color: var(--isis-text-soft);
    height: 34px;
    position: sticky;
    top: 0;
    z-index: 4;
}
.isis-grid__head > div {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.15rem;
    padding: 0 0.35rem;
}

.isis-grid__sort-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    background: transparent;
    border: none;
    padding: 0.15rem 0.4rem;
    border-radius: 4px;
    color: inherit;
    font-size: inherit;
    font-weight: inherit;
    text-transform: inherit;
    letter-spacing: inherit;
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-grid__sort-btn:hover {
    background: var(--isis-surface);
    color: var(--isis-text);
}
.isis-grid__sort-btn.is-active {
    color: var(--isis-accent);
    background: var(--isis-accent-soft);
}
/* Audit a11y #3 : focus visible clavier sur les sort buttons. */
.isis-grid__sort-btn:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}

/* Audit M3 : séparateur visuel entre 2 groupes de chips dans la filter-bar. */
.isis-filter-bar__separator {
    width: 1px;
    height: 1.4rem;
    background: var(--isis-border);
    align-self: center;
    margin: 0 0.25rem;
}

/* Groupe de chips axé (libellé + chips) à l'intérieur d'une lane filter-bar.
   Permet de fusionner plusieurs axes (Type · Portée…) dans une même lane sub
   séparés par .isis-filter-bar__separator. Sur écran étroit, wrap naturel. */
.isis-filter-bar__axis-group {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
}
.isis-filter-bar__axis-group .isis-filter-bar__chips {
    /* Évite que les chips se collent au libellé d'axe sur écran large. */
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    flex-wrap: wrap;
}

/* Audit M3 : chip variante alerte (Urgentes) — terre cuite pour signaler
   "demande d'attention" sans crier "ERREUR" (rouge réservé aux statuts critiques
   refuse/annule/inactif). Refonte F4 2026-05-17. */
.isis-chip.isis-chip--alert {
    color: var(--isis-accent-warm);
}
.isis-chip.isis-chip--alert.is-active {
    background: var(--isis-accent-warm);
    color: #fff;
}

/* Badge statut — pattern réutilisable pour porter un statut coloré
   (équipement, livraison, indispo…). Calque sur RadzenBadge mais pilotable
   par classes is-X. Ajouté 2026-05-19 (audit gesmat — .isis-badge utilisé
   par plusieurs modules mais jamais défini avant). */
.isis-badge {
    display: inline-flex;
    align-items: center;
    padding: 0.15rem 0.55rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    border: 1px solid var(--isis-border);
}
.isis-badge.is-ok      { background: var(--isis-success-soft); color: var(--isis-success);            border-color: transparent; }
.isis-badge.is-pending { background: #dbeafe;                  color: #1d4ed8;                        border-color: transparent; }
/* Audit V1.5 — variante warning distincte de pending (bleu = en cours, orange = manquant/attention).
   Précédemment "Jamais calibrée" et "En calibration" partageaient is-pending : ambiguïté résolue. */
.isis-badge.is-warning { background: var(--isis-warning-soft); color: var(--isis-warning);            border-color: transparent; }
.isis-badge.is-danger  { background: var(--isis-danger-soft);  color: var(--isis-danger);             border-color: transparent; }
.isis-badge.is-draft   { background: var(--isis-surface-alt);  color: var(--isis-text-muted);         border-color: var(--isis-border); }
.isis-badge.is-info    { background: color-mix(in srgb, var(--isis-current-mod) 10%, white); color: var(--isis-current-mod); border-color: transparent; }

/* F4 — Utilities terre cuite (à appliquer parcimonieusement : 1 par écran max).
   Usage prévu : badges "Nouveau"/"Action requise", KPI hero principal,
   indicateurs éphémères "modifications non sauvegardées". */
.isis-badge--warm,
.rz-badge.isis-badge--warm {
    background: var(--isis-accent-warm-soft) !important;
    color: var(--isis-accent-warm-strong) !important;
}
.isis-chip.isis-chip--warm {
    color: var(--isis-accent-warm-strong);
    border-color: var(--isis-accent-warm);
}
.isis-chip.isis-chip--warm.is-active {
    background: var(--isis-accent-warm);
    color: #fff;
}
.isis-kpi-card__value.is-warm {
    color: var(--isis-accent-warm-strong);
}

/* Branded depth 2026-05-17 — narrative anchor : le 1er KPI de chaque hero
   est automatiquement en terre cuite (le "TOTAL" qui rythme le scan).
   Opt-out par page possible via .isis-kpi-hero--no-headline
   (ex: pages avec foreach équipondéré comme MonEspace soldes par type d'absence). */
.isis-kpi-hero:not(.isis-kpi-hero--no-headline) > .isis-kpi-card:first-child .isis-kpi-card__value {
    color: var(--isis-accent-warm-strong);
}

/* Audit M5 : style de l'ancienneté en mode normal (cohérence avec urgent). */
.isis-grid__age-normal {
    color: var(--isis-text-muted);
    font-size: 0.82rem;
}
.isis-grid__sort-icon {
    font-size: 14px;
    opacity: 0.6;
}
.isis-grid__sort-btn.is-active .isis-grid__sort-icon { opacity: 1; }

/* En-tête : cellule hébergeant tri + entonnoir de filtre côte à côte */
.isis-grid__head-cell {
    display: inline-flex;
    align-items: center;
    gap: 0.1rem;
    min-width: 0;
}
.isis-grid__filter-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: var(--isis-text-soft);
    cursor: pointer;
    padding: 2px;
    border-radius: 4px;
    opacity: 0.55;
}
.isis-grid__head-cell:hover .isis-grid__filter-btn { opacity: 0.85; }
.isis-grid__filter-btn:hover { color: var(--isis-text); background: var(--isis-surface); opacity: 1; }
.isis-grid__filter-btn:focus-visible {
    outline: 2px solid color-mix(in srgb, var(--isis-current-mod) 55%, transparent);
    outline-offset: 1px;
    opacity: 1;
}
.isis-grid__filter-btn.is-active {
    color: var(--isis-current-mod);
    opacity: 1;
}

/* Popup de filtre par colonne (position: fixed, ancré au clic) */
.isis-head-filter__backdrop {
    position: fixed;
    inset: 0;
    z-index: 60;
    background: transparent;
}
.isis-head-filter__panel {
    position: fixed;
    z-index: 61;
    width: 260px;
    max-width: 92vw;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: var(--isis-elevation-2);
    padding: 0.4rem;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-head-filter__head {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.15rem 0.35rem;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-soft);
}
.isis-head-filter__search {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.45rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
}
.isis-head-filter__search input {
    border: 0;
    background: transparent;
    outline: none;
    width: 100%;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-head-filter__list {
    max-height: 280px;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
}
.isis-head-filter__item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    width: 100%;
    text-align: left;
    border: 0;
    background: transparent;
    padding: 0.4rem 0.5rem;
    border-radius: 6px;
    cursor: pointer;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-head-filter__item:hover { background: var(--isis-surface-alt); }
.isis-head-filter__item.is-active {
    background: color-mix(in srgb, var(--isis-current-mod) 12%, transparent);
    color: var(--isis-current-mod);
    font-weight: 600;
}
.isis-head-filter__item > span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-head-filter__empty {
    padding: 0.5rem;
    font-size: 0.8rem;
    color: var(--isis-text-soft);
    text-align: center;
}
/* Multi-select : case à cocher dans l'item */
.isis-head-filter__check {
    font-size: 16px;
    opacity: 0.7;
    flex: 0 0 auto;
}
.isis-head-filter__item.is-active .isis-head-filter__check { opacity: 1; }
/* Multi-select : compteur sur l'entonnoir d'en-tête */
.isis-grid__filter-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 14px;
    height: 14px;
    padding: 0 3px;
    margin-left: 2px;
    border-radius: 7px;
    background: var(--isis-current-mod);
    color: #fff;
    font-size: 0.62rem;
    font-weight: 700;
    line-height: 1;
}
/* Multi-select : pied du popup (Tout effacer / Appliquer) */
.isis-head-filter__foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding-top: 0.35rem;
    margin-top: 0.15rem;
    border-top: 1px solid var(--isis-border);
}
.isis-head-filter__clear {
    border: 0;
    background: transparent;
    color: var(--isis-text-soft);
    font-size: 0.78rem;
    cursor: pointer;
    padding: 0.3rem 0.4rem;
    border-radius: 6px;
}
.isis-head-filter__clear:hover:not(:disabled) { color: var(--isis-text); background: var(--isis-surface-alt); }
.isis-head-filter__clear:disabled { opacity: 0.4; cursor: default; }
.isis-head-filter__apply {
    border: 0;
    background: var(--isis-current-mod);
    color: #fff;
    font-size: 0.8rem;
    font-weight: 600;
    cursor: pointer;
    padding: 0.35rem 0.7rem;
    border-radius: 6px;
}
.isis-head-filter__apply:hover { filter: brightness(0.95); }

/* Rows */
.isis-grid__row {
    min-height: 44px;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
    transition: background-color 100ms ease;
    cursor: pointer;
}
/* Hover : signal tactile module-coloré + border-left 2px (refonte F1 2026-05-17).
   Active : fond module-soft + border-left 3px (F2). */
.isis-grid__row:hover {
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
    border-left: 2px solid var(--isis-current-mod, var(--isis-accent));
    padding-left: calc(0.85rem - 2px);
}
.isis-grid__row:last-child { border-bottom: none; }
.isis-grid__row.is-active {
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    padding-left: calc(0.85rem - 3px);
}
.isis-grid__row.is-active:hover {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 18%, white);
}
.isis-grid__row > div {
    padding: 0.35rem 0.35rem;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Status dot */
.isis-grid__col-status {
    display: flex !important;
    justify-content: center;
    align-items: center;
    padding: 0 !important;
}
.isis-grid__status-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    display: inline-block;
    /* Anneau sombre fin pour remonter le contraste (~4.5:1) sur les
       variantes claires (is-ready, is-pending) — sinon un daltonien ne
       perçoit qu'une pastille pastel à peine distincte du fond. */
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
}
.isis-grid__status-dot.is-client      { background: #10b981; }
.isis-grid__status-dot.is-prospect    { background: #3b82f6; }
.isis-grid__status-dot.is-fournisseur { background: #f59e0b; }
.isis-grid__status-dot.is-partenaire  { background: #8b5cf6; }
.isis-grid__status-dot.is-inactif     { background: #9ca3af; }

/* Badges multi-facettes affichés dans la colonne dédiée + en tête du sidepanel
   tiers (migration 0096). Un tiers peut cumuler plusieurs badges. */
.isis-tiers-facets {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    align-items: center;
}
.isis-tiers-facets__badge {
    display: inline-flex;
    align-items: center;
    padding: 0.1rem 0.45rem;
    font-size: 0.68rem;
    font-weight: 500;
    line-height: 1.5;
    border-radius: var(--isis-radius-pill);
    border: 1px solid var(--isis-border);
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-tiers-facets__badge.is-client      { border-color: #10b981; color: #047857; background: rgba(16, 185, 129, 0.08); }
.isis-tiers-facets__badge.is-prospect    { border-color: #3b82f6; color: #1d4ed8; background: rgba(59, 130, 246, 0.08); }
.isis-tiers-facets__badge.is-fournisseur { border-color: #f59e0b; color: #b45309; background: rgba(245, 158, 11, 0.10); }
.isis-tiers-facets__badge.is-partenaire  { border-color: #8b5cf6; color: #6d28d9; background: rgba(139, 92, 246, 0.10); }
.isis-tiers-facets__badge.is-inactif     { border-color: var(--isis-border); color: var(--isis-text-muted); background: var(--isis-surface-alt); }
/* Variantes GED documents :
   ready    = vert  (PDF natif ou image, lecture immédiate)
   pending  = bleu  (preview en cours de génération côté Office)
   failed   = orange (preview a échoué, fichier toujours téléchargeable)
   archived = gris  (document marqué archivé) */
.isis-grid__status-dot.is-ready    { background: #10b981; }
.isis-grid__status-dot.is-pending  { background: #3b82f6; }
.isis-grid__status-dot.is-failed   { background: #f59e0b; }
.isis-grid__status-dot.is-archived { background: #9ca3af; }

/* Badge Type — plus compact dans la grille */
.isis-grid__row .rz-badge {
    font-size: 0.65rem !important;
    padding: 0.15rem 0.5rem !important;
    line-height: 1.4 !important;
    letter-spacing: 0.02em;
    font-weight: 600 !important;
}

/* Cells particulières */
.isis-grid__col-code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    font-weight: 500;
}
.isis-grid__row.is-active .isis-grid__col-code { color: var(--isis-current-mod, var(--isis-accent)); }
.isis-grid__col-raison { font-weight: 500; color: var(--isis-text); }
.isis-grid__col-email,
.isis-grid__col-phone,
.isis-grid__col-ville { color: var(--isis-text-muted); }

/* Cell empty state placeholder */
.isis-grid__cell-empty {
    color: var(--isis-text-soft);
    font-style: italic;
}

/* Actions cell */
.isis-grid__col-actions {
    display: flex !important;
    justify-content: flex-end;
    gap: 0.25rem;
    padding: 0 !important;
}
.isis-grid__action-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: none;
    background: transparent;
    border-radius: 6px;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-grid__action-btn:hover {
    background: var(--isis-surface);
    color: var(--isis-text);
}
.isis-grid__action-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
    color: var(--isis-text);
}
.isis-grid__row:focus-visible {
    /* Outline = couleur du module courant (fallback --isis-accent sur les pages
       sans .mod-{code} parent). Identité visuelle cohérente cross-module. */
    outline: 2px solid var(--isis-current-mod);
    outline-offset: -2px;
}

/* Empty state global (aucune donnée filtrée) */
.isis-grid__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 3rem 1rem;
    color: var(--isis-text-soft);
    text-align: center;
}
.isis-grid__empty .rzi {
    font-size: 32px;
    opacity: 0.4;
}

/* Variante --welcome : empty state riche pour tenant vierge (onboarding 1re fois).
   Icône large + paragraphe + CTAs + tips list. */
.isis-grid__empty--welcome {
    padding: 4rem 2rem;
    gap: 0.85rem;
    max-width: 560px;
    margin: 0 auto;
}
.isis-grid__empty--welcome strong {
    font-size: 1.15rem;
    color: var(--isis-text);
    margin-top: 0.5rem;
}
.isis-grid__empty-hint {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    line-height: 1.5;
    margin: 0;
}
.isis-grid__empty-actions {
    display: flex;
    gap: 0.6rem;
    margin-top: 0.5rem;
    flex-wrap: wrap;
    justify-content: center;
}
.isis-grid__empty-tips {
    list-style: none;
    margin: 1rem 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    text-align: left;
    width: 100%;
    max-width: 460px;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-grid__empty-tips li {
    display: flex;
    align-items: flex-start;
    gap: 0.45rem;
    line-height: 1.45;
}

/* N1.3 — Saved views dialog */
.isis-saved-views__capture {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}
.isis-saved-views__capture .rz-textbox {
    flex: 1;
}
.isis-saved-views__fav-toggle {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.5rem;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    cursor: pointer;
    user-select: none;
}
.isis-saved-views__empty {
    padding: 1rem;
    text-align: center;
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    border: 1px dashed var(--isis-border);
    border-radius: 4px;
}
.isis-saved-views__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-saved-views__item {
    display: grid;
    grid-template-columns: 32px 1fr 32px;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.55rem;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: var(--isis-surface);
    transition: background 120ms ease, border-color 120ms ease;
}
.isis-saved-views__item:hover {
    background: var(--isis-surface-alt);
    border-color: color-mix(in srgb, var(--isis-text) 15%, var(--isis-border));
}
.isis-saved-views__star,
.isis-saved-views__delete {
    background: none;
    border: 0;
    cursor: pointer;
    padding: 4px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-saved-views__star:hover,
.isis-saved-views__delete:hover {
    background: color-mix(in srgb, var(--isis-text) 8%, transparent);
}
.isis-saved-views__name {
    flex: 1;
    background: none;
    border: 0;
    text-align: left;
    cursor: pointer;
    padding: 0;
    font-family: inherit;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}
.isis-saved-views__name-label {
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-saved-views__name-notes {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    font-style: italic;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Badge dans le bouton Vues du toolbar (nom de la vue active). */
.isis-rich-toolbar__btn-badge {
    display: inline-flex;
    align-items: center;
    padding: 0.1rem 0.4rem;
    margin-left: 0.4rem;
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, transparent);
    color: var(--isis-current-mod, var(--isis-accent));
    border-radius: var(--isis-radius-pill);
    font-size: 0.7rem;
    font-weight: 600;
    max-width: 140px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ── Pied de grille : pagination ─────────────────────────────────────────── */
.isis-grid__foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.5rem 0.85rem;
    border-top: 1px solid var(--isis-border);
    background: var(--isis-surface-alt);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    position: sticky;
    bottom: 0;
    z-index: 3;
    flex-wrap: wrap;
}
.isis-grid__foot-count {
    display: flex;
    gap: 0.4rem;
    align-items: baseline;
    font-variant-numeric: tabular-nums;
}
.isis-grid__foot-hint { color: var(--isis-text-soft); font-size: 0.72rem; }
.isis-grid__foot-pager {
    display: flex;
    align-items: center;
    gap: 0.2rem;
}
.isis-grid__foot-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px; height: 28px;
    border: 1px solid transparent;
    background: transparent;
    border-radius: 4px;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}
.isis-grid__foot-btn:hover:not(:disabled) {
    background: var(--isis-surface);
    color: var(--isis-text);
    border-color: var(--isis-border);
}
.isis-grid__foot-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-grid__foot-btn:disabled {
    opacity: 0.35;
    cursor: not-allowed;
}
.isis-grid__foot-current {
    padding: 0 0.6rem;
    font-weight: 500;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    min-width: 110px;
    text-align: center;
}
.isis-grid__foot-pagesize {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
}
.isis-grid__foot-pagesize select {
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: var(--isis-surface);
    padding: 0.2rem 0.4rem;
    font-size: 0.78rem;
    color: var(--isis-text);
    cursor: pointer;
}
.isis-grid__foot-pagesize select:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}

/* ============================================================================
   .isis-detail-grid — Grille compacte label/value pour fiches détail
   ----------------------------------------------------------------------------
   Pattern dense : label gauche court + value droite, gap minimal, font 0.85rem.
   Pose sur un container où chaque "field" est wrappé par un div display:contents
   (pour que les 2 sous-divs deviennent enfants directs de la grille).
   ============================================================================ */
.isis-detail-grid {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 0.85rem;
    font-size: 0.85rem;
    align-items: baseline;
}
/* Bloc géolocalisation sous la carte Coordonnées (bouton « Localiser » + statut). */
.isis-detail-geo {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin-top: 0.75rem;
}
.isis-detail-geo__status {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.8rem;
    color: var(--isis-text);
}
.isis-detail-geo__status--muted {
    color: var(--isis-text-muted);
}
.isis-detail-grid__label {
    color: var(--isis-text-soft);
    font-size: 0.72rem;
    white-space: nowrap;
}
.isis-detail-grid__val {
    color: var(--isis-text);
    overflow-wrap: anywhere;
}
.isis-detail-grid__val--mono {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.82rem;
}
.isis-detail-grid__val--empty {
    color: var(--isis-text-soft);
    font-style: italic;
}
/* Valeur cliquable (navigation onglet depuis la summary card). Bouton plat
   avec underline subtile + couleur accent au hover/focus. */
.isis-detail-grid__val-link {
    background: transparent;
    border: none;
    padding: 0;
    color: var(--isis-text);
    font: inherit;
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
    text-decoration-color: var(--isis-border);
    cursor: pointer;
    transition: color 100ms ease, text-decoration-color 100ms ease;
}
.isis-detail-grid__val-link:hover,
.isis-detail-grid__val-link:focus-visible {
    color: var(--isis-accent);
    text-decoration-color: var(--isis-accent);
    outline: none;
}
.isis-detail-grid__val-link:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
    border-radius: 2px;
}
/* Valeur marge colorée — vert/rouge (mêmes teintes que les autres marges du module). */
.isis-detail-grid__val--pos {
    color: #16a34a;
    font-weight: 600;
}
.isis-detail-grid__val--neg {
    color: #c62828;
    font-weight: 600;
}

/* ----------------------------------------------------------------------------
   .isis-detail-grid variante « multi-cartes » — quand .isis-detail-grid
   contient des .isis-detail-grid__card en enfants directs, on bascule sur
   une grille auto-fit responsive de cartes élevées (Branded depth §1).
   Permet de regrouper plusieurs blocs `<dl>` côte à côte dans un onglet
   de fiche détail (identité / classification / valorisation / métadonnées…).
   ---------------------------------------------------------------------------- */
.isis-detail-grid:has(> .isis-detail-grid__card) {
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1rem;
    align-items: stretch;
}
.isis-detail-grid__card {
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border-soft, #f1f2f5);
    border-radius: 8px;
    padding: 0.9rem 1rem;
    box-shadow: var(--isis-elevation-1);
    display: flex;
    flex-direction: column;
    gap: 0.65rem;
    min-width: 0;
}
.isis-detail-grid__card-title {
    margin: 0;
    font-size: 0.7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--isis-text-soft);
}
.isis-detail-grid__dl {
    margin: 0;
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.4rem 0.85rem;
    font-size: 0.85rem;
    align-items: baseline;
}
.isis-detail-grid__dl > dt {
    color: var(--isis-text-soft);
    font-size: 0.72rem;
    white-space: nowrap;
}
.isis-detail-grid__dl > dd {
    margin: 0;
    color: var(--isis-text);
    overflow-wrap: anywhere;
}

/* Aide contextuelle sous une colonne du rail de synthèse (ex. coût non renseigné). */
.isis-detail-summary__hint {
    margin-top: 0.4rem;
    font-size: 0.7rem;
    line-height: 1.35;
    color: var(--isis-text-soft);
}

/* Carte détail compacte — 4 colonnes côte à côte (Identité / Client / Montants /
   Rentabilité prévisionnelle), séparateurs verticaux subtils. */
.isis-detail-summary {
    display: grid;
    grid-template-columns: 5fr 3fr 4fr 4fr;
    gap: 1.5rem;
}
@media (max-width: 1100px) {
    /* Sous 1100px : 2×2 pour éviter des colonnes trop étroites. Séparateurs
       verticaux retirés (le gap suffit) — sinon bordure parasite en début de
       2e rangée. */
    .isis-detail-summary {
        grid-template-columns: 1fr 1fr;
    }
    .isis-detail-summary__col + .isis-detail-summary__col {
        border-left: none;
        padding-left: 0;
        margin-left: 0;
    }
}
.isis-detail-summary__col {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 0;
}
.isis-detail-summary__col + .isis-detail-summary__col {
    border-left: 1px solid var(--isis-border-soft, #f1f2f5);
    padding-left: 1.5rem;
    margin-left: -0.75rem;
}
.isis-detail-summary__title {
    font-size: 0.65rem;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--isis-text-soft);
}
.isis-detail-summary__meta {
    margin-top: 0.85rem;
    padding-top: 0.65rem;
    border-top: 1px solid var(--isis-border-soft, #f1f2f5);
    display: flex;
    flex-wrap: wrap;
    gap: 0.85rem;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
}
.isis-detail-summary__meta strong {
    color: var(--isis-text-muted);
    font-weight: 500;
}

@media (max-width: 900px) {
    .isis-detail-summary {
        grid-template-columns: 1fr;
    }
    .isis-detail-summary__col + .isis-detail-summary__col {
        border-left: none;
        padding-left: 0;
        margin-left: 0;
        border-top: 1px solid var(--isis-border-soft, #f1f2f5);
        padding-top: 1rem;
        margin-top: 0.25rem;
    }
}

/* ============================================================================
   .isis-tabs-clean — Style tabs inspiré NetLogger CommandDetailsV3
   ----------------------------------------------------------------------------
   Override Radzen RadzenTabs : container avec border-bottom 1px, tabs avec
   radius top, hover fond gris-très-clair, actif = couleur accent + weight 600
   + sous-ligne 2px via box-shadow inset (technique propre, pas une ombre).
   ============================================================================ */
.isis-tabs-clean .rz-tabview {
    border: none !important;
    box-shadow: none !important;
    background: transparent !important;
}
.isis-tabs-clean .rz-tabview-nav {
    background: transparent !important;
    border-bottom: 1px solid var(--isis-border) !important;
    margin: 0 0 1rem 0 !important;
    padding: 0 !important;
    display: flex !important;
    align-items: center;
    gap: 4px;
    list-style: none;
}
.isis-tabs-clean .rz-tabview-nav > li,
.isis-tabs-clean .rz-tabview-nav-item {
    margin: 0 !important;
    background: transparent !important;
    border: none !important;
}
.isis-tabs-clean .rz-tabview-nav-link,
.isis-tabs-clean .rz-tabview-nav-link.rz-state-default {
    padding: 10px 16px !important;
    font-size: 0.82rem !important;
    font-weight: 500 !important;
    font-family: inherit !important;
    color: var(--isis-text-muted) !important;
    background: transparent !important;
    border: none !important;
    border-radius: 6px 6px 0 0 !important;
    display: inline-flex !important;
    align-items: center;
    gap: 6px;
    cursor: pointer;
    transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease !important;
}
.isis-tabs-clean .rz-tabview-nav-link:hover {
    color: var(--isis-text) !important;
    background: var(--isis-surface-alt) !important;
}
.isis-tabs-clean .rz-tabview-selected .rz-tabview-nav-link,
.isis-tabs-clean li.rz-state-active .rz-tabview-nav-link,
.isis-tabs-clean .rz-tabview-nav-link.rz-state-active {
    color: var(--isis-current-mod, var(--isis-accent)) !important;
    font-weight: 600 !important;
    background: transparent !important;
    /* F10 — sous-ligne 3px via inset (chevauche la border-bottom 1px du container).
       Couleur module courant (au lieu de gescom hardcodé) pour cohérence cross-module. */
    box-shadow: inset 0 -3px 0 0 var(--isis-current-mod, var(--isis-accent)) !important;
}
.isis-tabs-clean .rz-tabview-nav-link .rz-icon,
.isis-tabs-clean .rz-tabview-nav-link .material-icons,
.isis-tabs-clean .rz-tabview-nav-link .notranslate {
    font-size: 16px !important;
    vertical-align: middle;
}
.isis-tabs-clean .rz-tabview-panels {
    padding: 0 !important;
    border: none !important;
    background: transparent !important;
}
.isis-tabs-clean .rz-tabview-panel { padding: 0 !important; }

/* ============================================================================
   .isis-tabs / .isis-tab — Tabs HTML custom (port direct NetLogger CommandDetailsV3)
   ----------------------------------------------------------------------------
   Pattern : container border-bottom 1px, boutons radius top, hover bg gris très
   clair, actif = couleur module + weight 600 + sous-ligne 2px via box-shadow
   inset (technique propre, pas une ombre portée).
   ============================================================================ */
.isis-tabs {
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    gap: 4px;
    flex-wrap: wrap;
    flex-shrink: 0;   /* la barre d'onglets reste fixe, c'est le panneau qui scrolle */
}
.isis-tab {
    background: transparent;
    border: 0;
    padding: 10px 16px;
    font-size: 13px;
    font-family: inherit;
    color: var(--isis-text-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    border-radius: 6px 6px 0 0;
    transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
}
.isis-tab:hover {
    color: var(--isis-text);
    background: var(--isis-surface-soft, #f8fafc);
}
.isis-tab.is-active {
    /* Couleur du module courant (var propagée par .isis-shell__content.mod-*),
       pas le bleu Gescom en dur — sinon l'onglet actif est bleu sur les pages SIRH. */
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
    /* F10 — underline 3px au lieu de 2px : plus présent au scan visuel. */
    box-shadow: inset 0 -3px 0 0 var(--isis-current-mod, var(--isis-accent));
}
.isis-tab:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: -2px;
    border-radius: 3px;
}
.isis-tab .rz-icon,
.isis-tab .material-icons,
.isis-tab .notranslate {
    font-size: 16px !important;
    vertical-align: middle;
}
.isis-tabs__spacer { flex: 1; }

/* ─────────────────────────────────────────────────────────────────────────
   .isis-focus-zone — wrapper Participants + Tabs avec toggle plein écran
   ----------------------------------------------------------------------------
   Pattern porté depuis .isis-geo-layers (2026-05-23, ZoneGeoSection V1.3) :
   un wrapper qui peut basculer en `position: fixed` sous le header app pour
   libérer toute la largeur de l'écran. Sert principalement aux pages détail
   (DevisDetail, etc.) où le sidepanel fixe 480px contraint la zone principale
   sur petits écrans. Touche Échap = sortie. z-index 950 < dialogs Radzen 1010.
   ───────────────────────────────────────────────────────────────────────── */
.isis-focus-zone {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    /* En mode normal, hérite de la chaîne flex de .isis-detail-layout__main :
       prend la hauteur restante et contraint les enfants → la carte d'onglets
       continue de scroller en interne, pas la page. */
    flex: 1 1 auto;
    min-height: 0;
    outline: none;
}
.isis-focus-zone--expanded {
    position: fixed;
    /* `top` calibré pour laisser la `.isis-rich-toolbar` (breadcrumb + actions)
       visible au-dessus du wrapper. Header app 56px + toolbar ~52px (padding
       page 0.75rem + bouton h 32px + gap 0.85rem) = ~108px de marge haute.
       Surchargeable par page via inline style="--isis-focus-zone-top: ..."
       si toolbar wrap sur 2 lignes (rare). Refonte 2026-05-29 : auparavant
       cachait la toolbar (fullscreen modal). */
    top: var(--isis-focus-zone-top, calc(var(--isis-header-h, 56px) + 52px));
    /* `left` calibré sur la largeur du subnav module : la nav latérale reste
       visible et naviguable en mode focus. C'est la différence vs le pattern
       zone géo qui occupe full-screen (la carte a besoin de TOUT l'espace,
       les onglets non — l'objectif est de récupérer le sidepanel droit 480px,
       pas de couper la nav latérale). Sync avec .isis-shell__sidebar. */
    left: var(--isis-subnav-w, 280px);
    right: 0;
    bottom: 0;
    z-index: 950;
    background: var(--isis-surface);
    padding: 0.75rem 1rem 1rem;
    border-top: 1px solid var(--isis-border);
    /* Le wrapper porte tabindex="-1" : focus-visible signale clairement le
       conteneur actif (utile pour la touche Échap). */
    outline: none;
    /* Anim douce de la largeur quand l'utilisateur replie le subnav pendant
       qu'on est en focus zone (calque .isis-shell__sidebar transition). */
    transition: left 200ms cubic-bezier(0.4, 0, 0.2, 1);
}
/* Si le subnav est replié (.isis-shell.is-subnav-collapsed), recalibre la
   bordure gauche du wrapper sur la largeur réduite — sinon un trou visuel
   apparaît entre subnav rétréci et zone focus. */
.isis-shell.is-subnav-collapsed .isis-focus-zone--expanded {
    left: var(--isis-subnav-w-collapsed, 64px);
}
.isis-focus-zone--expanded:focus-visible {
    box-shadow: inset 0 0 0 2px var(--isis-accent);
}

/* Variante sticky du ruban Participants en mode plein écran : reste visible
   en haut quand on scrolle dans les onglets (UX bonus — pratique pour vérifier
   la répartition cotraitant en éditant les lignes). */
.isis-focus-zone--expanded .isis-participants-ribbon {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--isis-surface);
}

/* Mini-bandeau identité en tête du focus-zone (DevisDetail 2026-05-29).
   Garde le contexte essentiel (numéro · titre · statut · tiers) à l'écran
   quand la summary card est masquée par le wrapper en mode --expanded.
   En mode normal, le bandeau est caché : le contexte vit déjà dans la summary. */
.isis-focus-zone__header {
    display: none;
}
.isis-focus-zone--expanded .isis-focus-zone__header {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.4rem 0.7rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    flex-shrink: 0;
}
.isis-focus-zone__num {
    font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    color: var(--isis-text);
    font-weight: 500;
    font-size: 0.82rem;
}
.isis-focus-zone__title {
    color: var(--isis-text);
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 360px;
}
.isis-focus-zone__sep {
    opacity: 0.45;
    color: var(--isis-text-soft);
}
.isis-focus-zone__tiers {
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 280px;
}

/* Bouton fullscreen dans la barre d'onglets — placé après __spacer (donc à
   droite). Calque visuel sur .isis-map-toolbar__btn (zone géo) : ~28px carré,
   icône Material 16px, border + radius légers. */
.isis-tabs__expand-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    margin-left: 4px;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 6px;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 120ms, color 120ms, border-color 120ms;
}
.isis-tabs__expand-btn:hover,
.isis-tabs__expand-btn:focus-visible {
    background: var(--isis-surface-alt);
    border-color: var(--isis-border);
    color: var(--isis-text);
    outline: none;
}
.isis-tabs__expand-btn[aria-pressed="true"] {
    color: var(--isis-current-mod, var(--isis-accent));
}

.isis-tab-panel { display: block; }
.isis-tab-panel.is-hidden { display: none; }
/* Panneau d'onglet « nu » (fiches détail, ex. DevisDetail) : le panneau actif
   prend la hauteur restante de la carte d'onglets et scrolle en interne — la
   page entière ne défile plus. Exclut --rich (chaîne flex propre) et --footed
   (qui pinne un pied de panneau). */
.isis-tab-panel:not(.is-hidden):not(.isis-tab-panel--rich):not(.isis-tab-panel--footed) {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}
/* Modificateur --footed : panneau dont le contenu scrollable est encadré d'un
   en-tête fixe (toolbar) et d'un pied fixe « collé au bas » (ex. onglet Lignes :
   tableau scrollable + Ventilation TVA pinnée en bas). */
.isis-tab-panel--footed:not(.is-hidden) {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;   /* remplit toute la hauteur de la carte d'onglets */
    min-height: 0;
    overflow: hidden;
}
.isis-tab-panel--footed > .isis-devis-items__toolbar {
    flex-shrink: 0;
}
/* Zone scrollable interne du panneau --footed.
   flex: 1 1 auto → la zone du tableau prend toute la place disponible, ce qui
   pousse la Ventilation TVA (flex-shrink:0) et la garde collée AU BAS du
   panneau. Peu de lignes ⇒ espace vide sous le tableau, TVA en bas. Beaucoup
   de lignes ⇒ le tableau scrolle en interne, TVA toujours en bas. */
.isis-devis-items__scroll {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}
/* Modificateur --rich : le panneau d'onglet contient des sections rich-page
   (KPI / filtre / master-detail). Il relaie alors le rythme vertical de
   .isis-rich-page (gap entre sections) ET la chaîne flex de hauteur — sinon
   les sections sont collées et la grille interne ne se contraint pas.
   Réservé aux pages liste-à-onglets ; les fiches détail gardent le bloc nu. */
.isis-tab-panel--rich:not(.is-hidden) {
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    flex: 1 1 auto;
    min-height: 0;
}

/* ============================================================================
   .isis-tabs-card — carte englobante d'un bloc « onglets + panneaux » sur une
   page rich-page. Maillon manquant de la chaîne flex pleine hauteur : la
   .isis-rich-page (overflow:hidden + height:100%) délègue tout l'espace
   restant à cette carte, qui à son tour épingle la barre .isis-tabs en haut
   et laisse scroller le .isis-tab-panel actif dans son intérieur.

   À placer en dernier enfant de .isis-rich-page. Pattern utilisé par
   gesproj/commandes/{id} (cf. décision 2026-05-15).

   Variante .isis-focus-zone > … : depuis 2026-05-29, les fiches détail
   enveloppent la carte d'onglets dans un wrapper .isis-focus-zone (toggle
   plein écran). Le wrapper s'intercale entre .isis-rich-page et la carte, ce
   qui cassait le sélecteur enfant-direct → la carte retombait sur flex:0 1 auto
   (taille = contenu) et laissait du vide en bas. On relaie donc la chaîne flex
   au cas focus-zone (le wrapper porte déjà flex:1 1 auto + min-height:0).
   ============================================================================ */
.isis-rich-page > .isis-tabs-card.rz-card,
.isis-focus-zone > .isis-tabs-card.rz-card {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    padding: 0;          /* on porte le padding aux enfants pour mieux contrôler */
}
.isis-rich-page > .isis-tabs-card.rz-card > .isis-tabs,
.isis-focus-zone > .isis-tabs-card.rz-card > .isis-tabs {
    flex-shrink: 0;
    margin: 0 1rem;
    padding-top: 0.5rem;
}
.isis-rich-page > .isis-tabs-card.rz-card > .isis-tab-panel:not(.is-hidden),
.isis-focus-zone > .isis-tabs-card.rz-card > .isis-tab-panel:not(.is-hidden) {
    padding: 0.25rem 1rem 1rem;
}

/* ============================================================================
   .isis-contact-card — Carte interlocuteur (réutilisable)
   ============================================================================ */
.isis-contact-list { display: flex; flex-direction: column; gap: 0.5rem; }
.isis-contact-card {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.65rem 0.85rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    transition: background-color 120ms ease;
}
.isis-contact-card:hover { background: var(--isis-surface-alt); }
/* Carte navigable au clavier (tabindex + role=button côté markup). */
.isis-contact-card--navigable { cursor: pointer; }
.isis-contact-card--navigable:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-contact-card__avatar {
    width: 34px; height: 34px;
    border-radius: 50%;
    /* Teinte du module courant (composant partagé) — pas le bleu Gescom en dur. */
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    font-size: 0.78rem;
    font-weight: 600;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    text-transform: uppercase;
}
.isis-contact-card__main { flex: 1; min-width: 0; }
.isis-contact-card__name {
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-contact-card__meta {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-contact-card__primary {
    font-size: 0.62rem;
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    flex-shrink: 0;
}

/* Actions hover-révélées sur la carte contact */
.isis-contact-card__actions {
    display: flex;
    gap: 0.2rem;
    opacity: 0;
    transition: opacity 120ms ease;
    flex-shrink: 0;
}
.isis-contact-card:hover .isis-contact-card__actions,
.isis-contact-card:focus-within .isis-contact-card__actions { opacity: 1; }
.isis-contact-card__action-btn {
    width: 28px; height: 28px;
    border: none;
    background: transparent;
    border-radius: 6px;
    color: var(--isis-text-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-contact-card__action-btn:hover {
    background: var(--isis-surface);
    color: var(--isis-text);
}
.isis-contact-card__action-btn--danger:hover {
    background: var(--isis-danger-soft);
    color: #dc2626;
}

/* En-tête de tab : titre + bouton Ajouter à droite */
.isis-tab-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.85rem;
}
.isis-tab-header__title {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-tab-header__title strong {
    color: var(--isis-text);
    font-weight: 600;
}

.isis-tab-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-soft);
    text-align: center;
    font-size: 0.85rem;
}
.isis-tab-empty .rzi { font-size: 32px; opacity: 0.4; }

/* ============================================================================
   .isis-grid--entreprises — arbre indenté de la hiérarchie sirh.entreprise
   (onglet Entreprises de la page Organisation). À combiner avec .isis-grid--tree.
   Colonnes : tree | nom | code | type | pays | actions
   La maison mère n'a plus de colonne dédiée : elle est portée par l'indentation.
   ============================================================================ */
.isis-grid--entreprises .isis-grid__head,
.isis-grid--entreprises .isis-grid__row {
    grid-template-columns: 32px minmax(200px, 1.7fr) 78px 130px 64px 84px;
    min-width: 640px;
}
.isis-grid--entreprises .isis-grid__col-name {
    font-weight: 500;
    color: var(--isis-text);
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    min-width: 0;
}
.isis-grid--entreprises .isis-grid__col-name .rzi { font-size: 14px; opacity: 0.5; }
.isis-grid--entreprises .isis-grid__col-name-label {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid--entreprises .isis-grid__col-shortcode {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-text);
    font-weight: 600;
    letter-spacing: 0.05em;
}
.isis-grid--entreprises .isis-grid__col-type { color: var(--isis-text-muted); font-size: 0.85rem; }
.isis-grid--entreprises .isis-grid__col-country {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
/* .isis-grid__col-parent retiré : la grille Entreprises est désormais un arbre
   indenté, la maison mère est portée par l'indentation (plus de colonne dédiée). */

/* ============================================================================
   .isis-grid--organisation — arbre unifié de l'onglet « Structures internes »
   (entreprises racines + structures org). À combiner avec .isis-grid--tree.
   Colonnes : tree | nom | type | code | manager | effectif | actions
   ============================================================================ */
.isis-grid--organisation .isis-grid__head,
.isis-grid--organisation .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.7fr) 130px 78px minmax(140px, 1fr) 82px 112px;
    min-width: 960px;
}
.isis-grid--organisation .isis-grid__col-type { color: var(--isis-text-muted); font-size: 0.85rem; }
.isis-grid--organisation .isis-grid__col-shortcode {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-text);
    font-weight: 600;
    letter-spacing: 0.05em;
}
.isis-grid--organisation .isis-grid__kind-icon { font-size: 15px !important; flex-shrink: 0; }
.isis-grid--organisation .isis-grid__kind-icon.is-entreprise { color: var(--isis-mod-sirh, #10b981); opacity: 0.9; }
.isis-grid--organisation .isis-grid__kind-icon.is-structure  { color: var(--isis-text-soft); opacity: 0.7; }
.isis-grid--organisation .isis-grid__row.is-entreprise .isis-grid__col-name-label { font-weight: 600; }

/* ============================================================================
   .isis-grid--entreprises — onglet « Entreprises » enrichi (Lot 1 pilotage live)
   Colonnes : tree | nom (+ badges) | code | type | pays | manager (+ titre)
              | effectif | structures | actions
   ============================================================================ */
.isis-grid--tree.isis-grid--entreprises .isis-grid__head,
.isis-grid--tree.isis-grid--entreprises .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.5fr) 85px 95px 55px minmax(150px, 1fr) 95px 80px 112px;
    min-width: 1080px;
}
.isis-grid--entreprises .isis-grid__col-country {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
}
/* Pill structures internes : variante grise neutre du headcount-pill (différencie
   visuellement effectif vs structures pour le scan rapide). */
.isis-grid__structures-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 26px;
    padding: 0 0.4rem;
    height: 18px;
    border-radius: 9px;
    background: var(--isis-surface-alt);
    color: var(--isis-text);
    font-size: 0.7rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* ============================================================================
   .isis-grid--structures — variante pour la liste sirh.entreprise_structure
   Colonnes : status | nom | code court | parent | master | actions
   Override des grid-template-columns par défaut (qui ciblent les tiers).
   ============================================================================ */
.isis-grid--structures .isis-grid__head,
.isis-grid--structures .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.8fr) 110px minmax(200px, 1.3fr) 110px 90px;
    min-width: 820px;
}
.isis-grid--structures .isis-grid__col-name {
    font-weight: 500;
    color: var(--isis-text);
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
}
.isis-grid--structures .isis-grid__col-name .rzi { font-size: 14px; opacity: 0.5; }
.isis-grid--structures .isis-grid__col-shortcode {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-text);
    font-weight: 600;
    letter-spacing: 0.05em;
}
.isis-grid--structures .isis-grid__col-parent {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
}
.isis-grid__status-dot.is-master      { background: var(--isis-mod-sirh, #10b981); }
.isis-grid__status-dot.is-nonmaster   { background: #9ca3af; }

/* Pastille « no short code » utilisée en lieu et place du code monospace */
.isis-grid__shortcode-empty {
    color: var(--isis-text-soft);
    font-style: italic;
    font-family: inherit !important;
    letter-spacing: 0 !important;
    font-weight: 400 !important;
}

/* ============================================================================
   .isis-view-toggle — Segmented control (Liste ↔ Organigramme)
   ----------------------------------------------------------------------------
   Posé dans la toolbar `.isis-rich-toolbar__actions`. Cohérent avec le style
   `.isis-rich-toolbar__btn` mais regroupé visuellement (2-3 segments).
   ============================================================================ */
.isis-view-toggle {
    display: inline-flex;
    align-items: stretch;
    gap: 0;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    padding: 2px;
    height: 30px;
    margin-right: 0.4rem;
}
.isis-view-toggle__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0 0.7rem;
    background: transparent;
    border: none;
    border-radius: 6px;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    font-weight: 500;
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-view-toggle__btn:hover {
    color: var(--isis-text);
}
.isis-view-toggle__btn.is-active {
    background: var(--isis-surface);
    color: var(--isis-text);
    font-weight: 600;
}
.isis-view-toggle__btn:disabled,
.isis-view-toggle__btn[disabled] {
    cursor: not-allowed;
    opacity: 0.45;
}
.isis-view-toggle__btn:disabled:hover { color: var(--isis-text-muted); }
.isis-view-toggle__btn .rzi { opacity: 0.7; }
.isis-view-toggle__btn.is-active .rzi { opacity: 1; color: var(--isis-accent); }
/* Point #4 — variante compacte pour les segmented controls de toolbar (zoom levels). */
.isis-view-toggle__btn--compact {
    padding: 0 0.45rem;
    font-size: 0.72rem;
    height: 26px;
}

/* ============================================================================
   .isis-grid--tree — Variante arbre indenté de la grille structures
   ----------------------------------------------------------------------------
   Colonnes : tree(32) | name | shortcode(110) | descendants(120) | master(110) | actions(90)
   Override des grid-template-columns de `.isis-grid--structures` (qui restent
   utiles si on revient à une vue à plat dans le futur).
   ============================================================================ */
.isis-grid--tree.isis-grid--structures .isis-grid__head,
.isis-grid--tree.isis-grid--structures .isis-grid__row {
    /* tree | name | shortcode | manager | headcount | descendants | master | actions */
    grid-template-columns: 32px minmax(220px, 1.5fr) 95px minmax(150px, 1fr) 80px 100px 95px 60px;
    min-width: 1080px;
}
.isis-grid__col-manager {
    color: var(--isis-text);
    font-size: 0.82rem;
    display: inline-flex !important;
    align-items: center;
    gap: 0.35rem;
    overflow: hidden !important;
    white-space: nowrap;
    text-overflow: ellipsis;
}
.isis-grid__manager-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--isis-mod-sirh);
    flex-shrink: 0;
}
.isis-grid__col-headcount-head {
    justify-content: flex-end;
    padding-right: 0.6rem !important;
}
.isis-grid__col-headcount {
    text-align: right;
    padding-right: 0.6rem !important;
}
.isis-grid__headcount-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 26px;
    padding: 0 0.4rem;
    height: 18px;
    border-radius: 9px;
    background: var(--isis-mod-sirh-soft, #ecfdf5);
    /* Texte en --isis-text : --isis-mod-sirh sur --isis-mod-sirh-soft ne donne
       que 2.4:1 (échec WCAG AA texte). Le fond vert pâle porte l'identité SIRH. */
    color: var(--isis-text);
    font-size: 0.7rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}
/* Rollup d'effectif : « 12 / 47 » — la 2nde valeur (consolidé descendants) en plus discret. */
.isis-grid__headcount-rollup {
    color: var(--isis-text-muted);
    font-weight: 500;
    margin-left: 1px;
}

/* Badge nombre d'enfants directs, posé à droite du nom dans la cellule arbre. */
.isis-grid__sub-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 16px;
    padding: 0 0.3rem;
    margin-left: 0.35rem;
    border-radius: 8px;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    font-size: 0.68rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    line-height: 1;
}

/* Drapeau « sans manager » — alerte de gouvernance discrète. */
.isis-grid__warning-dot {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    margin-left: 0.3rem;
    border-radius: 50%;
    background: var(--isis-warning-soft, #fef3c7);
    color: var(--isis-warning, #b45309);
    font-size: 0.7rem;
    font-weight: 700;
    line-height: 1;
    cursor: help;
}

/* Stack vertical nom-poste dans la cellule Manager. */
.isis-grid__manager-stack {
    display: flex;
    flex-direction: column;
    min-width: 0;
    overflow: hidden;
}
.isis-grid__manager-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid__manager-title {
    color: var(--isis-text-muted);
    font-size: 0.72rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    line-height: 1.15;
}

/* Cellule tree (chevron expand/collapse ou dot feuille) */
.isis-grid__col-tree {
    display: flex !important;
    justify-content: center;
    align-items: center;
    padding: 0 !important;
}
.isis-grid__chevron-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    border: none;
    background: transparent;
    border-radius: 4px;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background-color 120ms ease, color 120ms ease;
}
.isis-grid__chevron-btn:hover {
    background: var(--isis-surface);
    color: var(--isis-accent);
}
.isis-grid__chevron-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
    color: var(--isis-text);
}
.isis-grid__leaf-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--isis-border);
    display: inline-block;
}

/* Cellule "Nom" en mode arbre : indentation par profondeur + guides verticaux */
.isis-grid__col-name--tree {
    display: inline-flex !important;
    align-items: center;
    gap: 0.35rem;
    overflow: hidden !important;
}
.isis-grid__tree-guide {
    display: inline-block;
    width: 22px;
    height: 32px;
    border-left: 1px dashed var(--isis-border);
    margin-right: -4px;
    flex-shrink: 0;
    opacity: 0.55;
}
.isis-grid__col-name-label {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

/* Cellule "Descendants" */
.isis-grid__col-descendants-head {
    justify-content: flex-end;
    padding-right: 0.6rem !important;
}
.isis-grid__col-descendants {
    text-align: right;
    padding-right: 0.6rem !important;
}
.isis-grid__descendants-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 26px;
    padding: 0 0.4rem;
    height: 18px;
    border-radius: 9px;
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-size: 0.7rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* Bloc master/detail en mode plein écran (vue organigramme) */
.isis-master-detail.is-fullwidth {
    grid-template-columns: 1fr;
}
.isis-master-detail.is-fullwidth .isis-master-detail__detail {
    display: none;
}

/* ============================================================================
   .isis-orgchart — Vue organigramme top-down (Balkan OrgChart JS)
   ----------------------------------------------------------------------------
   Wrapper minimaliste autour du host Balkan. Le contenu (cards, connecteurs)
   est rendu par Balkan en SVG ; on contrôle seulement le container et la
   légende.
   ============================================================================ */
.isis-orgchart-wrapper {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    gap: 0.6rem;
    overflow: hidden;
}
.isis-orgchart-balkan-host {
    /* `flex: 1 1 0` (au lieu de `1 1 auto`) : la base à 0 laisse Balkan
       respirer dans la hauteur fournie par la chaîne flex, sans imposer
       de plancher dur qui ferait déborder le master sur petits écrans. */
    flex: 1 1 0;
    min-height: 280px;
    background:
        radial-gradient(circle at 1px 1px, #e5e7eb 1px, transparent 0) 0 0 / 18px 18px,
        var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    overflow: hidden;
    position: relative;
}
/* Le SVG interne hérite explicitement de la box du host : sans ça Balkan
   peut conserver la largeur/hauteur calculées au 1er render et ne pas suivre
   le resize du container (sidepanel toggle, fenêtre, switch d'onglet). */
.isis-orgchart-balkan-host > svg {
    display: block;
    width: 100% !important;
    height: 100% !important;
}

/* Hover : surligne la 1re <rect> de la node (= bordure card) avec l'accent ISIS.
   Balkan attache `data-n-id` à chaque <g> de noeud. */
.isis-orgchart-balkan-host g[data-n-id] { cursor: pointer; }
.isis-orgchart-balkan-host g[data-n-id]:hover > rect:first-of-type {
    stroke: var(--isis-accent) !important;
    stroke-width: 1.5 !important;
}

/* Watermark Balkan (Free Trial uniquement, pas Community — au cas où on switche
   un jour) : on l'atténue par défaut. À supprimer si licence achetée. */
.isis-orgchart-balkan-host .boc-watermark,
.isis-orgchart-balkan-host [class*="watermark"] {
    opacity: 0.25 !important;
}

/* Toolbar Balkan : neutralise les ombres et aligne au theme Flat */
.isis-orgchart-balkan-host .bft-toolbar {
    background: var(--isis-surface) !important;
    border: 1px solid var(--isis-border) !important;
    box-shadow: none !important;
}
.isis-orgchart-balkan-host .bft-toolbar svg { fill: var(--isis-text-muted) !important; }
.isis-orgchart-balkan-host .bft-toolbar :hover svg { fill: var(--isis-accent) !important; }

.isis-orgchart-legend {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 1rem;
    padding: 0.35rem 0.6rem;
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-orgchart-legend span {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}
.isis-orgchart-legend__swatch {
    width: 14px;
    height: 14px;
    border-radius: 3px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left-width: 3px;
}
.isis-orgchart-legend__swatch.is-master {
    border-left-color: var(--isis-mod-sirh, #10b981);
}
.isis-orgchart-legend__swatch.is-nonmaster {
    border-left-color: var(--isis-border);
}
.isis-orgchart-legend__swatch.is-manager {
    border-left-color: #facc15;
}
.isis-orgchart-legend__swatch.is-nonmanager {
    border-left-color: var(--isis-border);
}
.isis-orgchart-legend__hint {
    margin-left: auto;
    color: var(--isis-text-soft);
    font-style: italic;
}

.isis-orgchart-empty {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 3rem 1rem;
    color: var(--isis-text-soft);
    text-align: center;
}
.isis-orgchart-empty .rzi { font-size: 32px; opacity: 0.4; }

/* ============================================================================
   .isis-grid--collaborateurs — Grille de l'effectif sirh
   Colonnes : status | identity | poste | structure | contrat | embauche | état | actions
   La colonne actions accueille 3 boutons (ouvrir / lier compte / modifier) :
   3 × 28px + 2 × 4px gap ≈ 92px, on prend 110px avec marge.
   ============================================================================ */
.isis-grid--collaborateurs .isis-grid__head,
.isis-grid--collaborateurs .isis-grid__row {
    grid-template-columns: 32px minmax(240px, 1.8fr) minmax(160px, 1.4fr) minmax(140px, 1fr) 90px 110px 100px 110px;
    min-width: 1140px;
}

/* Status dots pour l'état du collaborateur */
.isis-grid__status-dot.is-actif    { background: #10b981; }
.isis-grid__status-dot.is-suspendu { background: #f59e0b; }
.isis-grid__status-dot.is-sorti    { background: #9ca3af; }

/* Cellule identité combinée : avatar + nom + sous-ligne */
.isis-grid__col-identity {
    display: flex !important;
    align-items: center;
    gap: 0.6rem;
    overflow: hidden !important;
}
.isis-grid__avatar {
    flex-shrink: 0;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--isis-mod-sirh-soft, #ecfdf5);
    color: var(--isis-mod-sirh, #10b981);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.05em;
}
.isis-grid__avatar--photo {
    background: transparent;
    object-fit: cover;
    border: 1px solid var(--isis-border);
}

/* Composant uploader photo (form dialog collaborateur) */
.isis-photo-uploader {
    display: flex;
    align-items: center;
    gap: 1rem;
}
.isis-photo-uploader__preview {
    flex-shrink: 0;
    width: 96px;
    height: 96px;
    border-radius: 50%;
    background: var(--isis-mod-sirh-soft, #ecfdf5);
    border: 1px solid var(--isis-border);
    overflow: hidden;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-photo-uploader__preview img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.isis-photo-uploader__initials {
    color: var(--isis-mod-sirh, #10b981);
    font-size: 1.4rem;
    font-weight: 600;
    letter-spacing: 0.06em;
}
.isis-photo-uploader__actions {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    flex: 1;
    min-width: 0;
}
.isis-photo-uploader__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.7rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    color: var(--isis-text);
    font-size: 0.8rem;
    font-weight: 500;
    cursor: pointer;
    width: fit-content;
    transition: background-color 120ms, color 120ms, border-color 120ms;
}
.isis-photo-uploader__btn:hover {
    background: var(--isis-surface-alt);
    border-color: var(--isis-accent);
    color: var(--isis-accent);
}
.isis-photo-uploader__btn--ghost {
    color: var(--isis-text-muted);
}
.isis-photo-uploader__btn--ghost:hover {
    color: #dc2626;
    border-color: #dc2626;
}
.isis-photo-uploader__busy {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}

.isis-grid__identity-block {
    display: flex;
    flex-direction: column;
    gap: 1px;
    overflow: hidden;
    min-width: 0;
}
.isis-grid__identity-name {
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid__identity-sub {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    display: flex;
    align-items: center;
    gap: 0.35rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid__matricule {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    color: var(--isis-text-muted);
    font-weight: 500;
}
.isis-grid__identity-dot { opacity: 0.5; }
.isis-grid__cell-hint {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    margin-top: 2px;
}
.isis-grid__col-structure { color: var(--isis-text-muted); }
.isis-grid__col-date {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
}

/* Side panel détail collaborateur (réutilisé : avatar XL + identité, blocs section) */
.isis-detail-collab-head {
    display: flex;
    align-items: center;
    gap: 0.85rem;
}
.isis-detail-collab-head__avatar {
    width: 48px !important;
    height: 48px !important;
    font-size: 1rem !important;
}
.isis-detail-collab-head__main {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    min-width: 0;
}
.isis-detail-collab-head__meta {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.isis-detail-block {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding-top: 0.5rem;
    border-top: 1px dashed var(--isis-border);
}
.isis-detail-block:first-child { border-top: none; padding-top: 0; }
.isis-detail-block__title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    font-weight: 600;
}
.isis-detail-link {
    color: var(--isis-accent);
    text-decoration: none;
}
.isis-detail-link:hover { text-decoration: underline; }
.isis-detail-collab-hint {
    color: var(--isis-text-soft);
    font-size: 0.78rem;
    margin-left: 0.25rem;
}

/* Select natif dans la barre de filtres (theming Flat aligné sur l'input search) */
.isis-filter-bar__select {
    display: flex;
    align-items: center;
}
.isis-filter-bar__select select {
    appearance: none;
    -webkit-appearance: none;
    padding: 0.45rem 1.8rem 0.45rem 0.7rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    color: var(--isis-text);
    font-size: 0.8rem;
    cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%236b7280' width='14' height='14'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.5rem center;
    transition: border-color 120ms;
}
.isis-filter-bar__select select:hover { border-color: var(--isis-accent); }
.isis-filter-bar__select select:focus {
    outline: none;
    border-color: var(--isis-accent);
}

/* ============================================================================
   .isis-grid--users — Grille des utilisateurs (admin)
   Colonnes : status | identity | modules | derniere conn. | etat | actions
   ============================================================================ */
.isis-grid--users .isis-grid__head,
.isis-grid--users .isis-grid__row {
    grid-template-columns: 32px minmax(240px, 1.8fr) minmax(220px, 1.6fr) 150px 100px 90px;
    min-width: 980px;
}

/* Avatar variante admin (gris neutre) — réutilise .isis-grid__avatar.
   Texte en gris foncé (#374151) pour contraste WCAG AA sur fond #f3f4f6 (~9.5:1). */
.isis-grid--users .isis-grid__avatar {
    background: var(--isis-mod-admin-soft);
    color: #374151;
}

/* Status dots utilisateurs */
.isis-grid__status-dot.is-inactif { background: #9ca3af; }

/* Variante admin du side panel (avatar XL) */
.isis-detail-collab-head--admin .isis-detail-collab-head__avatar {
    background: var(--isis-mod-admin-soft) !important;
    color: #374151 !important;
}

/* Wrap des badges modules dans la ligne de grille */
.isis-grid__col-modules {
    display: flex !important;
    flex-wrap: wrap;
    gap: 0.25rem;
    align-items: center;
    overflow: hidden;
}

/* ============================================================================
   .isis-grid--equipe — variante équipe gescom
   Colonnes : status | membre | login | statut | autorité | manager | actions
   ============================================================================ */
.isis-grid--equipe .isis-grid__head,
.isis-grid--equipe .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.6fr) 160px 130px 140px minmax(180px, 1.2fr) 110px;
    min-width: 980px;
}
.isis-grid__status-dot.is-active       { background: #10b981; }
.isis-grid__status-dot.is-inactive     { background: #f59e0b; }
.isis-grid__status-dot.is-not-activated { background: #9ca3af; }

.isis-equipe-member {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    min-width: 0;
}
.isis-equipe-member__avatar {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.7rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    flex-shrink: 0;
}
.isis-equipe-member__name {
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-equipe-money {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    font-weight: 500;
}
.isis-equipe-illimite {
    color: var(--isis-mod-gescom);
    font-weight: 500;
    font-style: italic;
}
.isis-grid__action-btn--primary {
    color: var(--isis-mod-gescom);
}
.isis-grid__action-btn--primary:hover {
    background: var(--isis-mod-gescom-soft);
}
.isis-grid__action-btn--danger {
    color: var(--rz-danger, #dc2626);
}
.isis-grid__action-btn--danger:hover {
    background: var(--rz-danger-lighter, #fef2f2);
}

/* Sprint F.2 — action-btn dans état "actif" (= des données associées existent).
   Ex : bouton compétences avec compteur > 0. */
.isis-grid__action-btn--active {
    color: var(--isis-mod-sirh, var(--isis-accent));
    position: relative;
}
.isis-grid__action-btn--active:hover {
    background: color-mix(in srgb, var(--isis-mod-sirh, var(--isis-accent)) 14%, transparent);
}
.isis-grid__action-btn__badge {
    position: absolute;
    top: -4px;
    right: -4px;
    min-width: 14px;
    height: 14px;
    padding: 0 3px;
    font-size: 0.6rem;
    font-weight: 700;
    line-height: 14px;
    text-align: center;
    background: var(--isis-mod-sirh, var(--isis-accent));
    color: white;
    border-radius: var(--isis-radius-pill);
}
.isis-grid__action-btn--success {
    color: var(--isis-success);
}
.isis-grid__action-btn--success:hover {
    background: var(--isis-mod-sirh-soft);
}

/* ============================================================================
   .isis-grid--regles — variante règles d'approbation gescom
   Colonnes : status | priorité | nom | conditions | approbateur | actions
   ============================================================================ */
.isis-grid--regles .isis-grid__head,
.isis-grid--regles .isis-grid__row {
    grid-template-columns: 32px 80px minmax(220px, 1.4fr) minmax(240px, 1.8fr) minmax(200px, 1.2fr) 130px;
    min-width: 980px;
}
.isis-regle-name { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.isis-regle-desc {
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    font-weight: 400;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-regle-conditions {
    display: flex !important;
    flex-wrap: wrap;
    gap: 0.3rem;
    align-items: center;
    padding: 0.35rem !important;
    margin: 0;
    list-style: none;
    overflow: visible !important;
    white-space: normal !important;
}
.isis-regle-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.15rem 0.5rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.isis-regle-approver-tag {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    border-radius: 3px;
    font-size: 0.65rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.isis-regle-detail-desc {
    font-size: 0.82rem;
    line-height: 1.45;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    border-left: 2px solid var(--isis-border);
    padding: 0.5rem 0.7rem;
    border-radius: 4px;
}

/* Sélecteur de mode d'approbateur (radio cards Statique / N+x) */
.isis-mode-toggle {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
    margin-top: 0.3rem;
}
.isis-mode-toggle__opt {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.65rem 0.75rem;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
    cursor: pointer;
    transition: background-color 120ms ease, border-color 120ms ease;
}
.isis-mode-toggle__opt:hover { background: var(--isis-surface-alt); }
.isis-mode-toggle__opt.is-active {
    border-color: var(--isis-accent);
    background: var(--isis-accent-soft);
}
.isis-mode-toggle__opt input[type="radio"] {
    margin-top: 0.2rem;
    accent-color: var(--isis-accent);
}
.isis-mode-toggle__opt .rzi {
    color: var(--isis-text-muted);
    flex-shrink: 0;
    margin-top: 0.1rem;
}
.isis-mode-toggle__opt.is-active .rzi { color: var(--isis-accent); }
.isis-mode-toggle__opt > div {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}
.isis-mode-toggle__opt strong {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-mode-toggle__opt small {
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    line-height: 1.3;
}
@media (max-width: 600px) {
    .isis-mode-toggle { grid-template-columns: 1fr; }
}

/* Badge mode N+x dans la liste règles */
.isis-regle-mode-tag {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.1rem 0.5rem;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    border-radius: 3px;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.03em;
    font-variant-numeric: tabular-nums;
}

/* ============================================================================
   .isis-grid--templates — variante "templates de documents" (gescom params)
   Colonnes : status | type | code | libellé | portée | actions
   ============================================================================ */
.isis-grid--templates .isis-grid__head,
.isis-grid--templates .isis-grid__row {
    grid-template-columns: 32px 130px 160px minmax(220px, 1.8fr) minmax(180px, 1.2fr) 130px;
    min-width: 880px;
}

.isis-tpl-kind {
    display: inline-flex;
    align-items: center;
    padding: 0.1rem 0.5rem;
    background: var(--isis-mod-gescom-soft);
    /* Bleu profond pour ratio AA ≥ 7:1 sur le fond gescom-soft (#eff6ff). */
    color: #1d3a8a;
    border-radius: 4px;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.02em;
}

.isis-tpl-default {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin-left: 0.5rem;
    padding: 0.05rem 0.4rem;
    background: var(--isis-accent-soft);
    /* Bleu accent assombri pour ratio AA ≥ 6:1 sur accent-soft (#eef0f9). */
    color: #2e3a73;
    border-radius: 3px;
    font-size: 0.65rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

/* Badge inline "Fichier introuvable" — signale qu'un template a son blob
   storage perdu (bucket purgé, suppression manuelle…). Calque .isis-tpl-default
   pour la cohérence visuelle, palette danger pour signaler l'urgence. */
.isis-tpl-orphan {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin-left: 0.5rem;
    padding: 0.05rem 0.4rem;
    background: var(--isis-danger-soft);
    color: #991b1b; /* red-800 — AA ≥ 6:1 sur danger-soft */
    border-radius: 3px;
    font-size: 0.65rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

/* Discriminator de portée pour les templates DEVIS (phase BPU).
   STANDARD = bleu doux (devis ferme), BPU = bleu pâle dédié.
   Pas de version pour 'générique' (NULL) — l'absence du badge suffit
   à signaler la portée large. */
.isis-tpl-devis-type {
    display: inline-flex;
    align-items: center;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    border-radius: 3px;
    font-size: 0.65rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.isis-tpl-devis-type.is-standard {
    background: #e0e7ff; /* indigo-100 */
    color: #3730a3;      /* indigo-800 — AA ≥ 7:1 sur indigo-100 */
}
.isis-tpl-devis-type.is-bpu {
    background: #dbeafe; /* blue-100 — cohérent avec le badge BPU liste devis (.isis-devis-bpu-tag) */
    color: #1e40af;      /* blue-800 — AA ≥ 7:1 sur blue-100 */
}

.isis-tpl-badges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.2rem;
}

/* ============================================================================
   Upload custom (.docx) — InputFile natif visuellement masqué, label stylé.
   ============================================================================ */
.isis-tpl-upload {
    position: relative;
    display: block;
}
/* Input visuellement masqué mais accessible au clavier (focus relayé sur le label). */
.isis-tpl-upload__input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
.isis-tpl-upload__label {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.55rem 0.85rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    color: var(--isis-text);
    cursor: pointer;
    font-size: 0.875rem;
    transition: border-color 0.15s ease, background-color 0.15s ease;
    width: 100%;
}
.isis-tpl-upload__label:hover {
    border-color: var(--isis-current-mod, var(--isis-accent));
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
}
.isis-tpl-upload__input:focus-visible + .isis-tpl-upload__label {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
}
.isis-tpl-upload__size {
    margin-left: auto;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* ============================================================================
   Analyse pré-upload : feedback placeholders connus / inconnus / collection items.
   ============================================================================ */
.isis-tpl-analysis {
    margin-top: 0.65rem;
    padding: 0.7rem 0.85rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
.isis-tpl-analysis__row {
    display: flex;
    align-items: flex-start;
    gap: 0.55rem;
    font-size: 0.8rem;
    line-height: 1.45;
    color: var(--isis-text);
}
.isis-tpl-analysis__row--warning {
    background: var(--isis-warning-soft);
    border-radius: 4px;
    padding: 0.45rem 0.6rem;
    margin: 0 -0.2rem;
}
.isis-tpl-analysis__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin-top: 0.35rem;
}
.isis-tpl-analysis__chips code {
    padding: 0.1rem 0.4rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    font-family: 'JetBrains Mono', 'Geist Mono', ui-monospace, monospace;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
}

/* Champ readonly dans formulaires (.isis-form-linear) — pour metadata immuables.
   Couleur texte primaire (et non muted) pour contraste AA ≥ 6.8:1 sur surface-alt. */
.isis-readonly-field {
    padding: 0.55rem 0.7rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-size: 0.875rem;
    color: var(--isis-text);
    user-select: text;
}
.isis-readonly-field code {
    font-family: 'JetBrains Mono', 'Geist Mono', ui-monospace, monospace;
    font-size: 0.825rem;
}

/* Label associé à une checkbox dans .isis-form-linear (factorisation
   du style inline répété sur "Définir par défaut", "Template actif", etc.). */
.isis-form-linear .field-checkbox-label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
}

/* Screen-reader-only — utilitaire d'accessibilité standard. Visuel caché
   mais le texte reste lisible par les lecteurs d'écran. Préfixe rz- pour
   cohérence avec les classes Radzen. */
.rz-sr-only {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* Focus visible sur les rangées de grille focusables (role="row" tabindex=0).
   Cible exclusivement le focus clavier (pas la souris) via :focus-visible. */
.isis-grid__row:focus-visible {
    /* Généralisation 2026-06 : grille générique de toutes les listes → suit le module courant (était gescom en dur). */
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: -2px;
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
}

/* ============================================================================
   Page détail collaborateur — header avec avatar XL + timeline carrière
   ============================================================================ */
.isis-rich-header--collab { gap: 1rem; }
.isis-detail-collab-head__avatar-wrap {
    position: relative;
    flex-shrink: 0;
}
.isis-rich-header__avatar {
    width: 72px;
    height: 72px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-rich-header__avatar--initials {
    background: var(--isis-mod-sirh-soft, #ecfdf5);
    color: var(--isis-mod-sirh, #10b981);
    font-size: 1.4rem;
    font-weight: 600;
    letter-spacing: 0.05em;
}
.isis-rich-header__manager-dot {
    position: absolute;
    top: -2px;
    right: -2px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: #facc15;
    border: 2px solid var(--isis-surface);
}

/* Timeline carrière */
.isis-timeline {
    list-style: none;
    padding: 0.4rem 0 0.4rem 1.2rem;
    margin: 0;
    position: relative;
}
.isis-timeline::before {
    content: "";
    position: absolute;
    left: 7px;
    top: 12px;
    bottom: 12px;
    width: 1px;
    background: var(--isis-border);
}
.isis-timeline__item {
    position: relative;
    padding: 0.6rem 0 0.6rem 1.4rem;
}
.isis-timeline__marker {
    position: absolute;
    left: -5px;
    top: 0.85rem;
    width: 13px;
    height: 13px;
    border-radius: 50%;
    background: var(--isis-surface);
    border: 2px solid var(--isis-border);
}
.isis-timeline__item.is-current .isis-timeline__marker {
    border-color: var(--isis-mod-sirh, #10b981);
    background: var(--isis-mod-sirh, #10b981);
    box-shadow: 0 0 0 3px var(--isis-mod-sirh-soft, #ecfdf5);
}
.isis-timeline__item.is-current .isis-timeline__content {
    background: var(--isis-mod-sirh-soft, #ecfdf5);
    border-color: var(--isis-mod-sirh, #10b981);
}
.isis-timeline__content {
    padding: 0.6rem 0.8rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-timeline__period {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}
.isis-timeline__title {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    margin-top: 0.2rem;
}
.isis-timeline__meta {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    flex-wrap: wrap;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-top: 0.2rem;
}
.isis-timeline__salary {
    margin-top: 0.4rem;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-timeline__notes {
    margin-top: 0.35rem;
    font-size: 0.78rem;
    color: var(--isis-text-soft);
    font-style: italic;
}

/* ── Chaîne d'approbation (sirh_absence_approval_step) ─────────────────── */
.isis-approval-chain {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-approval-chain__item {
    display: flex;
    gap: 0.7rem;
    align-items: flex-start;
    padding: 0.55rem 0.75rem;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
}
.isis-approval-chain__item.is-current {
    border-color: var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
}
.isis-approval-chain__item.is-rejected {
    border-color: var(--isis-danger);
    background: var(--isis-danger-soft, var(--isis-surface-alt));
}
.isis-approval-chain__item.is-skipped {
    opacity: 0.6;
}
/* V3.A — variante approved (succès) + carte d'embed banner */
.isis-approval-chain__item.is-approved {
    border-color: var(--isis-success, #16a34a);
    background: var(--isis-success-soft, #ecfdf5);
}
.isis-approval-card {
    border-left: 3px solid var(--isis-mod-gesst, var(--isis-accent)) !important;
}
/* V3.A puis V1.1 Phase 4 — grille niveaux dans le form dialog.
   5 colonnes : ordre / mode / quorum / validateur / label / actions
   (la colonne quorum n'affiche un input que si Kind=PARALLEL_QUORUM, sinon « — »).
   Mode + Quorum ont width fixe (140px + 80px) pour ne pas sacrifier l'espace validateur/label.
*/
.isis-grid--niveaux .isis-grid__head,
.isis-grid--niveaux .isis-grid__row {
    grid-template-columns: 70px 140px 80px 1fr 1fr 60px;
    align-items: center;
}

/* V1.1 Phase 4 — Header de niveau parallèle dans la chaîne d'approbation.
   Apparaît AVANT les N steps d'un niveau parallèle (PARALLEL_ALL/PARALLEL_QUORUM).
   Visuellement distinct : pas de bordure, fond accent-soft, layout horizontal compact. */
.isis-approval-chain__level-header {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.35rem 0.7rem;
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    border-radius: var(--isis-radius);
    font-size: 0.82rem;
    color: var(--isis-current-mod, var(--isis-accent));
    margin-top: 0.4rem;
    margin-bottom: -0.25rem;
}
.isis-approval-chain__level-label {
    font-weight: 500;
}
.isis-approval-chain__level-progress {
    margin-left: auto;
    font-size: 0.76rem;
    font-weight: 600;
    opacity: 0.85;
}

/* Step indenté de 14px quand membre d'un niveau parallèle (visuellement rattaché au header). */
.isis-approval-chain__item.is-parallel-member {
    margin-left: 14px;
    border-left-width: 3px;
}
.isis-approval-chain__marker {
    flex: 0 0 28px;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
}
.isis-approval-chain__item.is-approved .isis-approval-chain__marker {
    color: var(--isis-success, #047857);
    background: var(--isis-success-soft, #ecfdf5);
}
.isis-approval-chain__item.is-rejected .isis-approval-chain__marker {
    color: var(--isis-danger);
    background: var(--isis-danger-soft, #fef2f2);
}
.isis-approval-chain__item.is-current .isis-approval-chain__marker {
    color: var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-surface);
    border: 1px solid var(--isis-current-mod, var(--isis-accent));
}
.isis-approval-chain__content {
    flex: 1 1 auto;
    min-width: 0;
}
.isis-approval-chain__head {
    display: flex;
    flex-wrap: nowrap;          /* compact : tout sur une ligne, ellipsis sur le nom si nécessaire */
    align-items: baseline;
    gap: 0.5rem;
    min-width: 0;               /* permet aux enfants flex de rétrécir */
}
/* Cible le nom validateur — convention __item utilise <strong>,
   convention __step (DevisDetail) utilise <span class="__user">. */
.isis-approval-chain__head > strong,
.isis-approval-chain__head > .isis-approval-chain__user {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-approval-chain__order {
    flex: 0 0 auto;             /* ne se compresse pas — l'ellipsis est sur le nom */
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}
.isis-approval-chain__status {
    flex: 0 0 auto;             /* idem — visible en entier, c'est le statut qu'on doit lire */
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
}
.isis-approval-chain__current-badge {
    margin-left: auto;
    font-size: 0.72rem;
    color: var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-surface);
    border: 1px solid var(--isis-current-mod, var(--isis-accent));
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
.isis-timeline__hint {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.5rem;
    padding: 0.4rem 0.6rem;
    font-size: 0.75rem;
    color: var(--isis-text-soft);
    background: var(--isis-surface-alt);
    border-radius: 4px;
}

/* ============================================================================
   Fixes audits UI/UX & a11y
   ============================================================================ */
/* Form linear : grille 2 colonnes pour les .isis-form-linear__row (utilisé partout) */
.isis-form-linear__row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
}
.isis-form-linear__row > .field { min-width: 0; }

/* Utilitaires de largeur sur un champ d'une row form-linear — extraits de styles inline
   pour rester réactif au zoom navigateur ≤ 1200px (audit ui-ux gespla 2026-05-20). */
.isis-form-linear__field--xs { max-width: 140px; }
.isis-form-linear__field--sm { max-width: 200px; }
.isis-form-linear__field--md { max-width: 260px; }

/* ============================================================================
   IsisSidePanel — switch Détail/Filtres en haut + slot body
   ============================================================================ */
.isis-side-panel { padding: 0 !important; display: flex; flex-direction: column; }
.isis-side-panel__switch {
    display: flex;
    align-items: stretch;
    gap: 0;
    padding: 0.4rem 0.4rem 0;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface);
    position: sticky;
    top: 0;
    z-index: 2;
}
.isis-side-panel__switch-btn {
    flex: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    padding: 0.45rem 0.7rem;
    background: transparent;
    border: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    font-weight: 500;
    cursor: pointer;
    transition: color 120ms, border-color 120ms, background-color 120ms;
}
.isis-side-panel__switch-btn:hover:not(:disabled) {
    color: var(--isis-text);
    background: var(--isis-surface-alt);
}
.isis-side-panel__switch-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}
.isis-side-panel__switch-btn.is-active {
    color: var(--isis-accent);
    border-bottom-color: var(--isis-accent);
    font-weight: 600;
}
.isis-side-panel__badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 9px;
    background: var(--isis-accent);
    color: white;
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 1;
}
.isis-side-panel__body {
    flex: 1;
    overflow: auto;
    padding: 1rem;
}

/* Section de filtres dans le side panel (groupe de champs avec titre) */
.isis-filter-group {
    margin-bottom: 1rem;
}
.isis-filter-group__title {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    font-weight: 600;
    margin-bottom: 0.4rem;
}
.isis-filter-group__field { margin-bottom: 0.5rem; }
.isis-filter-actions {
    display: flex;
    gap: 0.4rem;
    margin-top: 1rem;
    padding-top: 0.85rem;
    border-top: 1px solid var(--isis-border);
}

/* KPI hero — variantes pour la page détail collaborateur */
.isis-kpi-card__value--text {
    font-size: 1rem;
    font-weight: 600;
    color: var(--isis-text);
    line-height: 1.3;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
}
.isis-kpi-card__value--text strong { font-size: 1.4rem; font-weight: 700; }
.isis-kpi-card__currency {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-weight: 500;
}
.isis-kpi-card__empty {
    font-size: 0.85rem;
    color: var(--isis-text-soft);
    font-style: italic;
    font-weight: 400;
}
.isis-kpi-card__manager-dot {
    width: 8px; height: 8px;
    border-radius: 50%;
    background: #facc15;
    flex-shrink: 0;
}

/* Accordion natif <details>/<summary> aligné Flat ISIS */
.isis-accordion {
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    margin-bottom: 0.6rem;
    background: var(--isis-surface);
    overflow: hidden;
}
.isis-accordion__summary {
    list-style: none;
    cursor: pointer;
    padding: 0.65rem 0.85rem;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
    user-select: none;
    transition: background-color 120ms;
}
.isis-accordion__summary::-webkit-details-marker { display: none; }
.isis-accordion__summary:hover { background: var(--isis-surface-alt); }
.isis-accordion__chevron {
    margin-left: auto;
    transition: transform 200ms ease;
    color: var(--isis-text-muted);
}
.isis-accordion[open] > .isis-accordion__summary .isis-accordion__chevron {
    transform: rotate(180deg);
}
.isis-accordion[open] > .isis-accordion__summary {
    border-bottom: 1px solid var(--isis-border);
}
.isis-accordion__body {
    padding: 0.85rem;
    background: var(--isis-surface);
}

/* Bloc d'information contextuel en tête d'un form (ex: position courante dans "Changer de poste") */
.isis-form-linear__hint {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.6rem 0.8rem;
    background: var(--isis-surface-alt);
    border-left: 3px solid var(--isis-mod-sirh, #10b981);
    border-radius: 4px;
    margin-bottom: 0.85rem;
    font-size: 0.85rem;
    color: var(--isis-text);
}

/* Dialog « justificatifs » (échéance / jalon). Le paragraphe d'intro est de la PROSE
   (avec des <strong>) : surtout PAS display:flex (sinon chaque segment devient un
   flex-item séparé et la phrase se fragmente). */
.isis-jalon-preuve {
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    padding: 0.25rem 0.1rem;
}
.isis-jalon-preuve > p {
    margin: 0;
    padding: 0.65rem 0.85rem;
    font-size: 0.85rem;
    line-height: 1.55;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    border-radius: 4px;
}

/* Chips dot variantes manquantes */
.isis-chip__dot.is-all   { background: var(--isis-text-soft); }
.isis-chip__dot.is-muted { background: #9ca3af; }

/* Alignement droite des colonnes numériques */
.isis-grid__col-headcount,
.isis-grid__col-headcount-head { justify-content: flex-end; text-align: right; }

/* ============================================================================
   .isis-workflow-diagram — Flowchart SVG horizontal du workflow devis.
   ----------------------------------------------------------------------------
   3 types de formes :
     - state    (rect arrondi) : étape de processus (DRAFT, PENDING, APPROVED, SENT)
     - decision (losange)      : point de bifurcation
     - terminal (pill)         : statut final (ACCEPTED, REJECTED, EXPIRED, REVISED, CANCELLED)
   ============================================================================ */
.isis-workflow-diagram {
    background: transparent;
    padding: 0.25rem 0 0;
    margin: 0;
}
.isis-workflow-diagram__legend {
    display: flex;
    flex-wrap: wrap;
    gap: 0.7rem;
    align-items: center;
    font-size: 0.66rem;
    color: var(--isis-text-soft);
    margin-bottom: 0.4rem;
}
.isis-workflow-diagram__legend span { display: inline-flex; align-items: center; gap: 0.3rem; }
.isis-workflow-legend__sep { color: var(--isis-border); margin: 0 0.2rem; }

/* Aperçus de formes dans la légende */
.isis-workflow-legend__shape {
    width: 14px; height: 9px;
    display: inline-block;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
}
.isis-workflow-legend__shape.is-state    { border-radius: 2px; }
.isis-workflow-legend__shape.is-decision { transform: rotate(45deg); width: 9px; height: 9px; }
.isis-workflow-legend__shape.is-terminal { border-radius: var(--isis-radius-pill); }

.isis-workflow-legend__dot {
    width: 8px; height: 8px; border-radius: 50%;
    display: inline-block;
}
.isis-workflow-legend__dot.is-done        { background: #16a34a; }
.isis-workflow-legend__dot.is-current     { background: var(--isis-mod-gescom); box-shadow: 0 0 0 1.5px var(--isis-mod-gescom-soft); }
.isis-workflow-legend__dot.is-future      { background: #cbd5e1; }
.isis-workflow-legend__dot.is-unreachable { background: transparent; border: 1px dashed #cbd5e1; }

/* Glyphe de légende — reprend les symboles posés sur les nodes (✓ ● ○ ✕) pour
   que le statut ne soit jamais porté par la seule couleur (WCAG 1.4.11). */
.isis-workflow-legend__glyph {
    font-size: 0.82rem;
    line-height: 1;
    margin: 0 0.18rem 0 0.05rem;
    color: var(--isis-text-soft);
}

.isis-workflow-svg {
    width: 100%;
    height: auto;
    max-height: 360px;
    display: block;
}
.isis-workflow-svg text { font-family: inherit; user-select: none; }

/* ── Nodes (formes) ──
   .isis-wf-node__shape = polygon, rect ou pill selon Kind */
.isis-wf-node { cursor: help; }
.isis-wf-node__shape {
    fill: var(--isis-surface);
    stroke: var(--isis-border);
    stroke-width: 1;
    transition: fill 120ms ease, stroke 120ms ease;
}
.isis-wf-node__label {
    /* viewBox 1180 large rendu ~0.76× sur un panel d'onglet : fontes nominales
       remontées pour que le rendu effectif reste ≥ ~9px lisibles. */
    font-size: 13px;
    font-weight: 600;
    fill: var(--isis-text);
    dominant-baseline: middle;
    text-anchor: middle;
}
.isis-wf-node__label.is-decision-label { font-size: 11px; }
.isis-wf-node:hover .isis-wf-node__shape { stroke: var(--isis-mod-gescom); }

/* Glyphe de statut (coin haut-gauche) — double la couleur pour les daltoniens
   (WCAG 1.4.11). ✓ passé · ● actuel · ○ à venir · ✕ inaccessible. */
.isis-wf-node__glyph {
    font-size: 10px;
    font-weight: 700;
    dominant-baseline: middle;
    text-anchor: middle;
    fill: var(--isis-text-muted);
}
.isis-wf-node.is-done .isis-wf-node__glyph        { fill: #166534; }
.isis-wf-node.is-current .isis-wf-node__glyph     { fill: var(--isis-mod-gescom); }
.isis-wf-node.is-future .isis-wf-node__glyph      { fill: var(--isis-text-muted); }
.isis-wf-node.is-unreachable .isis-wf-node__glyph { fill: #cbd5e1; }

/* États passés (vert) */
.isis-wf-node.is-done .isis-wf-node__shape { fill: #f0fdf4; stroke: #86efac; }
.isis-wf-node.is-done .isis-wf-node__label { fill: #166534; }

/* Étape courante (accent + bordure renforcée + pulse) — pas de drop-shadow :
   DESIGN.md impose le Flat absolu, le relief vient de la bordure 2.5px. */
.isis-wf-node.is-current .isis-wf-node__shape {
    /* Généralisation 2026-06 : diagrammes workflow partagés (7 modules) → suivent le module courant. */
    fill: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
    stroke: var(--isis-current-mod, var(--isis-accent));
    stroke-width: 2.5;
    animation: isis-wf-pulse-shape 1.8s ease-in-out infinite;
}
.isis-wf-node.is-current .isis-wf-node__label { fill: var(--isis-current-mod, var(--isis-accent)); font-weight: 600; }

@keyframes isis-wf-pulse-shape {
    0%, 100% { opacity: 1; }
    50%      { opacity: 0.78; }
}

/* Respect des préférences système : pas de pulse perpétuel — l'étape courante
   reste signalée par sa couleur d'accent + bordure renforcée. */
@media (prefers-reduced-motion: reduce) {
    .isis-wf-node.is-current .isis-wf-node__shape { animation: none; }
}

/* À venir (gris pâle) */
.isis-wf-node.is-future .isis-wf-node__shape { fill: var(--isis-surface-alt); stroke: #e2e8f0; }
.isis-wf-node.is-future .isis-wf-node__label { fill: var(--isis-text-muted); }

/* Inaccessible (dashed grisé) */
.isis-wf-node.is-unreachable .isis-wf-node__shape { fill: transparent; stroke: #e2e8f0; stroke-dasharray: 4 3; }
.isis-wf-node.is-unreachable .isis-wf-node__label { fill: #cbd5e1; }

/* Edges (flèches) */
.isis-wf-edge {
    stroke: #94a3b8;
    stroke-width: 1.4;
    fill: none;
}
.isis-wf-edge.is-done    { stroke: #16a34a; }
.isis-wf-edge.is-current { stroke: var(--isis-current-mod, var(--isis-accent)); stroke-width: 2; }
.isis-wf-edge.is-future  { stroke: #b0bac9; stroke-width: 1.4; }
/* Arcs secondaires (contournement envoi direct, retour rejet approbateur) :
   volontairement plus pâles que le flux principal pour ne pas concurrencer
   le « happy path » en lecture rapide. */
.isis-wf-edge.is-dashed  { stroke: #dde1e9; stroke-width: 1; stroke-dasharray: 4 3; }
.isis-workflow-svg #wfArrow path { fill: #94a3b8; }

/* Labels d'arêtes (oui/non, accepté/refusé...) */
.isis-wf-edge-label {
    font-size: 11.5px;
    fill: var(--isis-text-muted);
    font-style: italic;
}
.isis-wf-note {
    font-size: 11px;
    fill: var(--isis-text-soft);
    font-style: italic;
}

/* Annotation datée sous un node franchi (alimentée par le journal de workflow).
   tabular-nums : les dates s'alignent verticalement entre colonnes.
   En mode agrégé, le même slot porte les compteurs « N · ↑M » (cf. plus bas
   .isis-workflow-svg--aggregate .isis-wf-node-annot). */
.isis-wf-node-annot {
    /* 11px nominal : cohérent avec .isis-wf-note, reste lisible une fois le
       viewBox 1180 réduit (~0.76×) sur un panneau d'onglet. */
    font-size: 11px;
    fill: var(--isis-text-muted);
    text-anchor: middle;
    font-variant-numeric: tabular-nums;
}

/* ─── Mode agrégé du diagramme (page /gescom/pipeline) ──────────────────
   Tous les nodes non-décision sont neutres ; le compteur stock+flux porte
   le sens. On dérive les nodes "is-aggregate" sur un visuel proche du
   "is-future" mais sans le glyphe ○ (qui voudrait dire "à venir"). */
.isis-wf-node.is-aggregate .isis-wf-node__shape {
    fill: var(--isis-surface);
    stroke: var(--isis-border-strong, #cbd5e1);
    stroke-width: 1.5;
}
.isis-wf-node.is-aggregate .isis-wf-node__label {
    fill: var(--isis-text);
    font-weight: 500;
}
/* Au survol d'un node agrégé, surligner pour le rendre visiblement
   interactif (clic = drill-down stock). */
.isis-workflow-svg--aggregate .isis-wf-node.is-aggregate:hover .isis-wf-node__shape {
    stroke: var(--isis-current-mod, var(--isis-accent));
    stroke-width: 2;
}
/* Node cliquable : curseur main + hover stroke (le seul cursor ne suffit pas
   à signaler la cliquabilité, surtout sur démo écran partagé / écran tactile)
   + focus visible pour navigation clavier. */
.isis-wf-node.is-clickable { cursor: pointer; }
.isis-wf-node.is-clickable:hover .isis-wf-node__shape {
    stroke: var(--isis-current-mod, var(--isis-accent));
    stroke-width: 1.5;
}
.isis-wf-node.is-clickable:focus { outline: none; }
.isis-wf-node.is-clickable:focus-visible .isis-wf-node__shape {
    stroke: var(--isis-current-mod, var(--isis-accent));
    stroke-width: 2.5;
    filter: drop-shadow(0 0 3px color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 50%, transparent));
}
/* Node sélectionné (drill ouvert) : stroke marqué + fond teinté pour le
   distinguer nettement du hover. Override l'inline `fill` du heatmap via
   !important (sinon le node sélectionné garde sa couleur heatmap et la
   sélection devient invisible sur un node intensément teinté). */
.isis-wf-node.is-selected .isis-wf-node__shape {
    stroke: var(--isis-current-mod, var(--isis-accent));
    stroke-width: 2.5;
    fill: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface)) !important;
}
.isis-wf-node.is-selected .isis-wf-node__label {
    font-weight: 600;
}
/* Annotation agrégée : compteurs en gros (poids 600), monospace tabular-nums
   pour alignement vertical, accent module gescom pour signaler la valeur. */
.isis-workflow-svg--aggregate .isis-wf-node-annot {
    font-size: 13px;
    font-weight: 600;
    fill: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
/* Distinguer les losanges de décision en mode agrégé : ils ne portent pas de
   compteur (ce sont des points de structure du workflow, pas des statuts
   comptabilisables) — on les rend en tirets sur fond surface-alt pour signaler
   visuellement "structure, pas donnée" et éviter la confusion avec is-future
   du mode Individual (= "pas encore atteint"). */
.isis-workflow-svg--aggregate .isis-wf-node.is-future .isis-wf-node__shape {
    fill: var(--isis-surface-alt);
    stroke: var(--isis-border-strong, #cbd5e1);
    stroke-dasharray: 4 3;
}
.isis-workflow-svg--aggregate .isis-wf-node.is-future .isis-wf-node__label {
    fill: var(--isis-text-muted);
    font-weight: 500;
}

/* Legend : pastille neutre pour l'agrégat (pas de "passé / actuel / futur").
   Fond surface-alt pour contraste 3:1+ avec la bordure (WCAG 1.4.11). */
.isis-workflow-legend__dot.is-aggregate {
    background: var(--isis-surface-alt);
    border: 1.5px solid var(--isis-border-strong, #cbd5e1);
}
/* Pastille "structure" — losanges de décision en mode agrégé : tiretée pour
   signaler "point de structure, pas de donnée". Calque le rendu node. */
.isis-workflow-legend__dot.is-structure {
    background: var(--isis-surface-alt);
    border: 1.5px dashed var(--isis-border-strong, #cbd5e1);
}
/* Pastille "heatmap" — gradient multi-couleurs (vert → jaune → rouge) qui
   matche l'interpolation HSL appliquée aux nodes du diagramme (cf. HeatStyle
   dans DevisWorkflowDiagram.razor : hue 120→0, lightness 88→67). */
.isis-workflow-legend__heat {
    display: inline-block;
    width: 36px;
    height: 10px;
    border-radius: 2px;
    margin-right: 0.3rem;
    vertical-align: middle;
    background: linear-gradient(to right,
        hsl(120, 75%, 88%),  /* faible — vert pâle */
        hsl(60,  75%, 78%),  /* moyen — jaune */
        hsl(0,   75%, 67%)); /* élevé — rouge */
    border: 1px solid var(--isis-border, #e2e8f0);
}

/* Bandelette contextuelle (sous le SVG) — compacte */
.isis-workflow-branch {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    padding: 0.4rem 0.65rem;
    margin-top: 0.6rem;
    border-radius: 4px;
    font-size: 0.75rem;
    line-height: 1.35;
}
.isis-workflow-branch strong { font-size: 0.78rem; }
.isis-workflow-branch__inline { margin-left: 0.4rem; font-style: italic; color: var(--isis-text-muted); }
.isis-workflow-branch__action { margin-left: 0.4rem; color: var(--isis-text); }
/* Liens « Voir l'onglet … » dans les bandeaux contextuels du workflow commande (2026-06-07). */
.isis-workflow-branch__links { display: inline-flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 0.3rem; }
.isis-workflow-branch__links .isis-text-link { background: none; border: none; padding: 0; font: inherit; cursor: pointer; color: var(--isis-mod-gesproj); display: inline-flex; align-items: center; gap: 0.1rem; font-weight: 600; }
.isis-workflow-branch__links .isis-text-link:hover { text-decoration: underline; }
.isis-workflow-branch__links .isis-text-link:focus-visible { outline: 2px solid var(--isis-accent); outline-offset: 2px; border-radius: 3px; }
.isis-workflow-branch--danger  { background: #fef2f2; border-left: 3px solid #dc2626; color: #991b1b; }
.isis-workflow-branch--warning { background: #fffbeb; border-left: 3px solid #d97706; color: #92400e; }
.isis-workflow-branch--muted   { background: var(--isis-surface-alt); border-left: 3px solid var(--isis-text-soft); color: var(--isis-text-muted); }
.isis-workflow-branch--info    { background: var(--isis-mod-gescom-soft); border-left: 3px solid var(--isis-mod-gescom); color: var(--isis-text); }

@media (max-width: 1100px) {
    .isis-workflow-svg { min-width: 1000px; }
    .isis-workflow-diagram { overflow-x: auto; }
}

/* Workflow intégré (swimlanes horizontales A+B) : viewBox compactée v3 1468×380,
   ratio ≈ 3.86:1. Min-width 1100px → fit confortable sur tout écran ≥ 13".
   Scroll-X si plus étroit. */
.isis-workflow-svg--integrated {
    max-height: none;
    min-width: 1100px;
}
.isis-workflow-diagram:has(.isis-workflow-svg--integrated) {
    overflow-x: auto;
    overflow-y: hidden;
    padding-bottom: 0.25rem;
}

/* Historique des transitions — sous le diagramme, dans l'onglet Workflow */
.isis-workflow-history {
    margin-top: 1.25rem;
    padding-top: 1rem;
    border-top: 1px solid var(--isis-border);
}
.isis-workflow-history__title {
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin-bottom: 0.6rem;
}

/* ----------------------------------------------------------------------------
   Modificateurs de palette par module — diagrammes workflow simplifiés
   (EngagementWorkflowDiagram pour gesst, CommandeWorkflowDiagram pour gesproj).
   Le diagramme de base hardcode --isis-mod-gescom sur l'état actuel ; ces
   modificateurs swap la couleur d'accent pour rester cohérent avec l'identité
   chromatique du module hôte.
   ---------------------------------------------------------------------------- */

/* GESST — pink-700 (#be185d) */
.isis-workflow-svg--gesst .isis-wf-node.is-current .isis-wf-node__shape {
    fill: var(--isis-mod-gesst-soft);
    stroke: var(--isis-mod-gesst);
}
.isis-workflow-svg--gesst .isis-wf-node.is-current .isis-wf-node__label {
    fill: var(--isis-mod-gesst);
}
.isis-workflow-svg--gesst .isis-wf-node.is-current .isis-wf-node__glyph {
    fill: var(--isis-mod-gesst);
}
.isis-workflow-svg--gesst .isis-wf-node:hover .isis-wf-node__shape {
    stroke: var(--isis-mod-gesst);
}
.isis-workflow-svg--gesst .isis-wf-edge.is-current {
    stroke: var(--isis-mod-gesst);
}
.isis-workflow-legend__dot.is-current--gesst {
    background: var(--isis-mod-gesst);
    box-shadow: 0 0 0 1.5px var(--isis-mod-gesst-soft);
}
.isis-workflow-branch--gesst-info {
    background: var(--isis-mod-gesst-soft);
    border-left: 3px solid var(--isis-mod-gesst);
    color: var(--isis-text);
}

/* GESPROJ — cyan-700 (#0e7490) */
.isis-workflow-svg--gesproj .isis-wf-node.is-current .isis-wf-node__shape {
    fill: var(--isis-mod-gesproj-soft);
    stroke: var(--isis-mod-gesproj);
}
.isis-workflow-svg--gesproj .isis-wf-node.is-current .isis-wf-node__label {
    fill: var(--isis-mod-gesproj);
}
.isis-workflow-svg--gesproj .isis-wf-node.is-current .isis-wf-node__glyph {
    fill: var(--isis-mod-gesproj);
}
.isis-workflow-svg--gesproj .isis-wf-node:hover .isis-wf-node__shape {
    stroke: var(--isis-mod-gesproj);
}
.isis-workflow-svg--gesproj .isis-wf-edge.is-current {
    stroke: var(--isis-mod-gesproj);
}
.isis-workflow-legend__dot.is-current--gesproj {
    background: var(--isis-mod-gesproj);
    box-shadow: 0 0 0 1.5px var(--isis-mod-gesproj-soft);
}
.isis-workflow-branch--gesproj-info {
    background: var(--isis-mod-gesproj-soft);
    border-left: 3px solid var(--isis-mod-gesproj);
    color: var(--isis-text);
}

/* GESMAFF — ambre (#d97706). Calque structurel des autres modules. */
.isis-workflow-svg--gesmaff .isis-wf-node.is-current .isis-wf-node__shape {
    fill: var(--isis-mod-gesmaff-soft);
    stroke: var(--isis-mod-gesmaff);
}
.isis-workflow-svg--gesmaff .isis-wf-node.is-current .isis-wf-node__label {
    fill: var(--isis-mod-gesmaff);
}
.isis-workflow-svg--gesmaff .isis-wf-node.is-current .isis-wf-node__glyph {
    fill: var(--isis-mod-gesmaff);
}
.isis-workflow-svg--gesmaff .isis-wf-node:hover .isis-wf-node__shape {
    stroke: var(--isis-mod-gesmaff);
}
.isis-workflow-svg--gesmaff .isis-wf-edge.is-current {
    stroke: var(--isis-mod-gesmaff);
}
.isis-workflow-legend__dot.is-current--gesmaff {
    background: var(--isis-mod-gesmaff);
    box-shadow: 0 0 0 1.5px var(--isis-mod-gesmaff-soft);
}
.isis-workflow-branch--gesmaff-info {
    background: var(--isis-mod-gesmaff-soft);
    border-left: 3px solid var(--isis-mod-gesmaff);
    color: var(--isis-text);
}

/* ============================================================================
   Onglet « Versions » du devis — liste des versions closes + viewer figé
   (versioning in-place, cf. migration 0082)
   ============================================================================ */
.isis-version-intro {
    font-size: 0.8rem;
    line-height: 1.5;
    color: var(--isis-text-soft);
    background: var(--isis-bg-subtle, #f7f8fa);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.7rem 0.85rem;
    margin-bottom: 1rem;
}
.isis-version-list {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-version-row {
    display: flex;
    align-items: flex-start;
    gap: 0.85rem;
    padding: 0.75rem 0.9rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-version-row--current {
    border-left: 3px solid var(--isis-current-mod, var(--isis-mod-gescom));
    background: var(--isis-mod-gescom-soft);
}
.isis-version-row__badge {
    flex-shrink: 0;
    min-width: 38px;
    height: 38px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    font-size: 0.8rem;
    color: var(--isis-current-mod, var(--isis-mod-gescom));
    background: var(--isis-mod-gescom-soft);
    border-radius: 6px;
    font-variant-numeric: tabular-nums;
}
.isis-version-row--current .isis-version-row__badge {
    color: var(--isis-surface);
    background: var(--isis-current-mod, var(--isis-mod-gescom));
}

/* P-bis : snapshot interne (DRAFT_SNAPSHOT) — variante visuelle distincte de
   la version officielle. Bordure latérale et badge en accent secondaire. */
.isis-version-row--snapshot {
    border-left: 3px solid var(--isis-accent-warm, #c2410c);
    background: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 4%, var(--isis-surface));
}
.isis-version-row__badge--snapshot {
    color: var(--isis-surface);
    background: var(--isis-accent-warm, #c2410c);
    min-width: 52px;
    font-size: 0.72rem;
    letter-spacing: 0.05em;
}

/* Section P-bis : « Versions envoyées au client » / « Instantanés internes ». */
.isis-version-section {
    margin-top: 1rem;
}
.isis-version-section__title {
    margin: 0 0 0.15rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-version-section__subtitle {
    margin: 0 0 0.6rem;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
}
.isis-version-row__body { flex: 1 1 auto; min-width: 0; }
.isis-version-row__head {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
}
.isis-version-row__title {
    font-weight: 600;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-version-row__date {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-version-row__meta {
    font-size: 0.76rem;
    color: var(--isis-text-soft);
    margin-top: 0.2rem;
}
.isis-version-row__reason {
    font-size: 0.76rem;
    color: var(--isis-text-soft);
    font-style: italic;
    margin-top: 0.3rem;
}
.isis-version-row__action {
    flex-shrink: 0;
    display: flex;
    align-items: center;
}
.isis-version-row__hint {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-version-empty {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    padding: 1rem;
    text-align: center;
    border: 1px dashed var(--isis-border);
    border-radius: 6px;
}

/* Viewer dialog — contenu figé d'une version, lecture seule */
.isis-version-viewer {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
}
.isis-version-viewer__state {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 1.5rem;
    color: var(--isis-text-muted);
    font-size: 0.85rem;
}
.isis-version-viewer__head {
    display: flex;
    gap: 0.85rem;
    align-items: flex-start;
    padding-bottom: 0.85rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-version-viewer__badge {
    flex-shrink: 0;
    min-width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    color: var(--isis-surface);
    background: var(--isis-current-mod, var(--isis-mod-gescom));
    border-radius: 6px;
    font-variant-numeric: tabular-nums;
}
/* P-bis : header viewer en mode snapshot interne — accent secondaire chaud. */
.isis-version-viewer__head--snapshot {
    border-bottom-color: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 30%, var(--isis-border));
}
.isis-version-viewer__badge--snapshot {
    background: var(--isis-accent-warm, #c2410c);
    min-width: 56px;
    font-size: 0.75rem;
    letter-spacing: 0.05em;
}
/* P-bis : indicateurs marge dans le viewer. */
.isis-version-viewer__total-divider {
    height: 1px;
    background: var(--isis-border);
    margin: 0.45rem 0;
}
.isis-version-viewer__total-row--margin {
    font-weight: 700;
    font-size: 1rem;
}
.isis-version-viewer__total-hint {
    margin-top: 0.5rem;
    padding: 0.5rem 0.75rem;
    background: color-mix(in srgb, var(--isis-text-muted) 8%, var(--isis-surface));
    border-radius: 4px;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-margin-neg {
    color: var(--isis-danger);
}

/* ═══════════════════════════════════════════════════════════════════════════
   P-bis : Snapshot browser dialog (master-detail + diff vs courant)
   ═══════════════════════════════════════════════════════════════════════════ */

.isis-snapshot-browser {
    display: grid;
    grid-template-columns: 280px 1fr;
    height: 100%;
    min-height: 0;
    gap: 0;
}
.isis-snapshot-browser__loading {
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 3rem;
}

/* ─── Panneau gauche : liste des snapshots ─────────────────────────────── */
.isis-snapshot-browser__rail {
    border-right: 1px solid var(--isis-border);
    background: var(--isis-surface-alt);
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
}
.isis-snapshot-browser__rail-head {
    padding: 0.75rem 0.85rem;
    border-bottom: 1px solid var(--isis-border);
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    background: var(--isis-surface);
}
.isis-snapshot-browser__rail-head h3 {
    margin: 0;
    font-size: 0.78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}
.isis-snapshot-browser__empty-rail {
    padding: 1.5rem 1rem;
    text-align: center;
    color: var(--isis-text-muted);
    font-size: 0.8rem;
}
.isis-snapshot-browser__empty-rail .hint {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    opacity: 0.7;
    margin-top: 0.3rem;
}
.isis-snapshot-browser__list {
    list-style: none;
    margin: 0;
    padding: 0.5rem;
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-snapshot-browser__item {
    padding: 0.6rem 0.7rem;
    margin-bottom: 0.3rem;
    border-radius: 4px;
    border: 1px solid transparent;
    cursor: pointer;
    background: var(--isis-surface);
    transition: background 120ms ease, border 120ms ease;
}
.isis-snapshot-browser__item:hover {
    background: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 6%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 25%, transparent);
}
.isis-snapshot-browser__item.is-selected {
    background: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 12%, var(--isis-surface));
    border-color: var(--isis-accent-warm, #c2410c);
    border-left-width: 3px;
}
.isis-snapshot-browser__item:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-snapshot-browser__item-label {
    font-weight: 600;
    font-size: 0.88rem;
    color: var(--isis-text);
    line-height: 1.3;
    margin-bottom: 0.2rem;
}
.isis-snapshot-browser__item-meta {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-snapshot-browser__item-totals {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    margin-top: 0.2rem;
    font-variant-numeric: tabular-nums;
}

/* ─── Panneau principal : contenu du snapshot sélectionné ──────────────── */
.isis-snapshot-browser__main {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
    padding: 1rem 1.25rem;
}
.isis-snapshot-browser__empty {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    color: var(--isis-text-muted);
    gap: 0.5rem;
}
.isis-snapshot-browser__empty h3 { margin: 0; font-size: 1rem; }
.isis-snapshot-browser__empty p { margin: 0; font-size: 0.85rem; }

.isis-snapshot-browser__head {
    display: flex;
    gap: 0.75rem;
    align-items: flex-start;
    padding-bottom: 0.85rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-snapshot-browser__badge {
    flex-shrink: 0;
    min-width: 56px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--isis-accent-warm, #c2410c);
    color: var(--isis-surface);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.05em;
    border-radius: 6px;
}
.isis-snapshot-browser__head-body { flex: 1 1 auto; min-width: 0; }
.isis-snapshot-browser__head-body h2 {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-snapshot-browser__head-sub {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
}
.isis-snapshot-browser__head-notes {
    font-size: 0.82rem;
    color: var(--isis-text);
    font-style: italic;
    margin-top: 0.4rem;
    padding: 0.4rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 4px;
}

.isis-snapshot-browser__diff-banner {
    margin: 0.75rem 0;
    padding: 0.55rem 0.75rem;
    border-radius: 4px;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.85rem;
}
.isis-snapshot-browser__diff-banner.has-diff {
    background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
    border-left: 3px solid var(--isis-warning);
}
.isis-snapshot-browser__diff-banner.no-diff {
    background: color-mix(in srgb, var(--isis-success) 8%, var(--isis-surface));
    border-left: 3px solid var(--isis-success);
}

.isis-snapshot-browser__table-wrap {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    margin-bottom: 0.75rem;
}
.isis-snapshot-browser__table thead th {
    position: sticky;
    top: 0;
    background: var(--isis-surface-alt);
    z-index: 1;
}

/* ─── Diff row styling ─────────────────────────────────────────────────── */
.isis-snapshot-diff-row__marker {
    text-align: center;
    font-weight: 700;
    font-family: ui-monospace, "SF Mono", Menlo, monospace;
    cursor: help;
}
.isis-snapshot-diff-row--identical {
    opacity: 0.55;
}
.isis-snapshot-diff-row--identical .isis-snapshot-diff-row__marker {
    color: var(--isis-text-muted);
}
.isis-snapshot-diff-row--modified {
    background: color-mix(in srgb, var(--isis-warning) 7%, var(--isis-surface));
}
.isis-snapshot-diff-row--modified .isis-snapshot-diff-row__marker {
    color: var(--isis-warning);
}
.isis-snapshot-diff-row--added {
    background: color-mix(in srgb, var(--isis-success) 8%, var(--isis-surface));
}
.isis-snapshot-diff-row--added .isis-snapshot-diff-row__marker {
    color: var(--isis-success);
}
.isis-snapshot-diff-row--removed {
    background: color-mix(in srgb, var(--isis-danger) 6%, var(--isis-surface));
}
.isis-snapshot-diff-row--removed .isis-snapshot-diff-row__marker {
    color: var(--isis-danger);
}
.isis-snapshot-diff-row--removed td {
    text-decoration: line-through;
    text-decoration-color: color-mix(in srgb, var(--isis-danger) 70%, transparent);
}

.isis-diff-cell--old {
    color: var(--isis-text-muted);
    text-decoration: line-through;
    text-decoration-thickness: 1px;
    font-size: 0.85em;
}
.isis-diff-cell--new {
    color: var(--isis-text);
    font-weight: 600;
}
.isis-diff-cell-arrow {
    color: var(--isis-text-muted);
    margin: 0 0.15rem;
}

/* ─── Récap totaux ─────────────────────────────────────────────────────── */
.isis-snapshot-browser__recap {
    padding: 0.6rem 0.75rem;
    background: var(--isis-surface-alt);
    border-radius: 4px;
    margin-bottom: 0.75rem;
}
.isis-snapshot-browser__recap h4 {
    margin: 0 0 0.4rem;
    font-size: 0.78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}
.isis-snapshot-browser__recap table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.85rem;
}
.isis-snapshot-browser__recap th {
    text-align: left;
    font-weight: 500;
    color: var(--isis-text-muted);
    padding: 0.25rem 0.4rem;
}
.isis-snapshot-browser__recap thead th {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.isis-snapshot-browser__recap td {
    padding: 0.25rem 0.4rem;
    font-variant-numeric: tabular-nums;
    text-align: right;
}
.isis-snapshot-browser__recap thead th:not(:first-child) {
    text-align: right;
}
.isis-snapshot-browser__recap-margin {
    font-weight: 700;
    border-top: 1px solid var(--isis-border);
}
.isis-delta-positive { color: var(--isis-success); }
.isis-delta-negative { color: var(--isis-danger); }

/* ─── Actions ──────────────────────────────────────────────────────────── */
.isis-snapshot-browser__actions {
    display: flex;
    justify-content: flex-end;
    gap: 0.5rem;
    padding-top: 0.5rem;
    border-top: 1px solid var(--isis-border);
}
.isis-version-viewer__title {
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--isis-text);
}
.isis-version-viewer__sub {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    margin-top: 0.15rem;
}
.isis-version-viewer__reason {
    font-size: 0.78rem;
    color: var(--isis-text-soft);
    font-style: italic;
    margin-top: 0.35rem;
}
.isis-version-viewer__section-title {
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin-bottom: 0.6rem;
}
.isis-version-viewer__fields {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0.6rem 1.25rem;
    margin: 0;
}
.isis-version-viewer__fields > div { min-width: 0; }
.isis-version-viewer__fields dt {
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    margin-bottom: 0.1rem;
}
.isis-version-viewer__fields dd {
    margin: 0;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-version-viewer__notes {
    margin-top: 0.75rem;
}
.isis-version-viewer__notes-label {
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}
.isis-version-viewer__notes p {
    margin: 0.2rem 0 0;
    font-size: 0.82rem;
    color: var(--isis-text);
    white-space: pre-wrap;
}
.isis-version-viewer__totals {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    align-self: flex-end;
    min-width: 260px;
}
.isis-version-viewer__total-row {
    display: flex;
    justify-content: space-between;
    font-size: 0.82rem;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-version-viewer__total-row--ttc {
    font-weight: 700;
    padding-top: 0.3rem;
    border-top: 1px solid var(--isis-border);
}
@media (max-width: 720px) {
    .isis-version-viewer__fields { grid-template-columns: 1fr 1fr; }
}

/* Barre de comparaison + cases à cocher de sélection (onglet Versions) */
.isis-version-comparebar {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 0.75rem;
}
.isis-version-comparebar__hint {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-version-row__select {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    padding-top: 0.5rem;
}
.isis-version-row__select input { cursor: pointer; }
.isis-version-row__select input:disabled { cursor: not-allowed; opacity: 0.55; }
.isis-version-row__select input:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}

/* Dialog de comparaison de deux versions */
.isis-version-compare {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
}
.isis-version-compare__section-title {
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin-bottom: 0.6rem;
}
.isis-version-compare__head {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    padding-bottom: 0.85rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-version-compare__side {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.isis-version-compare__side-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 38px;
    height: 30px;
    padding: 0 0.5rem;
    font-weight: 700;
    font-size: 0.8rem;
    border-radius: 6px;
    font-variant-numeric: tabular-nums;
}
.isis-version-compare__side-badge--old {
    color: var(--isis-text);
    background: var(--isis-surface-alt);
}
.isis-version-compare__side-badge--new {
    color: var(--isis-surface);
    background: var(--isis-current-mod, var(--isis-mod-gescom));
}
.isis-version-compare__side-meta {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
}
.isis-version-compare__nochange {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.82rem;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.6rem 0.85rem;
}
.isis-version-compare__nochange .rzi { color: var(--isis-text-muted); }
.isis-version-compare__empty {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    padding: 0.5rem 0;
}
.isis-version-compare__table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.8rem;
}
.isis-version-compare__table th {
    text-align: left;
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 600;
    padding: 0.3rem 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-version-compare__table td {
    padding: 0.4rem 0.5rem;
    border-bottom: 1px solid var(--isis-border);
    color: var(--isis-text);
    vertical-align: top;
}
.isis-version-compare__field { font-weight: 600; }
.isis-version-compare__old {
    color: var(--isis-text-muted);
    text-decoration: line-through;
}
.isis-version-compare__new { color: var(--isis-text); font-weight: 600; }
.isis-version-compare__legend {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-bottom: 0.5rem;
}
.isis-version-compare__tag {
    font-size: 0.7rem;
    padding: 0.12rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    border: 1px solid var(--isis-border);
}
/* Texte sombre + fond teinté + bord coloré : l'identité couleur reste lisible
   (le libellé textuel « ajoutée(s) »… porte le sens, la couleur le renforce). */
.isis-version-compare__tag.is-added     { background: var(--isis-success-soft); border-color: var(--isis-success); }
.isis-version-compare__tag.is-removed   { background: var(--isis-danger-soft);  border-color: var(--isis-danger); }
.isis-version-compare__tag.is-modified  { background: var(--isis-warning-soft); border-color: var(--isis-warning); }
.isis-version-compare__tag.is-unchanged { background: var(--isis-surface-alt); }

/* Lignes du tableau de diff — marqueur + bord coloré par nature du changement.
   Le marqueur reste en texte sombre (lisible) ; la nature est portée par le fond
   teinté, l'accent gauche, le glyphe +/−/~ et son aria-label. */
.isis-version-compare__items td { vertical-align: top; }
.isis-version-compare__marker {
    text-align: center;
    font-weight: 700;
    font-size: 0.95rem;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-version-compare__row--added {
    background: var(--isis-success-soft);
    box-shadow: inset 3px 0 0 0 var(--isis-success);
}
.isis-version-compare__row--removed {
    background: var(--isis-danger-soft);
    box-shadow: inset 3px 0 0 0 var(--isis-danger);
}
.isis-version-compare__row--modified {
    background: var(--isis-warning-soft);
    box-shadow: inset 3px 0 0 0 var(--isis-warning);
}
.isis-version-compare__changes {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    margin-top: 0.3rem;
}
.isis-version-compare__change {
    font-size: 0.72rem;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-version-compare__totals-ttc td {
    font-weight: 700;
    border-top: 2px solid var(--isis-border);
}
/* Delta neutre : un devis qui monte n'est pas « rouge/danger » — le signe +/−
   porte la direction, pas la couleur (évite une fausse alerte commerciale). */
.isis-version-compare__delta--up   { color: var(--isis-text); font-weight: 600; }
.isis-version-compare__delta--down { color: var(--isis-text); font-weight: 600; }
.isis-version-compare__delta--flat { color: var(--isis-text-muted); }

/* ============================================================================
   Coût de revient — pages /gescompta/cout/* (référentiel)
   ============================================================================ */
.isis-grid--units .isis-grid__head,
.isis-grid--units .isis-grid__row {
    grid-template-columns: 32px 110px minmax(220px, 1.6fr) 100px 80px 110px;
    min-width: 820px;
}
.isis-grid--cost-categories .isis-grid__head,
.isis-grid--cost-categories .isis-grid__row {
    grid-template-columns: 32px 140px minmax(280px, 2fr) 80px 140px;
    min-width: 880px;
}
.isis-grid--resources .isis-grid__head,
.isis-grid--resources .isis-grid__row {
    grid-template-columns: 32px 120px minmax(220px, 1.4fr) minmax(180px, 1.1fr) 130px 140px 100px 110px;
    min-width: 1140px;
}

/* ============================================================================
   .isis-side--switchable — sidepanel droit avec switcher (Aperçu ⇄ Filtres)
   Réinitialise le padding du conteneur .isis-master-detail__detail pour
   permettre au header switcher de coller au bord supérieur, et fait du
   conteneur un flex column dont le body scrolle.
   ============================================================================ */
.isis-master-detail__detail.isis-side--switchable,
.isis-detail-layout__side.isis-side--switchable {
    padding: 0;
    display: flex;
    flex-direction: column;
    /* Sépare le head et les cards filles (.isis-side-block). Sans ça les
       sections se collent les unes aux autres (le --switchable override
       le gap: 0.85rem du conteneur de base .isis-detail-layout__side). */
    gap: 0.75rem;
    min-height: 0;
    overflow: hidden;
}
/* Padding latéral sur les blocs (pas sur le head qui colle au bord supérieur).
   Le sélecteur descendant (espace, pas `>`) attrape les blocs même s'ils sont
   enveloppés par un wrapper Razor invisible. */
.isis-detail-layout__side.isis-side--switchable .isis-side-block,
.isis-detail-layout__side.isis-side--switchable .isis-side-block__empty {
    margin-inline: 0.75rem;
}
/* Espace vertical entre 2 blocs consécutifs — sélecteur adjacent sibling,
   plus robuste que le `gap` flex (qui ne marche pas si un wrapper Razor
   intermédiaire casse la chaîne d'enfants directs). */
.isis-detail-layout__side.isis-side--switchable .isis-side-block + .isis-side-block,
.isis-detail-layout__side.isis-side--switchable .isis-side-block + .isis-side-block__empty,
.isis-detail-layout__side.isis-side--switchable .isis-side-block__empty + .isis-side-block {
    margin-top: 0.75rem;
}
.isis-detail-layout__side.isis-side--switchable .isis-side-block:last-of-type,
.isis-detail-layout__side.isis-side--switchable .isis-side-block__empty:last-of-type {
    margin-bottom: 0.75rem;
}
.isis-side-switcher__head {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 0.5rem 0.6rem;
    border-bottom: 1px solid var(--isis-border);
    background: #fafbfc;
}
.isis-side-switcher__tabs {
    display: inline-flex;
    background: #fff;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow: hidden;
}
.isis-side-switcher__tab {
    background: transparent;
    border: none;
    padding: 0.35rem 0.7rem;
    font-size: 0.78rem;
    color: var(--isis-text-soft);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    transition: background 0.12s, color 0.12s;
    border-right: 1px solid var(--isis-border);
}
.isis-side-switcher__tab:last-child { border-right: none; }
.isis-side-switcher__tab:hover { background: var(--isis-surface-alt); color: var(--isis-text); }
.isis-side-switcher__tab.is-active {
    /* switcher partagé (DevisDetail + DevisListPage) → teinte du module courant */
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
}
.isis-side-switcher__tab:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: -2px;
}
.isis-side-switcher__badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-current-mod, var(--isis-accent));
    color: #fff;
    font-size: 0.66rem;
    font-weight: 700;
    line-height: 1;
}
.isis-side-switcher__body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0.85rem;
}

/* ============================================================================
   .isis-collab — panneau de collaboration devis (commentaires + réponses client)
   Vit dans le sidepanel switcher de DevisDetail.
   ============================================================================ */
.isis-collab {
    display: flex;
    flex-direction: column;
    gap: 0.7rem;
    height: 100%;
    min-height: 0;
}
.isis-collab__loading,
.isis-collab__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 1.5rem 1rem;
    color: var(--isis-text-soft);
    font-size: 0.82rem;
    text-align: center;
}
.isis-collab__empty .rzi { font-size: 26px; opacity: 0.3; }

.isis-collab__filter {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    flex-shrink: 0;
}
.isis-collab__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    background: #f7f8fa;
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    padding: 0.2rem 0.55rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.73rem;
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.isis-collab__chip:hover { background: var(--isis-surface-alt); }
.isis-collab__chip.is-active {
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    border-color: var(--isis-mod-gescom);
    font-weight: 600;
}
.isis-collab__chip-count {
    font-variant-numeric: tabular-nums;
    opacity: 0.7;
    font-size: 0.68rem;
}

.isis-collab__thread {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
    padding-right: 2px;
}
.isis-collab__msg {
    background: #fff;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.5rem 0.6rem;
}
.isis-collab__msg.is-focused {
    border-color: var(--isis-mod-gescom);
    box-shadow: inset 3px 0 0 0 var(--isis-mod-gescom);
}
.isis-collab__msg.is-client {
    background: #fffdf5;
    border-color: #f0e3b8;
}
.isis-collab__msg-head {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-collab__avatar {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.62rem;
    font-weight: 700;
    flex-shrink: 0;
}
.isis-collab__avatar.is-client {
    background: #f6ecc8;
    color: #8a6d11;
}
.isis-collab__author {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-collab__date {
    font-size: 0.68rem;
    color: var(--isis-text-muted);   /* WCAG AA : text-soft #9ca3af échouait le contraste */
    margin-left: auto;
    flex-shrink: 0;
}
.isis-collab__del {
    background: transparent;
    border: none;
    color: var(--isis-text-soft);
    cursor: pointer;
    padding: 1px 2px;
    border-radius: 3px;
    display: inline-flex;
    flex-shrink: 0;
}
.isis-collab__del:hover { color: var(--rz-danger, #dc2626); background: var(--rz-danger-lighter, #fef2f2); }
.isis-collab__context {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.3rem;
    font-size: 0.68rem;
    color: var(--isis-mod-gescom);
    background: var(--isis-mod-gescom-soft);
    padding: 0.1rem 0.4rem;
    border-radius: 4px;
}
.isis-collab__body {
    margin-top: 0.35rem;
    font-size: 0.82rem;
    line-height: 1.45;
    color: var(--isis-text);
    white-space: pre-wrap;
    word-break: break-word;
}
.isis-collab__mentions {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.3rem;
    font-size: 0.68rem;
    color: var(--isis-text-soft);
}

.isis-collab__client-banner {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    background: #fffdf5;
    border: 1px solid #f0e3b8;
    color: #8a6d11;
    border-radius: 6px;
    padding: 0.4rem 0.55rem;
    font-size: 0.74rem;
    flex-shrink: 0;
}

.isis-collab__composer {
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    border-top: 1px solid var(--isis-border);
    padding-top: 0.55rem;
}
.isis-collab__composer-target {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.7rem;
    color: var(--isis-text-soft);
}
.isis-collab__composer-reset {
    background: transparent;
    border: none;
    color: var(--isis-text-soft);
    cursor: pointer;
    padding: 0 2px;
    display: inline-flex;
}
.isis-collab__composer-reset:hover { color: var(--isis-text); }
.isis-collab__textarea {
    width: 100%;
    box-sizing: border-box;
    background: #f7f8fa;
    border: 1px solid transparent;
    border-bottom: 1px solid var(--isis-border);
    border-radius: 4px 4px 0 0;
    padding: 0.45rem 0.55rem;
    font-size: 0.82rem;
    font-family: inherit;
    color: var(--isis-text);
    resize: vertical;
    transition: border-color 0.12s, background 0.12s;
}
.isis-collab__textarea:focus {
    outline: none;
    background: #fff;
    border-bottom-color: var(--isis-mod-gescom);
}
.isis-collab__composer-row {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-collab__composer-hint {
    flex: 1;
    font-size: 0.68rem;
    color: var(--isis-text-soft);
    font-style: italic;
}
.isis-collab__composer-block {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.6rem;
    margin-bottom: 0.4rem;
    border: 1px solid var(--isis-border);
    background: var(--isis-surface-alt);
    color: var(--isis-text);
    font-size: 0.72rem;
    border-radius: 4px;
}
.isis-collab__composer-block .rzi { color: var(--isis-text-muted); }
.isis-collab__send {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    background: var(--isis-mod-gescom);
    border: 1px solid var(--isis-mod-gescom);
    color: #fff;
    padding: 0.4rem 0.7rem;
    border-radius: 4px;
    font-size: 0.78rem;
    font-weight: 500;
    cursor: pointer;
    flex-shrink: 0;
    transition: filter 0.12s;
}
.isis-collab__send:hover:not(:disabled) { filter: brightness(0.92); }
.isis-collab__send:disabled { opacity: 0.5; cursor: not-allowed; }

/* ── Bulle de commentaire (lignes devis + allocations de coût) ───────────── */
.isis-comment-bubble {
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    background: transparent;
    border: none;
    color: var(--isis-text-soft);
    cursor: pointer;
    padding: 2px 4px;
    border-radius: 4px;
    transition: background 0.12s, color 0.12s;
}
.isis-comment-bubble:hover {
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
}
.isis-comment-bubble.has-comments { color: var(--isis-mod-gescom); }
.isis-comment-bubble__count {
    font-size: 0.66rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    line-height: 1;
}

/* ============================================================================
   .isis-notif — cloche de notifications du header + panneau déroulant
   ============================================================================ */
.isis-notif { position: relative; display: inline-flex; }
.isis-notif__bell {
    position: relative;
    background: transparent;
    border: none;
    color: var(--isis-text-soft);
    cursor: pointer;
    width: 36px;
    height: 36px;
    border-radius: 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background 0.12s, color 0.12s;
}
.isis-notif__bell:hover { background: var(--isis-surface-alt); color: var(--isis-text); }
.isis-notif__badge {
    position: absolute;
    top: 3px;
    right: 3px;
    min-width: 15px;
    height: 15px;
    padding: 0 3px;
    border-radius: var(--isis-radius-pill);
    background: var(--rz-danger, #dc2626);
    color: #fff;
    font-size: 0.6rem;
    font-weight: 700;
    line-height: 15px;
    text-align: center;
}
.isis-notif__backdrop {
    position: fixed;
    inset: 0;
    z-index: 1000;
}
.isis-notif__panel {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    width: 340px;
    max-height: 460px;
    background: var(--isis-surface);
    /* Flat Design absolu (DESIGN.md §1) : pas d'ombre — bordure + ring 1px
       suffisent à détacher le panneau flottant du fond. */
    border: 1px solid var(--isis-border);
    outline: 1px solid rgba(15, 23, 42, 0.04);
    border-radius: 8px;
    z-index: 1001;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.isis-notif__panel-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--isis-border);
    background: #fafbfc;
    flex-shrink: 0;
}
.isis-notif__panel-title { font-size: 0.82rem; font-weight: 600; color: var(--isis-text); }
.isis-notif__mark-all {
    background: transparent;
    border: none;
    color: var(--isis-accent);   /* composant de shell transverse : accent neutre, pas teinte module */
    font-size: 0.72rem;
    cursor: pointer;
    padding: 2px 4px;
    border-radius: 4px;
}
.isis-notif__mark-all:hover { background: var(--isis-surface-alt); }
.isis-notif__list {
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-notif__state {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.4rem;
    padding: 1.5rem 1rem;
    color: var(--isis-text-soft);
    font-size: 0.8rem;
}
.isis-notif__item {
    width: 100%;
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
    background: transparent;
    border: none;
    border-bottom: 1px solid var(--isis-border);
    padding: 0.55rem 0.7rem;
    cursor: pointer;
    text-align: left;
    transition: background 0.12s;
}
.isis-notif__item:last-child { border-bottom: none; }
.isis-notif__item:hover { background: var(--isis-surface-alt); }
.isis-notif__item-dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: transparent;
    margin-top: 5px;
    flex-shrink: 0;
}
.isis-notif__item.is-unread .isis-notif__item-dot { background: var(--isis-accent); }
.isis-notif__item.is-unread .isis-notif__item-title { font-weight: 600; }
.isis-notif__item-body {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}
.isis-notif__item-title {
    font-size: 0.78rem;
    color: var(--isis-text);
    line-height: 1.3;
}
.isis-notif__item-text {
    font-size: 0.72rem;
    color: var(--isis-text-muted);   /* WCAG AA : text-soft #9ca3af échouait le contraste */
    line-height: 1.35;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.isis-notif__item-date {
    font-size: 0.66rem;
    color: var(--isis-text-soft);
    opacity: 0.8;
}

/* ── Filter panel (multicritère) ─────────────────────────────────────────── */
.isis-filter-panel {
    display: flex;
    flex-direction: column;
    gap: 0.95rem;
}
/* Panneau flottant non-modal, ancré à droite (niveau sidepanel). Ne pousse pas la grille. */
.isis-filter-float {
    position: fixed;
    top: 7.75rem;
    right: 1.25rem;
    width: 360px;
    max-width: calc(100vw - 2.5rem);
    max-height: calc(100vh - 9.5rem);
    display: flex;
    flex-direction: column;
    gap: 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-2);
    z-index: 50;
    overflow: hidden;
    animation: isis-filter-float-in 0.14s ease-out;
}
@keyframes isis-filter-float-in {
    from { opacity: 0; transform: translateY(-6px); }
    to   { opacity: 1; transform: translateY(0); }
}
.isis-filter-float__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.65rem 0.85rem;
    border-bottom: 1px solid var(--isis-border);
    flex: 0 0 auto;
}
.isis-filter-float__title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-filter-float__close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: none;
    background: transparent;
    color: var(--isis-text-muted);
    border-radius: 6px;
    cursor: pointer;
    transition: background 0.12s, color 0.12s;
}
.isis-filter-float__close:hover { background: var(--isis-surface-alt); color: var(--isis-text); }
.isis-filter-float__close:focus-visible { outline: 2px solid var(--isis-current-mod, var(--isis-accent)); outline-offset: 1px; }
.isis-filter-float__body {
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    padding: 0.9rem;
    overflow-y: auto;
}
/* Actions collées en bas du panneau flottant (offset sticky par défaut recalé). */
.isis-filter-float__body .isis-filter-panel__actions {
    bottom: 0;
    margin-top: 0.2rem;
}
.isis-filter-panel__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 0.85rem 1rem;
}
/* Bouton « Filtres avancés » dans la filter-bar + badge compteur de critères actifs. */
.isis-filter-advanced-btn { position: relative; }
.isis-filter-advanced-btn__badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    margin-left: 0.15rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-current-mod, var(--isis-accent));
    color: #fff;
    font-size: 0.64rem;
    font-weight: 700;
    line-height: 1;
}
.isis-filter-panel__group {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-filter-panel__label {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.045em;
    color: var(--isis-text-soft);
    font-weight: 600;
}
.isis-filter-panel__row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.4rem;
}
.isis-filter-panel input[type="text"],
.isis-filter-panel input[type="number"],
.isis-filter-panel input[type="date"] {
    background: #f7f8fa;
    border: 1px solid transparent;
    border-bottom: 1px solid var(--isis-border);
    padding: 0.4rem 0.55rem;
    font-size: 0.82rem;
    color: var(--isis-text);
    font-family: inherit;
    border-radius: 4px 4px 0 0;
    width: 100%;
    transition: border-color 0.12s, background 0.12s;
    box-sizing: border-box;
}
.isis-filter-panel input::placeholder { color: var(--isis-text-soft); }
.isis-filter-panel input:focus {
    outline: none;
    background: #fff;
    border-bottom-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-filter-panel__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
}
.isis-filter-panel__chip {
    background: #f7f8fa;
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    padding: 0.25rem 0.65rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.75rem;
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.isis-filter-panel__chip:hover { background: var(--isis-surface-alt); }
.isis-filter-panel__chip.is-active {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
}
.isis-filter-panel__chip:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 1px;
}
.isis-filter-panel__checklist {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    max-height: 200px;
    overflow-y: auto;
    background: #f7f8fa;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    padding: 0.35rem 0.5rem;
}
.isis-filter-panel__check {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.78rem;
    color: var(--isis-text);
    cursor: pointer;
    padding: 0.15rem 0;
}
.isis-filter-panel__check input { accent-color: var(--isis-current-mod, var(--isis-accent)); }
.isis-filter-panel__check span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-filter-panel__check-more {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    font-style: italic;
    padding: 0.2rem 0;
}
.isis-filter-panel__actions {
    display: flex;
    gap: 0.4rem;
    justify-content: space-between;
    position: sticky;
    bottom: -0.85rem;
    background: var(--isis-surface);
    padding: 0.6rem 0 0;
    margin-top: 0.4rem;
    border-top: 1px solid var(--isis-border);
}
.isis-filter-panel__btn {
    flex: 1 1 0;
    background: #fff;
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    padding: 0.45rem 0.7rem;
    border-radius: 4px;
    font-size: 0.8rem;
    font-weight: 500;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    transition: background 0.12s, border-color 0.12s, color 0.12s;
}
.isis-filter-panel__btn:hover {
    background: var(--isis-surface-alt);
}
.isis-filter-panel__btn--primary {
    background: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: #fff;
}
.isis-filter-panel__btn--primary:hover {
    background: var(--isis-current-mod, var(--isis-accent));
    filter: brightness(0.92);
}
.isis-filter-panel__btn:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 1px;
}

/* ============================================================================
   .isis-grid--devis-list — variante liste devis gescom (11 colonnes depuis N1.4)
   Colonnes : check | status | numéro | émission | titre | tiers | partenaires
            | montant HT + coût prévi. en sous-ligne | marge prévi. | statut | actions
   ============================================================================ */
.isis-grid--devis-list .isis-grid__head,
.isis-grid--devis-list .isis-grid__row {
    grid-template-columns: 28px 32px 130px 110px minmax(180px, 1.4fr) minmax(160px, 1fr) 120px 140px 150px 110px 50px;
    min-width: 1330px;
}
.isis-grid--devis-list .isis-grid__col-check {
    display: flex;
    align-items: center;
    justify-content: center;
}
.isis-grid--devis-list .isis-grid__col-check input[type="checkbox"] {
    cursor: pointer;
    width: 14px;
    height: 14px;
}
/* Row sélectionnée pour multi : highlight discret accent (pas confondu avec
   .is-active qui marque la row dont le sidepanel est ouvert). */
.isis-grid--devis-list .isis-grid__row.is-multi-selected {
    background: color-mix(in srgb, var(--isis-accent) 5%, transparent);
}
.isis-grid--devis-list .isis-grid__row.is-multi-selected.is-active {
    background: color-mix(in srgb, var(--isis-accent) 10%, transparent);
}

/* Barre flottante bulk actions — apparaît en bas, sticky horizontalement centrée. */
.isis-bulk-actions-bar {
    position: fixed;
    bottom: 1.5rem;
    left: 50%;
    transform: translateX(-50%);
    z-index: 100;
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 0.55rem 0.85rem 0.55rem 1rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    box-shadow: var(--isis-elevation-2);   /* overlay flottant — token (était ad-hoc, DESIGN.md §10) */
    animation: isis-bulk-bar-rise 180ms ease-out;
}
@keyframes isis-bulk-bar-rise {
    from { transform: translate(-50%, 20px); opacity: 0; }
    to   { transform: translate(-50%, 0);    opacity: 1; }
}
.isis-bulk-actions-bar__count {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.9rem;
    color: var(--isis-text);
    white-space: nowrap;
}
.isis-bulk-actions-bar__count strong {
    font-weight: 700;
    font-size: 1rem;
    color: var(--isis-accent);
}
.isis-bulk-actions-bar__actions {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding-left: 0.8rem;
    border-left: 1px solid var(--isis-border);
}
.isis-bulk-actions-bar__close {
    background: none;
    border: 0;
    cursor: pointer;
    padding: 4px;
    border-radius: 4px;
    margin-left: 0.4rem;
    color: var(--isis-text-muted);
    display: inline-flex;
}
.isis-bulk-actions-bar__close:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

/* N2.5 — Search avec suggestions (dropdown contextuel sous l'input). */
.isis-search-with-suggestions {
    position: relative;
}
.isis-search-suggestions {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 50;
    margin-top: 4px;
    padding: 0.35rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    box-shadow: var(--isis-elevation-2);   /* dropdown overlay — token (était ad-hoc, DESIGN.md §10) */
    max-height: 360px;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-search-suggestions__group {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.isis-search-suggestions__group-label {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.5rem 0.15rem;
    font-size: 0.68rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-search-suggestions__item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    background: none;
    border: 0;
    cursor: pointer;
    padding: 0.4rem 0.5rem;
    border-radius: 4px;
    text-align: left;
    font-family: inherit;
    font-size: 0.85rem;
    color: var(--isis-text);
    width: 100%;
}
.isis-search-suggestions__item:hover {
    background: color-mix(in srgb, var(--isis-accent) 8%, transparent);
}
.isis-search-suggestions__item-label {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
    flex: 1;
}
.isis-search-suggestions__item-hint {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-search-suggestions__highlight {
    background: color-mix(in srgb, var(--isis-warning) 25%, transparent);
    padding: 0 1px;
    border-radius: 2px;
    font-weight: 600;
    color: inherit;
}

/* N2.6 — Hover preview row : tooltip riche CSS-only avec délai 400ms.
   Activé au :hover de la row. Caché par défaut, opacity 0 + pointer-events
   none. Position : décalé vers le haut-droite de la row pour éviter d'écraser
   le sidepanel. Désactivé sur mobile (no hover device). */
.isis-grid--devis-list {
    /* Scroll horizontal hérité de la base .isis-grid (overflow: auto). Le grid
       a min-width: 1330px (11 colonnes cumulées) ; sur écrans < 1330px le scroll
       horizontal natif laisse l'utilisateur accéder aux colonnes droites.
       Note : le hover preview (.isis-row-preview) est masqué sur écrans étroits
       via la media query ci-dessous — incompatible avec un scroll horizontal
       actif (absolute positioning + transform : la preview se retrouverait
       en partie hors zone visible une fois la grille scrollée). */
}

/* Désactive le hover preview sous 1100px (tablettes / petits écrans sans hover) :
   c'est une feature de confort desktop. Au-dessus, le JS isis-row-preview.js la
   passe en position:fixed + clamp viewport → pas de débordement même quand la
   grille a un scroll horizontal sur fenêtre moyenne (1100-1500px). */
@media (max-width: 1100px) {
    .isis-row-preview {
        display: none;
    }
}
/* Générique : toute row d'une .isis-grid peut héberger un .isis-row-preview. */
.isis-grid__row {
    position: relative;
}
.isis-row-preview {
    position: absolute;
    z-index: 30;
    /* Ouvre SOUS la row (et non au-dessus) : sinon la preview des lignes du haut
       remonte hors du conteneur scroll (overflow:auto) et se fait clipper par le
       bord haut / l'en-tête sticky (« le rail au-dessus du datagrid »). */
    top: calc(100% - 4px);
    right: 60px;
    width: 320px;
    max-width: calc(100vw - 4rem);
    opacity: 0;
    pointer-events: none;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    padding: 0.75rem;
    box-shadow: var(--isis-elevation-hover);   /* tooltip preview — token (était ad-hoc, DESIGN.md §10) */
    font-size: 0.82rem;
    transition: opacity 120ms ease;
    transition-delay: 0ms;
}
.isis-grid__row:hover .isis-row-preview {
    opacity: 1;
    transition-delay: 400ms;
}
.isis-row-preview__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.35rem;
}
.isis-row-preview__head strong {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    color: var(--isis-text);
    font-size: 0.85rem;
}
.isis-row-preview__status {
    font-size: 0.68rem;
    font-weight: 600;
    padding: 0.1rem 0.4rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-row-preview__title {
    font-weight: 600;
    color: var(--isis-text);
    margin-bottom: 0.5rem;
    line-height: 1.3;
    overflow-wrap: anywhere;
}
.isis-row-preview__meta {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.25rem;
    font-size: 0.78rem;
}
.isis-row-preview__meta > div {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 0.15rem 0;
    border-bottom: 1px dotted color-mix(in srgb, var(--isis-text) 8%, transparent);
}
.isis-row-preview__meta > div:last-child { border-bottom: none; }
.isis-row-preview__meta > div span:first-child {
    color: var(--isis-text-muted);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    white-space: nowrap;
    flex-shrink: 0;
}
.isis-row-preview__meta > div span:last-child {
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    text-align: right;
    /* Autorise le retour à la ligne d'une valeur longue (ex. nom de client) au lieu
       de déborder du popup. flex 1 1 0 + min-width:0 bornent la valeur à l'espace
       restant et lèvent le min-content auto des flex items → wrap garanti. */
    flex: 1 1 0;
    min-width: 0;
    white-space: normal;
    overflow-wrap: anywhere;
    word-break: break-word;
}
.isis-row-preview__margin.is-positive { color: var(--isis-success); font-weight: 600; }
.isis-row-preview__margin.is-negative { color: var(--isis-danger);  font-weight: 600; }
.isis-row-preview__margin.is-muted    { color: var(--isis-text-muted); }

/* Mobile : pas de hover device → désactive le tooltip pour éviter le tap accidentel. */
@media (hover: none) {
    .isis-grid__row:hover .isis-row-preview {
        opacity: 0;
    }
}

/* ============================================================================
   .isis-grid--commande-list — variante liste commandes gesproj (10 colonnes)
   Colonnes : status | numéro+réf | intitulé (+ icônes nature/suivi + compteurs)
            | client | origine | propriétaire
            | pilotage (avancement + santé + rendement) | montant HT | statut | actions
   (Colonne « type » supprimée 2026-06-04 — icônes fusionnées dans l'intitulé.)
   ============================================================================ */
.isis-grid--commande-list .isis-grid__head,
.isis-grid--commande-list .isis-grid__row {
    grid-template-columns: 32px 140px minmax(220px, 1.6fr) minmax(160px, 1fr) 100px minmax(150px, 1fr) 210px 140px 120px 50px;
    min-width: 1344px;
}

/* Colonne Propriétaire : nom du commercial owner, tronqué si trop long */
.isis-grid--commande-list .isis-grid__col-owner {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Colonne Type : 2 glyphes (typologie + mode de suivi) centrés */
.isis-grid--commande-list .isis-grid__col-type {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    color: var(--isis-text-muted);
}

/* Colonne Montant HT : aligné à droite, chiffres tabulaires (ex-style inline). */
.isis-grid--commande-list .isis-grid__col-amount {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
/* Colonne Pilotage : fusion avancement + santé + rendement (2026-06-04).
   Ligne 1 = barre + % + icône santé ; ligne 2 = rendement (sous-ligne). */
.isis-grid--commande-list .isis-grid__col-pilot {
    display: flex;
    flex-direction: column;
    gap: 2px;
    justify-content: center;
    min-width: 0;
}
.isis-grid--commande-list .isis-pilot-cell {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-grid--commande-list .isis-pilot-cell .isis-health { flex: 0 0 auto; }
.isis-grid--commande-list .isis-grid__col-pilot .isis-rendement { font-size: 0.72rem; }
/* Complément Pilotage : chips livraisons + qualité des livrables (2026-06-07). */
.isis-pilot-extra { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.2rem; }
.isis-pilot-chip { display: inline-flex; align-items: center; gap: 0.15rem; font-size: 0.7rem; line-height: 1; padding: 0.12rem 0.38rem; border-radius: 999px; background: var(--isis-surface-alt); border: 1px solid var(--isis-border); color: var(--isis-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.isis-pilot-chip.is-ok { color: var(--isis-success); border-color: color-mix(in srgb, var(--isis-success) 30%, var(--isis-border)); }
.isis-pilot-chip.is-warn { color: var(--isis-warning); border-color: color-mix(in srgb, var(--isis-warning) 30%, var(--isis-border)); }
.isis-pilot-chip.is-danger { color: var(--isis-danger); border-color: color-mix(in srgb, var(--isis-danger) 35%, var(--isis-border)); background: color-mix(in srgb, var(--isis-danger) 8%, var(--isis-surface)); }
/* Sous-ligne intitulé : icônes nature/suivi alignées inline puis compteurs (2026-06-04). */
.isis-grid--commande-list .isis-grid__intitule-meta {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    flex-wrap: wrap;
}
.isis-mini-progress {
    flex: 1 1 auto;
    height: 6px;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-alt, #eef0f4);
    overflow: hidden;
    min-width: 40px;
}
.isis-mini-progress__fill {
    height: 100%;
    border-radius: var(--isis-radius-pill);
    transition: width 0.2s ease;
}
.isis-mini-progress__fill.is-ok      { background: var(--isis-success); }
.isis-mini-progress__fill.is-warn    { background: var(--isis-warning); }
.isis-mini-progress__fill.is-late    { background: var(--isis-danger); }
.isis-mini-progress__fill.is-unknown { background: var(--isis-text-muted); }
.isis-mini-progress__pct {
    flex: 0 0 auto;
    font-size: 0.72rem;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
    min-width: 2.2rem;
    text-align: right;
}

/* Colonnes Santé + Rendement : pastille / texte coloré par statut */
.isis-health,
.isis-rendement {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.78rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-health.is-ok,      .isis-rendement.is-ok      { color: var(--isis-success); }
.isis-health.is-warn,    .isis-rendement.is-warn    { color: var(--isis-warning); }
.isis-health.is-late,    .isis-rendement.is-late    { color: var(--isis-danger); }
.isis-health.is-unknown, .isis-rendement.is-unknown { color: var(--isis-text-muted); }

/* ============================================================================
   .isis-grid--groupe-rollup — consolidation CA d'un groupe (grand compte 0312)
   Colonnes : Devise | CA facturé | CA signé | Pipe (3 montants alignés droite)
   ============================================================================ */
.isis-grid--groupe-rollup .isis-grid__head,
.isis-grid--groupe-rollup .isis-grid__row {
    grid-template-columns: minmax(90px, 0.5fr) 1fr 1fr 1fr;
    min-width: 560px;
}
.isis-grid--groupe-rollup .isis-grid__head > div:nth-child(n+2),
.isis-grid--groupe-rollup .isis-grid__row > div:nth-child(n+2) {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-grid--groupe-rollup .isis-grid__row { cursor: default; }
.isis-groupe-rollup-grid { margin-bottom: 1rem; }
.isis-groupe-rollup-note { margin-bottom: 1rem; }

/* ============================================================================
   .isis-grid--tiers-encours — encours par devise sur la fiche tiers (0339)
   Colonnes : Devise | Encours non soldé | Nb factures
   ============================================================================ */
.isis-grid--tiers-encours .isis-grid__head,
.isis-grid--tiers-encours .isis-grid__row {
    grid-template-columns: minmax(90px, 0.5fr) 1fr minmax(110px, 0.6fr);
    min-width: 420px;
}
.isis-grid--tiers-encours .isis-grid__head > div:nth-child(n+2),
.isis-grid--tiers-encours .isis-grid__row > div:nth-child(n+2) {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-grid--tiers-encours .isis-grid__row { cursor: default; }
.isis-tiers-credit__gauge { margin: 0.5rem 0 0.75rem; }
/* Bandeau encours dépassé en flux (fiche devis) — espace sous le bandeau. */
.isis-credit-banner-gap { margin-bottom: 1rem; }

/* Note de rattachement « Rattaché au groupe : X » (onglet Groupe, 0312). */
.isis-groupe-note { margin-bottom: 0.75rem; font-size: 0.82rem; color: var(--isis-text-muted); }
.isis-groupe-note__link { color: var(--isis-mod-gescom); text-decoration: none; font-weight: 600; }
.isis-groupe-note__link:hover,
.isis-groupe-note__link:focus-visible { text-decoration: underline; }
.isis-groupe-note__strong { color: var(--isis-text); }
.isis-rich-header__ancestor-link { color: inherit; text-decoration: none; }
.isis-rich-header__ancestor-link:hover,
.isis-rich-header__ancestor-link:focus-visible { text-decoration: underline; }

/* Synthèse 360° d'un tiers (grand compte Phase 1, migration 0313). */
.isis-tiers-360__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 0.6rem;
}
.isis-tiers-360__note { margin-top: 0.5rem; }

/* ============================================================================
   .isis-grid--tiers-filiales — filiales directes d'une tête de groupe (0312)
   Colonnes : status | code | raison sociale | ville | sous-groupe | actions
   ============================================================================ */
.isis-grid--tiers-filiales .isis-grid__head,
.isis-grid--tiers-filiales .isis-grid__row {
    grid-template-columns: 44px 110px minmax(180px, 1.4fr) 120px 110px 56px;
    min-width: 620px;
}

/* ============================================================================
   .isis-grid--contacts — annuaire intelligent des interlocuteurs (/gescom/contacts)
   Colonnes : status | contact (avatar+nom) | fonction | compte | email | tél | actions
   ============================================================================ */
.isis-grid--contacts .isis-grid__head,
.isis-grid--contacts .isis-grid__row {
    grid-template-columns: 44px minmax(200px, 1.4fr) 140px minmax(180px, 1.2fr) minmax(180px, 1fr) 130px 96px;
    min-width: 980px;
}
.isis-grid--contacts .isis-grid__col-contact {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    min-width: 0;
}
.isis-grid--contacts .isis-grid__avatar {
    width: 30px; height: 30px;
    font-size: 0.72rem;
}
.isis-grid--contacts .isis-grid__contact-id { min-width: 0; }
.isis-grid--contacts .isis-grid__contact-name {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid--contacts .isis-grid__col-account {
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.isis-grid--contacts .isis-grid__account-name {
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ============================================================================
   .isis-grid--contrats — portefeuille transverse de contrats (/gescom/contrats)
   Colonnes : status | sens | référence | intitulé | contrepartie | montant | statut | actions
   ============================================================================ */
.isis-grid--contrats .isis-grid__head,
.isis-grid--contrats .isis-grid__row {
    grid-template-columns: 44px 84px 120px minmax(200px, 1.4fr) minmax(160px, 1fr) 120px 110px 64px;
    min-width: 1040px;
}
/* Pastille « sens » du contrat : vente (client, bleu) vs achat (fournisseur, ambre). */
.isis-contrat-sens {
    display: inline-block;
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    padding: 0.12rem 0.5rem;
    border-radius: var(--isis-radius-pill);
}
.isis-contrat-sens--vente {
    background: color-mix(in srgb, var(--isis-mod-gescom, #4b5fad) 14%, white);
    color: var(--isis-mod-gescom, #4b5fad);
}
.isis-contrat-sens--achat {
    background: color-mix(in srgb, var(--isis-accent-warm, #c2410c) 14%, white);
    color: var(--isis-accent-warm, #c2410c);
}
/* Liste workspace contrats fournisseurs (P3 symétrie) — 8 colonnes. */
.isis-grid--contrat-fourn .isis-grid__head,
.isis-grid--contrat-fourn .isis-grid__row {
    grid-template-columns: 44px 120px minmax(200px, 1.5fr) minmax(150px, 1fr) 120px 150px 110px 56px;
    min-width: 1000px;
}

/* Consommé d'un contrat fournisseur (P2.2) — sidepanel portefeuille. */
.isis-contrat-conso {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    margin: 0.25rem 0 0.5rem;
}
.isis-contrat-conso__amount {
    font-size: 1.05rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-contrat-conso__cap { font-size: 0.8rem; color: var(--isis-text-muted); }
.isis-conso-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.25rem; }
.isis-conso-list__row {
    display: grid;
    grid-template-columns: 90px 1fr auto;
    gap: 0.5rem;
    align-items: center;
    font-size: 0.8rem;
    padding: 0.25rem 0;
    border-bottom: 1px solid var(--isis-border);
}
.isis-conso-list__num { font-family: 'Geist Mono', ui-monospace, monospace; color: var(--isis-text-muted); }
.isis-conso-list__title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-conso-list__ttc { font-variant-numeric: tabular-nums; text-align: right; }

/* Boucle financière engagé → facturé → payé (fiche détail contrat fournisseur, P3.A). */
.isis-contrat-finance {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
    margin-top: 1rem;
    padding: 0.85rem 1rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
}
.isis-contrat-finance__cell { min-width: 130px; }
.isis-contrat-finance__label { font-size: 0.72rem; color: var(--isis-text-soft); text-transform: uppercase; letter-spacing: 0.03em; }
.isis-contrat-finance__value { font-size: 1.15rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--isis-text); }
.isis-contrat-finance__hint { font-size: 0.72rem; color: var(--isis-text-muted); }

/* ============================================================================
   .isis-grid--commande-items — variante items commande sur la fiche détail
   Colonnes : # | désignation | qté | unité | PU HT | remise | total HT | actions
   ============================================================================ */
.isis-grid--commande-items .isis-grid__head,
.isis-grid--commande-items .isis-grid__row {
    grid-template-columns: 2.5rem minmax(220px, 1fr) 4.5rem 5rem 7rem 5rem 8rem 6rem;
}

/* S0 — badge cadenas (ligne/tâche verrouillée) + indicateur d'allocation. */
.isis-lock-badge {
    display: inline-flex; align-items: center; gap: 0.2rem;
    font-size: 0.7rem; font-weight: 600; color: var(--isis-text-muted);
    background: var(--isis-surface-alt); border-radius: var(--isis-radius-sm);
    padding: 0.05rem 0.35rem; margin-left: 0.35rem;
}
.isis-lock-badge .rzi, .isis-lock-badge .material-symbols-outlined { font-size: 13px; }
.isis-alloc-indicator {
    font-size: 0.78rem; color: var(--isis-text-muted); margin-top: 0.1rem;
    font-variant-numeric: tabular-nums;
}
.isis-alloc-indicator strong { color: var(--isis-current-mod, var(--isis-accent)); }
.isis-tache-budget {
    font-size: 0.82rem; font-variant-numeric: tabular-nums;
    color: var(--isis-current-mod, var(--isis-accent)); font-weight: 600;
}

/* S0 — éditeur d'allocation (dialog) */
.isis-alloc-editor { display: flex; flex-direction: column; gap: 0.15rem; }
.isis-alloc-editor__head,
.isis-alloc-editor__row {
    display: grid; grid-template-columns: minmax(160px, 1fr) 6rem 6rem 7rem;
    gap: 0.5rem; align-items: center; padding: 0.3rem 0.2rem;
}
.isis-alloc-editor__head {
    font-size: 0.72rem; font-weight: 600; text-transform: uppercase;
    color: var(--isis-text-muted); border-bottom: 1px solid var(--isis-border);
}
.isis-alloc-editor__row { border-bottom: 1px solid var(--isis-surface-alt); }

/* S0 — readout (champ calculé en lecture seule, ex: Total HT) */
.isis-form-linear__readout {
    display: flex; align-items: center; min-height: 38px;
    padding: 0 0.6rem; border-radius: var(--isis-radius-sm);
    background: var(--isis-surface-alt); font-variant-numeric: tabular-nums;
    font-weight: 600; color: var(--isis-text);
}

/* Dots workflow commande (cf. EventDotClass dans CommandeDetail.razor) —
   nommage aligné sur devis-wf-evt-* / ged-evt-*. */
.isis-audit-trail__dot.commande-wf-evt-created   { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.commande-wf-evt-validated { background: var(--isis-accent-soft); color: var(--isis-accent); }
.isis-audit-trail__dot.commande-wf-evt-started   { background: var(--isis-mod-gesproj-soft); color: var(--isis-mod-gesproj); }
.isis-audit-trail__dot.commande-wf-evt-closed    { background: var(--isis-success-soft); color: var(--isis-success); }
.isis-audit-trail__dot.commande-wf-evt-reopened  { background: var(--isis-accent-soft); color: var(--isis-accent); }
.isis-audit-trail__dot.commande-wf-evt-cancelled { background: var(--isis-danger-soft); color: var(--isis-danger); }
.isis-audit-trail__dot.commande-wf-evt-suivi     { background: #eef2ff; color: #4338ca; }

/* Variante "comment" simple pour la timeline commentaires (commande / devis). */
.isis-audit-trail__dot.is-comment { background: var(--isis-mod-gesproj-soft); color: var(--isis-mod-gesproj); }

/* Texte atténué dans une colonne de grille — pour valeurs vides ("—") ou état
   désactivé. Utilisé hors des colonnes spécialisées (email/phone/etc.). */
.isis-grid__col-muted { color: var(--isis-text-muted); }
/* Colonne « Partenaires » : 1 ou 2 pastilles compactes (COT / ST) */
.isis-grid__col-partners {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    flex-wrap: wrap;
}
.isis-grid__partner-chip {
    display: inline-block;
    padding: 0.05rem 0.35rem;
    font-size: 0.7rem;
    font-weight: 600;
    border-radius: 4px;
    font-variant-numeric: tabular-nums;
    border: 1px solid var(--isis-border);
}
.isis-grid__partner-chip.is-cotraitant {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}
/* Sous-traitant : neutre (cf. note ribbon — pas un état d'alerte, et bg warning
   donnait 2.86:1 sur texte warning, échec AA). */
.isis-grid__partner-chip.is-soustraitant {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

/* Mini-pastille « apporté par X » sur les lignes de devis dont le provider
   est un participant (P2 cotraitants — DevisDetail items + DevisCostingTab).
   Le chip est inline-flex avec un strong interne (badge COT/ST) ; line-height
   explicite + max-height + padding réduit pour ne pas étirer la row du
   tableau au-delà de la hauteur typographique de la description. */
.isis-devis-items__provider-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-left: 0.5rem;
    padding: 0 0.4rem;
    height: 18px;
    line-height: 1;
    font-size: 0.68rem;
    border-radius: 4px;
    border: 1px solid var(--isis-border);
    vertical-align: middle;
    white-space: nowrap;
}
.isis-devis-items__provider-chip strong {
    display: inline-flex;
    align-items: center;
    height: 13px;
    font-size: 0.58rem;
    font-weight: 600;
    line-height: 1;
    letter-spacing: 0.04em;
    padding: 0 0.25rem;
    border-radius: 3px;
}
.isis-devis-items__provider-chip.is-cotraitant {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}
.isis-devis-items__provider-chip.is-cotraitant strong {
    background: var(--isis-accent);
    color: var(--isis-surface);
}
.isis-devis-items__provider-chip.is-soustraitant {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-devis-items__provider-chip.is-soustraitant strong {
    background: var(--isis-text-muted);
    color: var(--isis-surface);
}

/* Section « Marge par participant » de l'onglet Coût de revient (P2 cotraitants).
   flex-shrink:0 pour rester collée au bas du panneau --footed (le tableau du
   coût de revient scrolle au-dessus). */
.isis-costing-by-provider {
    margin-top: 1.25rem;
    padding-top: 1rem;
    border-top: 1px solid var(--isis-border);
    flex-shrink: 0;
}
.isis-costing-by-provider__title {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin: 0 0 0.6rem;
}
.isis-costing-by-provider__table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
}
.isis-costing-by-provider__table th {
    text-align: left;
    font-size: 0.68rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    padding: 0.3rem 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-costing-by-provider__table td {
    padding: 0.4rem 0.5rem;
    border-bottom: 1px solid var(--isis-border-soft);
}
.isis-costing-by-provider__table tr:last-child td { border-bottom: none; }

/* Liste participants compacte dans le sidepanel de DevisListPage */
.isis-side-participants {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-side-participants__row {
    display: grid;
    /* Première colonne assez large pour « Sous-traitant » en toutes lettres. */
    grid-template-columns: 110px 1fr auto;
    gap: 0.5rem;
    align-items: center;
    padding: 0.3rem 0.4rem;
    border: 1px solid var(--isis-border-soft);
    border-radius: 5px;
    background: var(--isis-surface);
    font-size: 0.8rem;
}
.isis-side-participants__name {
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-side-participants__share {
    font-weight: 600;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    font-size: 0.74rem;
}

/* ============================================================================
   Sidepanel intelligent — chantier 2026-05-26 (DevisListPage pilote)
   ----------------------------------------------------------------------------
   11 améliorations livrées :
   #1 actions contextuelles par statut, #2 status enrichi (étape + validateur
   + ancienneté), #3 micro-KPIs contextuels (marge / jauge validité / commande),
   #4 montant HT mono large, #5 PJ GED, #6 tiers cliquable + stats, #7
   hiérarchie sections (--metier vs neutre), #8 switcher saillant, #9 empty
   state enrichi, #10 aperçu lignes top 3, #11 layout adaptatif (multi-middle).
   ============================================================================ */

/* #4 — Bloc identité refondu : numéro caption + titre H3 + montant mono large */
.isis-side-head {
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
}
.isis-side-head__caption {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    letter-spacing: 0.02em;
}
.isis-side-head__num {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.01em;
}
.isis-side-head__title {
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
    line-height: 1.25;
    margin: 0;
    /* 2 lignes max avec ellipsis (long titres devis) */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* #2 — Status enrichi : pill + métadonnées chaîne + ancienneté */
.isis-side-status {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.75rem;
    color: var(--isis-text-soft);
}
.isis-side-status__meta {
    color: var(--isis-text-muted);
}
.isis-side-status__age {
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-side-status__age.is-urgent {
    color: var(--isis-danger);
    font-weight: 600;
}

/* #4 — Montant 2 colonnes : HT/TTC empilés (col gauche) + Marge promue (col droite).
   La marge n'apparaît qu'avec la classe .has-margin posée par le markup. */
.isis-side-amount {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.75rem;
    padding: 0.5rem 0;
}
.isis-side-amount.has-margin {
    grid-template-columns: 1fr auto;
    align-items: center;
}
.isis-side-amount__totals {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.isis-side-amount__primary,
.isis-side-amount__secondary {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
}
.isis-side-amount__value {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 1.55rem;
    font-weight: 700;
    color: var(--isis-text);
    line-height: 1.1;
    letter-spacing: -0.015em;
    font-variant-numeric: tabular-nums;
}
.isis-side-amount__unit {
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--isis-text-soft);
    letter-spacing: 0.05em;
    text-transform: uppercase;
}
.isis-side-amount__ttc-value {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 0.95rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-side-amount__ttc-unit {
    font-size: 0.68rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    letter-spacing: 0.05em;
    text-transform: uppercase;
}

/* Bloc Marge inline dans isis-side-amount (col droite). Hérite des classes
   is-margin-on-target / is-margin-below-target / is-margin-below-floor pour
   colorer la bordure gauche + valeur. */
.isis-side-amount__margin {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    text-align: right;
    padding: 0.35rem 0.6rem 0.35rem 0.7rem;
    border-left: 3px solid var(--isis-border);
    background: var(--isis-surface-alt);
    border-radius: 4px;
    min-width: 90px;
}
.isis-side-amount__margin-label {
    font-size: 0.68rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.isis-side-amount__margin-value {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 1.1rem;
    font-weight: 700;
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-side-amount__margin-hint {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-side-amount__margin.is-margin-on-target {
    border-left-color: var(--isis-success);
}
.isis-side-amount__margin.is-margin-on-target .isis-side-amount__margin-value {
    color: var(--isis-success);
}
.isis-side-amount__margin.is-margin-below-target {
    border-left-color: var(--isis-warning);
}
.isis-side-amount__margin.is-margin-below-target .isis-side-amount__margin-value {
    color: var(--isis-warning);
}
.isis-side-amount__margin.is-margin-below-floor {
    border-left-color: var(--isis-danger);
}
.isis-side-amount__margin.is-margin-below-floor .isis-side-amount__margin-value {
    color: var(--isis-danger);
}

/* Bloc Validité fusionné sous le client : date + barre fine + % sur 1 ligne.
   Visible uniquement quand statut = SENT (compte à rebours pertinent). */
.isis-side-validity {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.35rem 0.55rem;
    margin: 0.3rem 0;
    background: var(--isis-surface-alt);
    border-radius: 4px;
    border-left: 3px solid var(--isis-border);
    font-size: 0.78rem;
    flex-wrap: wrap;
}
.isis-side-validity__label {
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    font-size: 0.68rem;
    letter-spacing: 0.04em;
}
.isis-side-validity__date {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    font-weight: 500;
}
.isis-side-validity__bar {
    flex: 1 1 80px;
    min-width: 70px;
    height: 5px;
    background: var(--isis-border);
    border-radius: 3px;
    overflow: hidden;
}
.isis-side-validity__bar-fill {
    height: 100%;
    background: var(--isis-success);
    transition: width 200ms ease;
}
.isis-side-validity__pct {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
    font-size: 0.72rem;
    white-space: nowrap;
}
.isis-side-validity.is-validity-ok       { border-left-color: var(--isis-success); }
.isis-side-validity.is-validity-ok       .isis-side-validity__bar-fill { background: var(--isis-success); }
.isis-side-validity.is-validity-warn     { border-left-color: var(--isis-warning); }
.isis-side-validity.is-validity-warn     .isis-side-validity__bar-fill { background: var(--isis-warning); }
.isis-side-validity.is-validity-expired  { border-left-color: var(--isis-danger); }
.isis-side-validity.is-validity-expired  .isis-side-validity__bar-fill { background: var(--isis-danger); }

/* #6 — Tiers cliquable + mini-stats */
.isis-side-tiers {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.isis-side-tiers__link {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    font-size: 0.85rem;
    color: var(--isis-current-mod, var(--isis-accent));
    text-align: left;
    font-weight: 500;
    transition: color 0.12s;
}
.isis-side-tiers__link:hover {
    text-decoration: underline;
}
.isis-side-tiers__link:focus-visible {
    text-decoration: underline;
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
    border-radius: 2px;
}
.isis-side-tiers__stats {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    margin-left: 1.05rem;
    font-variant-numeric: tabular-nums;
}

/* Dates compactes (sub-line) */
.isis-side-dates {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.74rem;
    color: var(--isis-text-soft);
    font-variant-numeric: tabular-nums;
}
.isis-side-dates__sep {
    opacity: 0.5;
}

/* #3 — Micro-KPIs contextuels par statut (marge / validité / commande) */
.isis-side-microkpis {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
    gap: 0.5rem;
    margin-top: 0.85rem;
    padding-top: 0.85rem;
    border-top: 1px dashed var(--isis-border);
}
.isis-side-microkpi {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.45rem 0.6rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-border);
    border-radius: 5px;
    transition: border-left-color 0.12s;
}
.isis-side-microkpi__label {
    font-size: 0.72rem;
    color: var(--isis-text-soft);
    letter-spacing: 0.06em;
    text-transform: uppercase;
}
.isis-side-microkpi__value {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 1rem;
    font-weight: 700;
    color: var(--isis-text);
    line-height: 1.15;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.01em;
}
.isis-side-microkpi__hint {
    font-size: 0.66rem;
    color: var(--isis-text-muted);
}
.isis-side-microkpi__action {
    margin-top: 0.25rem;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    font-size: 0.7rem;
    color: var(--isis-current-mod, var(--isis-accent));
    text-align: left;
    font-weight: 600;
}
.isis-side-microkpi__action:hover { text-decoration: underline; }
.isis-side-microkpi__action:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 2px;
    border-radius: 3px;
}
.isis-side-microkpi__bar {
    height: 6px;
    background: var(--isis-surface-soft);
    border-radius: 3px;
    overflow: hidden;
    margin: 0.2rem 0 0.15rem;
}
.isis-side-microkpi__bar-fill {
    height: 100%;
    background: var(--isis-current-mod, var(--isis-accent));
    border-radius: 3px;
    transition: width 0.3s ease;
}

/* Variantes sémantiques marge (reprises de MarginClassifier) — réservées
   au pilotage commercial Phases 1-4, ne PAS recycler pour d'autres états. */
.isis-side-microkpi.is-margin-on-target    { border-left-color: var(--isis-success); }
.isis-side-microkpi.is-margin-on-target    .isis-side-microkpi__bar-fill { background: var(--isis-success); }
.isis-side-microkpi.is-margin-below-target { border-left-color: var(--isis-warning); }
.isis-side-microkpi.is-margin-below-target .isis-side-microkpi__bar-fill { background: var(--isis-warning); }
.isis-side-microkpi.is-margin-below-floor  { border-left-color: var(--isis-danger); }
.isis-side-microkpi.is-margin-below-floor  .isis-side-microkpi__bar-fill { background: var(--isis-danger); }

/* Variantes sémantiques distinctes pour la jauge de validité (devis SENT) — fix audit 2026-05-26 #3
   pour ne pas polluer la sémantique commerciale de MarginClassifier. */
.isis-side-microkpi.is-validity-ok       { border-left-color: var(--isis-success); }
.isis-side-microkpi.is-validity-ok       .isis-side-microkpi__bar-fill { background: var(--isis-success); }
.isis-side-microkpi.is-validity-warn     { border-left-color: var(--isis-warning); }
.isis-side-microkpi.is-validity-warn     .isis-side-microkpi__bar-fill { background: var(--isis-warning); }
.isis-side-microkpi.is-validity-expired  { border-left-color: var(--isis-danger); }
.isis-side-microkpi.is-validity-expired  .isis-side-microkpi__bar-fill { background: var(--isis-danger); }

/* Variante pour la carte "Commande convertie" — signal positif (existence du lien) */
.isis-side-microkpi.is-converted { border-left-color: var(--isis-success); }

/* Classe utilitaire — icône décorative atténuée (extraction styles inline audit #7) */
.isis-side-icon--muted {
    font-size: 14px;
    opacity: 0.5;
}

/* #1 — Actions contextuelles par statut (primaire + secondaires inline) */
.isis-side-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-top: 0.85rem;
    padding-top: 0.85rem;
    border-top: 1px dashed var(--isis-border);
    align-items: center;
}

/* #5 — Pièces jointes GED (liste compacte 3 derniers) */
.isis-side-attachments {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-side-attachments__row {
    display: grid;
    grid-template-columns: auto 1fr auto;
    gap: 0.5rem;
    align-items: center;
    padding: 0.3rem 0.45rem;
    border: 1px solid var(--isis-border-soft);
    border-radius: 5px;
    background: var(--isis-surface);
    font-size: 0.78rem;
}
.isis-side-attachments__name {
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-side-attachments__size {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* #10 — Aperçu lignes (top 3 + bouton voir tout) */
.isis-side-lines {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-side-lines__row {
    display: grid;
    grid-template-columns: auto 1fr auto auto;
    gap: 0.45rem;
    align-items: center;
    padding: 0.3rem 0.45rem;
    border-bottom: 1px solid var(--isis-border-soft);
    font-size: 0.78rem;
}
.isis-side-lines__row:last-child { border-bottom: none; }
.isis-side-lines__pos {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    font-variant-numeric: tabular-nums;
    min-width: 18px;
    text-align: right;
}
.isis-side-lines__desc {
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-side-lines__qty {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-side-lines__total {
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 0.76rem;
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    text-align: right;
}
.isis-side-lines__more {
    background: none;
    border: 1px dashed var(--isis-border);
    border-radius: 4px;
    padding: 0.3rem 0.6rem;
    margin-top: 0.4rem;
    width: 100%;
    cursor: pointer;
    font-size: 0.73rem;
    color: var(--isis-current-mod, var(--isis-accent));
    transition: background 0.12s, border-color 0.12s;
}
.isis-side-lines__more:hover,
.isis-side-lines__more:focus-visible {
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
    border-color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}

/* #7 — Hiérarchie sections : variante --metier (accent module) vs neutre */
.isis-detail-split__title--metier {
    color: var(--isis-current-mod, var(--isis-accent));
    border-left: 2px solid var(--isis-current-mod, var(--isis-accent));
    padding-left: 0.4rem;
}
.isis-detail-split__title--metier .rzi {
    color: var(--isis-current-mod, var(--isis-accent));
    opacity: 1;
}
.isis-detail-split__count {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 18px;
    padding: 0 6px;
    border-radius: 9px;
    background: var(--isis-current-mod-soft, var(--isis-surface-alt));
    color: var(--isis-current-mod, var(--isis-accent));
    font-size: 0.68rem;
    font-weight: 700;
    line-height: 1;
}

/* #8 — Switcher saillant : underline accent module sur tab actif (en plus du fond) */
.isis-side-switcher__tab.is-active {
    box-shadow: inset 0 -2px 0 0 var(--isis-current-mod, var(--isis-accent));
}

/* #11 — Layout adaptatif : multiples sections __middle peuvent coexister
   (PJ + Participants + Lignes). Le cap max-height: 35% par section était
   trop strict, on remplace par flex-shrink: 0 (taille naturelle) ; le scroll
   global du sidepanel (.isis-side-switcher__body) absorbe le débord. */
.isis-detail-split__middle {
    flex: 0 0 auto;
    max-height: none;
}
    text-align: right;
    font-variant-numeric: tabular-nums;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: center;
    line-height: 1.2;
}
.isis-grid--devis-list .isis-grid__col-num.is-muted {
    color: var(--isis-text-soft);
}
.isis-grid--devis-list .isis-grid__col-num.is-positive {
    color: var(--isis-success);    /* token (était #16a34a — DESIGN.md §2 palette --isis-* uniquement) */
    font-weight: 600;
}
.isis-grid--devis-list .isis-grid__col-num.is-negative {
    color: var(--isis-danger);     /* token (était #c62828) */
    font-weight: 600;
}
.isis-grid__col-num__sub {
    display: block;            /* sous-valeur sur sa propre ligne (sinon collée au montant) */
    font-size: 0.72rem;
    font-weight: 500;
    opacity: 0.75;
    margin-top: 1px;
}
.isis-cost-symbol {
    color: var(--isis-text-muted);
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
}
.isis-cost-tree {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: var(--isis-text);
}
.isis-cost-tree__indent {
    color: var(--isis-text-soft);
    opacity: 0.6;
    font-size: 0.85rem;
}
.isis-cost-tree__label { font-weight: 500; }

.isis-csv-input { margin-top: 0.3rem; font-size: 0.85rem; }
.isis-csv-report {
    margin-top: 0.7rem;
    padding: 0.7rem 0.9rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-csv-report__head { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.4rem; }
.isis-csv-report__counts { display: flex; gap: 1.2rem; font-size: 0.82rem; color: var(--isis-text); }
.isis-csv-report__counts .is-error { color: #c62828; }
.isis-csv-report__details { margin-top: 0.5rem; font-size: 0.78rem; }
.isis-csv-report__details summary { cursor: pointer; color: var(--isis-text-muted); }
.isis-csv-report__details ul { margin: 0.4rem 0 0 1.2rem; color: var(--isis-text-muted); line-height: 1.5; }

/* ── Import bulk articles (ArticleBulkImportDialog) ─────────────────────── */
.isis-bulk-import { min-width: 860px; max-width: 1120px; }
.isis-bulk-import__file {
    display: flex; align-items: center; gap: 0.6rem;
    padding: 0.5rem 0.7rem;
    background: var(--isis-surface-alt); border-radius: 4px;
}
.isis-bulk-import__file-meta { flex: 1; }
.isis-bulk-import__file-name { font-weight: 500; font-size: 0.85rem; }
.isis-bulk-import__file-size { font-size: 0.72rem; color: var(--isis-text-soft); }

.isis-bulk-import__section-sub {
    font-size: 0.8rem; color: var(--isis-text-muted);
    margin: 0.1rem 0 0.6rem;
}
.isis-bulk-import__muted { color: var(--isis-text-muted); }

.isis-bulk-import__download {
    display: inline-flex; align-items: center; gap: 0.4rem;
    padding: 0.45rem 0.7rem;
    background: color-mix(in srgb, var(--isis-current-mod) 8%, transparent);
    border: 1px solid color-mix(in srgb, var(--isis-current-mod) 30%, transparent);
    border-radius: 4px; font-size: 0.85rem; color: var(--isis-current-mod);
    text-decoration: none; font-weight: 500;
}
.isis-bulk-import__download:hover { background: color-mix(in srgb, var(--isis-current-mod) 14%, transparent); }
.isis-bulk-import__download:focus-visible {
    outline: 2px solid var(--isis-current-mod); outline-offset: 2px;
}

.isis-bulk-import__counters {
    display: flex; gap: 0.6rem; flex-wrap: wrap;
    margin: 0.5rem 0 0.4rem;
}
.isis-bulk-import__counters-detail {
    display: flex; gap: 0.8rem; flex-wrap: wrap;
    margin: 0 0 0.6rem;
    font-size: 0.78rem; color: var(--isis-text-muted);
}
.isis-bulk-import__kpi {
    font-size: 0.82rem; padding: 0.25rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 4px; color: var(--isis-text);
}
.isis-bulk-import__kpi.is-warn { background: color-mix(in srgb, var(--isis-warning) 12%, transparent); }
.isis-bulk-import__kpi.is-create strong { color: var(--isis-success); }
.isis-bulk-import__kpi.is-update strong { color: var(--isis-current-mod); }

.isis-bulk-import__td-price {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-variant-numeric: tabular-nums;
    text-align: right;
}

.isis-bulk-import__badge-mini {
    display: inline-block; margin-left: 0.4rem;
    padding: 0.05rem 0.35rem;
    font-size: 0.68rem; font-weight: 600;
    text-transform: uppercase; letter-spacing: 0.03em;
    background: color-mix(in srgb, var(--isis-current-mod) 18%, transparent);
    color: var(--isis-current-mod);
    border-radius: 2px;
}

.isis-bulk-import__table {
    max-height: 340px; overflow: auto;
    border: 1px solid var(--isis-border); border-radius: 4px;
    margin-top: 0.4rem;
}
.isis-bulk-import__table table {
    width: 100%; border-collapse: collapse;
    font-size: 0.8rem;
}
.isis-bulk-import__table thead th {
    position: sticky; top: 0; z-index: 1;
    background: var(--isis-surface-alt);
    text-align: left; padding: 0.4rem 0.6rem;
    font-weight: 600; color: var(--isis-text-muted);
    border-bottom: 1px solid var(--isis-border);
    text-transform: uppercase; font-size: 0.7rem; letter-spacing: 0.04em;
}
.isis-bulk-import__table tbody td {
    padding: 0.35rem 0.6rem;
    border-bottom: 1px solid var(--isis-border-soft, var(--isis-border));
    vertical-align: top;
}
.isis-bulk-import__row.is-skip td { opacity: 0.7; }
.isis-bulk-import__td-line, .isis-bulk-import__td-code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-variant-numeric: tabular-nums;
}
.isis-bulk-import__td-errors {
    color: var(--isis-danger); font-size: 0.75rem; max-width: 200px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.isis-bulk-import__action {
    display: inline-block; padding: 0.1rem 0.45rem;
    border-radius: 3px; font-size: 0.72rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.03em;
}
/* Badges graphiques (WCAG 1.4.11 = 3:1 objet). Fond à 28 % pour pousser le ratio
   texte au-delà de 4.5:1 (1.4.3) sur `is-create` où le contraste était marginal. */
.isis-bulk-import__action.is-create {
    background: color-mix(in srgb, var(--isis-success) 28%, transparent);
    color: var(--isis-success);
}
.isis-bulk-import__action.is-update {
    background: color-mix(in srgb, var(--isis-current-mod) 28%, transparent);
    color: var(--isis-current-mod);
}
/* « Ignorer » est neutre (ligne non importée sans conséquence), pas un avertissement.
   On évite l'ambre (réservé aux états qui demandent attention de l'utilisateur). */
.isis-bulk-import__action.is-skip {
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
}

.isis-bulk-import__report {
    padding: 0.9rem 1rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-bulk-import__report-head {
    display: flex; align-items: center; gap: 0.5rem;
    font-size: 1rem; margin-bottom: 0.7rem;
}
.isis-bulk-import__report-grid {
    display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem 1rem;
    font-size: 0.86rem;
}
.isis-bulk-import__errors { margin-top: 0.7rem; font-size: 0.8rem; }
.isis-bulk-import__errors summary { cursor: pointer; color: var(--isis-danger); }
.isis-bulk-import__errors summary:focus-visible {
    outline: 2px solid var(--isis-current-mod);
    outline-offset: 2px; border-radius: 2px;
}
.isis-bulk-import__errors ul { margin: 0.4rem 0 0 1.2rem; color: var(--isis-text-muted); line-height: 1.5; }

/* Wizard catalogue (CatalogueBulkImportDialog) — réutilise la base bulk-import.
   Le tableau a des dropdowns par ligne donc plus de hauteur que la version
   articles. La toolbar wizard (Tout cocher / Tout décocher / filtre) vit dans
   `.isis-bulk-import__toolbar`. */
.isis-cat-import { min-width: 960px; max-width: 1280px; }
.isis-cat-import__table { max-height: 460px; }
.isis-cat-import__table tbody td { vertical-align: middle; padding: 0.5rem 0.6rem; }
.isis-cat-import__table input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; }
.isis-cat-import__table input[type="checkbox"]:disabled { cursor: not-allowed; opacity: 0.4; }
.isis-cat-import__table .rz-dropdown { font-size: 0.8rem; }

/* Les erreurs sont actionnables (l'user doit savoir QUOI corriger) — on autorise
   le wrap sur 2 lignes max pour éviter une troncature `…` illisible.
   Surcharge la version globale `.isis-bulk-import__td-errors` (text-overflow ellipsis). */
.isis-cat-import__table .isis-bulk-import__td-errors {
    white-space: normal;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    max-width: 240px;
}

.isis-bulk-import__toolbar {
    display: flex; gap: 0.5rem; flex-wrap: wrap;
    margin: 0.3rem 0 0.5rem;
}

/* Bouton-lien neutre (action discrète sans bg, juste icône + texte) — utile
   dans les barres d'action wizard / sidepanel. */
.isis-link-btn {
    display: inline-flex; align-items: center; gap: 0.3rem;
    padding: 0.3rem 0.5rem; border-radius: 4px;
    background: transparent; border: 1px solid transparent;
    font-size: 0.78rem; color: var(--isis-text-muted);
    cursor: pointer; text-decoration: none;
}
.isis-link-btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-link-btn:focus-visible {
    outline: 2px solid var(--isis-current-mod);
    outline-offset: 2px;
}

/* Toolbar légère au-dessus du tableau de lignes dans DevisDetail (DRAFT only) */
.isis-devis-items__toolbar {
    display: flex;
    justify-content: flex-end;
    gap: 0.4rem;
    margin-bottom: 0.6rem;
}

/* ============================================================================
   Onglet « Coût de revient » sur DevisDetail
   ============================================================================ */
.isis-costing-tab { display: flex; flex-direction: column; gap: 0.8rem; padding-top: 0.5rem; }
/* Quand le panneau parent est --footed (chaîne flex pleine hauteur), .isis-costing-tab
   doit lui-même devenir flex column avec overflow hidden pour que le scroll du tableau
   et le pinning de la section « Marge par participant » fonctionnent. */
.isis-tab-panel--footed > .isis-costing-tab {
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
}

/* Tableau unique « Coût de revient » : reprend le style .isis-devis-items
   avec modifiers pour les rows ligne / allocation / total. */
.isis-costing-items .isis-costing-row__pos {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    margin-right: 0.4rem;
}
.isis-costing-items .isis-costing-row__desc {
    font-weight: 500;
    color: var(--isis-text);
}
.isis-costing-items .isis-costing-row__margin.is-positive { color: #16a34a; font-weight: 600; }
.isis-costing-items .isis-costing-row__margin.is-negative { color: #c62828; font-weight: 600; }

/* Classification tri-état Phase 1 (réconciliation coût/prix, migration 0121).
   Cohabite avec is-positive/is-negative ci-dessus tant qu'il reste des appelants
   binaires. Cibler aussi la sous-table .isis-costing-by-provider.              */
.isis-costing-items .isis-costing-row__margin.is-on-target,
.isis-costing-by-provider .isis-costing-row__margin.is-on-target {
    color: var(--isis-success, #16a34a); font-weight: 600;
}
.isis-costing-items .isis-costing-row__margin.is-below-target,
.isis-costing-by-provider .isis-costing-row__margin.is-below-target {
    color: var(--isis-warning, #d97706); font-weight: 600;
}
.isis-costing-items .isis-costing-row__margin.is-below-floor,
.isis-costing-by-provider .isis-costing-row__margin.is-below-floor {
    color: var(--isis-danger, #c62828); font-weight: 700;
}
.isis-costing-items .isis-costing-row__margin.is-no-cost,
.isis-costing-by-provider .isis-costing-row__margin.is-no-cost {
    color: var(--isis-text-muted, #94a3b8); font-weight: 500;
}
.isis-costing-items .isis-costing-row__margin.is-unclassified,
.isis-costing-by-provider .isis-costing-row__margin.is-unclassified {
    color: var(--isis-text, #1f2328); font-weight: 600;
}

/* Bandeau marge globale en tête de l'onglet Coût de revient.
   flex-shrink: 0 → reste fixe en haut, le tableau scrolle en dessous.          */
.isis-margin-banner {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.55rem 0.85rem;
    border-radius: 8px;
    border-left: 3px solid var(--isis-border, #e2e8f0);
    background: var(--isis-surface-soft, #f8fafc);
    font-size: 0.82rem;
}
.isis-margin-banner__main { flex: 1 1 auto; min-width: 0; }
.isis-margin-banner__main strong { font-weight: 600; }
.isis-margin-banner__sub { color: var(--isis-text-muted, #475569); margin-left: 0.25rem; }
.isis-margin-banner__chip {
    flex-shrink: 0;
    padding: 0.15rem 0.55rem;
    border-radius: 10px;
    font-size: 0.72rem;
    font-weight: 600;
    background: rgba(217, 119, 6, 0.12);
    color: var(--isis-warning, #b45309);
}
.isis-margin-banner__help {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    border-radius: 12px;
    color: var(--isis-text-muted, #475569);
    text-decoration: none;
    margin-left: 0.25rem;
}
.isis-margin-banner__help:hover {
    background: var(--isis-accent-soft, rgba(75, 95, 173, 0.12));
    color: var(--isis-accent, #4b5fad);
}
.isis-margin-banner.is-on-target {
    border-left-color: var(--isis-success, #16a34a);
    background: rgba(22, 163, 74, 0.06);
}
.isis-margin-banner.is-below-target {
    border-left-color: var(--isis-warning, #d97706);
    background: rgba(217, 119, 6, 0.06);
}
.isis-margin-banner.is-below-floor {
    border-left-color: var(--isis-danger, #c62828);
    background: rgba(198, 40, 40, 0.06);
}
.isis-margin-banner.is-no-cost,
.isis-margin-banner.is-unclassified {
    border-left-color: var(--isis-border, #cbd5e1);
}

/* Badge ajustements appliqués sur ligne devis (Phase 5) — icône history +
   compteur. Cliquable, ouvre l'historique. Couleur sobre accent module. */
.isis-adjust-badge {
    display: inline-flex !important;
    align-items: center;
    gap: 3px;
    background: color-mix(in srgb, var(--isis-accent) 8%, var(--isis-surface));
    color: var(--isis-accent) !important;
    border-color: color-mix(in srgb, var(--isis-accent) 30%, transparent) !important;
}
.isis-adjust-badge:hover {
    background: color-mix(in srgb, var(--isis-accent) 16%, var(--isis-surface));
}
.isis-adjust-badge__count {
    font-size: 0.7rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* Liste de l'historique d'ajustements (DevisAdjustmentHistoryDialog). */
.isis-adjust-history {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
.isis-adjust-history__item {
    display: flex;
    gap: 0.7rem;
    align-items: flex-start;
    padding: 0.6rem 0.7rem;
    background: var(--isis-surface-alt, #f8fafc);
    border-radius: 6px;
    border-left: 3px solid var(--isis-border, #e2e8f0);
}
.isis-adjust-history__icon {
    flex-shrink: 0;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-adjust-history__icon.is-uplift {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, transparent);
    color: var(--isis-success, #16a34a);
}
.isis-adjust-history__icon.is-discount {
    background: color-mix(in srgb, var(--isis-accent) 14%, transparent);
    color: var(--isis-accent);
}
.isis-adjust-history__body { flex: 1; min-width: 0; }
.isis-adjust-history__head {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    align-items: baseline;
    font-size: 0.82rem;
}
.isis-adjust-history__head .muted { color: var(--isis-text-muted); }
.isis-adjust-history__deltas {
    margin-top: 0.3rem;
    display: flex;
    flex-wrap: wrap;
    gap: 0.7rem;
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-adjust-history__deltas strong { color: var(--isis-text); }
.isis-adjust-history__reason {
    margin-top: 0.35rem;
    padding: 0.4rem 0.55rem;
    background: var(--isis-surface, #ffffff);
    border-radius: 4px;
    font-size: 0.78rem;
    font-style: italic;
    color: var(--isis-text);
    border-left: 2px solid var(--isis-accent);
}

/* Bouton « Auditer » dans le banner marge (Phase 5). Style cohérent avec
   les autres chips du banner — petit, sobre. */
.isis-margin-banner__audit {
    appearance: none;
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border, #e2e8f0);
    color: var(--isis-text);
    border-radius: 6px;
    padding: 0.3rem 0.6rem;
    font-size: 0.78rem;
    font-weight: 500;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
    margin-left: 0.5rem;
}
.isis-margin-banner__audit:hover {
    background: color-mix(in srgb, var(--isis-accent) 8%, var(--isis-surface));
    border-color: var(--isis-accent);
    color: var(--isis-accent);
}

/* Dialog d'audit bulk Phase 5 — sections empilées avec titre coloré. */
.isis-audit-section--deficit { color: var(--isis-danger, #dc2626); }
.isis-audit-section--excess  { color: var(--isis-accent, #4b5fad); }
.isis-audit-list {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
}
.isis-audit-list th,
.isis-audit-list td {
    padding: 0.45rem 0.6rem;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
    vertical-align: top;
}
.isis-audit-list thead th {
    text-align: left;
    font-weight: 600;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt, #f8fafc);
}
.isis-audit-list .num { text-align: right; font-variant-numeric: tabular-nums; }
.isis-audit-list .muted { color: var(--isis-text-muted); font-size: 0.74rem; margin-top: 2px; }
.isis-audit-list .error { color: var(--isis-danger, #dc2626); font-size: 0.74rem; margin-top: 2px; font-style: italic; }
.isis-audit-list .is-positive { color: var(--isis-success, #16a34a); font-weight: 600; }
.isis-audit-list .is-negative { color: var(--isis-danger, #dc2626); font-weight: 600; }
.isis-audit-list tbody tr:hover { background: var(--isis-surface-alt, #f8fafc); }

/* Aperçu d'ajustement Phase 5 (DevisAdjustmentDialog) — table compacte
   avant/après/Δ. Couleurs sémantiques sur les Δ : vert = bénéfice (PU monte,
   total HT monte, marge monte), rouge = perte (PU baisse, etc.). */
.isis-adjust-preview {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
    margin-top: 0.4rem;
}
.isis-adjust-preview th,
.isis-adjust-preview td {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
}
.isis-adjust-preview thead th {
    text-align: left;
    font-weight: 600;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt, #f8fafc);
}
.isis-adjust-preview .num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-adjust-preview .is-positive { color: var(--isis-success, #16a34a); font-weight: 600; }
.isis-adjust-preview .is-negative { color: var(--isis-danger, #dc2626); font-weight: 600; }
.isis-adjust-preview tr.margin-row td { background: color-mix(in srgb, var(--isis-accent) 4%, transparent); font-weight: 600; }
.isis-adjust-preview tr.cost-row td { color: var(--isis-text-muted); font-size: 0.78rem; font-style: italic; }

/* Bandeau snapshot coût (Phase 3) — placé juste sous le bandeau marge. Style
   neutre informatif pour ne pas distraire : icône lock + texte mince.        */
.isis-cost-snapshot-banner {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.45rem 0.85rem;
    margin-top: 0.4rem;
    border-radius: 6px;
    background: var(--isis-surface-soft, #f8fafc);
    color: var(--isis-text-muted, #475569);
    font-size: 0.78rem;
    border-left: 3px solid var(--isis-text-muted, #94a3b8);
}
.isis-cost-snapshot-banner strong {
    color: var(--isis-text, #1f2328);
    font-weight: 600;
}
/* Bascule "Voir le coût live aussi" — alignée à droite dans le bandeau. */
.isis-cost-snapshot-banner__toggle {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    cursor: pointer;
    user-select: none;
    color: var(--isis-text, #1f2328);
    font-size: 0.78rem;
}
.isis-cost-snapshot-banner__toggle input[type="checkbox"] {
    width: 13px;
    height: 13px;
    accent-color: var(--isis-accent, #4b5fad);
    cursor: pointer;
}
/* Delta coût live vs snapshot (Phase 3 v2). Up = coût a augmenté (rouge),
   down = coût a baissé (vert). 0 = pas de variation. */
.isis-costing-items .isis-cost-delta--up   { color: var(--isis-danger,  #c62828); font-weight: 500; }
.isis-costing-items .isis-cost-delta--down { color: var(--isis-success, #16a34a); font-weight: 500; }

/* Ligne devis : séparateur fin entre lignes successives */
.isis-costing-items tr.isis-costing-row-line > td {
    border-top: 1px solid var(--isis-border);
    padding-top: 0.55rem;
    padding-bottom: 0.55rem;
    background: var(--isis-surface);
}
.isis-costing-items tbody > tr.isis-costing-row-line:first-child > td { border-top: none; }

/* Allocations : indentation + fond légèrement teinté + texte plus discret */
.isis-costing-items tr.isis-costing-row-alloc > td,
.isis-costing-items tr.isis-costing-row-alloc-empty > td {
    background: var(--isis-surface-alt);
    padding-top: 0.35rem;
    padding-bottom: 0.35rem;
    font-size: 0.85rem;
    border-bottom: none;
}
.isis-costing-items .isis-costing-row__tree {
    color: var(--isis-text-soft);
    margin-right: 0.4rem;
    font-size: 0.85rem;
}
.isis-costing-items .isis-costing-row__alloc-label {
    font-weight: 500;
    color: var(--isis-text);
}
.isis-costing-items .isis-costing-row__alloc-comment {
    margin-top: 0.15rem;
    margin-left: 1.1rem;
    font-size: 0.72rem;
    font-style: italic;
    color: var(--isis-text-soft);
}
.isis-costing-items tr.isis-costing-row-alloc-empty {
    color: var(--isis-text-soft);
    font-style: italic;
    font-size: 0.78rem;
}

/* Total devis : barre marquée en bas */
.isis-costing-items tr.isis-costing-row-total > td {
    border-top: 2px solid var(--isis-border);
    padding-top: 0.7rem;
    padding-bottom: 0.7rem;
    background: var(--isis-surface);
    font-size: 0.95rem;
}

/* Colonne Code dans la table read-only des lignes (DevisDetail · onglet Lignes) */
.isis-devis-items__code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-mod-gescom);
    font-weight: 600;
}
.isis-devis-items__code-empty {
    color: var(--isis-text-soft);
    font-style: italic;
    font-size: 0.78rem;
}

/* ============================================================================
   Catalogue articles : sélecteurs (1-à-1 et masse) + indicateurs ligne devis.
   ============================================================================ */

/* Bouton « Depuis le catalogue » distinctif dans la barre add-row */
.isis-devis-items__add--catalog {
    background: var(--isis-mod-gescom-soft) !important;
    color: var(--isis-mod-gescom) !important;
    border-color: var(--isis-mod-gescom) !important;
    font-weight: 600;
}
.isis-devis-items__add--catalog:disabled {
    opacity: 0.45;
    cursor: not-allowed;
}

/* Ligne checkbox + label dans les formulaires (Phase 2 v2). Pattern simple
   pour les options booléennes : la checkbox Radzen à gauche, label à droite. */
.isis-checkbox-row {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    cursor: pointer;
    user-select: none;
}

/* Mode simulation sandbox (Phase 2 v2) — toggle au-dessus du bloc actions
   du DevisItemsEditDialog. Cosmétique d'avertissement : fond ambre subtil,
   pas intrusif mais visible. Le bouton "Enregistrer" se transforme en
   "Quitter sans enregistrer" warning quand activé.                             */
.isis-sim-mode {
    margin-top: 1rem;
    padding: 0.55rem 0.85rem;
    border-radius: 6px;
    background: rgba(217, 119, 6, 0.06);
    border-left: 3px solid var(--isis-warning, #d97706);
}
.isis-sim-mode__toggle {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    cursor: pointer;
    font-size: 0.82rem;
    color: var(--isis-text, #1f2328);
    user-select: none;
}
.isis-sim-mode__toggle input[type="checkbox"] {
    width: 14px;
    height: 14px;
    accent-color: var(--isis-warning, #d97706);
    cursor: pointer;
}
.isis-sim-mode__toggle .rz-icon { color: var(--isis-warning, #d97706); }

/* Bulk align PU sur cible entreprise (Phase 2). Distinct visuellement des
   boutons d'ajout : palette success pour signaler l'opération sur les lignes
   existantes (pas une création).                                                */
.isis-devis-items__add--bulk-align {
    margin-left: auto;
    background: rgba(22, 163, 74, 0.08) !important;
    color: var(--isis-success, #16a34a) !important;
    border-color: var(--isis-success, #16a34a) !important;
    font-weight: 600;
}
.isis-devis-items__add--bulk-align:hover {
    background: rgba(22, 163, 74, 0.16) !important;
}

/* Cellule PU HT : input numeric + bouton calculateur inline (Phase 2). */
.isis-pu-cell {
    display: flex;
    align-items: center;
    gap: 0.25rem;
}
.isis-pu-cell__calc {
    appearance: none;
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border, #e2e8f0);
    color: var(--isis-accent, #4b5fad);
    border-radius: 4px;
    height: 24px;
    width: 24px;
    padding: 0;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-pu-cell__calc:hover {
    background: var(--isis-accent-soft, rgba(75, 95, 173, 0.12));
    border-color: var(--isis-accent, #4b5fad);
}
.isis-pu-cell__calc:focus-visible {
    outline: 2px solid var(--isis-accent, #4b5fad);
    outline-offset: 1px;
}

/* Cell « Article » dans le tableau d'édition : chip + bouton délier */
.isis-catalog-link {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    min-height: 28px;
    font-size: 0.72rem;
    line-height: 1;
    border: none;
    background: transparent;
    cursor: pointer;
    color: var(--isis-text-muted);
    padding: 0;
}
.isis-catalog-link.is-unlinked {
    padding: 0.25rem 0.55rem;
    border: 1px dashed #d97706;
    border-radius: 4px;
    background: #fffbeb;
    color: #92400e;
}
.isis-catalog-link.is-unlinked:hover { background: #fef3c7; }
.isis-catalog-link__dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: #d97706;
    flex-shrink: 0;
}
.isis-catalog-link.is-linked {
    display: inline-flex;
    align-items: stretch;
    border: 1px solid var(--isis-mod-gescom);
    border-radius: 4px;
    background: var(--isis-mod-gescom-soft);
    overflow: hidden;
}
.isis-catalog-link__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.2rem 0.45rem;
    border: none;
    background: transparent;
    color: var(--isis-mod-gescom);
    cursor: pointer;
    font: inherit;
    font-weight: 600;
}
.isis-catalog-link__chip:hover { background: rgba(75, 95, 173, 0.12); }
.isis-catalog-link__code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.7rem;
}
.isis-catalog-link__unlink {
    padding: 0 0.3rem;
    border: none;
    background: transparent;
    border-left: 1px solid var(--isis-mod-gescom);
    color: var(--isis-mod-gescom);
    cursor: pointer;
    opacity: 0.6;
}
.isis-catalog-link__unlink:hover { opacity: 1; color: #c62828; border-left-color: #c62828; }

/* Recherche commune aux dialogs catalogue */
.isis-catalog-search {
    width: 100%;
    height: 36px;
    padding: 0 0.7rem;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
    font-size: 0.85rem;
    color: var(--isis-text);
    outline: none;
    transition: border-color 120ms ease;
}
.isis-catalog-search:focus { border-color: var(--isis-accent); }

/* Sélecteur 1-à-1 : liste verticale d'items */
.isis-catalog-list {
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    max-height: 360px;
    min-height: 200px;
    overflow-y: auto;
    background: var(--isis-surface);
    margin-top: 0.4rem;
}
.isis-catalog-list ul { list-style: none; margin: 0; padding: 0; }
.isis-catalog-list__empty {
    padding: 2rem 1rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.4rem;
    color: var(--isis-text-soft);
    text-align: center;
}
.isis-catalog-list__empty .rzi { font-size: 28px; opacity: 0.4; }

.isis-catalog-item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.55rem 0.75rem;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
    cursor: pointer;
    transition: background-color 100ms ease;
    gap: 0.6rem;
}
.isis-catalog-item:last-child { border-bottom: none; }
.isis-catalog-item:hover { background: var(--isis-surface-alt); }
.isis-catalog-item.is-selected {
    background: var(--isis-accent-soft);
    border-left: 2px solid var(--isis-accent);
    padding-left: calc(0.75rem - 2px);
}
.isis-catalog-item__main {
    display: flex;
    align-items: baseline;
    gap: 0.65rem;
    min-width: 0;
}
.isis-catalog-item__code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    flex-shrink: 0;
}
.isis-catalog-item__name {
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-catalog-item__structure {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    background: var(--isis-surface-alt);
    padding: 0.1rem 0.45rem;
    border-radius: 3px;
    flex-shrink: 0;
}

/* En-tête de groupe (par structure) dans les pickers — P2 cotraitants. */
.isis-catalog-group-header {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.45rem 0.75rem 0.3rem;
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
    cursor: default;
}
.isis-catalog-group-header strong {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-catalog-group-header__role {
    font-size: 0.65rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    padding: 0.05rem 0.4rem;
    border-radius: 3px;
}

/* Sélecteur en masse : tableau avec checkbox + qty */
.isis-catalog-bulk-count {
    font-weight: 500;
    color: var(--isis-mod-gescom);
    margin-left: 0.4rem;
    font-size: 0.78rem;
}
.isis-catalog-bulk {
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    max-height: 420px;
    min-height: 240px;
    overflow-y: auto;
    background: var(--isis-surface);
    margin-top: 0.4rem;
}
.isis-catalog-bulk__table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.82rem;
}
.isis-catalog-bulk__table thead th {
    position: sticky; top: 0;
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
    padding: 0.5rem 0.6rem;
    text-align: left;
    font-size: 0.7rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-catalog-bulk__table tbody td {
    padding: 0.45rem 0.6rem;
    border-bottom: 1px solid var(--isis-border-soft, #f1f2f5);
}
.isis-catalog-bulk__table tbody tr:last-child td { border-bottom: none; }
.isis-catalog-bulk__table tbody tr.is-checked { background: var(--isis-accent-soft); }
.isis-catalog-bulk__code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-catalog-bulk__structure {
    font-size: 0.72rem;
    color: var(--isis-text-soft);
}
/* En-tête de groupe par structure (P2 cotraitants) */
.isis-catalog-bulk__group-row td {
    background: var(--isis-surface-alt);
    padding: 0.4rem 0.65rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-catalog-bulk__group {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-catalog-bulk__group strong {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-catalog-bulk__group-role {
    font-size: 0.65rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    padding: 0.05rem 0.4rem;
    border-radius: 3px;
}

/* Dropdown Type compact dans le dialog d'édition de lignes : font plus petit
   + padding réduit pour que le texte (PRODUIT/SERVICE/SECTION/COMMENT) reste
   lisible sans déborder de la colonne 100px. */
.isis-devis-items__type-dd.rz-dropdown {
    min-height: 30px;
}
.isis-devis-items__type-dd .rz-dropdown-label,
.isis-devis-items__type-dd .rz-inputtext {
    font-size: 0.72rem;
    padding: 0.25rem 0.4rem;
}
.isis-devis-items__type-dd .rz-dropdown-trigger {
    width: 24px;
}
/* Liste déroulante : items du popup */
.rz-dropdown-panel .rz-dropdown-items .rz-dropdown-item {
    font-size: 0.78rem;
}

/* ============================================================================
   .isis-grid--email-templates — variante pour /<module>/parametres/emails.
   Colonnes : code | sujet | statut
   ============================================================================ */
.isis-grid--email-templates .isis-grid__head,
.isis-grid--email-templates .isis-grid__row {
    grid-template-columns: minmax(220px, 0.9fr) minmax(220px, 1.5fr) 110px;
    min-width: 600px;
}

/* ============================================================================
   .isis-grid--integration-entities — variante pour /sirh/parametres/integration.
   Colonnes : Sujet RH (large, nom + hint) | Direction (dropdown) | Dernier pull | Badge
   ============================================================================ */
.isis-grid--integration-entities .isis-grid__head,
.isis-grid--integration-entities .isis-grid__row {
    grid-template-columns: minmax(240px, 1.4fr) 260px 150px minmax(140px, 1fr);
    min-width: 820px;
    align-items: center;
}
/* Variante master-detail dédiée : sidepanel large pour le JSON config + scroll
   interne (les configs JSON peuvent être longues). */
.isis-master-detail--integration {
    grid-template-columns: minmax(0, 1fr) 520px;
}
.isis-master-detail--integration .isis-master-detail__detail {
    overflow-y: auto;
    max-height: calc(100vh - 220px);
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
/* Groupes d'actions du sidepanel détail (master-detail) : primaire en tête,
   destructive séparée en bas via margin-top:auto. Remplace l'ancien recyclage de
   .isis-card-split__aside-actions (intra-carte) qui ne convient pas au pattern
   full-height. */
.isis-master-detail__detail-actions {
    display: flex;
    gap: 0.4rem;
    flex-wrap: wrap;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid var(--isis-border-soft);
}
.isis-master-detail__detail-actions--destructive {
    margin-top: auto;
    padding-top: 0.75rem;
    border-top: 1px solid var(--isis-border-soft);
    border-bottom: none;
}
/* Bloc d'erreur de test connexion : remonté en tête de sidepanel pour scan
   immédiat (auparavant noyé en bas après la textarea credentials, scroll requis). */
.isis-master-detail--integration .isis-sidepanel-alert {
    border-left: 3px solid var(--isis-danger);
    background: var(--isis-danger-soft);
    padding: 0.6rem 0.75rem;
    border-radius: 0 6px 6px 0;
}
.isis-master-detail--integration .isis-sidepanel-alert__label {
    font-size: 0.72rem;
    font-weight: 600;
    color: #991b1b;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    margin-bottom: 0.25rem;
}
.isis-master-detail--integration .isis-sidepanel-alert__value {
    font-size: 0.85rem;
    color: var(--isis-text);
    word-break: break-word;
}
/* Credentials masqués : placeholder avant édition explicite. */
.isis-credentials-masked {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px dashed var(--isis-border-soft);
    border-radius: 6px;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-credentials-masked__dots {
    font-family: "Geist Mono", ui-monospace, monospace;
    letter-spacing: 0.15em;
    color: var(--isis-text);
}

/* Variante master-detail pour la page templates email : sidepanel plus large
   (560px) car contient un éditeur de body, et scroll interne pour permettre
   les longs contenus sans casser le sticky du detail. */
.isis-master-detail--emails {
    grid-template-columns: minmax(0, 1fr) 560px;
}
.isis-master-detail--emails .isis-master-detail__detail {
    overflow-y: auto;
    max-height: calc(100vh - 220px);
}
/* Variante master-detail pour /mon-espace/validations : sidepanel 480px par
   défaut (cf. .isis-master-detail), scroll interne pour permettre l'affichage
   complet de l'AbsenceDetailPanel (chaîne + timeline) sans pousser la page. */
.isis-master-detail--validations .isis-master-detail__detail {
    overflow-y: auto;
    max-height: calc(100vh - 220px);
}
/* Variante master-detail --scrollable : opt-in générique pour les pages dont le
   sidepanel peut accumuler du contenu vertical (collaboration équipe avec
   commentaires + partages + listes liées). Calque la variante --validations
   mais sans rattacher à une page spécifique. À appliquer sur les pages liste
   gesmaff (AO/marché/demande client) qui exposent le panneau collaboration. */
.isis-master-detail--scrollable .isis-master-detail__detail {
    overflow-y: auto;
    max-height: calc(100vh - 220px);
}
/* En mode drawer overlay (--no-side), le sidepanel passe en position:fixed avec
   top: header_h + bottom: 0 (cf. règle ~L.7084). Les `max-height` posées par
   les variantes `--scrollable`, `--emails`, `--validations` doivent alors être
   neutralisées pour que le drawer occupe TOUTE la hauteur restante sous le
   header (et non être tronqué à 100vh-220px). Sélecteur doublé `.isis-master-detail.isis-master-detail--no-side`
   pour battre la spécificité (0,2,0) des variantes simples sans `!important`.
   Refonte 2026-05-29. */
.isis-master-detail.isis-master-detail--no-side .isis-master-detail__detail {
    max-height: none;
}

/* Variante drawer overlay ADAPTÉE pour les pages 3 colonnes `--rail` (sirh/organisation
   onglet Structures internes : rail entreprises | arbre | sidepanel détail).
   En mode élargi, on passe de 3 cols à 2 cols (rail + arbre pleine largeur) en
   retirant le sidepanel du flux (il devient drawer flottant comme dans le pattern
   standard). Le rail à 230px reste visible pour ne pas perdre la navigation par
   entreprise. Refonte 2026-05-29. */
.isis-master-detail--rail.isis-master-detail--no-side {
    grid-template-columns: 230px minmax(0, 1fr);
}
/* Éditeur de template : monospace 14px (pas 11px = fatigue oculaire après 30 min). */
.isis-tpl-editor textarea,
.isis-tpl-editor input,
.isis-tpl-editor .rz-textbox,
.isis-tpl-editor .rz-textarea {
    width: 100% !important;
    font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
    font-size: 0.875rem !important;
    line-height: 1.5 !important;
}
/* Chips variables — boutons cliquables (copient {{ var }} au clipboard). */
.isis-tpl-var-btn {
    border: none;
    cursor: copy;
    font-family: "Geist Mono", ui-monospace, monospace;
}
.isis-tpl-var-btn:hover {
    background: var(--isis-mod-sirh) !important;
    color: #fff !important;
}
.isis-tpl-var-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}

/* ============================================================================
   .isis-grid--validations — variante pour /mon-espace/validations.
   Colonnes : status | demandeur | type | période | jours | étape | soumise | actions
   ============================================================================ */
.isis-grid--validations .isis-grid__head,
.isis-grid--validations .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1.4fr) minmax(120px, 0.9fr) minmax(170px, 1.2fr) 70px 80px 100px 110px;
    min-width: 1080px;
}
.isis-grid--validations .isis-grid__col-actions {
    display: flex;
    gap: 0.25rem;
    justify-content: flex-end;
}
.isis-grid__step-pill {
    display: inline-block;
    padding: 0.1rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--isis-text);
    background: var(--isis-mod-sirh-soft, var(--isis-surface-alt));
    font-variant-numeric: tabular-nums;
}
.isis-grid__age-urgent {
    /* F4 — terre cuite : "demande d'attention" sans connoter "erreur".
       Le rouge --isis-danger reste réservé aux statuts critiques permanents. */
    color: var(--isis-accent-warm-strong);
    font-weight: 600;
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
}

/* Layout master-detail à l'intérieur d'une RadzenCard (hauteur naturelle, pas
   forcé sur le reste de la rich-page). Utilisé sur MonEspace pour les cartes
   « Mes demandes » et « À valider » : la grille à gauche, le sidepanel détail
   à droite. */
.isis-card-split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 360px;
    gap: 0.75rem;
    align-items: start;
}
.isis-card-split__aside {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border-soft);
    border-radius: var(--isis-radius);
    padding: 0.75rem;
    max-height: 560px;
    overflow-y: auto;
    position: sticky;
    top: 0.5rem;
}
.isis-card-split__aside-actions {
    display: flex;
    gap: 0.4rem;
    margin-bottom: 0.6rem;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid var(--isis-border-soft);
}
@media (max-width: 1100px) {
    .isis-card-split { grid-template-columns: 1fr; }
    .isis-card-split__aside { position: static; max-height: none; }
}

/* Sidepanel utilitaires (réutilisés par AbsenceDetailPanel) */
.isis-sidepanel-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 1.5rem 0.75rem;
    text-align: center;
    color: var(--isis-text-soft);
    font-size: 0.85rem;
}
.isis-sidepanel-block {
    padding: 0.5rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
}
.isis-sidepanel-block__label {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    margin-bottom: 0.2rem;
}
.isis-sidepanel-block__value {
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-sidepanel-block__title {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--isis-text);
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-sidepanel-block__subtitle {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
    margin-bottom: 0.4rem;
}
/* Liste de faits du sidepanel : icône + texte alignés sur une ligne (sinon le
   <div> texte block tombe sous l'icône inline). Ajout 2026-05-30. */
.isis-sidepanel-block__facts {
    list-style: none;
    margin: 0.3rem 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-sidepanel-block__facts > li {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    font-size: 0.85rem;
    color: var(--isis-text);
    line-height: 1.35;
}
.isis-sidepanel-block__facts > li > .rz-icon,
.isis-sidepanel-block__facts > li > i {
    flex: 0 0 auto;
    margin-top: 0.05rem;
}
.isis-sidepanel-block__facts > li > div {
    min-width: 0;
    overflow-wrap: anywhere;
}
.isis-sidepanel-block__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 0.85rem;
}
.isis-sidepanel-block__thumb {
    display: block;
    max-width: 100%;
    max-height: 180px;
    object-fit: contain;
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    margin: 0.5rem 0;
    background: var(--isis-surface-alt);
}
.isis-sidepanel-block__count {
    font-size: 0.68rem;
    font-weight: 600;
    background: var(--isis-surface);
    color: var(--isis-text-soft);
    padding: 0.05rem 0.4rem;
    border-radius: 10px;
    font-variant-numeric: tabular-nums;
    border: 1px solid var(--isis-border);
}

/* Liste des devis créés depuis un AO/Demande (traçabilité reverse, sidepanel gesmaff). */
.isis-source-devis-list {
    list-style: none;
    padding: 0;
    margin: 0.4rem 0 0 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-source-devis-list__item { margin: 0; }
.isis-source-devis-list__row {
    width: 100%;
    display: grid;
    grid-template-columns: minmax(90px, auto) 1fr auto auto;
    align-items: center;
    gap: 0.4rem;
    padding: 0.35rem 0.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 5px;
    cursor: pointer;
    text-align: left;
    font: inherit;
    color: var(--isis-text);
    transition: background 0.1s, border-color 0.1s;
}
.isis-source-devis-list__row:hover,
.isis-source-devis-list__row:focus-visible {
    background: var(--isis-mod-gesmaff-soft, #fef3c7);
    border-color: var(--isis-mod-gesmaff, #d97706);
    outline: 0;
}
.isis-source-devis-list__num {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--isis-mod-gescom, #4b5fad);
}
.isis-source-devis-list__title {
    font-size: 0.8rem;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}
.isis-source-devis-list__amount {
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--isis-text-soft);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* ============================================================================
   .isis-grid--absences — variante pour /sirh/absences (liste des demandes).
   Colonnes : status | collaborateur | type | période | jours | statut | actions
   ============================================================================ */
.isis-grid--absences .isis-grid__head,
.isis-grid--absences .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1.4fr) minmax(140px, 1fr) minmax(180px, 1.3fr) 70px 100px 60px;
    min-width: 920px;
}
.isis-grid--absences .isis-grid__col-name {
    display: flex !important;
    flex-direction: column;
    gap: 0.05rem;
    min-width: 0;
}
.isis-grid--absences .isis-grid__col-name-label {
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.isis-grid--absences .isis-grid__col-period {
    color: var(--isis-text-muted);
    font-size: 0.82rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Variante compacte pour l'onglet « Absences » de la fiche collaborateur :
   pas de colonne « Collaborateur » (implicite) → 6 colonnes au lieu de 7. */
.isis-grid--absences-collab .isis-grid__head,
.isis-grid--absences-collab .isis-grid__row {
    grid-template-columns: 32px minmax(140px, 1fr) minmax(180px, 1.5fr) 70px 110px 60px;
    min-width: 720px;
}
.isis-grid--absences-collab .isis-grid__col-period {
    color: var(--isis-text-muted);
    font-size: 0.82rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ============================================================================
   .isis-absence-pill — pastille colorée du type d'absence (calendrier + grille).
   Palette dérivée de --isis-* uniquement (DESIGN.md). 9 classes prédéfinies.
   ============================================================================ */
.isis-absence-pill {
    display: inline-flex;
    align-items: center;
    padding: 0.15rem 0.55rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.01em;
}
/* Variante compacte utilisée en sous-libellé d'une cellule (carte aperçu MonEspace). */
.isis-absence-pill--mini {
    padding: 0.05rem 0.4rem;
    font-size: 0.68rem;
    font-weight: 500;
    margin-top: 0.15rem;
    align-self: flex-start;
}
/* Lien texte standard (souligné au hover, couleur muted), pour les liens
   secondaires type « Voir tout → ». */
.isis-text-link {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    text-decoration: none;
}
.isis-text-link:hover,
.isis-text-link:focus-visible {
    text-decoration: underline;
    color: var(--isis-text);
}
/* CP / RTT / REC : congés acquis → vert SIRH */
.isis-absence-pill.absence-type-cp,
.isis-absence-pill.absence-type-rtt,
.isis-absence-pill.absence-type-rec {
    background: var(--isis-mod-sirh-soft);
    color: var(--isis-text);
}
/* MAL : maladie → rouge danger soft */
.isis-absence-pill.absence-type-mal {
    background: var(--isis-danger-soft);
    color: var(--isis-text);
}
/* MAT / PAT : parentalité → accent soft */
.isis-absence-pill.absence-type-mat,
.isis-absence-pill.absence-type-pat {
    background: var(--isis-accent-soft);
    color: var(--isis-text);
}
/* EXC / FOR : exceptionnel/formation → warning soft */
.isis-absence-pill.absence-type-exc,
.isis-absence-pill.absence-type-for {
    background: var(--isis-warning-soft);
    color: var(--isis-text);
}
/* SOL : sans solde → neutre. Texte en --isis-text (pas --isis-text-muted) :
   #6b7280 sur #eef0f5 = 4.28:1, échoue WCAG AA texte (4.5:1). Le fond gris pâle
   garde l'identité « neutre » sans que le texte ne tombe sous le seuil. */
.isis-absence-pill.absence-type-sol {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

/* ============================================================================
   .isis-absence-cal — calendrier mensuel des absences (vue Calendrier).
   Grille 7 colonnes (lundi-dimanche) × 5-6 lignes couvrant le mois.
   ============================================================================ */
.isis-absence-cal {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-absence-cal__head {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
}
.isis-absence-cal__head-cell {
    padding: 0.5rem 0.75rem;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft);
    text-align: left;
    font-weight: 600;
}
.isis-absence-cal__body {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 0;
}
.isis-absence-cal__row {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    border-bottom: 1px solid var(--isis-border-soft);
    flex: 1 1 0;
    min-height: 96px;
}
.isis-absence-cal__row:last-child { border-bottom: none; }
.isis-absence-cal__cell {
    background: transparent;
    border: none;
    border-right: 1px solid var(--isis-border-soft);
    padding: 0.5rem 0.5rem 0.4rem;
    text-align: left;
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-width: 0;
    transition: background-color 120ms ease;
}
.isis-absence-cal__cell:last-child { border-right: none; }
.isis-absence-cal__cell:hover { background: var(--isis-surface-alt); }
.isis-absence-cal__cell:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: -2px;
}
.isis-absence-cal__cell.is-out { background: var(--isis-surface-alt); opacity: 0.55; }
.isis-absence-cal__cell.is-today .isis-absence-cal__cell-num {
    background: var(--isis-mod-sirh);
    color: white;
    border-radius: 50%;
    width: 22px; height: 22px;
    display: inline-flex;
    align-items: center; justify-content: center;
}
.isis-absence-cal__cell-num {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-weight: 500;
    font-variant-numeric: tabular-nums;
}
.isis-absence-cal__cell-badges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.2rem;
    align-items: center;
}
.isis-absence-cal__chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    padding: 0 0.3rem;
    height: 18px;
    border-radius: 4px;
    font-size: 0.65rem;
    font-weight: 600;
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.isis-absence-cal__chip.is-overflow {
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    font-size: 0.6rem;
}

/* Chip statique (libellé mois dans la nav calendrier) — non cliquable. */
.isis-chip.is-static {
    cursor: default;
    background: var(--isis-surface);
    color: var(--isis-text);
    font-weight: 500;
    pointer-events: none;
}

/* Pages paramètres absences : grilles read-only. */
.isis-grid--absence-types .isis-grid__head,
.isis-grid--absence-types .isis-grid__row {
    grid-template-columns: 90px 70px minmax(160px, 1.5fr) 90px 60px 130px 130px 110px;
    min-width: 920px;
}
.isis-grid--accrual-rules .isis-grid__head,
.isis-grid--accrual-rules .isis-grid__row {
    grid-template-columns: 90px minmax(150px, 1.3fr) 130px 130px 110px 110px 130px;
    min-width: 860px;
}
.isis-grid--holidays .isis-grid__head,
.isis-grid--holidays .isis-grid__row {
    grid-template-columns: 130px 110px minmax(220px, 1.5fr) 140px;
    min-width: 640px;
}

/* ============================================================================
   .isis-notif-list — liste de notifications dans MonEspace.
   ============================================================================ */
.isis-notif-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-notif-list__item {
    border: 1px solid var(--isis-border-soft);
    border-radius: 6px;
    transition: background-color 120ms ease;
}
.isis-notif-list__item.is-unread {
    background: var(--isis-mod-sirh-soft);
    border-left: 2px solid var(--isis-mod-sirh);
}
.isis-notif-list__item.is-read { opacity: 0.75; }
.isis-notif-list__btn {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    width: 100%;
    padding: 0.6rem 0.85rem;
    background: transparent;
    border: none;
    text-align: left;
    cursor: pointer;
    border-radius: 6px;
    font-family: inherit;
    color: var(--isis-text);
}
.isis-notif-list__btn:hover { background: var(--isis-surface-alt); }
.isis-notif-list__btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: -2px;
}
.isis-notif-list__main { flex: 1; min-width: 0; }
.isis-notif-list__title {
    font-weight: 600;
    font-size: 0.88rem;
    color: var(--isis-text);
    margin-bottom: 0.15rem;
}
.isis-notif-list__body {
    font-size: 0.82rem;
    color: var(--isis-text);
    margin-bottom: 0.25rem;
}
.isis-notif-list__meta {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
}
.isis-notif-list__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--isis-mod-sirh);
    flex-shrink: 0;
    margin-top: 0.4rem;
}

/* ============================================================================
   Recherche transverse Gescom — .isis-grid--gescom-search + ctx-* + pagination
   ============================================================================ */

/* Grille : 9 colonnes — status / contexte / élément / référence / tiers /
   montant / statut / date / actions. Min-width généreux pour conserver la
   lisibilité de chaque colonne avant scroll horizontal. */
.isis-grid--gescom-search .isis-grid__head,
.isis-grid--gescom-search .isis-grid__row {
    grid-template-columns: 32px 150px minmax(220px, 1.6fr) 120px minmax(140px, 1.1fr) 120px 110px 100px 60px;
    min-width: 1180px;
}
.isis-grid--gescom-search .isis-grid__col-amount {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.isis-grid__cell-hint {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    line-height: 1.25;
    margin-top: 0.15rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-grid__code-mono {
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-size: 0.78rem;
    color: var(--isis-text);
}
.isis-grid__context-tag {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-alt);
    color: var(--isis-text);
    font-size: 0.72rem;
    line-height: 1.6;
    white-space: nowrap;
}
/* Couleur de chaque contexte — uniquement des vars définies dans :root.
   Fonds = color-mix() à 14-18% sur transparent → pastel ; couleurs texte saturées.
   Contraste : composant graphique (WCAG 1.4.11 = 3:1), pas texte courant 4.5:1. */
.isis-grid__context-tag.ctx-devis           { background: color-mix(in srgb, var(--isis-mod-gescom) 14%, transparent);    color: var(--isis-mod-gescom); }
.isis-grid__context-tag.ctx-tiers           { background: color-mix(in srgb, var(--isis-accent) 14%, transparent);        color: var(--isis-accent); }
.isis-grid__context-tag.ctx-demande-client  { background: color-mix(in srgb, var(--isis-success) 14%, transparent);       color: var(--isis-success); }
.isis-grid__context-tag.ctx-appel-offre     { background: color-mix(in srgb, var(--isis-warning) 16%, transparent);       color: var(--isis-warning); }
.isis-grid__context-tag.ctx-marche          { background: color-mix(in srgb, var(--isis-mod-gescompta) 14%, transparent); color: var(--isis-mod-gescompta); }
.isis-grid__context-tag.ctx-commande        { background: color-mix(in srgb, var(--isis-mod-gesproj) 14%, transparent);   color: var(--isis-mod-gesproj); }
.isis-grid__context-tag.ctx-document        { background: color-mix(in srgb, var(--isis-danger) 14%, transparent);        color: var(--isis-danger); }
.isis-grid__context-tag.ctx-livraison       { background: color-mix(in srgb, var(--isis-accent) 14%, transparent);        color: var(--isis-accent); }
.isis-grid__context-tag.ctx-note-frais      { background: color-mix(in srgb, var(--isis-warning) 16%, transparent);       color: var(--isis-warning); }

/* ============================================================================
   Recherche transverse Gesproj — .isis-grid--gesproj-search
   Même layout 9 colonnes que .isis-grid--gescom-search (calque migration 0377).
   ============================================================================ */
.isis-grid--gesproj-search .isis-grid__head,
.isis-grid--gesproj-search .isis-grid__row {
    grid-template-columns: 32px 150px minmax(220px, 1.6fr) 120px minmax(140px, 1.1fr) 120px 110px 100px 60px;
    min-width: 1180px;
}
.isis-grid--gesproj-search .isis-grid__col-amount {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
/* Nom non-cliquable (note de frais — pas de fiche détail V1). */
.docgrid-name--static {
    cursor: default;
    color: var(--isis-text);
    font-weight: 500;
}

/* Pied de grille — pagination. Padding/border conformes au pattern grille. */
.isis-grid__foot {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    border-top: 1px solid var(--isis-border);
    background: var(--isis-surface);
    font-size: 0.75rem;
    color: var(--isis-text-muted);
}
.isis-grid__foot-label { margin-right: auto; }
.isis-grid__page-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    border-radius: 6px;
    cursor: pointer;
    color: var(--isis-text);
}
.isis-grid__page-btn:hover:not([disabled]) { background: var(--isis-bg-soft, #f7f8fa); }
.isis-grid__page-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-grid__page-btn[disabled] {
    opacity: 0.45;
    cursor: not-allowed;
}
.isis-grid__page-btn[disabled]:focus-visible {
    outline: none;
}

/* Sous-bandeau filter-bar — moins appuyé que la barre principale */
.isis-filter-bar.isis-filter-bar--sub {
    background: transparent;
    border-top: none;
    padding-top: 0.25rem;
}

/* Sous-chips du drill-down statut (niveau 2) : plus petits / discrets que les chips de phase. */
.isis-chip.isis-chip--sub {
    font-size: 0.78rem;
    padding: 0.2rem 0.6rem;
}

/* Récap des filtres actifs dans le slot Filter du sidepanel */
.isis-filter-summary {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    font-size: 0.82rem;
    color: var(--isis-text);
}
.isis-filter-summary li strong {
    font-weight: 600;
    color: var(--isis-text-muted);
    margin-right: 0.35rem;
}

/* Groupe d'inputs dans la filter-bar (dates, tri) */
.isis-filter-bar__group {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
}

/* Aperçu de l'élément sélectionné dans le sidepanel */
.isis-detail-description {
    font-size: 0.82rem;
    color: var(--isis-text);
    line-height: 1.5;
    padding: 0.5rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
    border-left: 2px solid var(--isis-border);
}
.isis-detail-field {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.isis-detail-field__label {
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-soft);
}
.isis-detail-field__value {
    font-size: 0.85rem;
    color: var(--isis-text);
}

/* ============================================================================
   Aide templates (gescom/parametres/templates/aide)
   ============================================================================ */
.isis-tpl-help {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    width: 100%;
    /* .isis-rich-page parent impose height:100% + overflow:hidden — le contenu
       long de cette page d'aide ne peut scroller qu'en devenant lui-même le
       scroll container (calque .isis-help-page §14912). */
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding-right: 0.5rem;
}
.isis-tpl-help__section {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 1.2rem 1.5rem;
}
.isis-tpl-help__section > h2 {
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0 0 0.8rem 0;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-tpl-help__section h3 {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 1.1rem 0 0.4rem 0;
}
.isis-tpl-help__section h4 {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    margin: 0.75rem 0 0.3rem 0;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-tpl-help__section p,
.isis-tpl-help__section li {
    font-size: 0.85rem;
    color: var(--isis-text);
    line-height: 1.55;
}
.isis-tpl-help__section p { margin: 0 0 0.5rem 0; }
.isis-tpl-help__section ul,
.isis-tpl-help__section ol {
    margin: 0 0 0.8rem 0;
    padding-left: 1.2rem;
}
.isis-tpl-help__section ul li { margin-bottom: 0.15rem; }
.isis-tpl-help__section ol li { margin-bottom: 0.3rem; }
.isis-tpl-help__section code {
    font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.78rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    padding: 0.05rem 0.35rem;
    color: var(--isis-text);
}
.isis-tpl-help__code {
    font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.78rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    border-radius: 4px;
    padding: 0.6rem 0.85rem;
    margin: 0.3rem 0 0.8rem 0;
    overflow-x: auto;
    line-height: 1.5;
    color: var(--isis-text);
    white-space: pre;
}
.isis-tpl-help__hint {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    padding: 0.45rem 0.7rem;
    background: var(--isis-surface-alt);
    border-left: 2px solid var(--isis-text-muted);
    border-radius: 3px;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin: 0.3rem 0 0.6rem 0;
}
.isis-tpl-help__hint .rzi { margin-top: 0.1rem; flex-shrink: 0; }
.isis-tpl-help__table {
    width: 100%;
    border-collapse: collapse;
    margin: 0.4rem 0 0.8rem 0;
    font-size: 0.82rem;
}
.isis-tpl-help__table th,
.isis-tpl-help__table td {
    padding: 0.4rem 0.6rem;
    text-align: left;
    border-bottom: 1px solid var(--isis-border);
    vertical-align: top;
}
.isis-tpl-help__table th {
    background: var(--isis-surface-alt);
    font-weight: 600;
    color: var(--isis-text);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.isis-tpl-help__table--catalog tbody tr:hover {
    background: var(--isis-surface-alt);
}
.isis-tpl-help__group {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    margin: 1.1rem 0 0.4rem 0;
    font-size: 0.88rem;
    font-weight: 600;
}
.isis-tpl-help__group code {
    color: var(--isis-current-mod, var(--isis-accent));
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
    border-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-tpl-help__group-hint {
    font-weight: 400;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-tpl-help__sample {
    color: var(--isis-text-muted);
    font-style: italic;
    font-size: 0.78rem;
}

/* ============================================================================
   .isis-grid--jour-ferie — liste jours fériés admin (5 colonnes)
   Colonnes : pays | date | libellé | notes | actions
   ============================================================================ */
.isis-grid--jour-ferie .isis-grid__head,
.isis-grid--jour-ferie .isis-grid__row {
    grid-template-columns: 80px 110px minmax(200px, 1.5fr) minmax(180px, 1fr) 90px;
}

/* ============================================================================
   .isis-grid--taux-horaire — liste taux horaires sirh dual-owner (6 colonnes)
   Colonnes : périmètre | owner | taux | période | statut | actions
   ============================================================================ */
.isis-grid--taux-horaire .isis-grid__head,
.isis-grid--taux-horaire .isis-grid__row {
    grid-template-columns: 120px minmax(220px, 1.6fr) 160px minmax(180px, 1fr) 100px 90px;
}

/* ============================================================================
   .isis-grid--fiche-temps — liste saisies de temps gesproj (6 colonnes)
   Colonnes : date | commande·tâche | heures | statut | taux figé | actions
   ============================================================================ */
.isis-grid--fiche-temps .isis-grid__head,
.isis-grid--fiche-temps .isis-grid__row {
    grid-template-columns: 110px minmax(260px, 1.6fr) 100px 160px 140px 130px;
}

/* ============================================================================
   .isis-grid--fiche-temps-validation — page validation manager/CP (6 colonnes)
   Colonnes : date | collab | commande·tâche | heures | taux figé | actions
   ============================================================================ */
.isis-grid--fiche-temps-validation .isis-grid__head,
.isis-grid--fiche-temps-validation .isis-grid__row {
    grid-template-columns: 90px minmax(180px, 1fr) minmax(280px, 1.8fr) 90px 140px 110px;
}

/* ============================================================================
   .isis-grid--mobilisations — onglet Mobilisations sur fiche commande (6 col).
   Colonnes : collaborateur | tâche·rôle | période | charge | notes | actions
   Modificateur is-active-period : liseré accent gauche pour les mobilisations
   actives à la date du jour (signal visuel rapide pour le CP).
   ============================================================================ */
.isis-grid--mobilisations .isis-grid__head,
.isis-grid--mobilisations .isis-grid__row {
    grid-template-columns: minmax(180px, 1fr) minmax(220px, 1.4fr) 170px 110px minmax(140px, 1.2fr) 100px;
}
.isis-grid--mobilisations .isis-grid__row.is-active-period {
    border-left: 3px solid var(--isis-mod-gesproj);
    background: var(--isis-mod-gesproj-soft);
}


/* ============================================================================
   Cartes tâches sur fiche commande (onglet Tâches, Phase 4) — Flat Design
   ============================================================================ */
.isis-tache-card {
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.7rem 0.85rem;
    background: white;
}
.isis-tache-card__head {
    display: flex;
    align-items: baseline;
    gap: 0.55rem;
    margin-bottom: 0.4rem;
}
.isis-tache-card__pos {
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    font-size: 0.85rem;
    min-width: 1.8rem;
}
.isis-tache-card__title {
    flex: 1 1 auto;
    font-size: 0.95rem;
}
.isis-tache-card__meta {
    color: var(--isis-text);
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
}
.isis-tache-card__empty,
.isis-tache-card__notes {
    color: var(--isis-text-muted);
    font-size: 0.83rem;
    padding: 0.25rem 0;
}
.isis-tache-besoins {
    display: grid;
    grid-template-columns: 1fr 5rem 4rem 1.5fr 4.5rem;
    gap: 0.35rem 1rem;
    margin-top: 0.4rem;
    padding: 0.4rem 0;
    border-top: 1px solid var(--isis-border);
    font-size: 0.85rem;
}
.isis-tache-besoins__head { display: contents; }
.isis-tache-besoins__head > div {
    font-weight: 600;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    padding-bottom: 0.2rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-tache-besoins__row { display: contents; }
.isis-tache-besoins__actions {
    display: flex;
    gap: 0.25rem;
    justify-content: flex-end;
    align-items: center;
}

/* Mobilisations rattachées à une tâche — bloc sous-tâche (calque tache-besoins). */
.isis-tache-mobilisations {
    display: grid;
    grid-template-columns: 1.4fr 1fr 1.6fr 5rem 1.6fr 4.5rem;
    gap: 0.35rem 1rem;
    margin-top: 0.4rem;
    padding: 0.4rem 0;
    border-top: 1px solid var(--isis-border);
    font-size: 0.85rem;
}
.isis-tache-mobilisations__head-label {
    grid-column: 1 / -1;
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    padding: 0.2rem 0 0.1rem 0;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
}
.isis-tache-mobilisations__head { display: contents; }
.isis-tache-mobilisations__head > div {
    font-weight: 600;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    padding-bottom: 0.2rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-tache-mobilisations__row { display: contents; }
.isis-tache-mobilisations__actions {
    display: flex;
    gap: 0.25rem;
    justify-content: flex-end;
    align-items: center;
}

/* Audit ui-ux Phase 4 — colonnes pré-stylées extraites des styles inline (DESIGN.md §10). */
.isis-tache-mobilisations__col-periode {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
    font-size: 0.85rem;
}
.isis-tache-mobilisations__col-periode-days {
    color: var(--isis-text-muted);
    margin-left: 0.4rem;
}
.isis-tache-mobilisations__col-charge {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-tache-mobilisations__col-notes {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
}
.isis-tache-mobilisations__head-label .rz-icon {
    font-size: 14px;
    vertical-align: middle;
    opacity: 0.6;
}
.isis-tache-card__add-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-left: auto;
    padding: 0.15rem 0.5rem;
    background: transparent;
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-pill);
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.isis-tache-card__add-btn:hover:not(:disabled) {
    background: var(--isis-mod-gesproj-soft);
    color: var(--isis-mod-gesproj);
    border-color: var(--isis-mod-gesproj);
}
.isis-tache-card__add-btn:focus-visible {
    outline: 2px solid var(--isis-mod-gesproj);
    outline-offset: 2px;
}
.isis-tache-card__add-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}


/* ============================================================================
   Page d'aide module Gescom (AideGescomPage)
   Layout 2-col : sidebar TOC sticky à gauche, contenu scrollable à droite.
   ----------------------------------------------------------------------------
   Note scroll : .isis-rich-page parent impose height:100% + overflow:hidden
   (chaîne flex shell), donc le scroll natif body ne marche pas. On force
   .isis-help-page à devenir le scroll container (flex:1 + min-height:0 +
   overflow-y:auto). La nav sticky reste collée en haut grâce à position:sticky
   relative à ce conteneur.
   ============================================================================ */
.isis-help-page {
    display: grid;
    grid-template-columns: 240px 1fr;
    gap: 1.5rem;
    align-items: start;
    scroll-behavior: smooth;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding-right: 0.5rem;     /* respiration pour la scrollbar */
}
@media (max-width: 960px) {
    .isis-help-page { grid-template-columns: 1fr; }
}

.isis-help-nav {
    position: sticky;
    top: 0;
    padding: 1rem 0.75rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-radius: 8px;
    border: 1px solid var(--isis-border, #e2e8f0);
    font-size: 0.82rem;
    max-height: calc(100vh - 100px);
    overflow-y: auto;
}
.isis-help-nav__title {
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-soft, #475569);
    margin-bottom: 0.5rem;
    padding-left: 0.5rem;
}
.isis-help-nav__search {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.55rem;
    margin-bottom: 0.6rem;
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 6px;
    transition: border-color 0.12s, box-shadow 0.12s;
}
.isis-help-nav__search:focus-within {
    border-color: var(--isis-mod-gescom, #4b5fad);
    box-shadow: 0 0 0 2px var(--isis-mod-gescom-soft, #e0e7ff);
}
.isis-help-nav__search input[type="search"] {
    flex: 1 1 auto;
    min-width: 0;
    border: 0;
    outline: 0;
    background: transparent;
    font: inherit;
    font-size: 0.8rem;
    color: var(--isis-text, #1f2328);
    padding: 0;
}
.isis-help-nav__search input[type="search"]::placeholder {
    color: var(--isis-text-muted, #94a3b8);
}
.isis-help-nav__search-count {
    flex: 0 0 auto;
    font-size: 0.68rem;
    font-weight: 600;
    color: var(--isis-mod-gescom, #4b5fad);
    background: var(--isis-mod-gescom-soft, #e0e7ff);
    padding: 0.1rem 0.4rem;
    border-radius: 10px;
    font-variant-numeric: tabular-nums;
}
.isis-help-nav ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.isis-help-nav ul ul {
    margin-left: 0.5rem;
    padding-left: 0.5rem;
    border-left: 1px solid var(--isis-border, #e2e8f0);
}
.isis-help-nav li { margin: 0.1rem 0; }
.isis-help-nav a {
    display: block;
    padding: 0.3rem 0.5rem;
    border-radius: 4px;
    color: var(--isis-text, #1f2328);
    text-decoration: none;
    transition: background 0.1s;
}
.isis-help-nav a:hover {
    background: var(--isis-mod-gescom-soft, #e0e7ff);
    color: var(--isis-mod-gescom, #4b5fad);
}
.isis-help-nav ul ul a {
    color: var(--isis-text-muted, #475569);
    font-size: 0.78rem;
}

.isis-help-content {
    min-width: 0;     /* sinon flex écrase l'overflow */
    line-height: 1.6;
    color: var(--isis-text, #1f2328);
}
/* Correctif ui-ux #6 audit 2026-05-22 — Style mutualisé pour <kbd> dans les
   pages d'aide (raccourcis clavier F/R/Esc côté gespla, mais aussi tout futur
   contenu help qui documente un raccourci). Rendu cross-browser consistant
   sans surcharge couleurs (palette --isis-* uniquement). */
.isis-help-content kbd {
    display: inline-block;
    padding: 0.1em 0.4em;
    font-size: 0.82em;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    box-shadow: 0 1px 0 var(--isis-border);
    color: var(--isis-text);
    vertical-align: baseline;
}
.isis-help-section {
    padding: 1.5rem 0;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
    scroll-margin-top: 1rem;
    border-radius: 8px;
}
.isis-help-section:last-child { border-bottom: none; }
/* Highlight flash quand l'utilisateur navigue vers une ancre (cf. aide-toc.js).
   Fade in court + maintien ~1.1s + fade out. La classe est ré-applicable :
   le JS la retire puis force un reflow avant de la rajouter pour relancer l'anim. */
@keyframes isisHelpFlash {
    0%   { background-color: transparent; box-shadow: none; }
    8%   { background-color: var(--isis-mod-gescom-soft, #e0e7ff); box-shadow: -4px 0 0 0 var(--isis-mod-gescom, #4b5fad); }
    65%  { background-color: var(--isis-mod-gescom-soft, #e0e7ff); box-shadow: -4px 0 0 0 var(--isis-mod-gescom, #4b5fad); }
    100% { background-color: transparent; box-shadow: none; }
}
.isis-help-section--flash {
    animation: isisHelpFlash 1.9s ease-out forwards;
    padding-left: 0.75rem;
    margin-left: -0.75rem;
}
.isis-help-section.is-spotlight {
    background: linear-gradient(180deg, var(--isis-mod-gescom-soft, #e0e7ff) 0%, transparent 80px);
    padding: 1.5rem 1rem;
    border-radius: 10px;
    margin: 1rem 0;
    border: 1px solid var(--isis-mod-gescom, #4b5fad);
    border-left-width: 4px;
}
.isis-help-section h2 {
    font-size: 1.35rem;
    font-weight: 600;
    color: var(--isis-text, #1f2328);
    margin: 0 0 0.75rem;
}
.isis-help-section h3 {
    font-size: 1.05rem;
    font-weight: 600;
    margin: 1.5rem 0 0.5rem;
    color: var(--isis-text, #1f2328);
}
.isis-help-section h4 {
    font-size: 0.92rem;
    font-weight: 600;
    margin: 1rem 0 0.4rem;
    color: var(--isis-text, #1f2328);
}
.isis-help-section__lead {
    font-size: 1rem;
    color: var(--isis-text, #1f2328);
}
.isis-help-section p,
.isis-help-section ul,
.isis-help-section ol {
    margin: 0.5rem 0 0.75rem;
}
.isis-help-section ul ul { margin: 0.3rem 0 0.3rem 1rem; }
.isis-help-section code {
    background: var(--isis-surface-soft, #f1f5f9);
    padding: 0.1rem 0.35rem;
    border-radius: 3px;
    font-size: 0.85em;
    font-family: ui-monospace, monospace;
}
.isis-help-section pre {
    background: var(--isis-surface-soft, #f1f5f9);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 6px;
    padding: 0.8rem 1rem;
    overflow-x: auto;
    font-size: 0.82rem;
    line-height: 1.5;
}
.isis-help-section pre code {
    background: transparent;
    padding: 0;
}

.isis-help-diagram {
    margin: 1.25rem 0;
    padding: 1rem;
    background: var(--isis-surface, #ffffff);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 8px;
    text-align: center;
}
.isis-help-diagram svg {
    max-width: 100%;
    height: auto;
}

.isis-help-callout {
    display: flex;
    gap: 0.75rem;
    align-items: flex-start;
    padding: 0.75rem 1rem;
    margin: 1rem 0;
    border-radius: 6px;
    border-left: 3px solid var(--isis-border, #cbd5e1);
    background: var(--isis-surface-soft, #f8fafc);
    font-size: 0.88rem;
}
.isis-help-callout > .rz-icon {
    font-size: 18px;
    flex-shrink: 0;
    margin-top: 0.1rem;
}
.isis-help-callout.is-info {
    border-left-color: var(--isis-accent, #4b5fad);
    background: var(--isis-accent-soft, rgba(75, 95, 173, 0.06));
}
.isis-help-callout.is-info > .rz-icon { color: var(--isis-accent, #4b5fad); }
.isis-help-callout.is-tip {
    border-left-color: var(--isis-success, #16a34a);
    background: rgba(22, 163, 74, 0.06);
}
.isis-help-callout.is-tip > .rz-icon { color: var(--isis-success, #16a34a); }
.isis-help-callout.is-warning {
    border-left-color: var(--isis-warning, #d97706);
    background: rgba(217, 119, 6, 0.06);
}
.isis-help-callout.is-warning > .rz-icon { color: var(--isis-warning, #d97706); }
.isis-help-callout ul { margin: 0.4rem 0 0; padding-left: 1.2rem; }

.isis-help-faq {
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 6px;
    padding: 0.6rem 0.85rem;
    margin: 0.5rem 0;
    background: var(--isis-surface, #ffffff);
}
.isis-help-faq[open] {
    background: var(--isis-surface-soft, #f8fafc);
    border-color: var(--isis-mod-gescom, #4b5fad);
}
.isis-help-faq summary {
    cursor: pointer;
    font-weight: 500;
    color: var(--isis-text, #1f2328);
    padding: 0.2rem 0;
    list-style-position: outside;
    margin-left: 1rem;
}
.isis-help-faq summary:hover { color: var(--isis-mod-gescom, #4b5fad); }
.isis-help-faq[open] summary { margin-bottom: 0.4rem; }
.isis-help-faq p {
    margin: 0.4rem 0 0;
    font-size: 0.88rem;
    color: var(--isis-text, #1f2328);
}

.isis-help-glossary {
    display: grid;
    grid-template-columns: minmax(180px, 1fr) 3fr;
    gap: 0.4rem 1rem;
    font-size: 0.88rem;
}
.isis-help-glossary dt {
    font-weight: 600;
    color: var(--isis-mod-gescom, #4b5fad);
}
.isis-help-glossary dd { margin: 0; }

/* ============================================================================
   Sidepanel gesmaff — pattern commun marché / AO / demande client.
   Caption mono + titre + badges + montant clé + faits avec icônes + actions.
   Variante `--amount-muted` = chiffre indicatif (estimatif AO) vs contractuel
   (marché signé). Initialement .isis-marche-side, renommé .isis-gesmaff-side
   pour réutilisation transverse au module.
   ============================================================================ */
.isis-gesmaff-side {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    padding: 0.25rem 0;
}
.isis-gesmaff-side__head {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding-bottom: 0.85rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-gesmaff-side__caption {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-family: var(--isis-font-mono);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-gesmaff-side__title {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
    line-height: 1.3;
    /* Casse les chaînes très longues sans espace (saisies test, refs externes). */
    word-wrap: break-word;
    overflow-wrap: anywhere;
}
.isis-gesmaff-side__badges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.15rem;
}

/* Montant clé (TTC contractuel ou estimatif). Fond ambre soft + bordure
   gauche pleine pour le contractuel ; variante .is-muted = bordure
   pointillée + fond surface-alt pour signaler le "estimatif" (AO). */
.isis-gesmaff-side__amount {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.65rem 0.85rem;
    background: var(--isis-mod-gesmaff-soft);
    border-left: 3px solid var(--isis-mod-gesmaff);
    border-radius: 0 4px 4px 0;
}
.isis-gesmaff-side__amount.is-muted {
    background: var(--isis-surface-alt);
    border-left: 3px dashed var(--isis-mod-gesmaff);
}
.isis-gesmaff-side__amount-label {
    font-size: 0.72rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--isis-text-muted);
}
.isis-gesmaff-side__amount-value {
    font-size: 1.3rem;
    font-weight: 700;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    line-height: 1.2;
}
.isis-gesmaff-side__amount-devise {
    font-size: 0.78rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    margin-left: 0.25rem;
    letter-spacing: 0.02em;
}

/* Liste de faits avec icône à gauche, label muted + valeur. */
.isis-gesmaff-side__facts {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
.isis-gesmaff-side__facts > li {
    display: grid;
    grid-template-columns: 20px 1fr;
    gap: 0.5rem;
    align-items: start;
}
.isis-gesmaff-side__fact-text {
    min-width: 0;
}
.isis-gesmaff-side__fact-label {
    font-size: 0.72rem;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    line-height: 1.2;
}
.isis-gesmaff-side__fact-value {
    font-size: 0.88rem;
    color: var(--isis-text);
    margin-top: 0.1rem;
    word-wrap: break-word;
    overflow-wrap: anywhere;
}
/* Complément secondaire d'une valeur de fait (ex : responsable sous l'utilisateur). */
.isis-gesmaff-side__fact-sub {
    display: block;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-top: 0.05rem;
}

.isis-gesmaff-side__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    padding-top: 0.6rem;
    border-top: 1px solid var(--isis-border);
}

/* Hint contextuel sous les actions (« Cet AO est obtenu, crée le marché… »). */
.isis-gesmaff-side__hint {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    line-height: 1.45;
    margin-top: 0.1rem;
}
.isis-gesmaff-side__hint strong {
    color: var(--isis-text);
    font-weight: 600;
}

/* ============================================================================
   .isis-gantt — Vue Gantt CSS-only (MarcheDetail onglet « Commandes liées »)
   ----------------------------------------------------------------------------
   Une grille 2 colonnes : label fixe (180px) | track positionnée (1fr).
   Les barres sont en position:absolute dans .isis-gantt__track avec left/width
   en % de la fenêtre temporelle calculée côté C# (cf. ComputeGantt).
   ============================================================================ */
.isis-gantt-wrap {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
.isis-gantt {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow-x: auto;
    background: var(--isis-surface);
    /* Track minimum width : pousse le scroll horizontal au-delà */
    min-width: 100%;
    /* Indicateur visuel de scroll horizontal : gradient à droite si débordement. */
    background-image: linear-gradient(to right, var(--isis-surface) 0%, var(--isis-surface) 90%, var(--isis-surface-alt) 100%);
    background-attachment: local;
    background-repeat: no-repeat;
}

/* En-tête : libellés mois alignés au-dessus de la track */
.isis-gantt__head {
    display: grid;
    grid-template-columns: 180px minmax(var(--isis-gantt-track-px, 600px), 1fr);
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
    position: sticky;
    top: 0;
    z-index: 2;
}
.isis-gantt__label-spacer {
    padding: 0.5rem 0.75rem;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    border-right: 1px solid var(--isis-border);
    box-sizing: border-box;
}
.isis-gantt__timeline {
    position: relative;
    height: 32px;
}
.isis-gantt__month-cell {
    position: absolute;
    top: 0;
    bottom: 0;
    border-left: 1px solid var(--isis-border);
    display: flex;
    align-items: center;
    padding-left: 0.5rem;
    box-sizing: border-box;
}
.isis-gantt__month-cell:first-child { border-left: none; }
.isis-gantt__month-label {
    font-size: 0.72rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    text-transform: capitalize;
    white-space: nowrap;
}

/* Ligne par commande */
.isis-gantt__row {
    display: grid;
    grid-template-columns: 180px minmax(var(--isis-gantt-track-px, 600px), 1fr);
    min-height: 36px;
    border-bottom: 1px solid var(--isis-border);
}
.isis-gantt__row:last-child { border-bottom: none; }
.isis-gantt__row-label {
    padding: 0.4rem 0.75rem;
    border-right: 1px solid var(--isis-border);
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 0.1rem;
    overflow: hidden;
}
.isis-gantt__row-num {
    font-family: var(--isis-font-mono);
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-gantt__row-name {
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-gantt__track {
    position: relative;
    min-height: 36px;
    background: linear-gradient(to bottom, transparent 50%, rgba(0,0,0,0.012) 50%);
}
.isis-gantt__grid-line {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 1px;
    background: var(--isis-border);
    opacity: 0.6;
}

/* Barre commande */
.isis-gantt__bar {
    position: absolute;
    top: 6px;
    bottom: 6px;
    border: 1px solid transparent;
    border-radius: 4px;
    padding: 0 0.5rem;
    font-size: 0.74rem;
    font-weight: 600;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    display: flex;
    align-items: center;
    cursor: pointer;
    overflow: hidden;
    transition: transform 100ms ease, box-shadow 100ms ease;
    z-index: 1;
}
.isis-gantt__bar:hover {
    transform: translateY(-1px);
    box-shadow: var(--isis-elevation-1, 0 2px 6px rgba(0,0,0,0.12));
    z-index: 3;
}
.isis-gantt__bar:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-gantt__bar-label {
    font-family: var(--isis-font-mono);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Couleurs statut — vars sémantiques --isis-* uniquement (DESIGN.md §1).
   .is-closed (CLOTUREE) en cyan/gesproj : état terminal positif distinct du
   vert "en cours" ; évite la confusion avec .is-pending (violet=attente). */
.isis-gantt__bar.is-draft  { background: var(--isis-surface-alt);    border-color: var(--isis-border);       color: var(--isis-text); }
.isis-gantt__bar.is-info   { background: var(--isis-mod-gescom-soft); border-color: var(--isis-mod-gescom);   color: var(--isis-mod-gescom); }
.isis-gantt__bar.is-ok     { background: var(--isis-success-soft);   border-color: var(--isis-success);      color: var(--isis-success); }
.isis-gantt__bar.is-closed { background: var(--isis-mod-gesproj-soft); border-color: var(--isis-mod-gesproj); color: var(--isis-mod-gesproj); }
.isis-gantt__bar.is-danger { background: var(--isis-danger-soft);    border-color: var(--isis-danger);       color: var(--isis-danger); }

/* Ligne « aujourd'hui » */
.isis-gantt__today-line {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 2px;
    background: var(--isis-danger);
    opacity: 0.7;
    pointer-events: none;
    z-index: 2;
}

/* Légende */
.isis-gantt__legend {
    display: flex;
    flex-wrap: wrap;
    gap: 0.85rem;
    padding: 0.45rem 0.6rem;
    font-size: 0.74rem;
    color: var(--isis-text-muted);
}
.isis-gantt__legend-item {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}
.isis-gantt__legend-swatch {
    width: 14px;
    height: 10px;
    border-radius: 3px;
    border: 1px solid transparent;
    display: inline-block;
}
.isis-gantt__legend-swatch.is-draft  { background: var(--isis-surface-alt);     border-color: var(--isis-border); }
.isis-gantt__legend-swatch.is-info   { background: var(--isis-mod-gescom-soft); border-color: var(--isis-mod-gescom); }
.isis-gantt__legend-swatch.is-ok     { background: var(--isis-success-soft);   border-color: var(--isis-success); }
.isis-gantt__legend-swatch.is-closed { background: var(--isis-mod-gesproj-soft); border-color: var(--isis-mod-gesproj); }
.isis-gantt__legend-swatch.is-danger { background: var(--isis-danger-soft);    border-color: var(--isis-danger); }
.isis-gantt__legend-today {
    width: 2px;
    height: 12px;
    background: var(--isis-danger);
    display: inline-block;
}

/* Bloc « sans date » sous le Gantt */
.isis-gantt-undated {
    border: 1px dashed var(--isis-border);
    border-radius: 6px;
    padding: 0.7rem 0.85rem;
    background: var(--isis-surface-alt);
}
.isis-gantt-undated__title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    margin-bottom: 0.45rem;
}
.isis-gantt-undated__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    font-size: 0.85rem;
}

/* Hint dans le tab-header (compte sans date) */
.isis-tab-header__hint {
    font-size: 0.78rem;
    font-weight: 400;
    color: var(--isis-text-muted);
    margin-left: 0.4rem;
}

/* ============================================================================
   Page Pipeline (/gescom/pipeline)
   ============================================================================ */

/* Variante de filter-bar pour le sélecteur de période + toggle compare.
   Layout 1 ligne (axis + chips + custom-range si visible + toggle) avec
   wrap progressif. */
.isis-filter-bar--period {
    flex-wrap: wrap;
    align-items: center;
    gap: 0.85rem;
}
.isis-filter-bar__custom-range {
    display: flex;
    gap: 0.4rem;
    align-items: center;
}
.isis-filter-bar__toggle {
    margin-left: auto;  /* repousse le toggle à droite */
}
.isis-filter-bar__toggle-label {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.825rem;
    color: var(--isis-text);
    cursor: pointer;
    user-select: none;
}
/* Sous 1400px (la plupart des écrans manager 1366/1440), force le toggle sur
   sa propre ligne avec séparateur visuel — sinon il atterrit après les date
   pickers comme un label orphelin. */
@media (max-width: 1400px) {
    .isis-filter-bar--period .isis-filter-bar__toggle {
        flex-basis: 100%;
        margin-left: 0;
        margin-top: 0.4rem;
        padding-top: 0.4rem;
        border-top: 1px solid var(--isis-border, #e2e8f0);
    }
}

/* Section principale (diagramme + transitions) ─ une "carte" plate calée
   sur le pattern .isis-rich-page (flex column gap). Prend toute la hauteur
   restante de la page — chaîne flex {1, min-height: 0} chain pour que les
   asides scrollent en interne sans déborder le viewport (cf. memory
   project_isis_grid_pattern). */
.isis-pipeline-section {
    background: var(--isis-surface);
    border-radius: 10px;
    padding: 1.25rem 1.5rem;
    box-shadow: var(--isis-elevation-1);
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-pipeline-section__title {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-pipeline-section__hint {
    margin: 0;
    font-size: 0.825rem;
    color: var(--isis-text-muted);
    line-height: 1.45;
}
.isis-pipeline-section__loading {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 2rem;
    justify-content: center;
    color: var(--isis-text-muted);
    font-size: 0.875rem;
    text-align: center;
}

/* Empty state — variante "filtre actif" avec CTA de réinitialisation. */
.isis-pipeline-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.85rem;
    max-width: 420px;
}
.isis-pipeline-empty__cta {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.45rem 0.85rem;
    border-radius: 6px;
    background: var(--isis-mod-gescom-soft);
    color: var(--isis-mod-gescom);
    border: 1px solid var(--isis-mod-gescom);
    font-size: 0.825rem;
    font-weight: 500;
    cursor: pointer;
    transition: background-color 150ms ease;
}
.isis-pipeline-empty__cta:hover,
.isis-pipeline-empty__cta:focus-visible {
    background: var(--isis-mod-gescom);
    color: var(--isis-surface);
}

/* Layout intra-section 3 colonnes : aside filtre entreprises (gauche),
   diagramme (centre), aside transitions (droite). master-detail-detail.
   `align-items: stretch` + flex:1 sur le layout pour que les 3 enfants prennent
   toute la hauteur de la section (qui elle-même prend toute la page). */
.isis-pipeline-layout {
    display: flex;
    gap: 1.25rem;
    align-items: stretch;
    flex: 1 1 auto;
    min-height: 0;
}
.isis-pipeline-layout__filter {
    flex: 0 0 220px;
    background: var(--isis-surface-alt);
    border-radius: 8px;
    padding: 0.85rem 0.75rem;
    overflow-y: auto;  /* scroll interne si la liste dépasse la hauteur dispo */
    min-height: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-pipeline-layout__main {
    flex: 1 1 auto;
    min-width: 0;  /* indispensable pour que le SVG ne fasse pas exploser le flex */
    min-height: 0;
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    overflow-y: auto;  /* le SVG + hint scrollent si la fenêtre est très basse */
}
.isis-pipeline-layout__aside {
    flex: 0 0 260px;
    background: var(--isis-surface-alt);
    border-radius: 8px;
    padding: 0.85rem 1rem;
    /* Reste visible si la liste dépasse — scroll interne dans la hauteur
       disponible (alignée sur la section). */
    overflow-y: auto;
    min-height: 0;
}
/* ─── Filtre entreprises ─── */
.isis-pipeline-filter__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-pipeline-filter__title {
    margin: 0;
    font-size: 0.825rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-pipeline-filter__reset {
    background: none;
    border: none;
    padding: 0;
    font-size: 0.75rem;
    color: var(--isis-mod-gescom);
    cursor: pointer;
    text-decoration: underline;
}
.isis-pipeline-filter__reset:hover,
.isis-pipeline-filter__reset:focus-visible { color: var(--isis-text); }
.isis-pipeline-filter__hint {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-pipeline-filter__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.isis-pipeline-filter__item {
    /* Indentation arbre pilotée par data-depth (évite l'interpolation Razor qui
       formate les décimales selon la culture courante — fr-FR produit "0,5rem"
       invalide en CSS). Connecteur vertical type tree-view sur les enfants
       (depth ≥ 1) pour matérialiser la hiérarchie. */
    padding-right: 0.3rem;
    position: relative;
    padding-left: 0.5rem;
}
.isis-pipeline-filter__item[data-depth="1"] { padding-left: 1.5rem; }
.isis-pipeline-filter__item[data-depth="2"] { padding-left: 2.5rem; }
.isis-pipeline-filter__item[data-depth="3"] { padding-left: 3.5rem; }
.isis-pipeline-filter__item[data-depth="4"] { padding-left: 4.5rem; }
.isis-pipeline-filter__item[data-depth="5"] { padding-left: 5.5rem; }

/* Connecteur vertical tree-view : un trait gris pour chaque génération
   parente, posé à la position de l'indentation correspondante. */
.isis-pipeline-filter__item:not([data-depth="0"])::before {
    content: '';
    position: absolute;
    left: 0.95rem;
    top: 0;
    bottom: 0;
    width: 1px;
    background: var(--isis-border, #e2e8f0);
}
.isis-pipeline-filter__item[data-depth="2"]::before { left: 1.95rem; }
.isis-pipeline-filter__item[data-depth="3"]::before { left: 2.95rem; }
.isis-pipeline-filter__item[data-depth="4"]::before { left: 3.95rem; }
.isis-pipeline-filter__item[data-depth="5"]::before { left: 4.95rem; }
.isis-pipeline-filter__label {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.25rem 0.35rem;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.8125rem;
    color: var(--isis-text);
    /* Empêche le label/checkbox de wrapper sur plusieurs lignes — la ellipsis
       sur __name gère l'overflow horizontal. */
    min-width: 0;
}
.isis-pipeline-filter__label:hover { background: var(--isis-surface); }
.isis-pipeline-filter__label input[type="checkbox"] {
    flex-shrink: 0;
    cursor: pointer;
    accent-color: var(--isis-mod-gescom);
}
.isis-pipeline-filter__name {
    flex: 1 1 auto;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}
.isis-pipeline-filter__code {
    flex-shrink: 0;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    background: var(--isis-surface);
    padding: 0.05rem 0.35rem;
    border-radius: 3px;
}

/* Sous 1300px (laptop standard / tablette paysage) : les 3 colonnes
   s'empilent verticalement. Le filtre AU-DESSUS du diagramme (l'utilisateur
   le voit avant d'analyser), les transitions EN DESSOUS. La section pipeline
   garde sa hauteur flex:1 mais devient un container scrollable en interne
   (le contenu empilé peut dépasser la hauteur). Asides bornés en hauteur
   nominale pour ne pas tout phagocyter au-dessus du diagramme. */
@media (max-width: 1300px) {
    .isis-pipeline-layout {
        flex-direction: column;
        overflow-y: auto;  /* scroll interne quand le total empilé dépasse */
    }
    .isis-pipeline-layout__filter,
    .isis-pipeline-layout__aside {
        flex: 0 0 auto;
        max-height: 240px;
    }
    .isis-pipeline-layout__main {
        flex: 0 0 auto;
        overflow-y: visible;  /* relâche son scroll interne, la section scroll */
    }
}

/* Top transitions sur la période — bloc intra-aside (V2 : extractible si
   d'autres pages réutilisent les transitions). */
.isis-pipeline-transitions__title {
    margin: 0 0 0.6rem 0;
    font-size: 0.825rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-pipeline-transitions__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-pipeline-transitions__item {
    display: grid;
    grid-template-columns: 1fr auto 1fr auto;
    align-items: center;
    gap: 0.55rem;
    padding: 0.35rem 0.6rem;
    border-radius: 6px;
    /* Fond surface (blanc) pour ressortir sur l'aside surface-alt. */
    background: var(--isis-surface);
    border: 1px solid var(--isis-border, #e2e8f0);
    font-size: 0.825rem;
}
.isis-pipeline-transitions__from,
.isis-pipeline-transitions__to {
    color: var(--isis-text);
}
.isis-pipeline-transitions__count {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: var(--isis-mod-gescom);
    min-width: 2.5rem;
    text-align: right;
}

/* ============================================================================
   Drill panel — composant DevisPipelineDrillPanel (sous le diagramme Pipeline)
   ============================================================================ */
.isis-pipeline-drill {
    background: var(--isis-surface);
    border-radius: 10px;
    padding: 1rem 1.25rem 1.25rem;
    box-shadow: var(--isis-elevation-1);
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    animation: isisDrillEnter 220ms ease-out;
}

/* Quand le drill est ouvert, on partage la hauteur disponible entre la section
   workflow (bornée à ~60 % du parent pour garder le diagramme visible sans
   l'écraser) et le drill (prend le reste, scroll interne).
   Au-dessus de 1300 px uniquement — sous cette taille, le layout interne de la
   section passe déjà en vertical empilé (cf. règle media 1300 plus haut). */
@media (min-width: 1301px) {
    .isis-rich-page.is-drill-open .isis-pipeline-section {
        flex: 0 1 auto;
        max-height: 60%;
    }
    .isis-rich-page.is-drill-open .isis-pipeline-drill {
        flex: 1 1 auto;
        min-height: 0;
        overflow-y: auto;
    }
}
@keyframes isisDrillEnter {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}
/* WCAG 2.3.3 — respecte le pref OS « réduire les animations ». */
@media (prefers-reduced-motion: reduce) {
    .isis-pipeline-drill { animation: none; }
}

/* Header : titre statut + meta count/total + bouton close */
.isis-pipeline-drill__head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
}
.isis-pipeline-drill__head-main { flex: 1 1 auto; min-width: 0; }
.isis-pipeline-drill__title {
    margin: 0 0 0.25rem 0;
    font-size: 1rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-pipeline-drill__head-meta {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.825rem;
    color: var(--isis-text-muted);
}
.isis-pipeline-drill__count {
    color: var(--isis-text);
    font-weight: 500;
    font-variant-numeric: tabular-nums;
}
.isis-pipeline-drill__separator { opacity: 0.4; }
.isis-pipeline-drill__totals { font-variant-numeric: tabular-nums; }
.isis-pipeline-drill__close {
    flex-shrink: 0;
    background: none;
    border: 1px solid transparent;
    border-radius: 6px;
    /* Cible 36×36 min pour tablette (compromis raisonnable sans alourdir le header
       — AA 2.5.5 indique 24×24, on offre une marge confortable). */
    padding: 0.55rem;
    min-width: 36px;
    min-height: 36px;
    cursor: pointer;
    color: var(--isis-text-muted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-pipeline-drill__close:hover,
.isis-pipeline-drill__close:focus-visible {
    background: var(--isis-surface-alt);
    border-color: var(--isis-border, #e2e8f0);
    color: var(--isis-text);
}

/* Breadcrumb — crumbs cliquables, dernier désactivé (= niveau courant) */
.isis-pipeline-drill__breadcrumb {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.25rem;
    font-size: 0.825rem;
}
.isis-pipeline-drill__crumb {
    background: none;
    border: none;
    padding: 0.2rem 0.5rem;
    border-radius: 4px;
    color: var(--isis-mod-gescom);
    cursor: pointer;
    font-size: 0.825rem;
    font-weight: 500;
}
.isis-pipeline-drill__crumb:hover:not([disabled]),
.isis-pipeline-drill__crumb:focus-visible {
    background: var(--isis-mod-gescom-soft);
}
.isis-pipeline-drill__crumb[disabled] {
    color: var(--isis-text);
    cursor: default;
    font-weight: 600;
}
.isis-pipeline-drill__crumb-sep {
    color: var(--isis-text-muted);
    font-size: 0.9rem;
    user-select: none;
}

.isis-pipeline-drill__hint {
    margin: 0 0 0.4rem 0;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    font-style: italic;
}

/* Empty state du drill (filtre laisse 0 devis dans ce périmètre) */
.isis-pipeline-drill__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-muted);
    font-size: 0.875rem;
}

/* Grille des buckets / items — CSS Grid (pas de table HTML pour conserver
   les boutons natifs row-level avec keyboard + a11y). */
.isis-pipeline-drill__grid {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 8px;
    overflow: hidden;
    background: var(--isis-surface);
}
.isis-pipeline-drill__grid--buckets .isis-pipeline-drill__row {
    display: grid;
    grid-template-columns: 1fr 90px 1fr 32px;
    align-items: center;
    gap: 0.75rem;
}
.isis-pipeline-drill__grid--items .isis-pipeline-drill__row {
    display: grid;
    /* 8 colonnes : Numéro · Titre · Tiers · Owner · Montant · Émis · Valide · Actions */
    grid-template-columns: 130px 1.5fr 1fr 1fr 130px 110px 110px 84px;
    align-items: center;
    gap: 0.6rem;
}
.isis-pipeline-drill__row {
    width: 100%;
    text-align: left;
    background: var(--isis-surface);
    border: none;
    border-bottom: 1px solid var(--isis-border, #e2e8f0);
    padding: 0.6rem 0.85rem;
    font-size: 0.8125rem;
    color: var(--isis-text);
    cursor: pointer;
    font-family: inherit;
    transition: background-color 120ms ease;
}
.isis-pipeline-drill__row:last-child { border-bottom: none; }
.isis-pipeline-drill__row:hover,
.isis-pipeline-drill__row:focus-visible {
    background: var(--isis-surface-alt);
    outline: none;
}
.isis-pipeline-drill__row:focus-visible {
    box-shadow: inset 3px 0 0 var(--isis-mod-gescom);
}
.isis-pipeline-drill__row--head {
    background: var(--isis-surface-alt);
    font-size: 0.7rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    cursor: default;
    pointer-events: none;
    padding: 0.5rem 0.85rem;
}
.isis-pipeline-drill__col--num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-pipeline-drill__num {
    font-family: ui-monospace, SFMono-Regular, monospace;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
}
.isis-pipeline-drill__title {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-pipeline-drill__bucket-label {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}
.isis-pipeline-drill__bucket-label strong {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-pipeline-drill__bucket-sub {
    font-size: 0.7rem;
    /* `--isis-text-muted` (#5b6470) sur surface (~4.35:1) échoue WCAG AA pour
       petit texte (~11px). Passage à `--isis-text` (#1f2328 ~ 14:1) — la
       distinction visuelle vient de la taille + weight, pas de la couleur. */
    color: var(--isis-text);
}
.isis-pipeline-drill__chevron {
    color: var(--isis-text-muted);
    display: inline-flex;
    justify-content: center;
}
.isis-pipeline-drill__row--bucket:hover .isis-pipeline-drill__chevron {
    color: var(--isis-mod-gescom);
}
/* Bucket orphelin (Guid.Empty) : cliquable comme les autres (drill jusqu'aux
   devis terminaux pour les corriger), mais teinte warm + bande accent gauche
   pour signaler l'anomalie « à traiter ». Garde le compteur visible pour
   matcher le total du node (cohérence numérique). */
.isis-pipeline-drill__row--bucket.is-orphan {
    background: color-mix(in srgb, var(--isis-accent-warm-soft, #fef3c7) 35%, var(--isis-surface));
    box-shadow: inset 3px 0 0 var(--isis-accent-warm, #c2410c);
}
.isis-pipeline-drill__row--bucket.is-orphan:hover,
.isis-pipeline-drill__row--bucket.is-orphan:focus-visible {
    background: color-mix(in srgb, var(--isis-accent-warm-soft, #fef3c7) 55%, var(--isis-surface));
    /* On garde la bande gauche prioritaire sur le inset focus standard */
    box-shadow: inset 3px 0 0 var(--isis-accent-warm, #c2410c);
}
.isis-pipeline-drill__row--bucket.is-orphan .isis-pipeline-drill__bucket-sub {
    color: var(--isis-accent-warm, #c2410c);
    font-weight: 500;
}

/* Colonne actions des lignes Devis : icônes 28×28 alignées à droite, gap léger
   entre les 2 icônes max (Attribuer owner si orphan + Ouvrir nouvel onglet). */
.isis-pipeline-drill__col--actions {
    display: inline-flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.3rem;
}
.isis-pipeline-drill__action {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 5px;
    border: 1px solid var(--isis-border, #e2e8f0);
    background: var(--isis-surface);
    color: var(--isis-text-muted);
    cursor: pointer;
    text-decoration: none;
    transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}
.isis-pipeline-drill__action:hover,
.isis-pipeline-drill__action:focus-visible {
    background: var(--isis-mod-gescom-soft);
    border-color: var(--isis-mod-gescom);
    color: var(--isis-mod-gescom);
    outline: none;
}
/* Variante "Attribuer owner" : accent warm pour rappeler l'anomalie à traiter. */
.isis-pipeline-drill__action--assign {
    border-color: var(--isis-accent-warm, #c2410c);
    color: var(--isis-accent-warm, #c2410c);
    background: color-mix(in srgb, var(--isis-accent-warm-soft, #fef3c7) 30%, var(--isis-surface));
}
.isis-pipeline-drill__action--assign:hover,
.isis-pipeline-drill__action--assign:focus-visible {
    background: var(--isis-accent-warm, #c2410c);
    color: var(--isis-surface);
    border-color: var(--isis-accent-warm, #c2410c);
}
/* Label en italique gris muted quand une donnée référentielle manque sur une
   ligne devis (owner / tiers null). Aide à scanner rapidement les anomalies. */
.isis-pipeline-drill__missing {
    color: var(--isis-text-muted);
    font-style: italic;
}

/* Responsive : sous 1100px, la grille items passe à 5 colonnes condensées
   (on garde la colonne actions, indispensable pour Attribuer owner). */
@media (max-width: 1100px) {
    .isis-pipeline-drill__grid--items .isis-pipeline-drill__row {
        grid-template-columns: 1fr 1.5fr 1fr 130px 84px;
        gap: 0.4rem;
    }
    /* Masque Owner (4) / Émis (6) / Valide (7) — Numéro (1) / Titre (2) /
       Tiers (3) / Montant (5) / Actions (8) restent. */
    .isis-pipeline-drill__grid--items .isis-pipeline-drill__row > :nth-child(4),
    .isis-pipeline-drill__grid--items .isis-pipeline-drill__row > :nth-child(6),
    .isis-pipeline-drill__grid--items .isis-pipeline-drill__row > :nth-child(7) {
        display: none;
    }
}

/* ============================================================================
   Reset Bootstrap remnants
   ============================================================================ */
.top-row, .sidebar { display: none !important; }

/* ============================================================================
   /gesmaff/parametres/numerotation — visualisation compteurs.
   3 règles : note d'info au-dessus de la grille, pill type d'entité, grille 4 cols.
   ============================================================================ */
.isis-rich-page__note {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 0.6rem 0.8rem;
    background: var(--isis-surface-soft, #f8fafc);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-left: 3px solid var(--isis-mod-gesmaff, #d97706);
    border-radius: 6px;
    font-size: 0.82rem;
    color: var(--isis-text-soft, #475569);
    line-height: 1.45;
}
.isis-rich-page__note code {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    padding: 0.05rem 0.3rem;
    background: var(--isis-surface, #fff);
    border: 1px solid var(--isis-border, #e2e8f0);
    border-radius: 3px;
    color: var(--isis-text, #1f2328);
}

.isis-counter-pill {
    display: inline-block;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    padding: 0.1rem 0.4rem;
    border-radius: 4px;
    margin-right: 0.5rem;
    background: var(--isis-mod-gesmaff-soft, #fef3c7);
    color: var(--isis-mod-gesmaff, #d97706);
    border: 1px solid color-mix(in srgb, var(--isis-mod-gesmaff, #d97706) 35%, transparent);
}
.isis-counter-pill.is-ao  { background: #fef3c7; color: #b45309; border-color: #d97706; }   /* ambre */
.isis-counter-pill.is-dc  { background: #dbeafe; color: #1e40af; border-color: #2563eb; }   /* bleu */
.isis-counter-pill.is-mar { background: #dcfce7; color: #166534; border-color: #16a34a; }   /* vert */

.isis-grid--gesmaff-counters .isis-grid__head,
.isis-grid--gesmaff-counters .isis-grid__row {
    grid-template-columns: minmax(220px, 1.5fr) 120px 140px minmax(160px, 1fr);
    min-width: 720px;
}
.isis-grid--gesmaff-counters .isis-grid__col-amount {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-variant-numeric: tabular-nums;
    text-align: right;
    font-weight: 600;
    color: var(--isis-text, #1f2328);
}

/* ─── Fiche admin/users/{id} : layout interne onglets ─────────────────── */

/* Bloc d'actions secondaires sous une colonne de summary (ex: bouton "Ouvrir la fiche collab") */
.isis-detail-actions {
    margin-top: 0.75rem;
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}

/* Onglet Modules — liste verticale "label + toggle" */
.isis-module-access-list {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    overflow: hidden;
}
.isis-module-access-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.75rem 1rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-module-access-row:last-child { border-bottom: 0; }
.isis-module-access-row__main { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
.isis-module-access-row__reason {
    color: var(--isis-warning, #b45309);
    font-style: italic;
}

/* Onglet Rôles — bloc par module */
.isis-role-module-block {
    padding: 0.85rem 1rem;
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    margin-bottom: 0.75rem;
    background: var(--isis-surface);
}
.isis-role-module-block:last-child { margin-bottom: 0; }
.isis-role-module-block__head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 0.6rem;
    padding-bottom: 0.4rem;
    border-bottom: 1px dashed var(--isis-border);
}
.isis-role-module-block__count {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
    font-variant-numeric: tabular-nums;
}
.isis-role-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
}
.isis-role-chips__item {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Surveillance / Audit applicatif — /admin/surveillance/audit
   Grille 7 colonnes (status / horodatage / type / résultat / acteur / IP / cible)
   ───────────────────────────────────────────────────────────────────────────── */
.isis-grid--audit-event .isis-grid__head,
.isis-grid--audit-event .isis-grid__row {
    grid-template-columns: 24px 130px minmax(180px, 1.4fr) 100px minmax(160px, 1.2fr) 120px 110px;
    min-width: 980px;
}

/* Alias sémantique pour status dot — la palette existante exposait is-ready (vert),
   on ajoute is-success comme alias plus discutable et plus lisible côté code. */
.isis-grid__status-dot.is-success { background: #16a34a; }

/* Bloc payload JSON dans le sidepanel audit. Police mono, scroll horizontal
   conservé pour les longs strings (UA, error stack), pas de word-break dur
   qui casserait la lisibilité d'un payload JSON formaté. */
.isis-audit-payload {
    margin: 0.5rem 0 0 0;
    padding: 0.6rem 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-family: var(--isis-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
    font-size: 0.72rem;
    line-height: 1.45;
    color: var(--isis-text);
    overflow: auto;
    max-height: 420px;
    white-space: pre;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Surveillance / Comptes — /admin/surveillance/comptes
   3 grilles : verrouillés / échecs récents / tokens reset actifs
   ───────────────────────────────────────────────────────────────────────────── */
.isis-grid--locked-accounts .isis-grid__head,
.isis-grid--locked-accounts .isis-grid__row {
    grid-template-columns: 160px minmax(160px, 1.2fr) minmax(180px, 1.4fr) 90px 180px 90px;
    min-width: 920px;
}
.isis-grid--recent-failures .isis-grid__head,
.isis-grid--recent-failures .isis-grid__row {
    grid-template-columns: minmax(180px, 1.3fr) 110px 140px minmax(160px, 1fr) 120px 130px;
    min-width: 920px;
}
.isis-grid--active-tokens .isis-grid__head,
.isis-grid--active-tokens .isis-grid__row {
    grid-template-columns: 160px minmax(180px, 1.4fr) 140px 110px 130px 60px;
    min-width: 880px;
}

/* Mise en évidence d'une ligne d'alerte (échecs ≥ 5 = potentiel brute-force ciblé).
   Bande gauche rouge + fond très léger — discret mais détecté au scan visuel. */
.isis-grid__row--alert {
    border-left: 3px solid var(--isis-danger);
    background: linear-gradient(to right,
        color-mix(in srgb, var(--isis-danger) 4%, transparent) 0%,
        transparent 60%);
}

/* ─────────────────────────────────────────────────────────────────────────────
   Surveillance / Santé tenant — /admin/surveillance/tenant
   Layout dashboard 2 colonnes responsive + cards avec titre + métriques
   ───────────────────────────────────────────────────────────────────────────── */
.isis-health-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
    gap: 1rem;
}
.isis-health-card {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
.isis-health-card__title {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    padding-bottom: 0.4rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-health-card__metrics {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
    gap: 0.6rem;
    margin-top: 0.2rem;
}
.isis-health-card__metric {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.1rem;
    padding: 0.4rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
    border-left: 3px solid transparent;
}
.isis-health-card__metric.is-success { border-left-color: #16a34a; }
.isis-health-card__metric.is-warning { border-left-color: #d97706; }
.isis-health-card__metric.is-danger  { border-left-color: var(--isis-danger); }
.isis-health-card__metric-val {
    font-size: 1.1rem;
    font-weight: 600;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-health-card__metric-lbl {
    font-size: 0.7rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-health-card__cta {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-top: 0.4rem;
    font-size: 0.8rem;
    color: var(--isis-current-mod, var(--isis-accent));
    text-decoration: none;
}
.isis-health-card__cta:hover,
.isis-health-card__cta:focus-visible {
    text-decoration: underline;
}

/* Barre de quota GED. Fond clair, fill coloré selon taux (success/warning/danger). */
.isis-quota-bar {
    width: 100%;
    height: 8px;
    background: var(--isis-surface-alt);
    border-radius: 4px;
    overflow: hidden;
    margin-top: 0.2rem;
}
.isis-quota-bar__fill {
    height: 100%;
    transition: width 0.3s ease;
}
.isis-quota-bar__fill.is-success { background: #16a34a; }
.isis-quota-bar__fill.is-warning { background: #d97706; }
.isis-quota-bar__fill.is-danger  { background: var(--isis-danger); }

/* ─────────────────────────────────────────────────────────────────────────────
   Surveillance / Audit row-level — /admin/surveillance/audit-data
   Grille 6 colonnes (status / horodatage / table+op / PK / acteur / cols modifiées)
   + table de diff 3 colonnes (col / avant / après)
   ───────────────────────────────────────────────────────────────────────────── */
.isis-grid--audit-log .isis-grid__head,
.isis-grid--audit-log .isis-grid__row {
    grid-template-columns: 24px 130px minmax(220px, 1.6fr) minmax(140px, 1.2fr) minmax(140px, 1fr) 110px;
    min-width: 1000px;
}

/* Alias status dot bleu pour les opérations UPDATE (cohérence avec le badge Info). */
.isis-grid__status-dot.is-info { background: #2563eb; }

/* Diff colonne par colonne. Mise en valeur cellule "avant" en rouge soft / "après"
   en vert soft pour le scan rapide. Police mono, scroll horizontal sur chaque
   cellule pour gérer les longs strings sans casser le layout. */
.isis-diff-table {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.78rem;
    margin-top: 0.4rem;
}
.isis-diff-table__head {
    display: grid;
    grid-template-columns: minmax(120px, 0.8fr) 1fr 1fr;
    gap: 0.4rem;
    padding: 0.25rem 0.4rem;
    background: var(--isis-surface-alt);
    border-radius: 4px;
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-soft);
    font-weight: 600;
}
.isis-diff-table__row {
    display: grid;
    grid-template-columns: minmax(120px, 0.8fr) 1fr 1fr;
    gap: 0.4rem;
    padding: 0.3rem 0.4rem;
    border-bottom: 1px dashed var(--isis-border);
}
.isis-diff-table__row:last-child { border-bottom: none; }
.isis-diff-table__col {
    color: var(--isis-text);
    font-weight: 600;
    word-break: break-word;
}
.isis-diff-table__old {
    color: #991b1b;
    background: color-mix(in srgb, #fecaca 35%, transparent);
    padding: 0.15rem 0.35rem;
    border-radius: 3px;
    overflow-wrap: anywhere;
}
.isis-diff-table__new {
    color: #166534;
    background: color-mix(in srgb, #bbf7d0 35%, transparent);
    padding: 0.15rem 0.35rem;
    border-radius: 3px;
    overflow-wrap: anywhere;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Console plateforme — pages /master/surveillance/*
   ───────────────────────────────────────────────────────────────────────────── */

/* Audit cross-tenant : 7 colonnes (status / horodatage / type / résultat / tenant / acteur / IP) */
.isis-grid--platform-audit .isis-grid__head,
.isis-grid--platform-audit .isis-grid__row {
    grid-template-columns: 24px 130px minmax(180px, 1.4fr) 100px 110px minmax(160px, 1.2fr) 120px;
    min-width: 1020px;
}

/* Services en arrière-plan : 4 colonnes (catégorie / nom court / FQN / état) */
.isis-grid--hosted-services .isis-grid__head,
.isis-grid--hosted-services .isis-grid__row {
    grid-template-columns: 140px minmax(220px, 1fr) minmax(260px, 1.6fr) 110px;
    min-width: 820px;
}

/* Liens externes : cards plates 2 colonnes (icône + label/desc), wrap responsive */
.isis-external-links {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 0.6rem;
}
.isis-external-link {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    padding: 0.6rem 0.8rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    color: var(--isis-text);
    text-decoration: none;
    transition: background 0.15s ease, border-color 0.15s ease;
}
.isis-external-link:hover,
.isis-external-link:focus-visible {
    background: var(--isis-surface);
    border-color: var(--isis-mod-admin);
    text-decoration: none;
}
.isis-external-link__main {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}
.isis-external-link__label {
    font-weight: 600;
    font-size: 0.88rem;
    color: var(--isis-text);
}
.isis-external-link__desc {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
}

/* ─────────────────────────────────────────────────────────────────────────────
   Console plateforme — pages /master/* additionnelles
   ───────────────────────────────────────────────────────────────────────────── */

/* Super-admins liste : 7 cols (status / login / nom / email / lastLogin / statut / actions) */
.isis-grid--platform-users .isis-grid__head,
.isis-grid--platform-users .isis-grid__row {
    grid-template-columns: 24px 160px minmax(180px, 1.2fr) minmax(220px, 1.4fr) 140px 180px 100px;
    min-width: 1080px;
}

/* Dashboard — migrations en retard : 5 cols (code / nom / appliquées / manquantes / dernière) */
.isis-grid--migration-gap .isis-grid__head,
.isis-grid--migration-gap .isis-grid__row {
    grid-template-columns: 140px minmax(220px, 1.4fr) 110px 110px 160px;
    min-width: 740px;
}

/* Dashboard — activité récente : 5 cols (status / horodatage / type / tenant / acteur) */
.isis-grid--recent-audit .isis-grid__head,
.isis-grid--recent-audit .isis-grid__row {
    grid-template-columns: 24px 130px minmax(180px, 1.3fr) 130px minmax(160px, 1fr);
    min-width: 720px;
}

/* Templates email plateforme — viewer read-only */
.isis-platform-tpl {
    padding: 0.75rem 0;
    border-top: 1px dashed var(--isis-border);
}
.isis-platform-tpl:first-of-type { border-top: none; padding-top: 0; }
.isis-platform-tpl__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    margin-bottom: 0.5rem;
}
.isis-platform-tpl__code {
    font-family: var(--isis-font-mono);
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--isis-mod-admin);
}
.isis-platform-tpl__locale {
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    background: var(--isis-surface-alt);
    border-radius: 3px;
    font-family: var(--isis-font-mono);
    font-size: 0.72rem;
    color: var(--isis-text-soft);
}
.isis-platform-tpl__desc {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    text-align: right;
}
.isis-platform-tpl__body {
    margin-top: 0.4rem;
}
.isis-platform-tpl__body summary {
    cursor: pointer;
    font-size: 0.78rem;
    color: var(--isis-text-soft);
    padding: 0.2rem 0;
}
/* Cap le <pre> à l'intérieur du body — un template HTML complet peut dépasser
   200 lignes et envahir la page si plusieurs sections sont ouvertes simultanément. */
.isis-platform-tpl__body pre.isis-audit-payload {
    max-height: 350px;
    overflow-y: auto;
}
.isis-platform-tpl__vars {
    margin-top: 0.5rem;
    padding: 0.5rem 0.6rem;
    background: var(--isis-surface-alt);
    border-radius: 4px;
}
.isis-platform-tpl__vars-title {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-soft);
    margin-bottom: 0.3rem;
}
.isis-platform-tpl__vars-grid {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.2rem 0.6rem;
    font-size: 0.78rem;
}
.isis-platform-tpl__vars-grid code {
    color: var(--isis-mod-admin);
    font-weight: 600;
}

/* Bandeau d'alertes du dashboard plateforme */
.isis-platform-alerts {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 0.6rem;
}
.isis-platform-alert {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.6rem 0.8rem;
    border-radius: 6px;
    border: 1px solid var(--isis-border);
    text-decoration: none;
    color: var(--isis-text);
    transition: transform 0.1s ease, box-shadow 0.15s ease;
}
.isis-platform-alert:hover,
.isis-platform-alert:focus-visible {
    transform: translateY(-1px);
    box-shadow: var(--isis-elevation-1);
    text-decoration: none;
}
.isis-platform-alert--warning {
    background: var(--isis-warning-soft, #fef3c7);
    border-color: #d97706;
    color: #92400e;
}
.isis-platform-alert--danger {
    background: var(--isis-danger-soft, #fee2e2);
    border-color: var(--isis-danger, #dc2626);
    color: #991b1b;
}
.isis-platform-alert__cta {
    display: block;
    font-size: 0.78rem;
    margin-top: 0.15rem;
    opacity: 0.85;
}

/* Config runtime — layout stacked clé/valeur pour les clés path-like longues
   (ex: Observability:ExternalLinks:GrafanaBaseUrl) qui ne tiennent pas en
   2-cols dans des cards de 380px de large. */
.isis-config-row {
    padding: 0.4rem 0;
    border-bottom: 1px dashed var(--isis-border);
}
.isis-config-row:last-child { border-bottom: none; }
.isis-config-row__key {
    font-size: 0.68rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    margin-bottom: 0.2rem;
    word-break: break-all;
}
.isis-config-row__val {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.82rem;
    color: var(--isis-text);
    word-break: break-all;
    overflow-wrap: anywhere;
}
.isis-config-row__val.is-empty {
    color: var(--isis-text-muted);
    font-style: italic;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Warnings de cohérence métier (CoherenceWarning) — panneau form + bandeau fiche
   + hint inline. Utilisé par EngagementFormDialog, EngagementDetail,
   FactureRecueFormDialog. Cf. IsisSolution.Shared.Validation.CoherenceWarning.
   ─────────────────────────────────────────────────────────────────────────── */

/* Panneau en bas de form dialog — encadré sur fond warning 8% */
.isis-form-coherence-warnings {
    margin-top: 0.6rem;
    padding: 0.6rem 0.75rem;
    background: color-mix(in srgb, var(--isis-warning) 8%, white);
    border-left: 3px solid var(--isis-warning);
    border-radius: 4px;
    color: var(--isis-text);
}
.isis-form-coherence-warnings__head {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-weight: 600;
    font-size: 0.85rem;
    color: var(--isis-text);
    margin-bottom: 0.35rem;
}
.isis-form-coherence-warnings__head .rzi {
    color: var(--isis-warning);
}
.isis-form-coherence-warnings ul {
    margin: 0;
    padding: 0;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-form-coherence-warnings__item {
    font-size: 0.82rem;
    line-height: 1.4;
    padding: 0.2rem 0.4rem;
    border-radius: 3px;
    background: white;
    border-left: 2px solid var(--isis-warning);
}
.isis-form-coherence-warnings__item.is-info {
    border-left-color: var(--isis-accent, #4b5fad);
    background: color-mix(in srgb, var(--isis-accent, #4b5fad) 4%, white);
}
.isis-form-coherence-warnings__item.is-warning {
    border-left-color: var(--isis-warning);
}
.isis-form-coherence-warnings__item.is-error {
    border-left-color: var(--isis-danger);
    background: color-mix(in srgb, var(--isis-danger) 6%, white);
    color: var(--isis-text);
    font-weight: 500;
}

/* Hint inline sous un input (warning facture↔engagement) */
.isis-form-coherence-warnings__inline {
    margin-top: 0.25rem;
    padding: 0.25rem 0.45rem;
    background: color-mix(in srgb, var(--isis-warning) 10%, white);
    border-left: 2px solid var(--isis-warning);
    border-radius: 3px;
    font-size: 0.78rem;
    color: var(--isis-text);
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    line-height: 1.35;
}
.isis-form-coherence-warnings__inline .rzi {
    color: var(--isis-warning);
    flex-shrink: 0;
    margin-top: 0.05rem;
}

/* Bandeau sticky sur fiche détail — pleine largeur sous la toolbar */
.isis-coherence-banner {
    display: flex;
    gap: 0.6rem;
    align-items: flex-start;
    padding: 0.55rem 0.85rem;
    background: color-mix(in srgb, var(--isis-warning) 6%, white);
    border-left: 3px solid var(--isis-warning);
    border-radius: 4px;
    color: var(--isis-text);
    font-size: 0.85rem;
}
.isis-coherence-banner .rzi {
    color: var(--isis-warning);
    flex-shrink: 0;
    margin-top: 0.1rem;
}
.isis-coherence-banner__list {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    line-height: 1.4;
}
.isis-coherence-banner__item.is-error {
    color: var(--isis-danger);
    font-weight: 500;
}
.isis-coherence-banner__item.is-info {
    color: var(--isis-text-muted);
}

/* ── Workflow commande gesproj refondu (migration 0159) ──────────────── */
/* Encadrement des 3 phases (Bon de commande / Exécution / Clôture). */
.isis-wf-phase-frame {
    stroke: var(--isis-border);
    stroke-width: 1;
    opacity: 0.5;
}

/* Losanges décision (Gate QA / Réception client). Polygone SVG. */
.isis-wf-diamond__shape {
    fill: #ffffff;
    stroke: var(--isis-border);
    stroke-width: 1.5;
    transition: fill 0.15s, stroke 0.15s;
}
.isis-wf-diamond.is-future .isis-wf-diamond__shape {
    stroke-dasharray: 3 3;
    opacity: 0.65;
}
.isis-wf-diamond.is-done .isis-wf-diamond__shape {
    fill: color-mix(in srgb, var(--isis-success, #16a34a) 8%, white);
    stroke: var(--isis-success, #16a34a);
    stroke-width: 1.5;
}
.isis-wf-diamond.is-current .isis-wf-diamond__shape {
    fill: color-mix(in srgb, var(--isis-mod-gesproj) 10%, white);
    stroke: var(--isis-mod-gesproj);
    stroke-width: 2;
    filter: drop-shadow(0 0 4px color-mix(in srgb, var(--isis-mod-gesproj) 35%, transparent));
}
.isis-wf-diamond.is-unreachable .isis-wf-diamond__shape {
    fill: var(--isis-surface-soft, #f8fafc);
    stroke: var(--isis-text-muted);
    stroke-dasharray: 2 4;
    opacity: 0.45;
}
.isis-wf-diamond__label {
    font-size: 10px;
    font-weight: 600;
    fill: var(--isis-text);
    pointer-events: none;
    letter-spacing: 0.02em;
}
.isis-wf-diamond.is-future .isis-wf-diamond__label,
.isis-wf-diamond.is-unreachable .isis-wf-diamond__label {
    fill: var(--isis-text-muted);
}

/* Légende : pastille losange. */
.isis-workflow-legend__shape.is-diamond {
    width: 12px; height: 12px;
    background: transparent;
    border: 1.5px solid var(--isis-border);
    transform: rotate(45deg);
    display: inline-block;
    vertical-align: middle;
}
.isis-wf-phase-label {
    font-size: 9px;
    font-weight: 600;
    fill: var(--isis-text-muted);
    text-anchor: middle;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}
/* Badge pause sur EN_COURS quand IsPaused = true. */
.isis-wf-pause-badge {
    fill: var(--isis-warning, #d97706);
    opacity: 0.95;
}
.isis-wf-pause-badge__text {
    font-size: 10px;
    font-weight: 600;
    fill: #ffffff;
    text-anchor: middle;
}
/* Badge réception confirmée sur LIVREE (workflow B). */
.isis-wf-received-badge {
    fill: var(--isis-success, #16a34a);
    opacity: 0.95;
}
.isis-wf-received-badge__text {
    font-size: 10px;
    font-weight: 600;
    fill: #ffffff;
    text-anchor: middle;
}
/* Badge accusé de réception sur RECEIVED côté engagement (workflow 0164). */
.isis-wf-ack-badge {
    fill: var(--isis-mod-gesst, #be185d);
    opacity: 0.95;
}
.isis-wf-ack-badge__text {
    font-size: 10px;
    font-weight: 600;
    fill: #ffffff;
    text-anchor: middle;
}
/* Workflow intégré 2 rangées (commande+engagement) — libellés rangées. */
.isis-wf-row-label {
    font-size: 10px;
    font-weight: 700;
    fill: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
}
/* Workflow intégré — état désactivé (rangée non applicable, hachuré gris). */
.isis-wf-node.is-disabled .isis-wf-node__shape {
    fill: url(#wfDiagHatch);
    stroke: #cbd5e1;
    stroke-width: 1;
    stroke-dasharray: 3 3;
}
.isis-wf-node.is-disabled .isis-wf-node__label {
    fill: var(--isis-text-muted);
    opacity: 0.55;
}
.isis-wf-edge.is-disabled {
    stroke: #cbd5e1;
    stroke-dasharray: 3 4;
    opacity: 0.5;
}

/* ════════════════════════════════════════════════════════════════════
   Workflow intégré — swimlanes verticales BPMN (IntegratedWorkflowDiagram).
   Lane A à gauche (engagement gesst), Lane B à droite (commande gesproj).
   ════════════════════════════════════════════════════════════════════ */

/* En-tête de chaque swimlane (titre lane). */
.isis-wf-lane-header {
    font-size: 11px;
    font-weight: 700;
    fill: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.1em;
}

/* Terminator circulaire (Start/End). */
.isis-wf-term {
    stroke-width: 2;
    transition: fill 0.15s, stroke 0.15s;
}
.isis-wf-term.is-done {
    fill: color-mix(in srgb, var(--isis-success, #16a34a) 12%, white);
    stroke: var(--isis-success, #16a34a);
}
.isis-wf-term.is-current {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 12%, white);
    stroke: var(--isis-mod-gesst);
}
.isis-wf-term.is-future {
    fill: white;
    stroke: #cbd5e1;
}
.isis-wf-term.is-disabled {
    fill: url(#wfDiagHatch);
    stroke: #cbd5e1;
    stroke-dasharray: 3 3;
    opacity: 0.6;
}
.isis-wf-term__label {
    font-size: 11px;
    font-weight: 700;
    fill: var(--isis-text);
    pointer-events: none;
}

/* Edges intra-lane (horizontaux dans swimlanes horizontales). */
.isis-wf-edge-h,
.isis-wf-edge-v {
    fill: none;
    stroke-width: 1.6;
    transition: stroke 0.15s, stroke-width 0.15s;
}
.isis-wf-edge-h.is-done,    .isis-wf-edge-v.is-done    { stroke: #16a34a; }
.isis-wf-edge-h.is-current, .isis-wf-edge-v.is-current { stroke: var(--isis-mod-gesst); stroke-width: 2; }
.isis-wf-edge-h.is-future,  .isis-wf-edge-v.is-future  { stroke: #b0bac9; stroke-width: 1.4; }
.isis-wf-edge-h.is-disabled,
.isis-wf-edge-v.is-disabled {
    stroke: #cbd5e1;
    stroke-dasharray: 3 4;
    opacity: 0.5;
}
.isis-wf-edge-h.is-dashed,
.isis-wf-edge-v.is-dashed {
    stroke-dasharray: 5 4;
    opacity: 0.8;
}

/* Flèches de cascade cross-lane (horizontales ou en zig-zag). */
.isis-wf-cascade {
    fill: none;
    stroke-width: 1.6;
    stroke-dasharray: 6 4;
    transition: stroke 0.15s;
}
.isis-wf-cascade.is-done    { stroke: var(--isis-mod-gesst); }
.isis-wf-cascade.is-future  { stroke: #cbd5e1; }
.isis-wf-cascade.is-disabled {
    stroke: #e2e8f0;
    opacity: 0.5;
}
.isis-wf-cascade.is-danger {
    stroke: var(--isis-danger, #dc2626);
    stroke-dasharray: 6 4;
}
.isis-wf-cascade-label {
    font-size: 9px;
    font-weight: 600;
    fill: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    pointer-events: none;
}
.isis-wf-cascade-label.is-danger {
    fill: var(--isis-danger, #dc2626);
}

/* Action manuelle (rectangle pointillé, ex: « Accuser réception »). */
.isis-wf-action {
    fill: #ffffff;
    stroke-width: 1.5;
    stroke-dasharray: 5 3;
    transition: fill 0.15s, stroke 0.15s;
}
.isis-wf-action.is-future {
    stroke: #cbd5e1;
    opacity: 0.75;
}
.isis-wf-action.is-current {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 8%, white);
    stroke: var(--isis-mod-gesst);
    stroke-dasharray: none;
    stroke-width: 2;
    filter: drop-shadow(0 0 4px color-mix(in srgb, var(--isis-mod-gesst) 30%, transparent));
}
.isis-wf-action.is-done {
    fill: color-mix(in srgb, var(--isis-success, #16a34a) 8%, white);
    stroke: var(--isis-success, #16a34a);
    stroke-dasharray: none;
}
.isis-wf-action.is-disabled {
    fill: url(#wfDiagHatch);
    stroke: #cbd5e1;
    opacity: 0.55;
}
.isis-wf-action__label {
    font-size: 10px;
    font-weight: 600;
    fill: var(--isis-text);
    pointer-events: none;
}
.isis-wf-action.is-future .isis-wf-action__label,
.isis-wf-action.is-disabled .isis-wf-action__label {
    fill: var(--isis-text-muted);
}

/* Override : losange côté swimlanes en couleur module gesst (pas gesproj). */
.isis-workflow-svg--gesst .isis-wf-diamond.is-current .isis-wf-diamond__shape {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 10%, white);
    stroke: var(--isis-mod-gesst);
    filter: drop-shadow(0 0 4px color-mix(in srgb, var(--isis-mod-gesst) 35%, transparent));
}

/* Overlay « Lane non applicable » dans une bande hachurée — remplace le rendu
   complet des nodes pour éviter la double-hachure illisible. */
.isis-wf-lane-empty {
    font-size: 18px;
    font-weight: 700;
    fill: var(--isis-text-muted);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    pointer-events: none;
}
.isis-wf-lane-empty--sub {
    font-size: 11px;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    fill: var(--isis-text-soft);
    font-style: italic;
}

/* ════════════════════════════════════════════════════════════════════
   IntegratedWorkflowDiagram — refonte BPMN column-grid (.wf-*).
   Namespace .wf-* dédié, ne partage rien avec les diagrammes uni-lane
   (.isis-wf-*) ; les 2 systèmes coexistent.
   ════════════════════════════════════════════════════════════════════ */

/* Bandes des swimlanes (rect background). */
.wf-lane-band {
    stroke: #e2e8f0;
    stroke-width: 1;
}
.wf-lane-band--a   { fill: color-mix(in srgb, var(--isis-mod-gesst) 5%, white); }
.wf-lane-band--b   { fill: color-mix(in srgb, var(--isis-mod-gesproj) 5%, white); }
.wf-lane-band--c   { fill: color-mix(in srgb, var(--isis-mod-gesproj) 8%, white); }
.wf-lane-band.is-hatched {
    fill: url(#wfDiagHatch);
    opacity: 0.5;
    stroke: none;
}

/* Tag latéral gauche identifiant la lane (A/B + libellé + sub). */
.wf-lane-tag {
    stroke-width: 0;
}
.wf-lane-tag--a    { fill: color-mix(in srgb, var(--isis-mod-gesst) 18%, white); }
.wf-lane-tag--b    { fill: color-mix(in srgb, var(--isis-mod-gesproj) 18%, white); }
.wf-lane-tag--c    { fill: color-mix(in srgb, var(--isis-mod-gesproj) 28%, white); }
.wf-lane-tag__letter {
    font-size: 19px;
    font-weight: 800;
    fill: var(--isis-text);
    pointer-events: none;
}
.wf-lane-tag__title {
    font-size: 8px;
    font-weight: 700;
    fill: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    pointer-events: none;
}
.wf-lane-tag__sub {
    font-size: 7px;
    font-weight: 500;
    fill: var(--isis-text-soft);
    font-style: italic;
    pointer-events: none;
}

/* Overlay « Lane non applicable » si bande hachurée (legacy, plus utilisé v3). */
.wf-lane-empty {
    font-size: 14px;
    font-weight: 700;
    fill: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    pointer-events: none;
}
.wf-lane-empty--sub {
    font-size: 9px;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    fill: var(--isis-text-soft);
    font-style: italic;
}

/* ── NODES (rectangles arrondis = états/statuts) ──────────────── */
.wf-node__shape {
    fill: white;
    stroke: var(--isis-border);
    stroke-width: 1.4;
    transition: fill 150ms ease, stroke 150ms ease;
}
.wf-node__label {
    font-size: 10px;
    font-weight: 600;
    fill: var(--isis-text);
    pointer-events: none;
}
.wf-node.is-done .wf-node__shape  { fill: #f0fdf4; stroke: #86efac; }
.wf-node.is-done .wf-node__label  { fill: #166534; }
.wf-node.is-current .wf-node__shape {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 14%, white);
    stroke: var(--isis-mod-gesst);
    stroke-width: 2.2;
    filter: drop-shadow(0 0 6px color-mix(in srgb, var(--isis-mod-gesst) 40%, transparent));
}
.wf-node.is-current .wf-node__label { fill: var(--isis-mod-gesst); font-weight: 700; }
.wf-node.is-future .wf-node__shape  { fill: var(--isis-surface-alt, #f8fafc); stroke: #e2e8f0; }
.wf-node.is-future .wf-node__label  { fill: var(--isis-text-muted); }
.wf-node.is-disabled .wf-node__shape {
    fill: white;
    stroke: #cbd5e1;
    stroke-dasharray: 4 3;
    stroke-width: 1.2;
    opacity: 0.7;
}
.wf-node.is-disabled .wf-node__label {
    fill: #94a3b8;
    opacity: 0.7;
    font-weight: 500;
}
.wf-node.is-unreachable .wf-node__shape { fill: transparent; stroke: #e2e8f0; stroke-dasharray: 4 3; }
.wf-node.is-unreachable .wf-node__label { fill: #cbd5e1; }

/* Note : on ne distingue pas A/B en CSS pur (pas de sélecteur sur X/Y SVG).
   La couleur "current" reste uniforme couleur gesst — suffisant V1 car les
   2 lanes ont rarement 2 nodes "current" simultanés. */

/* ── ACTION manuelle (rectangle pointillé, ex: ⚐ Accuser réception) ── */
.wf-action__shape {
    fill: white;
    stroke: #cbd5e1;
    stroke-width: 1.5;
    stroke-dasharray: 5 3;
    transition: fill 150ms, stroke 150ms;
}
.wf-action__label {
    font-size: 9px;
    font-weight: 600;
    fill: var(--isis-text);
    pointer-events: none;
}
.wf-action.is-current .wf-action__shape {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 10%, white);
    stroke: var(--isis-mod-gesst);
    stroke-dasharray: none;
    stroke-width: 2;
    filter: drop-shadow(0 0 5px color-mix(in srgb, var(--isis-mod-gesst) 35%, transparent));
}
.wf-action.is-current .wf-action__label { fill: var(--isis-mod-gesst); font-weight: 700; }
.wf-action.is-done .wf-action__shape {
    fill: #f0fdf4;
    stroke: #16a34a;
    stroke-dasharray: none;
}
.wf-action.is-done .wf-action__label { fill: #166534; }
.wf-action.is-future .wf-action__label { fill: var(--isis-text-muted); }
.wf-action.is-disabled .wf-action__shape {
    fill: white;
    stroke: #cbd5e1;
    stroke-dasharray: 4 3;
    opacity: 0.6;
}
.wf-action.is-disabled .wf-action__label {
    fill: #94a3b8;
    opacity: 0.7;
    font-weight: 500;
}

/* ── DIAMOND décision (◆ Validation ?) ─────────────────────────── */
.wf-diamond__shape {
    fill: white;
    stroke: var(--isis-border);
    stroke-width: 1.5;
    transition: fill 150ms, stroke 150ms;
}
.wf-diamond__label {
    font-size: 8px;
    font-weight: 600;
    fill: var(--isis-text);
    letter-spacing: 0.02em;
    pointer-events: none;
}
.wf-diamond.is-current .wf-diamond__shape {
    fill: color-mix(in srgb, var(--isis-mod-gesst) 12%, white);
    stroke: var(--isis-mod-gesst);
    stroke-width: 2.2;
    filter: drop-shadow(0 0 5px color-mix(in srgb, var(--isis-mod-gesst) 35%, transparent));
}
.wf-diamond.is-current .wf-diamond__label { fill: var(--isis-mod-gesst); font-weight: 700; }
.wf-diamond.is-done .wf-diamond__shape    { fill: #f0fdf4; stroke: #16a34a; }
.wf-diamond.is-done .wf-diamond__label    { fill: #166534; }
.wf-diamond.is-future .wf-diamond__shape  { stroke-dasharray: 3 3; opacity: 0.7; }
.wf-diamond.is-future .wf-diamond__label  { fill: var(--isis-text-muted); }
.wf-diamond.is-disabled .wf-diamond__shape {
    fill: white;
    stroke: #cbd5e1;
    stroke-dasharray: 4 3;
    opacity: 0.6;
}
.wf-diamond.is-disabled .wf-diamond__label {
    fill: #94a3b8;
    opacity: 0.7;
}

/* ── TERMINATOR (cercle Start/End) ─────────────────────────────── */
.wf-term__shape {
    stroke-width: 2.4;
    transition: fill 150ms, stroke 150ms;
}
.wf-term__letter {
    font-size: 11px;
    font-weight: 800;
    fill: var(--isis-text);
    pointer-events: none;
}
.wf-term__check {
    font-size: 12px;
    font-weight: 800;
    fill: #16a34a;
    pointer-events: none;
}
.wf-term.is-done .wf-term__shape    { fill: color-mix(in srgb, #16a34a 15%, white); stroke: #16a34a; }
.wf-term.is-current .wf-term__shape { fill: color-mix(in srgb, var(--isis-mod-gesst) 15%, white); stroke: var(--isis-mod-gesst); }
.wf-term.is-future .wf-term__shape  { fill: white; stroke: #cbd5e1; }
.wf-term.is-future .wf-term__check  { fill: #cbd5e1; }
.wf-term.is-disabled .wf-term__shape {
    fill: white;
    stroke: #cbd5e1;
    stroke-dasharray: 4 3;
    stroke-width: 1.5;
    opacity: 0.65;
}
.wf-term.is-disabled .wf-term__letter,
.wf-term.is-disabled .wf-term__check { fill: #94a3b8; opacity: 0.7; }

/* ── EDGES intra-lane (lignes solides ou pointillées) ──────────── */
.wf-edge {
    fill: none;
    stroke-width: 1.8;
    transition: stroke 150ms;
}
.wf-edge.is-done    { stroke: #16a34a; }
.wf-edge.is-current { stroke: var(--isis-mod-gesst); stroke-width: 2.4; }
.wf-edge.is-future  { stroke: #cbd5e1; stroke-width: 1.5; }
.wf-edge.is-disabled { stroke: #e2e8f0; stroke-dasharray: 3 4; opacity: 0.5; }
.wf-edge.is-dashed   { stroke-dasharray: 6 4; opacity: 0.85; }
.wf-edge-label {
    font-size: 8px;
    font-weight: 600;
    fill: var(--isis-text-muted);
    letter-spacing: 0.04em;
    pointer-events: none;
}

/* ── CASCADES cross-lane (flèches verticales/zig-zag) ─────────── */
.wf-cascade {
    fill: none;
    stroke-width: 2;
    stroke-dasharray: 7 4;
    transition: stroke 150ms;
}
.wf-cascade.is-done    { stroke: var(--isis-mod-gesst); }
.wf-cascade.is-future  { stroke: #cbd5e1; }
.wf-cascade.is-disabled { stroke: #e2e8f0; opacity: 0.4; }
.wf-cascade.is-danger  { stroke: var(--isis-danger, #dc2626); }

/* Badge numéroté au milieu d'une cascade (1, 2, 3, 4, 5). */
.wf-cascade-badge__circle {
    fill: white;
    stroke: var(--isis-mod-gesst);
    stroke-width: 1.8;
}
.wf-cascade-badge__num {
    font-size: 9px;
    font-weight: 800;
    fill: var(--isis-mod-gesst);
    pointer-events: none;
}
.wf-cascade-badge.is-done .wf-cascade-badge__circle {
    fill: var(--isis-mod-gesst);
}
.wf-cascade-badge.is-done .wf-cascade-badge__num {
    fill: white;
}
.wf-cascade-badge.is-future .wf-cascade-badge__circle {
    stroke: #cbd5e1;
}
.wf-cascade-badge.is-future .wf-cascade-badge__num {
    fill: #94a3b8;
}
.wf-cascade-badge.is-danger .wf-cascade-badge__circle {
    stroke: var(--isis-danger, #dc2626);
    fill: var(--isis-danger, #dc2626);
}
.wf-cascade-badge.is-danger .wf-cascade-badge__num {
    fill: white;
}
.wf-cascade-badge.is-disabled .wf-cascade-badge__circle {
    fill: white;
    stroke: #cbd5e1;
}
.wf-cascade-badge.is-disabled .wf-cascade-badge__num {
    fill: #cbd5e1;
}

/* Badges flag inline sur RECEIVED A / LIVREE B (✓ Accusé / ✓ Reçu). */
.wf-badge {
    opacity: 0.95;
}
.wf-badge--ack       { fill: var(--isis-mod-gesst, #be185d); }
.wf-badge--received  { fill: var(--isis-success, #16a34a); }
.wf-badge__text {
    font-size: 8px;
    font-weight: 700;
    fill: white;
    pointer-events: none;
}

/* ── LÉGENDE NUMÉROTÉE sous le SVG ──────────────────────────────── */
.wf-cascade-legend {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 0.25rem 0.75rem;
    margin: 0.5rem 0 0.2rem;
    padding: 0.45rem 0.75rem;
    background: var(--isis-surface-alt, #f8fafc);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.wf-cascade-legend__item {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    font-size: 0.65rem;
    line-height: 1.35;
    color: var(--isis-text);
}
.wf-cascade-legend__item em { color: var(--isis-text-soft); font-style: italic; }
.wf-cascade-legend__item.is-danger { color: var(--isis-danger, #dc2626); }
.wf-cascade-legend__num {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    font-size: 0.6rem;
    font-weight: 800;
    background: white;
    border: 1.5px solid var(--isis-mod-gesst);
    color: var(--isis-mod-gesst);
}
.wf-cascade-legend__num--done {
    background: var(--isis-mod-gesst);
    color: white;
}
.wf-cascade-legend__num--future {
    border-color: #cbd5e1;
    color: #94a3b8;
}
.wf-cascade-legend__num.is-danger,
.wf-cascade-legend__num--done.is-danger {
    background: var(--isis-danger, #dc2626);
    border-color: var(--isis-danger, #dc2626);
    color: white;
}


/* Classe events pour la timeline (CLIENT_REJECTED en couleur danger). */
.isis-audit-trail__dot.commande-wf-evt-client-rejected {
    background: var(--isis-danger, #c62828);
}
.isis-audit-trail__dot.commande-wf-evt-qa-rejected {
    background: var(--isis-warning, #d97706);
}
.isis-audit-trail__dot.commande-wf-evt-qa-passed {
    background: var(--isis-success, #16a34a);
}
.isis-audit-trail__dot.commande-wf-evt-paused {
    background: var(--isis-warning, #d97706);
    opacity: 0.7;
}
.isis-audit-trail__dot.commande-wf-evt-resumed {
    background: var(--isis-success, #16a34a);
    opacity: 0.7;
}

/* ── Timeline workflow livraison gesproj ───────────────────────────────── */
.isis-audit-trail__dot.livraison-wf-evt-created             { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.livraison-wf-evt-marked-ready        { background: var(--isis-accent-soft); color: var(--isis-accent); }
.isis-audit-trail__dot.livraison-wf-evt-shipped             { background: var(--isis-mod-gesproj-soft); color: var(--isis-mod-gesproj); }
.isis-audit-trail__dot.livraison-wf-evt-received            { background: var(--isis-warning-soft, #fff7ed); color: var(--isis-warning, #d97706); }
.isis-audit-trail__dot.livraison-wf-evt-validated           { background: var(--isis-success-soft); color: var(--isis-success); }
.isis-audit-trail__dot.livraison-wf-evt-partially-validated { background: var(--isis-warning-soft, #fff7ed); color: var(--isis-warning, #d97706); }
.isis-audit-trail__dot.livraison-wf-evt-rejected            { background: var(--isis-danger-soft); color: var(--isis-danger); }
.isis-audit-trail__dot.livraison-wf-evt-attachment-added    { background: #f1f5f9; color: #475569; }
.isis-audit-trail__dot.livraison-wf-evt-ligne-updated       { background: #f1f5f9; color: #475569; }

/* ── Partage commande gesproj (CommandeSharesSection) ─────────────────── */
.isis-share-list {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0 0 0;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
.isis-share-list__item {
    display: grid;
    grid-template-columns: 1fr auto auto;
    align-items: start;
    gap: 0.6rem;
    padding: 0.5rem 0.65rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-left: 3px solid var(--isis-mod-gesproj);
    border-radius: 4px;
    font-size: 0.85rem;
}
.isis-share-list__main {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}
.isis-share-list__meta {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    margin-left: 0.3rem;
}
.isis-share-list__note {
    color: var(--isis-text-muted);
    font-style: italic;
    font-size: 0.8rem;
    margin-top: 0.15rem;
}
.isis-share-list__badges {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0.2rem;
    align-self: center;
}
.isis-share-list__actions {
    display: inline-flex;
    gap: 0.2rem;
    align-self: center;
}

/* ── Thread de commentaires gesproj (GesprojCommentThread) ───────────── */
.isis-comment-thread {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-comment-thread__empty,
.isis-comment-thread__readonly {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    margin: 0;
}
.isis-comment-thread__list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
.isis-comment-thread__item {
    padding: 0.5rem 0.65rem;
    background: var(--isis-surface-soft, #f8fafc);
    border-left: 3px solid var(--isis-mod-gesproj);
    border-radius: 4px;
    font-size: 0.85rem;
}
.isis-comment-thread__head {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.2rem;
}
.isis-comment-thread__date {
    color: var(--isis-text-muted);
    font-size: 0.75rem;
    margin-left: 0.2rem;
}
.isis-comment-thread__delete {
    background: transparent;
    border: none;
    width: 22px; height: 22px;
    border-radius: 4px;
    color: var(--isis-text-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-comment-thread__delete:hover {
    background: #ffebee;
    color: #c62828;
}
.isis-comment-thread__edit-btn {
    background: transparent;
    border: none;
    width: 22px; height: 22px;
    border-radius: 4px;
    color: var(--isis-text-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
/* L'auto-marge gauche est portée par le 1er bouton de la cellule actions
   (whichever appears first) — pas par les boutons suivants. */
.isis-comment-thread__head > .isis-comment-thread__edit-btn:first-of-type,
.isis-comment-thread__head > .isis-comment-thread__delete:first-of-type {
    margin-left: auto;
}
.isis-comment-thread__edit-btn:hover {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}
.isis-comment-thread__edited {
    color: var(--isis-text-muted);
    font-size: 0.72rem;
    font-style: italic;
    margin-left: 0.2rem;
}
.isis-comment-thread__edit {
    border-top: 1px dashed var(--isis-border);
    padding-top: 0.5rem;
    margin-top: 0.3rem;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-comment-thread__edit-actions {
    display: flex;
    justify-content: flex-end;
    gap: 0.3rem;
    margin-top: 0.3rem;
}
.isis-comment-thread__body {
    white-space: pre-wrap;
    color: var(--isis-text);
}
.isis-comment-thread__mentions {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin-top: 0.3rem;
}
.isis-comment-thread__mention {
    background: var(--isis-mod-gesproj-soft, color-mix(in srgb, var(--isis-mod-gesproj) 12%, white));
    color: var(--isis-text);
    padding: 0.05rem 0.4rem;
    border-radius: 10px;
    font-size: 0.72rem;
    font-weight: 500;
}
.isis-comment-thread__compose {
    border-top: 1px dashed var(--isis-border);
    padding-top: 0.5rem;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-comment-thread__actions {
    display: flex;
    justify-content: flex-end;
    margin-top: 0.3rem;
}
.isis-comment-thread__error {
    color: var(--isis-danger, #c62828);
    font-size: 0.78rem;
    margin-top: 0.2rem;
}

/* ── Chantier C V2 — bandeau cumul avancement validation par item ──────── */
.isis-cumul-banner {
    margin: 0 0 0.8rem 0;
    padding: 0.55rem 0.85rem 0.7rem;
    background: color-mix(in srgb, var(--isis-mod-gesproj) 4%, white);
    border-left: 3px solid var(--isis-mod-gesproj);
    border-radius: 4px;
}
.isis-cumul-banner.is-complete {
    background: color-mix(in srgb, var(--isis-success) 5%, white);
    border-left-color: var(--isis-success);
}
.isis-cumul-banner__head {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.92rem;
    margin-bottom: 0.4rem;
}
.isis-cumul-banner__head .rzi { color: var(--isis-mod-gesproj); flex-shrink: 0; }
.isis-cumul-banner.is-complete .isis-cumul-banner__head .rzi { color: var(--isis-success); }
.isis-cumul-banner__pct {
    font-weight: 700;
    font-size: 1.05rem;
    color: var(--isis-mod-gesproj);
    font-variant-numeric: tabular-nums;
}
.isis-cumul-banner.is-complete .isis-cumul-banner__pct { color: var(--isis-success); }
.isis-cumul-banner__items {
    width: 100%;
    font-size: 0.85rem;
    border-collapse: collapse;
}
.isis-cumul-banner__items thead th {
    font-weight: 500;
    color: var(--isis-text-muted);
    padding: 0.25rem 0.5rem;
    border-bottom: 1px solid color-mix(in srgb, var(--isis-mod-gesproj) 15%, transparent);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.isis-cumul-banner__items tbody td {
    padding: 0.3rem 0.5rem;
    border-bottom: 1px dashed color-mix(in srgb, var(--isis-mod-gesproj) 8%, transparent);
}
.isis-cumul-banner__items tbody tr:last-child td { border-bottom: none; }
.isis-cumul-banner__items tbody tr.is-complete td { opacity: 0.65; }

/* ── Toggle inline (Chantier C V2 — opt-in auto-facture) ─────────────────── */
.isis-inline-toggle {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.25rem 0.6rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: 14px;
    font-size: 0.82rem;
    color: var(--isis-text);
    cursor: pointer;
    user-select: none;
}
.isis-inline-toggle:hover {
    background: color-mix(in srgb, var(--isis-mod-gesproj) 6%, var(--isis-surface-soft));
}
.isis-inline-toggle input[type="checkbox"] {
    margin: 0;
    cursor: pointer;
}


/* ── gesmat Phase 1.4 : calibration ──────────────────────────────────────
   Ajoutée 2026-05-19, consolidée par audit ui-ux 2026-05-19.
   Les variantes du bandeau d'alerte (.isis-alert-banner--pending|warning|danger)
   vivent désormais à côté de la définition de base (cf. § Alert banner ci-dessus). */

/* Grille historique calibrations — 7 cols
   Statut | Effectuée le | Expire le | N° certificat | Prestataire | Coût | Actions
   Header colonne Coût alignée à droite — cohérent avec body (tabular-nums right). */
.isis-grid--calibration .isis-grid__head,
.isis-grid--calibration .isis-grid__row {
    grid-template-columns: 110px 120px 120px minmax(140px, 1fr) minmax(160px, 1.2fr) 120px 110px;
    min-width: 920px;
}
.isis-grid--calibration .isis-grid__head > div:nth-child(6) {
    justify-content: flex-end;
    text-align: right;
}
.isis-grid--calibration .isis-grid__row.is-active {
    box-shadow: inset 3px 0 0 var(--isis-mod-gesmat);
}

/* Champ form-linear "verrouillé" — affichage non-modifiable d'une valeur
   imposée par le flux (ex : Type=CALIBRATION quand on vient du bouton
   "Envoyer en re-calibration"). Calque visuel d'un input désactivé sans
   l'élément input lui-même (l'AT lit le rôle status + label, pas un dropdown
   trompeur). */
.isis-form-linear__locked-field {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.4rem 0.6rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text);
    font-size: 0.9rem;
}
.isis-form-linear__locked-field > .isis-form-linear__field-hint {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}

/* Grille échéances calibration — 7 cols
   status | équipement (code+libellé) | catégorie | entreprise | statut | expiration | actions
   Ajoutée 2026-05-19, Phase 1.5 (page /gesmat/calibrations/echeances). */
.isis-grid--livraison-envoi .isis-grid__head,
.isis-grid--livraison-envoi .isis-grid__row {
    grid-template-columns: 150px 170px 90px minmax(180px,1.3fr) minmax(140px,1fr) minmax(120px,0.8fr);
}
.isis-grid--livraison-pj .isis-grid__head,
.isis-grid--livraison-pj .isis-grid__row {
    grid-template-columns: minmax(240px,2fr) 130px 100px;
}
.isis-grid--livraison-pj2 .isis-grid__head,
.isis-grid--livraison-pj2 .isis-grid__row {
    grid-template-columns: 160px minmax(220px,1.5fr) 130px 100px;
}
.isis-grid--livraison-livres .isis-grid__head,
.isis-grid--livraison-livres .isis-grid__row {
    grid-template-columns: 120px minmax(200px,1.4fr) minmax(180px,1fr) 110px 100px;
}
.isis-envoi-detail {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.5rem;
    padding: 0.75rem 1rem 1rem 2.2rem;
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
}
.isis-envoi-detail__title {
    font-weight: 600;
    font-size: 0.85rem;
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin-bottom: 0.4rem;
}
.isis-envoi-detail__list {
    margin: 0;
    padding-left: 1.1rem;
    font-size: 0.85rem;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-prereq {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem 0.85rem;
    margin-bottom: 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-sm);
    font-size: 0.85rem;
}
.isis-prereq__label { font-weight: 600; }
.isis-prereq__item {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    color: var(--isis-text-muted);
}
.isis-prereq__item.is-done { color: var(--isis-success); }
/* Timeline consolidée envois ↔ retours client (fiche livraison) */
.isis-livtl { list-style: none; margin: 0; padding: 0; }
.isis-livtl__item { display: grid; grid-template-columns: 32px 1fr; gap: 0.6rem; padding-bottom: 0.9rem; position: relative; }
.isis-livtl__item::before { content: ""; position: absolute; left: 15px; top: 28px; bottom: 0; width: 2px; background: var(--isis-border); }
.isis-livtl__item:last-child::before { display: none; }
.isis-livtl__marker {
    width: 30px; height: 30px; border-radius: 50%; z-index: 1;
    display: flex; align-items: center; justify-content: center;
    background: var(--isis-surface); border: 2px solid var(--isis-border); color: var(--isis-text-muted);
}
.isis-livtl__item--envoi .isis-livtl__marker { border-color: var(--isis-accent); color: var(--isis-accent); }
.isis-livtl__item--rejet .isis-livtl__marker { border-color: var(--isis-danger); color: var(--isis-danger); }
.isis-livtl__item--validation .isis-livtl__marker { border-color: var(--isis-success); color: var(--isis-success); }
.isis-livtl__item--partielle .isis-livtl__marker { border-color: var(--isis-warning); color: var(--isis-warning); }
.isis-livtl__body { min-width: 0; padding-top: 2px; }
.isis-livtl__head { display: flex; align-items: center; gap: 0.4rem; }
.isis-livtl__head.is-clickable { cursor: pointer; }
.isis-livtl__title { font-weight: 600; font-size: 0.9rem; }
.isis-livtl__date { color: var(--isis-text-muted); font-size: 0.8rem; margin-left: auto; white-space: nowrap; }
.isis-livtl__reason { font-size: 0.85rem; color: var(--isis-text); margin-top: 0.15rem; font-style: italic; }
.isis-grid--echeances .isis-grid__head,
.isis-grid--echeances .isis-grid__row {
    grid-template-columns: 32px minmax(200px, 1.4fr) minmax(140px, 1fr) minmax(160px, 1.2fr) 130px 140px 70px;
    min-width: 980px;
}

/* Layout grille demandes de déménagement gesfac (move_request) :
   N° | Collaborateur | Cible | Date | Statut | Étape | Actions */
.isis-grid--move-request .isis-grid__head,
.isis-grid--move-request .isis-grid__row {
    grid-template-columns: 110px minmax(160px, 1fr) minmax(180px, 1.3fr) 100px 110px 110px 110px;
    min-width: 980px;
}

/* Sous-libellé secondaire dans une cellule de grille (libellé sous le code,
   ancienneté sous la date, etc.). Phase 1.6 — extraction des styles inline
   répétés dans EquipementListPage + CalibrationEcheancesPage. */
.isis-grid__col-sublabel {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
}

/* Grille planner gespla S5 — 7 cols
   status | ressource | source | période | charge | état | actions */
.isis-grid--planner .isis-grid__head,
.isis-grid--planner .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.4fr) minmax(160px, 1fr) minmax(200px, 1.2fr) 90px 120px 60px;
    min-width: 1080px;
}

/* P2 — Grille échéancier commande gesproj — 7 cols
   # | libellé | % | montant | échéance | statut | actions */
.isis-grid--echeancier .isis-grid__head,
.isis-grid--echeancier .isis-grid__row {
    grid-template-columns: 40px minmax(180px, 1.4fr) 70px minmax(120px, 1fr) 110px 100px 160px;
    min-width: 780px;
}
/* Actions (jusqu'à 4 boutons : justificatifs / demander / modifier / supprimer) :
   alignées à droite, sans retour à la ligne. */
.isis-grid--echeancier .isis-grid__actions {
    justify-content: flex-end;
    flex-wrap: nowrap;
}

/* P13 — Devis tasks (avant-vente checklist) */
.isis-devis-tasks {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-devis-tasks__head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
}
.isis-devis-tasks__title {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
}
.isis-devis-tasks__subtitle {
    margin: 0.15rem 0 0;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
}
.isis-devis-tasks__list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-devis-tasks__item {
    display: grid;
    grid-template-columns: 28px 1fr 28px;
    align-items: center;
    gap: 0.5rem;
    padding: 0.35rem 0.5rem;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    background: var(--isis-surface);
    transition: background 120ms ease, opacity 120ms ease;
}
.isis-devis-tasks__item.is-done {
    background: color-mix(in srgb, var(--isis-success) 6%, var(--isis-surface));
    opacity: 0.85;
}
.isis-devis-tasks__item.is-done .isis-devis-tasks__label {
    text-decoration: line-through;
    color: var(--isis-text-muted);
}
.isis-devis-tasks__toggle,
.isis-devis-tasks__delete {
    background: none;
    border: 0;
    cursor: pointer;
    padding: 4px;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.isis-devis-tasks__toggle:hover,
.isis-devis-tasks__delete:hover {
    background: var(--isis-surface-alt);
}
.isis-devis-tasks__add {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}
.isis-devis-tasks__add .rz-textbox {
    flex: 1;
}

.isis-echeancier {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
.isis-echeancier__head {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    gap: 1rem;
    flex-wrap: wrap;
}
.isis-echeancier__title {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-echeancier__subtitle {
    margin: 0.25rem 0 0;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-echeancier__empty {
    text-align: center;
    padding: 2rem 1rem;
    color: var(--isis-text-muted);
    border: 1px dashed var(--isis-border);
    border-radius: 6px;
}
.isis-echeancier__empty .rz-icon {
    font-size: 2rem;
    color: var(--isis-text-muted);
    margin-bottom: 0.5rem;
}
.isis-echeancier__loading {
    display: flex;
    justify-content: center;
    padding: 1.5rem;
}
.isis-echeancier__currency {
    margin-left: 0.25rem;
    color: var(--isis-text-muted);
    font-size: 0.8rem;
}
.isis-echeancier__status {
    display: inline-block;
    padding: 0.15rem 0.5rem;
    border-radius: 12px;
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.isis-echeancier__status--pending {
    background: color-mix(in srgb, var(--isis-text-muted) 14%, var(--isis-surface));
    color: var(--isis-text);
}
.isis-echeancier__status--requested {
    background: color-mix(in srgb, var(--isis-accent-warm) 16%, var(--isis-surface));
    color: var(--isis-accent-warm-strong, var(--isis-accent-warm));
}
.isis-echeancier__status--invoiced {
    background: color-mix(in srgb, var(--isis-accent) 14%, var(--isis-surface));
    color: var(--isis-accent);
}
/* Compteur de justificatifs sur le bouton d'action (preuves attachées à l'échéance). */
.isis-echeancier__justif-count {
    display: inline-block;
    min-width: 1.1em;
    margin-left: 0.15rem;
    padding: 0 0.25rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-accent);
    color: #fff;
    font-size: 0.68rem;
    font-weight: 700;
    line-height: 1.35;
    text-align: center;
    vertical-align: 1px;
}
.isis-echeancier__status--paid {
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
    color: var(--isis-success);
}
.isis-echeancier__status--cancelled {
    background: color-mix(in srgb, var(--isis-danger) 10%, var(--isis-surface));
    color: var(--isis-text-muted);
    text-decoration: line-through;
}

/* Jalons d'avancement (migration 0350)
   # | Jalon | Poids | Avancement | Statut | Échéance liée | Actions */
.isis-grid--jalon .isis-grid__head,
.isis-grid--jalon .isis-grid__row {
    grid-template-columns: 40px minmax(180px, 1.6fr) 80px 110px 120px minmax(140px, 1fr) 150px;
    min-width: 820px;
}
.isis-jalon__sum {
    font-weight: 600;
}
.isis-jalon__sum.is-ok { color: var(--isis-success); }
.isis-jalon__sum.is-warn { color: var(--isis-warning); }
/* Suggestion V2.2 : jalon « prêt à atteindre » (toutes tâches liées à 100 %). */
.isis-jalon-suggest {
    display: inline-flex; align-items: center; gap: 0.2rem; margin-top: 0.2rem;
    font-size: 0.7rem; line-height: 1; padding: 0.12rem 0.4rem; border-radius: 999px;
    color: var(--isis-success);
    background: color-mix(in srgb, var(--isis-success) 10%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-success) 30%, var(--isis-border));
}
.isis-grid__action-btn--success.is-suggested {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-success) 35%, transparent);
    animation: isis-jalon-suggest-pulse 1.8s ease-in-out infinite;
}
@keyframes isis-jalon-suggest-pulse {
    0%, 100% { box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-success) 35%, transparent); }
    50%      { box-shadow: 0 0 0 4px color-mix(in srgb, var(--isis-success) 18%, transparent); }
}
.isis-jalon__status {
    display: inline-block;
    padding: 0.15rem 0.5rem;
    border-radius: 12px;
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.isis-jalon__status--non_demarre {
    background: color-mix(in srgb, var(--isis-text-muted) 14%, var(--isis-surface));
    color: var(--isis-text-muted);
}
.isis-jalon__status--en_cours {
    background: color-mix(in srgb, var(--isis-accent) 14%, var(--isis-surface));
    color: var(--isis-accent);
}
.isis-jalon__status--atteint {
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
    color: var(--isis-success);
}
.isis-jalon__status--annule {
    background: color-mix(in srgb, var(--isis-danger) 10%, var(--isis-surface));
    color: var(--isis-text-muted);
    text-decoration: line-through;
}
/* Boutons d'en-tête de la section jalons (Appliquer un modèle + Ajouter) */
.isis-echeancier__head-actions {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}
/* Modèles de jalons (admin) — Code | Libellé | Portée | Jalons | Total | État | Actions */
.isis-grid--jalon-tpl .isis-grid__head,
.isis-grid--jalon-tpl .isis-grid__row {
    grid-template-columns: 160px minmax(180px, 1.6fr) minmax(140px, 1fr) 80px 90px 90px 110px;
    min-width: 900px;
}
/* Ligne d'édition d'un item de modèle (libellé + poids + supprimer) */
.isis-jalon-tpl-row {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    margin-bottom: 0.4rem;
}
/* Compteur de justificatifs sur le bouton d'action du jalon */
.isis-jalon__justif-count {
    font-size: 0.7rem;
    font-weight: 600;
    margin-left: 1px;
}

/* ── Référentiel contrôle qualité des livrables (migrations 0361-0363) ── */
/* Activités — Code | Libellé | Entreprises | Produits | Type | Actions */
.isis-grid--qc-activite .isis-grid__head,
.isis-grid--qc-activite .isis-grid__row {
    grid-template-columns: 150px minmax(200px, 1.8fr) 110px 90px 110px 100px;
    min-width: 820px;
}
/* Produits — Code | Libellé | Activité | Unité | Actions */
.isis-grid--qc-produit .isis-grid__head,
.isis-grid--qc-produit .isis-grid__row {
    grid-template-columns: 160px minmax(220px, 2fr) minmax(140px, 1fr) 110px 100px;
    min-width: 760px;
}
/* Catalogue produit (liste L_produit) : Produit | Entreprise | Article | Templates QC | Actions */
.isis-grid--qc-lproduit .isis-grid__head,
.isis-grid--qc-lproduit .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) minmax(140px, 1fr) minmax(160px, 1.4fr) 120px 100px;
    min-width: 760px;
}
/* L_produit — produits rattachés (dialog) : Code | Produit | Actions */
.isis-grid--qc-lproduit-link .isis-grid__head,
.isis-grid--qc-lproduit-link .isis-grid__row {
    grid-template-columns: 150px minmax(200px, 1fr) 130px;
    min-width: 500px;
}
/* QC par défaut du produit : Code | Template | Critères | État | Actions */
.isis-grid--qc-produit-default .isis-grid__head,
.isis-grid--qc-produit-default .isis-grid__row {
    grid-template-columns: 150px minmax(200px, 1.6fr) 90px 90px 100px;
    min-width: 700px;
}
/* Templates QC possédés (produit) : Nom | Critères | Bloquants | Actions */
.isis-grid--qc-owned-template .isis-grid__head,
.isis-grid--qc-owned-template .isis-grid__row {
    grid-template-columns: minmax(220px, 2fr) 90px 90px 110px;
    min-width: 620px;
}
/* Templates QC possédés (L_produit) : Nom | Activité | Critères | Bloquants | Source | Actions */
.isis-grid--qc-owned-template-l .isis-grid__head,
.isis-grid--qc-owned-template-l .isis-grid__row {
    grid-template-columns: minmax(200px, 1.8fr) minmax(120px, 1fr) 90px 90px 100px 130px;
    min-width: 820px;
}
/* Ligne extensible livraison → panneau livrables & QC inline */
.isis-livraison-detail { padding: 0.5rem 0.4rem 1rem; }
.isis-qc-panel { display: flex; flex-direction: column; gap: 0.6rem; }
/* Matrice de contrôle (critères × passes) */
.isis-qc-matrix-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; margin: 0.4rem 0; }
.isis-qc-matrix-toolbar__hint { font-size: 0.82rem; color: var(--isis-text-muted); }
.isis-qc-matrix-wrap { overflow: auto; flex: 1 1 auto; min-height: 120px; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm); }
.isis-qc-matrix { border-collapse: separate; border-spacing: 0; width: 100%; font-size: 0.8rem; }
.isis-qc-matrix th, .isis-qc-matrix td { border-bottom: 1px solid var(--isis-border); padding: 0.3rem 0.4rem; vertical-align: top; text-align: left; }
.isis-qc-matrix thead th { position: sticky; top: 0; background: var(--isis-surface-soft); z-index: 1; vertical-align: bottom; }
.isis-qc-matrix__crit-head, .isis-qc-matrix__crit { position: sticky; left: 0; background: var(--isis-surface); min-width: 170px; max-width: 240px; z-index: 1; }
.isis-qc-matrix__crit { font-weight: 500; }  /* th en-tête de ligne, pas le gras lourd par défaut */
.isis-qc-proof-upload__label { display: block; font-size: 0.8rem; color: var(--isis-text-muted); margin-bottom: 0.3rem; }
.isis-qc-matrix thead .isis-qc-matrix__crit-head { z-index: 2; background: var(--isis-surface-soft); }
.isis-qc-matrix th.is-current, .isis-qc-matrix td.is-current { background: color-mix(in srgb, var(--isis-accent) 6%, var(--isis-surface)); }
/* En-tête de passe : libellé en texte VERTICAL (compact), badge de statut horizontal dessous */
/* En-tête de passe : DEUX colonnes verticales côte à côte (rotation) — « Passe X » à gauche,
   le badge de statut à sa droite. Aligné en bas. */
.isis-qc-matrix__passe { display: flex; flex-direction: row; align-items: flex-end; justify-content: center; gap: 0.35rem; }
.isis-qc-matrix__passe-vert { writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap; max-height: 150px; overflow: hidden; text-overflow: ellipsis; font-size: 0.76rem; line-height: 1.2; }
/* Badge de statut de passe (Conforme / Non conforme / Brouillon) en texte vertical. */
.isis-qc-vbadge { writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap; }
.isis-qc-matrix__passe-date { color: var(--isis-text-muted); }
.isis-qc-matrix__passe-by { color: var(--isis-text); font-weight: 600; }
.isis-qc-matrix__tags { display: inline-flex; gap: 0.2rem; margin-left: 0.35rem; }
.isis-qc-matrix__group td { background: var(--isis-surface-soft); font-weight: 600; font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.02em; color: var(--isis-text-muted); }
/* Cellules = statut compact (lecture). Plus aucun contrôle dedans (Option A : édition en panneau). */
.isis-qc-matrix__cell { min-width: 64px; text-align: center; vertical-align: middle; }
.isis-qc-matrix__read { display: flex; align-items: center; justify-content: center; gap: 0.35rem; }
.isis-qc-cellview { display: flex; align-items: center; justify-content: center; gap: 0.3rem; flex-wrap: wrap; }
.isis-qc-cellview__val { font-family: var(--isis-font-mono, monospace); font-size: 0.8rem; }
.isis-qc-cellview__note { font-size: 0.76rem; color: var(--isis-text-muted); }
/* Bulle de commentaire dans une cellule : icône + commentaire en infobulle (title) au survol. */
.isis-qc-comment-bubble { display: inline-flex; align-items: center; cursor: help; color: var(--isis-accent); }
.isis-qc-comment-bubble > i { font-size: 14px; vertical-align: middle; }
.isis-qc-matrix__cell.isis-qc-cell--click { cursor: pointer; }
.isis-qc-matrix__cell.isis-qc-cell--click:hover { background: color-mix(in srgb, var(--isis-accent) 9%, var(--isis-surface)); }
.isis-qc-matrix__cell.is-selected { box-shadow: inset 0 0 0 2px var(--isis-accent); background: color-mix(in srgb, var(--isis-accent) 8%, var(--isis-surface)); }
.isis-qc-matrix__cell.isis-qc-cell--click:focus-visible { outline: 2px solid var(--isis-accent); outline-offset: -2px; }

/* Panneau d'édition d'un critère (sous la matrice) */
.isis-qc-editor { margin-top: 0.9rem; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm); background: var(--isis-surface-alt); overflow: hidden; }
.isis-qc-editor__head { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; padding: 0.6rem 0.85rem; border-bottom: 1px solid var(--isis-border); background: var(--isis-surface); flex-wrap: wrap; }
.isis-qc-editor__title { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; }
.isis-qc-editor__sub { color: var(--isis-text-muted); font-size: 0.8rem; font-weight: 400; }
.isis-qc-editor__nav { display: flex; align-items: center; gap: 0.5rem; font-size: 0.82rem; color: var(--isis-text-muted); white-space: nowrap; }
.isis-qc-editor__navbtn { border: 1px solid var(--isis-border); background: var(--isis-surface); border-radius: 6px; cursor: pointer; padding: 0.15rem 0.35rem; line-height: 1; color: var(--isis-text); }
.isis-qc-editor__navbtn:hover:not(:disabled) { background: var(--isis-surface-alt); }
.isis-qc-editor__navbtn:disabled { opacity: 0.4; cursor: default; }
.isis-qc-editor__body { display: flex; flex-direction: column; gap: 0.75rem; padding: 0.9rem 0.95rem; }
.isis-qc-editor__field { display: flex; flex-direction: column; gap: 0.3rem; }
.isis-qc-editor__field label { font-size: 0.8rem; font-weight: 600; color: var(--isis-text-muted); }
.isis-qc-editor__valrow { display: flex; align-items: center; gap: 0.7rem; flex-wrap: wrap; }
.isis-qc-editor__rule { font-size: 0.82rem; color: var(--isis-text-muted); }
.isis-qc-editor__hint { margin-top: 0.85rem; color: var(--isis-text-muted); font-style: italic; }
.isis-qc-edit-tags { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; margin-bottom: 0.2rem; }
.isis-qc-edit-tags__grp { font-size: 0.78rem; color: var(--isis-text-muted); }
.isis-qc-matrix__comment { width: 100%; border: 1px solid var(--isis-border); border-radius: 4px; padding: 0.2rem 0.4rem; font-size: 0.8rem; background: var(--isis-surface); }
.isis-qc-matrix__proof-view { border: none; background: transparent; cursor: pointer; color: var(--isis-accent); padding: 0.1rem; }
.isis-qc-newpass-modes { display: flex; flex-direction: column; gap: 0.4rem; margin: 0.3rem 0 0.6rem; }
/* Config de seuil (type VALEUR) dans l'éditeur de template */
.isis-qc-value-config { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; margin: 0 0 0.5rem 1.2rem; padding-left: 0.6rem; border-left: 2px solid var(--isis-border); }
.isis-qc-value-config__hint { font-size: 0.78rem; color: var(--isis-text-muted); }
/* Saisie VALEUR / NOTE dans la matrice */
.isis-qc-matrix__valwrap { display: flex; align-items: center; gap: 0.25rem; }
.isis-qc-matrix__value { width: 90px; border: 1px solid var(--isis-border); border-radius: 4px; padding: 0.2rem 0.4rem; font-size: 0.82rem; background: var(--isis-surface); }
.isis-qc-matrix__unit { font-size: 0.78rem; color: var(--isis-text-muted); }
.isis-qc-matrix__rule { font-size: 0.74rem; color: var(--isis-text-muted); display: inline-flex; align-items: center; gap: 0.3rem; }
.isis-qc-matrix__readval { font-weight: 600; font-size: 0.82rem; }
/* Journal / timeline QC */
/* Pied ancré en bas du dialog : historique + erreur + boutons restent fixes, la matrice scrolle. */
.isis-qc-footer { flex: 0 0 auto; position: sticky; bottom: 0; z-index: 2; display: flex; flex-direction: column; gap: 0.5rem; border-top: 1px solid var(--isis-border); padding-top: 0.55rem; margin-top: 0.1rem; background: var(--isis-surface); }
.isis-qc-footer .isis-qc-history { margin-top: 0; border-top: none; padding-top: 0; }
.isis-qc-footer .isis-form-linear__actions { margin-top: 0; }
.isis-qc-history { margin-top: 0.6rem; border-top: 1px solid var(--isis-border); padding-top: 0.5rem; }
.isis-qc-history__toggle { display: inline-flex; align-items: center; gap: 0.3rem; background: none; border: none; color: var(--isis-text-muted); font-size: 0.85rem; cursor: pointer; padding: 0.2rem 0; }
.isis-qc-history__toggle:hover { color: var(--isis-text); }
.isis-qc-history__toggle:focus-visible { outline: 2px solid var(--isis-accent); outline-offset: 2px; }
.isis-qc-history__loading { padding: 0.5rem; }
.isis-qc-history__empty { font-size: 0.85rem; color: var(--isis-text-muted); margin: 0.4rem 0; }
.isis-qc-history__list { list-style: none; margin: 0.4rem 0 0; padding: 0; display: flex; flex-direction: column; gap: 0.45rem; max-height: 26vh; overflow: auto; }
.isis-qc-history__item { display: flex; gap: 0.5rem; align-items: flex-start; }
.isis-qc-history__dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 0.35rem; flex: 0 0 auto; background: var(--isis-text-muted); }
.isis-qc-history__dot.is-ok { background: var(--isis-success); }
.isis-qc-history__dot.is-draft { background: var(--isis-text-muted); }
.isis-qc-history__dot.is-pending, .isis-qc-history__dot.is-info { background: var(--isis-accent); }
.isis-qc-history__body { display: flex; flex-direction: column; }
.isis-qc-history__label { font-size: 0.85rem; color: var(--isis-text); }
.isis-qc-history__meta { font-size: 0.75rem; color: var(--isis-text-muted); }
/* Reporting QC */
.isis-grid--qc-produit .isis-grid__head, .isis-grid--qc-produit .isis-grid__row { grid-template-columns: minmax(220px, 2fr) 100px 100px 100px minmax(160px, 1fr); }
.isis-grid--qc-controleur .isis-grid__head, .isis-grid--qc-controleur .isis-grid__row { grid-template-columns: minmax(220px, 2fr) 150px 130px 110px; }
.isis-qc-bar { position: relative; height: 18px; background: var(--isis-surface-alt); border-radius: 9px; overflow: hidden; min-width: 140px; }
.isis-qc-bar__fill { position: absolute; inset: 0 auto 0 0; border-radius: 9px; }
.isis-qc-bar__fill.is-ok { background: color-mix(in srgb, var(--isis-success) 55%, transparent); }
.isis-qc-bar__fill.is-warning { background: color-mix(in srgb, var(--isis-warning) 60%, transparent); }
.isis-qc-bar__fill.is-danger { background: color-mix(in srgb, var(--isis-danger) 60%, transparent); }
.isis-qc-bar__val { position: relative; z-index: 1; font-size: 0.74rem; font-weight: 600; padding-left: 0.45rem; line-height: 18px; color: var(--isis-text); }
/* Sélection des templates QC à la création d'un livrable */
.isis-qc-tpl-pick { display: flex; align-items: center; gap: 0.5rem; padding: 0.35rem 0.2rem; }
.isis-qc-tpl-pick__name { font-weight: 600; }
.isis-qc-tpl-pick__meta { font-size: 0.8rem; color: var(--isis-text-muted); }
/* Preuve par critère (contrôle du livrable) */
.isis-qc-ctrl-row__proof {
    display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.3rem 0.6rem;
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm);
    background: var(--isis-surface); font-size: 0.82rem; cursor: pointer; white-space: nowrap; flex: 0 0 auto;
}
.isis-qc-ctrl-row__proof.is-missing { font-weight: 600; }
.isis-qc-ctrl-row__proof:hover { background: var(--isis-surface-alt); }
.isis-qc-ctrl-row__proof.is-ok { border-color: var(--isis-success); color: var(--isis-success); }
.isis-qc-ctrl-row__proof.is-missing { border-color: var(--isis-warning); color: var(--isis-warning); }
.isis-qc-proof-current { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; padding: 0.5rem 0.2rem; }
.isis-qc-proof-upload { padding: 0.4rem 0.2rem; }
/* Templates QC — Code | Libellé | Portée | Activité | Critères | Rattach. | État | Actions */
.isis-grid--qc-template .isis-grid__head,
.isis-grid--qc-template .isis-grid__row {
    grid-template-columns: 150px minmax(180px, 1.6fr) minmax(130px, 1fr) minmax(110px, 0.9fr) 100px 90px 90px 100px;
    min-width: 1000px;
}
/* Lignes d'édition (composition produit / critères QC / rattachements) */
.isis-qc-compo-row,
.isis-qc-ligne-row,
.isis-qc-bind-row,
.isis-qc-addrow {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    margin-bottom: 0.4rem;
    flex-wrap: wrap;            /* jamais de débordement : on passe à la ligne */
}
/* Cellule flex : sépare le dimensionnement (cellule) du composant Radzen (width:100%). */
.isis-erow__cell { min-width: 0; }
.isis-erow__cell--grow  { flex: 1 1 200px; min-width: 0; }
.isis-erow__cell--grow2 { flex: 2 1 220px; min-width: 0; }
.isis-erow__cell--md    { flex: 0 0 150px; }
.isis-erow__cell--sm    { flex: 0 0 130px; }
.isis-erow__cell--xs    { flex: 0 0 96px; }
.isis-qc-ligne-row__chk {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
}

/* ── Exécution QC : dialogs livrables + checklist (P2, migration 0364) ── */
.isis-grid--qc-livrable .isis-grid__head,
.isis-grid--qc-livrable .isis-grid__row {
    grid-template-columns: minmax(140px, 1.2fr) minmax(110px, 1fr) 58px minmax(240px, 1.7fr) 150px 200px;
    min-width: 1000px;
}
.isis-grid--qc-livrable .isis-grid__row > [role="cell"] { align-self: center; }
/* Colonne Conformité : jauge + ratio + statut, puis chips (KO / à renseigner / commentaires / preuves). */
.isis-grid__col-conformite { display: flex; flex-direction: column; gap: 0.25rem; }
.isis-qc-gauge-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
.isis-qc-gauge { flex: 0 0 64px; height: 7px; border-radius: 999px; background: var(--isis-surface-alt); border: 1px solid var(--isis-border); overflow: hidden; }
.isis-qc-gauge__fill { height: 100%; border-radius: 999px; transition: width 0.2s ease; }
.isis-qc-gauge__fill.is-ok { background: var(--isis-success); }
.isis-qc-gauge__fill.is-warning { background: var(--isis-warning); }
.isis-qc-gauge__fill.is-danger { background: var(--isis-danger); }
.isis-qc-gauge__fill.is-info { background: var(--isis-info, var(--isis-accent)); }
.isis-qc-gauge__fill.is-muted { background: var(--isis-text-muted); opacity: 0.35; }
.isis-qc-gauge__ratio { font-family: var(--isis-font-mono, monospace); font-size: 0.8rem; font-variant-numeric: tabular-nums; color: var(--isis-text); min-width: 30px; }
.isis-qc-chips { display: flex; flex-wrap: wrap; gap: 0.3rem; }
.isis-qc-chip { display: inline-flex; align-items: center; gap: 0.15rem; font-size: 0.72rem; line-height: 1; padding: 0.15rem 0.4rem; border-radius: 999px; background: var(--isis-surface-alt); border: 1px solid var(--isis-border); color: var(--isis-text-muted); }
.isis-qc-chip > i { font-size: 13px; }
.isis-qc-chip.is-danger { color: var(--isis-danger); border-color: color-mix(in srgb, var(--isis-danger) 35%, var(--isis-border)); background: color-mix(in srgb, var(--isis-danger) 8%, var(--isis-surface)); }
.isis-qc-chip.is-muted { color: var(--isis-text-muted); }
/* Colonne Passes : badge passe courante + sous-libellé date · auteur. */
.isis-grid__col-passes { display: flex; flex-direction: column; gap: 0.15rem; align-items: flex-start; }
.isis-livraison-jalons { display: flex; flex-wrap: wrap; gap: 0.25rem; }
.isis-grid--liv-validation .isis-grid__head,
.isis-grid--liv-validation .isis-grid__row {
    grid-template-columns: minmax(160px, 1.6fr) 90px 120px minmax(160px, 1.4fr);
    min-width: 560px;
}
.isis-grid--liv-validation .isis-grid__row > [role="cell"] { align-self: center; }
/* Dialog « Livraisons liées à la tranche » (jalon de paiement ↔ livraisons). */
.isis-ech-liv-list { display: flex; flex-direction: column; gap: 0.3rem; max-height: 50vh; overflow: auto; }
.isis-ech-liv-item { display: flex; align-items: center; gap: 0.6rem; padding: 0.5rem 0.6rem; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm); cursor: pointer; }
.isis-ech-liv-item:hover { background: var(--isis-surface-alt); }
.isis-ech-liv-item.is-checked { border-color: var(--isis-accent); background: color-mix(in srgb, var(--isis-accent) 6%, var(--isis-surface)); }
.isis-ech-liv-item__num { font-family: var(--isis-font-mono, monospace); font-weight: 600; }
.isis-ech-liv-item__type { color: var(--isis-text-muted); font-size: 0.85rem; }

/* Lien de stockage du livrable (sous le produit) : GED, lien externe, ou tiret. */
.isis-livrable-storage { display: block; margin-top: 0.1rem; }
.isis-livrable-storage__dash { color: var(--isis-text-muted); }
.isis-livrable-storage .isis-text-link { background: none; border: none; padding: 0; font: inherit; cursor: pointer; color: var(--isis-accent); }
.isis-livrable-storage .isis-text-link:hover { text-decoration: underline; }
/* Le dialog remplit toute sa hauteur → matrice scrollable, pied ancré en bas.
   Classe posée sur .rz-dialog via DialogOptions.CssClass (plus robuste que :has).
   La hauteur 92vh est sur .rz-dialog ; on le met en colonne flex pour que le contenu
   remplisse l'espace, sinon .rz-dialog-content reste à hauteur naturelle et le pied flotte. */
.rz-dialog.isis-qc-dialog-window { display: flex; flex-direction: column; }
.rz-dialog.isis-qc-dialog-window .rz-dialog-content { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
.isis-qc-dialog { display: flex; flex-direction: column; gap: 0.75rem; flex: 1 1 auto; min-height: 0; }
.isis-qc-dialog__head {
    display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
    padding-bottom: 0.5rem; border-bottom: 1px solid var(--isis-border);
}
.isis-qc-addrow { display: flex; gap: 0.5rem; align-items: center; }
.isis-qc-ctrl-row {
    display: flex; flex-direction: column; gap: 0.45rem; margin-bottom: 0.55rem;
    padding-bottom: 0.55rem; border-bottom: 1px dashed var(--isis-border);
}
.isis-qc-ctrl-row__crit { display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; }
.isis-qc-ctrl-row__lib { font-size: 0.9rem; font-weight: 600; color: var(--isis-text); }
.isis-qc-ctrl-row__tags { display: inline-flex; gap: 0.3rem; flex-wrap: wrap; }
.isis-qc-ctrl-row__controls { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.isis-qc-ctrl-row__comment { flex: 1 1 160px; min-width: 140px; }
/* Bandeau d'état OK (vert) — complète --pending/--warning/--danger */
.isis-alert-banner--ok {
    background: color-mix(in srgb, var(--isis-success) 10%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-success) 35%, transparent);
}

/* Grille conflits gespla S6 — 5 cols
   status | type | ressource | période en conflit | actions */
.isis-grid--conflits .isis-grid__head,
.isis-grid--conflits .isis-grid__row {
    grid-template-columns: 32px minmax(200px, 1fr) minmax(220px, 1.2fr) minmax(180px, 1fr) 60px;
    min-width: 780px;
}

/* Dashboard gesmaff — Pipeline AO (top 10) — 8 cols
   status | référence | intitulé | maître d'ouvrage | montant estimatif | statut | date limite | actions */
.isis-grid--gesmaff-pipeline .isis-grid__head,
.isis-grid--gesmaff-pipeline .isis-grid__row {
    grid-template-columns: 32px 140px minmax(200px, 2fr) minmax(160px, 1fr) 160px 110px 130px 60px;
    min-width: 1080px;
}

/* Dashboard gesmaff — Marchés à surveiller (top 10) — 9 cols
   status | numéro | intitulé | client | type | montant TTC | date fin | conso cadre | actions */
.isis-grid--gesmaff-surveiller .isis-grid__head,
.isis-grid--gesmaff-surveiller .isis-grid__row {
    grid-template-columns: 32px 140px minmax(180px, 2fr) minmax(160px, 1fr) 130px 140px 130px 110px 60px;
    min-width: 1180px;
}

/* Dashboard gesst — Top engagements — 8 cols
   status | numéro | intitulé | prestataire | statut | montant TTC | propriétaire | actions */
.isis-grid--gesst-top-engagements .isis-grid__head,
.isis-grid--gesst-top-engagements .isis-grid__row {
    grid-template-columns: 32px 140px minmax(180px, 2fr) minmax(160px, 1.2fr) 130px 140px minmax(140px, 1fr) 60px;
    min-width: 1140px;
}

/* Dashboard gesst — Top fournisseurs — 4 cols */
.isis-grid--gesst-top-fournisseurs .isis-grid__head,
.isis-grid--gesst-top-fournisseurs .isis-grid__row {
    grid-template-columns: minmax(220px, 2fr) 120px 140px 180px;
    min-width: 720px;
}

/* Dashboard gesproj — Top commandes marge — 10 cols
   status | numéro | intitulé | statut | CA HT | coût réel | marge HT | marge % | propriétaire | actions */
.isis-grid--gesproj-marges .isis-grid__head,
.isis-grid--gesproj-marges .isis-grid__row {
    grid-template-columns: 32px 140px minmax(180px, 1.8fr) 140px 130px 130px 130px 110px minmax(140px, 1fr) 60px;
    min-width: 1300px;
}

/* Dérive marge devisé→réalisé (game-changer portefeuille, 2026-06-02) :
   status | Numéro | Intitulé | CA HT | Marge devisée % | Marge réelle % | Dérive (pts) | Propriétaire | action */
.isis-grid--gesproj-derive .isis-grid__head,
.isis-grid--gesproj-derive .isis-grid__row {
    grid-template-columns: 32px 140px minmax(180px, 1.6fr) 130px 130px 130px 130px minmax(140px, 1fr) 60px;
    min-width: 1260px;
}

/* Bandeau synthèse dérive (3 mini-KPIs au-dessus de la grille dérive). */
.isis-derive-kpis {
    display: flex;
    flex-wrap: wrap;
    gap: 1.5rem;
    padding: 0.5rem 0 1rem;
}
.isis-derive-kpi { display: flex; flex-direction: column; gap: 0.1rem; }
.isis-derive-kpi__value {
    font-size: 1.35rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    line-height: 1.1;
}
.isis-derive-kpi__value.is-ok      { color: var(--isis-success); }
.isis-derive-kpi__value.is-warning { color: var(--isis-warning); }
.isis-derive-kpi__value.is-danger  { color: var(--isis-danger); }
.isis-derive-kpi__sub {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text-muted);
}
.isis-derive-kpi__label {
    font-size: 0.74rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}

/* ============================================================================
   POC planning visuel /gespla/planner-v2 (vis-timeline MIT)
   ============================================================================ */
/* Layout 3 colonnes : palette gauche + timeline + sidepanel droit détail.
   Le sidepanel droit n'est rendu côté DOM que si une affectation est sélectionnée.

   Sprint Mxx — layout fullscreen scrollable interne. La rich-page est déjà
   en flex col + height:100% + overflow:hidden (cf. .isis-rich-page). On
   demande au layout de prendre tout le reste vertical disponible (flex: 1)
   et on autorise min-height: 0 pour que les enfants puissent shrink correctement
   (sinon ils débordent et la page entière scrolle). Pattern memory
   [[project_isis_grid_pattern]] — « chaîne flex impérative ». */
.isis-planner-layout {
    position: relative;                   /* ancre le sidepanel flottant */
    display: grid;
    grid-template-columns: 280px 1fr;
    gap: 1rem;
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
}
/* Sidepanel droit en overlay flottant — ne réduit plus la timeline.
   Plus de 3ème colonne grid : le détail se positionne en absolute par-dessus. */
.isis-planner-layout.has-detail {
    grid-template-columns: 280px 1fr;
}
@media (max-width: 1100px) {
    /* Viewport étroit : palette aussi se réempile au-dessus. */
    .isis-planner-layout,
    .isis-planner-layout.has-detail {
        grid-template-columns: 1fr;
    }
}

/* Palette ressources */
.isis-planner-palette {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    display: flex;
    flex-direction: column;
    height: 100%;          /* pris dans la grille fullscreen — scroll interne sur __body */
    min-height: 0;
    overflow: hidden;
}
.isis-planner-palette__head {
    padding: 0.75rem;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface-soft);
}
.isis-planner-palette__title {
    margin: 0 0 0.25rem 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-planner-palette__hint {
    display: block;
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    line-height: 1.3;
}
.isis-planner-palette__search {
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-planner-palette__body {
    flex: 1;
    overflow-y: auto;
    padding: 0.5rem 0.5rem 0.75rem;
}
.isis-planner-palette__section + .isis-planner-palette__section {
    margin-top: 0.75rem;
}
.isis-planner-palette__section-title {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.25rem 0.5rem;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 600;
}
.isis-planner-palette__count {
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-pill);
    padding: 0 0.5rem;
    font-size: 0.7rem;
    color: var(--isis-text-muted);
}
.isis-planner-palette__empty {
    padding: 0.4rem 0.75rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
/* Carte ressource draggable */
.isis-planner-palette__card {
    user-select: none;
    -webkit-user-select: none;
    /* Drag natif HTML5 — explicite pour Safari/WebKit. Sans cette propriété,
       user-select:none peut bloquer le démarrage du drag sur les zones de texte. */
    -webkit-user-drag: element;
    cursor: grab;
    padding: 0.45rem 0.6rem;
    margin: 0.25rem 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    transition: border-color 120ms ease, background 120ms ease;
}
/* Le texte interne ne doit pas devenir une cible de drag indépendante
   (sinon Chrome démarre un drag de texte au lieu du drag de l'élément).
   pointer-events:none sur les enfants — le tooltip (title) est porté
   par la carte parente, donc on ne perd rien d'utile, et le drag est plus
   stable car le browser considère toujours la carte comme cible. */
.isis-planner-palette__card * {
    -webkit-user-drag: none;
    pointer-events: none;
}
.isis-planner-palette__card:hover {
    border-color: var(--isis-mod-gespla);
    background: color-mix(in srgb, var(--isis-mod-gespla) 6%, var(--isis-surface));
}
.isis-planner-palette__card:active { cursor: grabbing; }
.isis-planner-palette__card:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
.isis-planner-palette__card--collab {
    border-left: 3px solid color-mix(in srgb, var(--isis-mod-sirh, var(--isis-text-muted)) 50%, transparent);
}
.isis-planner-palette__card--equip {
    border-left: 3px solid color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 50%, transparent);
}

/* Sprint E — carte besoin draggable */
.isis-planner-palette__card--besoin {
    border-left: 3px solid color-mix(in srgb, var(--isis-mod-gespla) 60%, transparent);
}
.isis-planner-palette__card--besoin:hover {
    border-color: var(--isis-mod-gespla);
}
/* Sprint N+ — carte commande draggable (drag sur lane ressource = nouvelle affectation) */
.isis-planner-palette__card--cmd {
    border-left: 3px solid color-mix(in srgb, var(--isis-mod-gesproj, var(--isis-accent)) 60%, transparent);
}
.isis-planner-palette__card--cmd:hover {
    border-color: var(--isis-mod-gesproj, var(--isis-accent));
}

/* Sprint V S8 — bouton « Top candidats » sur carte besoin.
   Échappe au pointer-events:none global des children draggable. */
.isis-planner-palette__card-bestmatch {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.35rem;
    padding: 2px 8px;
    background: var(--isis-mod-gespla-soft);
    color: var(--isis-mod-gespla);
    border: 1px solid color-mix(in srgb, var(--isis-mod-gespla) 30%, var(--isis-border));
    border-radius: 4px;
    font-size: 0.7rem;
    font-weight: 600;
    cursor: pointer;
    pointer-events: auto;
    -webkit-user-drag: none;
    transition: background 120ms ease, border-color 120ms ease;
}
.isis-planner-palette__card-bestmatch:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 12%, var(--isis-surface));
    border-color: var(--isis-mod-gespla);
}
.isis-planner-palette__card-bestmatch:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}

/* Sprint V S8 — dialog Top candidats. */
.isis-best-match { display: flex; flex-direction: column; gap: 1rem; }
.isis-best-match__head { display: flex; flex-direction: column; gap: 0.25rem; }
.isis-best-match__breadcrumb {
    display: flex; align-items: center; gap: 0.4rem;
    font-size: 0.75rem; color: var(--isis-text-muted);
}
.isis-best-match__title {
    font-size: 1rem; font-weight: 600; color: var(--isis-text); margin: 0;
}
.isis-best-match__hint {
    font-size: 0.75rem; color: var(--isis-text-muted); margin: 0;
}
.isis-best-match__empty {
    display: flex; flex-direction: column; align-items: center;
    gap: 0.5rem; padding: 1.5rem; text-align: center;
    background: var(--isis-surface-soft); border-radius: 6px;
    color: var(--isis-text-muted);
}
.isis-best-match__empty p { font-size: 0.8rem; margin: 0; }
.isis-best-match__list {
    list-style: none; padding: 0; margin: 0;
    display: flex; flex-direction: column; gap: 0.4rem;
    max-height: 420px; overflow-y: auto;
}
.isis-best-match__row {
    display: grid; grid-template-columns: 32px 1fr auto; gap: 0.6rem;
    padding: 0.6rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-mod-gespla);
    border-radius: 4px;
    align-items: center;
}
.isis-best-match__row.is-backlisted {
    opacity: 0.7;
    border-left-color: var(--isis-text-muted);
}
.isis-best-match__rank {
    font-size: 1.1rem; font-weight: 700;
    color: var(--isis-mod-gespla);
    text-align: center;
    font-variant-numeric: tabular-nums;
}
.isis-best-match__row.is-backlisted .isis-best-match__rank {
    color: var(--isis-text-muted);
}
.isis-best-match__name { font-weight: 600; color: var(--isis-text); }
.isis-best-match__sub { font-size: 0.75rem; color: var(--isis-text-muted); }
.isis-best-match__missing {
    margin-top: 0.25rem;
    font-size: 0.72rem;
    color: var(--isis-danger);
    display: inline-flex; align-items: center; gap: 0.3rem;
}
.isis-best-match__score { text-align: right; }
.isis-best-match__score-total {
    font-size: 1.2rem; font-weight: 700;
    color: var(--isis-mod-gespla);
    font-variant-numeric: tabular-nums;
}
.isis-best-match__row.is-backlisted .isis-best-match__score-total {
    color: var(--isis-text-muted);
}
.isis-best-match__score-breakdown {
    display: flex; gap: 0.4rem; justify-content: flex-end;
    font-size: 0.7rem; color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    margin-top: 0.15rem;
}
.isis-best-match__distance {
    font-size: 0.72rem; color: var(--isis-text-muted);
    margin-top: 0.15rem;
}
.isis-best-match__foot {
    display: flex; justify-content: flex-end; gap: 0.5rem;
    padding-top: 0.5rem; border-top: 1px solid var(--isis-border);
}

/* Sprint U E3 — bouton favori sur carte palette.
   Doit échapper au `pointer-events: none` global des children + au drag natif. */
.isis-planner-palette__card {
    position: relative; /* pour positionnement absolu du bouton fav */
}
.isis-planner-palette__card-fav {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 22px;
    height: 22px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    color: var(--isis-text-muted);
    /* Override : ce bouton DOIT recevoir les clics même si la règle globale
       `.isis-planner-palette__card *` pose pointer-events:none. */
    pointer-events: auto;
    -webkit-user-drag: none;
    transition: color 120ms ease, background 120ms ease;
}
.isis-planner-palette__card-fav:hover {
    color: var(--isis-accent-warm-strong, var(--isis-accent));
    background: color-mix(in srgb, var(--isis-accent-warm-strong, var(--isis-accent)) 10%, transparent);
}
.isis-planner-palette__card-fav[aria-pressed="true"] {
    color: var(--isis-accent-warm-strong, #c2410c);
}
.isis-planner-palette__card-fav:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
.isis-planner-palette__card.is-favorite {
    border-color: color-mix(in srgb, var(--isis-accent-warm-strong, var(--isis-accent)) 40%, var(--isis-border));
    background: color-mix(in srgb, var(--isis-accent-warm-strong, var(--isis-accent)) 4%, var(--isis-surface));
}
/* Ne pas faire dépasser le nom sous le bouton étoile (clipping cohérent). */
.isis-planner-palette__card-name {
    padding-right: 24px;
}
.isis-planner-palette__card-meta {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 0.25rem;
    gap: 0.3rem;
}
.isis-planner-palette__card-jh {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}
.isis-planner-palette__card-status {
    font-size: 0.7rem;
    font-weight: 600;
    padding: 1px 6px;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-soft);
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-planner-palette__card-status--danger {
    background: color-mix(in srgb, var(--isis-danger) 18%, transparent);
    color: var(--isis-danger);
}
.isis-planner-palette__card-status--warning {
    background: color-mix(in srgb, var(--isis-warning) 22%, transparent);
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
}
.isis-planner-palette__card-status--info {
    background: color-mix(in srgb, var(--isis-accent) 18%, transparent);
    color: var(--isis-accent);
}
/* Sprint V — variante OK (besoin couvert 100 %). */
.isis-planner-palette__card-status--ok {
    background: color-mix(in srgb, var(--isis-success) 18%, transparent);
    color: color-mix(in srgb, var(--isis-success) 80%, var(--isis-text));
}

/* Toggle palette (Ressources / Besoins) */
.isis-planner-palette__toggle {
    margin: 0.45rem 0 0.3rem 0;
    width: 100%;
}
.isis-planner-palette__toggle .isis-view-toggle__btn {
    flex: 1 1 0;
    justify-content: center;
    gap: 0.3rem;
}
.isis-planner-palette__toggle-count {
    margin-left: 0.3rem;
    padding: 0 0.4rem;
    font-size: 0.65rem;
    font-weight: 700;
    background: var(--isis-mod-gespla);
    color: white;
    border-radius: var(--isis-radius-pill);
    line-height: 1.4;
}

/* Sprint S5 — filtre catégorie palette (Tous / Collabs / Équips / Commandes).
   Segmented control compact placé entre la recherche et le body. */
.isis-planner-palette__cat-filter {
    margin: 0.35rem 0 0.3rem 0;
    width: 100%;
    display: flex;
    flex-wrap: wrap;
}
.isis-planner-palette__cat-filter .isis-view-toggle__btn {
    flex: 1 1 0;
    justify-content: center;
    gap: 0.25rem;
    padding: 0.3rem 0.4rem;
    font-size: 0.72rem;
    min-width: 0;
}
.isis-planner-palette__cat-filter .isis-view-toggle__btn span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-planner-palette__card-name {
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--isis-text);
}
.isis-planner-palette__card-sub {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}

/* Conteneur vis-timeline — prend toute la cellule de grille fullscreen. */
.isis-planner-host {
    width: 100%;
    height: 100%;
    min-height: 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow: hidden;
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint Y — Planner V3 (Syncfusion Scheduler)
   Conteneur dédié, état de chargement et empty state. La hauteur est gérée
   par SfSchedule lui-même (Height="100%"). On entoure d'un cadre cohérent
   avec le V2 pour transition visuelle douce entre les 2 vues.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-host {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow: hidden;
}
.isis-planner-host > .e-schedule {
    flex: 1 1 auto;
    min-height: 0;
}
.isis-planner-loader,
.isis-planner-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    padding: 3rem 1rem;
    color: var(--isis-text-muted);
    font-size: 0.9rem;
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint X port V3 — barres de mobilisation Syncfusion Scheduler
   Calque visuel du V2 vis-timeline (--isis-source-accent → --isis-resource-accent).
   Le wrapper .e-appointment est géré par Syncfusion ; on stylise le contenu interne.
   ───────────────────────────────────────────────────────────────────────── */
.e-schedule .e-appointment:has(.isis-planner-item) {
    /* Désactive intégralement le styling natif Syncfusion (fond + bordures + padding)
       qui pose la couleur de la lane et masquerait notre bordure ressource. Le style
       inline `background-color`/`border-left` posé par Syncfusion via ColorField est
       neutralisé via !important. */
    background: transparent !important;
    background-color: transparent !important;
    border: none !important;
    border-left: none !important;
    border-right: none !important;
    border-color: transparent !important;
    padding: 0 !important;
    overflow: hidden;
}
/* Syncfusion v33 a 2 wrappers internes possibles (selon vue : Day/Week/Month-Timeline)
   qui peuvent ré-injecter un padding ou un border-left coloré (bande gauche d'event). */
.e-schedule .e-appointment:has(.isis-planner-item) .e-appointment-details,
.e-schedule .e-appointment:has(.isis-planner-item) .e-inner-wrap,
.e-schedule .e-appointment:has(.isis-planner-item) .e-appointment-border-left,
.e-schedule .e-appointment:has(.isis-planner-item) .e-subject,
.e-schedule .e-appointment:has(.isis-planner-item) .e-time {
    background: transparent !important;
    border: none !important;
    border-left: none !important;
    padding: 0 !important;
    margin: 0 !important;
    width: 100% !important;
    height: 100% !important;
}
/* Si Syncfusion pose un ::before / ::after décoratif (bande gauche colorée
   « event-border-left » par exemple) sur le WRAPPER .e-appointment lui-même,
   on le masque pour que notre bande --isis-resource-accent reste la seule
   visible. Important : ne PAS cibler les pseudo-éléments des enfants — sinon
   on tuerait notre `.isis-planner-item::before` qui porte la bande. */
.e-schedule .e-appointment:has(.isis-planner-item)::before,
.e-schedule .e-appointment:has(.isis-planner-item)::after {
    display: none !important;
    content: none !important;
}
.isis-planner-item {
    container-type: inline-size;
    container-name: planner-v3-item;
    position: relative;   /* anchor du ::before bande gauche */
    width: 100%;
    height: 100%;
    min-height: 38px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 3px 6px 4px 10px;   /* padding-left 10px = 4px bande + 6px gutter */
    border-radius: 3px;
    /* Option D 2026-05-22 — 4 signaux identité ressource indépendants :
       1) Bande gauche 4 px pleine couleur (via ::before absolute pour battre
          tout override Syncfusion sur .e-appointment - les border-left CSS standard
          sont parfois recouvertes par les wrappers internes de la lib).
       2) Fond tinté color-mix 35 % (perceptible, ne masque pas le motif d'état)
       3) Outline interne 1 px couleur ressource (renforce le périmètre)
       4) Avatar initiales coloré dans __meta (signal explicite vue Jour/Semaine). */
    background: color-mix(in srgb, var(--isis-resource-accent, var(--isis-surface-soft)) 35%, var(--isis-surface));
    color: var(--isis-text);
    font-size: 0.78rem;
    line-height: 1.2;
    overflow: hidden;
    box-shadow:
        inset 0 0 0 1px color-mix(in srgb, var(--isis-resource-accent, transparent) 35%, transparent),
        0 1px 0 0 rgba(0, 0, 0, 0.04);
}
/* Bande gauche 4 px = signal d'identité ressource le plus fort. Posée en pseudo-element
   absolute (z-index 2) pour passer au-dessus de tout wrapper Syncfusion qui aurait
   son propre border-left coloré (cas vue Timeline ColorField sur la lane). */
.isis-planner-item::before {
    content: "";
    position: absolute;
    inset: 0 auto 0 0;   /* top:0 right:auto bottom:0 left:0 */
    width: 4px;
    background: var(--isis-resource-accent, var(--isis-text-muted));
    z-index: 2;
    pointer-events: none;
    border-top-left-radius: 3px;
    border-bottom-left-radius: 3px;
}
.isis-planner-item--previsionnel {
    /* Motif hachuré renforcé à 14 % pour rester perceptible sur le fond tinté ressource. */
    background-image: repeating-linear-gradient(135deg, transparent 0 6px, rgba(0,0,0,0.14) 6px 8px);
}
/* Option D — Avatar initiales coloré dans le meta (signal fort ressource).
   Calque le ResourceHeaderTemplate de la lane gauche : rond pour collab,
   carré arrondi pour équipement. */
.isis-planner-item__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 16px;
    height: 16px;
    background: var(--isis-resource-accent, var(--isis-text-muted));
    color: #fff;
    font-size: 0.58rem;
    font-weight: 700;
    line-height: 1;
    letter-spacing: -0.02em;
    /* Ombre fine + ring blanc pour ancrer l'avatar sur le fond tinté qui partage sa teinte. */
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.45), 0 1px 2px rgba(0, 0, 0, 0.15);
}
.isis-planner-item__avatar.is-collab { border-radius: 50%; }
.isis-planner-item__avatar.is-equip { border-radius: 3px; }
/* Container queries — masquer l'avatar quand le bloc devient trop étroit
   (vues Trimestre / Semestre / Année). Bordure + fond + outline restent
   les signaux d'identité ressource jusqu'en vue Année. */
@container planner-v3-item (max-width: 70px) {
    .isis-planner-item__avatar { display: none; }
}
@container planner-v3-item (max-width: 50px) {
    .isis-planner-item__duration,
    .isis-planner-item__charge { display: none; }
}
@container planner-v3-item (max-width: 30px) {
    .isis-planner-item__meta,
    .isis-planner-item__title { display: none; }
}
.isis-planner-item--realise {
    opacity: 0.85;
}
.isis-planner-item--annule {
    opacity: 0.5;
    text-decoration: line-through;
}
.isis-planner-item__meta {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 0.66rem;
    line-height: 1;
    color: var(--isis-text-muted);
    white-space: nowrap;
    min-width: 0;
}
.isis-planner-item__state {
    display: inline-flex;
    align-items: center;
    padding: 1px 4px;
    border-radius: 3px;
    font-size: 0.6rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    line-height: 1.3;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    flex-shrink: 0;
}
.isis-planner-item__state.is-previsionnel {
    background: color-mix(in srgb, var(--isis-warning) 18%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 50%, transparent);
    color: color-mix(in srgb, var(--isis-warning) 70%, var(--isis-text));
}
.isis-planner-item__state.is-ferme {
    background: color-mix(in srgb, var(--isis-mod-gespla) 20%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-mod-gespla) 55%, transparent);
    color: color-mix(in srgb, var(--isis-mod-gespla) 80%, var(--isis-text));
}
.isis-planner-item__state.is-realise {
    background: var(--isis-surface-soft);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 40%, transparent);
    color: var(--isis-success, #16a34a);
}
.isis-planner-item__state.is-annule {
    background: var(--isis-surface);
    border-color: var(--isis-border);
    color: var(--isis-danger, #dc2626);
}
.isis-planner-item__duration,
.isis-planner-item__charge {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: var(--isis-text);
    flex-shrink: 0;
}
.isis-planner-item__title {
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

/* Dégradation responsive selon la largeur (container queries) */
@container planner-v3-item (max-width: 150px) {
    .isis-planner-item__duration,
    .isis-planner-item__charge { display: none; }
}
@container planner-v3-item (max-width: 80px) {
    .isis-planner-item__title { display: none; }
}
@container planner-v3-item (max-width: 50px) {
    .isis-planner-item__state { display: none; }
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint X port V3 — labels de lanes ressources (ResourceHeaderTemplate)
   Avatar initiales coloré stable (rond=collab, carré arrondi=équipement)
   + nom à droite avec ellipsis.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-lane {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 4px 8px;
    width: 100%;
    height: 100%;
    min-width: 0;
}
.isis-planner-lane__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    color: #fff;
    font-weight: 700;
    font-size: 0.82rem;
    line-height: 1;
    letter-spacing: 0.02em;
    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.4) inset;
    user-select: none;
}
.isis-planner-lane__avatar.is-collab {
    border-radius: 50%;                /* rond pour personne */
}
.isis-planner-lane__avatar.is-equip {
    border-radius: 4px;                /* carré arrondi pour équipement */
}
.isis-planner-lane__avatar.is-cmd {
    border-radius: 2px;                /* carré net pour commande source */
    /* Z2.3 — avatar commande : utilise une forme "tag/document" distincte */
}
.isis-planner-lane__avatar.is-ent {
    border-radius: 0;                  /* carré pur pour entreprise */
}

/* Z2.3 — badge "N à couvrir" sur lanes commande de la vue Par commande */
.isis-planner-lane__badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-left: auto;
    padding: 2px 6px;
    background: color-mix(in srgb, var(--isis-warning) 18%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-warning) 50%, transparent);
    color: color-mix(in srgb, var(--isis-warning) 75%, var(--isis-text));
    border-radius: 4px;
    font-size: 0.72rem;
    font-weight: 700;
    line-height: 1.2;
    text-decoration: none;
    flex-shrink: 0;
    transition: background 120ms ease;
}
.isis-planner-lane__badge:hover {
    background: color-mix(in srgb, var(--isis-warning) 28%, var(--isis-surface));
}
.isis-planner-lane__badge-label {
    font-weight: 500;
    font-size: 0.66rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    opacity: 0.85;
}

/* Sprint AB3 — Badge compteur sur bouton « Que faire ? » + dialog associé */
.isis-rich-toolbar__btn.is-actions-btn {
    position: relative;
    background: color-mix(in srgb, var(--isis-mod-gespla) 14%, var(--isis-surface));
    border-color: var(--isis-mod-gespla);
    color: color-mix(in srgb, var(--isis-mod-gespla) 80%, var(--isis-text));
    font-weight: 600;
}
.isis-rich-toolbar__btn-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    background: var(--isis-danger);
    color: #fff;
    border-radius: 9px;
    font-size: 0.7rem;
    font-weight: 700;
    margin-left: 4px;
}

.isis-planner-actions {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    min-width: 600px;
}
.isis-planner-actions__hint {
    margin: 0;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-planner-actions__section {
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow: hidden;
}
.isis-planner-actions__group {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    font-weight: 600;
    font-size: 0.85rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-planner-actions__group.is-danger {
    background: color-mix(in srgb, var(--isis-danger) 12%, var(--isis-surface));
    color: var(--isis-danger);
    border-left: 3px solid var(--isis-danger);
}
.isis-planner-actions__group.is-warning {
    background: color-mix(in srgb, var(--isis-warning) 14%, var(--isis-surface));
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
    border-left: 3px solid var(--isis-warning);
}
.isis-planner-actions__group.is-info {
    background: color-mix(in srgb, var(--isis-mod-gespla) 10%, var(--isis-surface));
    color: var(--isis-mod-gespla);
    border-left: 3px solid var(--isis-mod-gespla);
}
.isis-planner-actions__group-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-planner-actions__group-title {
    flex: 1 1 auto;
}
.isis-planner-actions__group-count {
    background: var(--isis-surface);
    border: 1px solid currentColor;
    padding: 1px 8px;
    border-radius: 10px;
    font-size: 0.72rem;
    font-weight: 700;
}
/* Sprint AB4 — bouton bulk dans le header de groupe (Tout matérialiser, etc.) */
.isis-planner-actions__bulk-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 3px 10px;
    border-radius: 6px;
    background: currentColor;
    color: var(--isis-surface);
    border: none;
    font-size: 0.75rem;
    font-weight: 600;
    cursor: pointer;
    margin-left: auto;
    transition: filter 0.12s ease, transform 0.08s ease;
}
.isis-planner-actions__bulk-btn:hover { filter: brightness(0.92); }
.isis-planner-actions__bulk-btn:active { transform: translateY(1px); }
.isis-planner-actions__bulk-btn:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
}
.isis-planner-actions__bulk-btn .rz-icon {
    color: var(--isis-surface) !important;
}
/* Quand le bulk-btn est présent, on retire le margin-left auto sur le count */
.isis-planner-actions__group:has(.isis-planner-actions__bulk-btn) .isis-planner-actions__group-count {
    margin-left: 0;
}
.isis-planner-actions__list {
    display: flex;
    flex-direction: column;
}
.isis-planner-actions__item {
    display: grid;
    grid-template-columns: 1fr auto 14px;
    gap: 0.5rem;
    align-items: center;
    padding: 0.45rem 0.75rem;
    background: var(--isis-surface);
    border: none;
    border-bottom: 1px solid color-mix(in srgb, var(--isis-border) 60%, transparent);
    cursor: pointer;
    text-align: left;
    transition: background 100ms ease;
}
.isis-planner-actions__item:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 6%, var(--isis-surface));
}
.isis-planner-actions__item-label {
    font-weight: 600;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-planner-actions__item-sub {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
}

/* V1.1 — Wrapper de toolbar fusionnée : filtres (gauche) + séparateur vertical + KPIs (droite).
   Une seule card visuelle qui regroupe les 2 outils de pilotage. */
.isis-planner-toolbar-merged {
    display: flex;
    align-items: stretch;
    flex-wrap: wrap;
    gap: 0.75rem;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-mod-gespla);
    border-radius: 6px;
    margin-bottom: 0.5rem;
}
/* Section filtres dans la toolbar fusionnée — transparente (le wrapper porte le fond) */
.isis-planner-toolbar-merged > .isis-planner-search {
    flex: 1 1 480px;
    background: transparent;
    border: none;
    border-left: none;
    border-radius: 0;
    padding: 0;
    margin: 0;
}
/* Section KPIs dans la toolbar fusionnée — séparateur vertical à gauche */
.isis-planner-toolbar-merged > .isis-planner-kpis {
    flex: 0 1 auto;
    background: transparent;
    border: none;
    border-radius: 0;
    border-left: 1px solid var(--isis-border);
    padding: 0 0 0 0.75rem;
    margin: 0;
}
@media (max-width: 900px) {
    /* Sur écran étroit, le séparateur vertical devient horizontal (les sections s'empilent). */
    .isis-planner-toolbar-merged > .isis-planner-kpis {
        border-left: none;
        border-top: 1px solid var(--isis-border);
        padding: 0.5rem 0 0 0;
        flex-basis: 100%;
    }
}

/* V1.1 — Bandeau recherche multi-select (standalone — non utilisé si toolbar fusionnée).
   Gardé pour back-compat si on veut décomposer plus tard. */
.isis-planner-search {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-mod-gespla);
    border-radius: 6px;
    margin-bottom: 0.5rem;
}
.isis-planner-search__label {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    letter-spacing: 0.02em;
}
.isis-planner-search__clear {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-warning) 40%, transparent);
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
    border-radius: 4px;
    font-size: 0.78rem;
    font-weight: 600;
    cursor: pointer;
    transition: background 120ms ease;
}
.isis-planner-search__clear:hover {
    background: color-mix(in srgb, var(--isis-warning) 22%, var(--isis-surface));
}
.isis-planner-search__count {
    margin-left: auto;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* Sprint AA6 — Bandeau KPIs synthèse en tête du planner V3 */
.isis-planner-kpis {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    margin-bottom: 0.5rem;
}
.isis-planner-kpi {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-width: 70px;
    padding: 4px 12px;
    border-radius: 4px;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
}
.isis-planner-kpi__value {
    font-size: 1.2rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-planner-kpi__label {
    font-size: 0.66rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-top: 1px;
}
.isis-planner-kpi.is-kind-ferme {
    background: color-mix(in srgb, var(--isis-mod-gespla) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-mod-gespla) 40%, transparent);
}
.isis-planner-kpi.is-kind-ferme .isis-planner-kpi__value {
    color: color-mix(in srgb, var(--isis-mod-gespla) 80%, var(--isis-text));
}
.isis-planner-kpi.is-kind-previ {
    background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 40%, transparent);
}
.isis-planner-kpi.is-kind-previ .isis-planner-kpi__value {
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
}
.isis-planner-kpi.is-priority-high {
    background: color-mix(in srgb, var(--isis-danger) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-danger) 40%, transparent);
}
.isis-planner-kpi.is-priority-high .isis-planner-kpi__value {
    color: var(--isis-danger);
}
.isis-planner-kpi.is-priority-medium {
    background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 40%, transparent);
}
.isis-planner-kpi.is-danger,
.isis-planner-kpi.is-conflict {
    background: color-mix(in srgb, var(--isis-danger) 8%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-danger) 30%, transparent);
}
.isis-planner-kpi.is-danger .isis-planner-kpi__value,
.isis-planner-kpi.is-conflict .isis-planner-kpi__value {
    color: var(--isis-danger);
}

/* Sprint AA — différenciation FERME/PRÉVISIONNELLE + priorité sur lanes commande */
.isis-planner-lane.is-kind-ferme {
    /* Bordure gauche teal pleine = engagement confirmé */
    box-shadow: inset 4px 0 0 0 color-mix(in srgb, var(--isis-mod-gespla) 70%, transparent);
}
.isis-planner-lane.is-kind-previ {
    /* Bordure gauche orange hachurée = prévisionnel (pas encore engagé) */
    box-shadow: inset 4px 0 0 0 var(--isis-warning);
    background-image: repeating-linear-gradient(
        135deg,
        transparent 0 6px,
        color-mix(in srgb, var(--isis-warning) 8%, transparent) 6px 8px);
}
.isis-planner-lane.is-priority-high {
    /* Priorité URGENT : halo rouge + pulse subtil */
    box-shadow:
        inset 4px 0 0 0 var(--isis-danger),
        0 0 0 1px color-mix(in srgb, var(--isis-danger) 40%, transparent);
    animation: isis-priority-pulse 2.5s ease-in-out infinite;
}
.isis-planner-lane.is-priority-medium {
    box-shadow: inset 4px 0 0 0 var(--isis-warning);
}
@keyframes isis-priority-pulse {
    0%, 100% { background-color: transparent; }
    50%      { background-color: color-mix(in srgb, var(--isis-danger) 5%, transparent); }
}
@media (prefers-reduced-motion: reduce) {
    .isis-planner-lane.is-priority-high { animation: none; }
}

/* Chip kind PRÉVI orange */
.isis-planner-lane__chip {
    display: inline-flex;
    align-items: center;
    padding: 1px 6px;
    border-radius: 3px;
    font-size: 0.62rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    background: var(--isis-surface-soft);
    color: var(--isis-text-muted);
    border: 1px solid var(--isis-border);
    flex-shrink: 0;
    margin-left: 6px;
}
.isis-planner-lane__chip.is-previ {
    background: color-mix(in srgb, var(--isis-warning) 20%, var(--isis-surface));
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
    border-color: color-mix(in srgb, var(--isis-warning) 50%, transparent);
}
/* Chips statut commande — couleurs sémantiques */
.isis-planner-lane__chip.is-statut-en-cours,
.isis-planner-lane__chip.is-statut-a-livrer,
.isis-planner-lane__chip.is-statut-a-valider {
    background: color-mix(in srgb, var(--isis-mod-gespla) 18%, var(--isis-surface));
    color: color-mix(in srgb, var(--isis-mod-gespla) 80%, var(--isis-text));
    border-color: color-mix(in srgb, var(--isis-mod-gespla) 50%, transparent);
}
.isis-planner-lane__chip.is-statut-a-facturer,
.isis-planner-lane__chip.is-statut-a-cloturer,
.isis-planner-lane__chip.is-statut-termine {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 40%, transparent);
}
.isis-planner-lane__chip.is-statut-cloturee {
    background: var(--isis-surface-soft);
    color: var(--isis-text-muted);
    text-decoration: line-through;
}
.isis-planner-lane__chip.is-statut-annulee {
    background: color-mix(in srgb, var(--isis-danger) 14%, var(--isis-surface));
    color: var(--isis-danger);
    text-decoration: line-through;
}

/* Icône conflit + badge priorité */
.isis-planner-lane__conflict-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    color: var(--isis-danger);
    flex-shrink: 0;
    margin-left: 4px;
}
.isis-planner-lane__priority {
    display: inline-flex;
    align-items: center;
    padding: 1px 6px;
    border-radius: 3px;
    font-size: 0.6rem;
    font-weight: 800;
    letter-spacing: 0.04em;
    color: #fff;
    flex-shrink: 0;
    margin-left: 4px;
}
.isis-planner-lane__priority.is-high   { background: var(--isis-danger); }
.isis-planner-lane__priority.is-medium { background: var(--isis-warning); color: var(--isis-text); }

/* AA5 V1.1 — Strip compétences requises sur lane commande */
.isis-planner-lane__competences {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    margin-left: 6px;
    flex-shrink: 1;
    overflow: hidden;
    cursor: help;
}
.isis-planner-lane__competence-chip {
    display: inline-flex;
    align-items: center;
    padding: 1px 5px;
    background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface));
    color: color-mix(in srgb, var(--isis-accent) 80%, var(--isis-text));
    border: 1px solid color-mix(in srgb, var(--isis-accent) 35%, transparent);
    border-radius: 3px;
    font-size: 0.6rem;
    font-weight: 600;
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 110px;
}
.isis-planner-lane__competence-more {
    font-size: 0.62rem;
    font-weight: 700;
    color: var(--isis-text-muted);
    padding: 1px 4px;
    background: var(--isis-surface-soft);
    border-radius: 3px;
    border: 1px solid var(--isis-border);
}

/* Sprint AC4 — bouton Matérialiser sur lane commande PRÉVISIONNELLE */
.isis-planner-lane__materialize-btn {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 2px 6px;
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
    border: 1px solid color-mix(in srgb, var(--isis-success, #16a34a) 50%, transparent);
    border-radius: 3px;
    font-size: 0.66rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    cursor: pointer;
    transition: background 120ms ease;
    margin-left: 4px;
    flex-shrink: 0;
}
.isis-planner-lane__materialize-btn:hover {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 22%, var(--isis-surface));
}
.isis-planner-lane__materialize-btn:focus-visible {
    outline: 2px solid var(--isis-success, #16a34a);
    outline-offset: 1px;
}

/* Bouton + Mobiliser direct sur la lane commande (vue Par commande) */
.isis-planner-lane__mobilize-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-left: auto;
    padding: 0;
    width: 24px;
    height: 24px;
    background: var(--isis-mod-gespla);
    color: #fff;
    border: none;
    border-radius: 50%;
    cursor: pointer;
    flex-shrink: 0;
    transition: transform 120ms ease, background 120ms ease;
}
.isis-planner-lane__mobilize-btn:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 85%, #000);
    transform: scale(1.08);
}
.isis-planner-lane__mobilize-btn:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 2px;
}
/* Quand le bouton mobilize est présent à côté du badge, retirer margin-left auto
   du badge — il suit naturellement le bouton. */
.isis-planner-lane__mobilize-btn + .isis-planner-lane__badge {
    margin-left: 4px;
}

/* Mini-dialog BesoinPickerDialog — liste des besoins non-couverts à mobiliser */
.isis-besoin-picker {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 500px;
}
.isis-besoin-picker__loader {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 1.5rem 1rem;
    color: var(--isis-text-muted);
}
.isis-besoin-picker__hint {
    margin: 0;
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-besoin-picker__list {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    max-height: 50vh;
    overflow-y: auto;
}
.isis-besoin-picker__item {
    display: grid;
    grid-template-columns: 12px 1fr auto auto 18px;
    gap: 0.6rem;
    align-items: center;
    padding: 0.55rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    cursor: pointer;
    text-align: left;
    transition: background 100ms ease, border-color 100ms ease;
}
.isis-besoin-picker__item:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 6%, var(--isis-surface));
    border-color: var(--isis-mod-gespla);
}
.isis-besoin-picker__item:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
.isis-besoin-picker__profil {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-besoin-picker__charge {
    font-variant-numeric: tabular-nums;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-besoin-picker__status {
    padding: 2px 6px;
    border-radius: 3px;
    font-size: 0.66rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.isis-besoin-picker__status.is-danger {
    background: color-mix(in srgb, var(--isis-danger) 18%, var(--isis-surface));
    color: var(--isis-danger);
}
.isis-besoin-picker__status.is-warning {
    background: color-mix(in srgb, var(--isis-warning) 18%, var(--isis-surface));
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text));
}

/* ─────────────────────────────────────────────────────────────────────────
   Marquage visuel du jour courant sur SfSchedule (TimelineDay/Week/Month).
   Syncfusion ajoute la classe `.e-current-day` aux header cells + work cells
   de la colonne du jour courant. On renforce avec un fond teinté module
   gespla + bordure top épaisse + label gras dans le header.
   La ligne verticale `.e-current-time-indicator` est aussi colorée.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-schedule .e-schedule-table .e-header-row .e-current-day,
.isis-planner-schedule .e-date-header-container .e-current-day,
.isis-planner-schedule .e-date-header-wrap .e-current-day {
    background: color-mix(in srgb, var(--isis-mod-gespla) 18%, var(--isis-surface)) !important;
    color: var(--isis-mod-gespla) !important;
    font-weight: 700 !important;
    border-top: 3px solid var(--isis-mod-gespla) !important;
    position: relative;
}
.isis-planner-schedule .e-date-header-wrap .e-current-day::after,
.isis-planner-schedule .e-date-header-container .e-current-day::after {
    content: "Auj.";
    position: absolute;
    bottom: 2px;
    left: 50%;
    transform: translateX(-50%);
    font-size: 0.6rem;
    font-weight: 700;
    color: var(--isis-mod-gespla);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    opacity: 0.85;
}
/* Colonne du jour courant côté work cells (fond timeline) — teinte marquée
   sur toute la hauteur de la lane. Visible mais sans masquer les events. */
.isis-planner-schedule .e-content-wrap .e-work-cells.e-current-day,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.e-current-day,
.isis-planner-schedule .e-schedule-table .e-work-cells.e-current-day {
    background: color-mix(in srgb, var(--isis-mod-gespla) 15%, var(--isis-surface)) !important;
    box-shadow:
        inset 3px 0 0 0 var(--isis-mod-gespla),
        inset -1px 0 0 0 color-mix(in srgb, var(--isis-mod-gespla) 40%, transparent);
}

/* ─────────────────────────────────────────────────────────────────────────
   Jours fériés — la classe `isis-planner-holiday` est injectée par
   OnRenderCell sur header dates ET work cells body de la colonne fériée.
   Fond pastel orange (warning) qui se distingue du teal aujourd'hui.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-schedule .e-date-header-wrap .isis-planner-holiday,
.isis-planner-schedule .e-date-header-container .isis-planner-holiday {
    background: color-mix(in srgb, var(--isis-warning) 20%, var(--isis-surface)) !important;
    color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text)) !important;
    font-weight: 600 !important;
    border-top: 2px solid color-mix(in srgb, var(--isis-warning) 70%, transparent) !important;
}
.isis-planner-schedule .e-content-wrap .e-work-cells.isis-planner-holiday,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.isis-planner-holiday {
    background: color-mix(in srgb, var(--isis-warning) 10%, var(--isis-surface)) !important;
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0 8px,
        color-mix(in srgb, var(--isis-warning) 8%, transparent) 8px 10px) !important;
}
/* Combo aujourd'hui + férié : aujourd'hui prime (fond couleur module), l'orange
   férié transparaît en rayures diagonales par-dessus. Bug 2026-05-22 corrigé : le
   sélecteur original était un compound (`.isis-planner-schedule.isis-planner-holiday.e-current-day`)
   qui matchait l'élément racine porteur des 3 classes — jamais le cas en pratique.
   Le bon sélecteur est descendant (cellule enfant porteuse des 2 classes). */
.isis-planner-schedule .isis-planner-holiday.e-current-day {
    background: color-mix(in srgb, var(--isis-mod-gespla) 15%, var(--isis-surface)) !important;
    background-image: repeating-linear-gradient(
        45deg,
        transparent 0 8px,
        color-mix(in srgb, var(--isis-warning) 18%, transparent) 8px 10px) !important;
}
/* ── Sprint 4 — Heatmap capacité tenant ──────────────────────────────────────
   Bande de couleur sur chaque cellule jour qui reflète la charge moyenne
   tenant (somme charge_pct FERME+REALISE collabs / N collabs).
   4 paliers : cool (sous-utilisé) / low (normal) / warning (proche saturation) /
   high (surcharge). Couleurs très diluées pour ne pas masquer les events.
   Posés sur les work-cells (body) + le header date — le selector ne touche pas
   les events eux-mêmes (e-appointment) qui gardent leur couleur ressource. */
.isis-planner-schedule .e-date-header-wrap .isis-planner-heat--cool,
.isis-planner-schedule .e-date-header-container .isis-planner-heat--cool,
.isis-planner-schedule .e-content-wrap .e-work-cells.isis-planner-heat--cool,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.isis-planner-heat--cool {
    background-color: color-mix(in srgb, var(--isis-info, #3b82f6) 4%, transparent);
}
.isis-planner-schedule .e-date-header-wrap .isis-planner-heat--low,
.isis-planner-schedule .e-date-header-container .isis-planner-heat--low,
.isis-planner-schedule .e-content-wrap .e-work-cells.isis-planner-heat--low,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.isis-planner-heat--low {
    background-color: color-mix(in srgb, var(--isis-success, #10b981) 4%, transparent);
}
.isis-planner-schedule .e-date-header-wrap .isis-planner-heat--warning,
.isis-planner-schedule .e-date-header-container .isis-planner-heat--warning,
.isis-planner-schedule .e-content-wrap .e-work-cells.isis-planner-heat--warning,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.isis-planner-heat--warning {
    background-color: color-mix(in srgb, var(--isis-warning) 8%, transparent);
}
.isis-planner-schedule .e-date-header-wrap .isis-planner-heat--high,
.isis-planner-schedule .e-date-header-container .isis-planner-heat--high,
.isis-planner-schedule .e-content-wrap .e-work-cells.isis-planner-heat--high,
.isis-planner-schedule .e-content-wrap .e-alternate-cells.isis-planner-heat--high {
    background-color: color-mix(in srgb, var(--isis-danger) 10%, transparent);
}

/* Sprint 4 a11y — Légende heatmap (correctif B1 audit accessibility-tester
   2026-05-22). Alternative textuelle au code couleur seul, posée sous le
   Scheduler. role="note" + aria-label complet sur le conteneur, aria-hidden
   sur les swatches purement décoratifs (le texte adjacent décrit le palier). */

/* Sprint 1.1 2026-05-23 — hint discret sous le scheduler en vue ByCommande pour
   signaler que le drag vertical réaffecte une mob à une autre commande. */
.isis-planner-drag-hint {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.75rem;
    margin-top: 0.5rem;
    background: color-mix(in srgb, var(--isis-mod-gespla) 8%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-mod-gespla) 25%, var(--isis-border));
    border-left: 3px solid var(--isis-mod-gespla);
    border-radius: 6px;
    font-size: 0.78rem;
    color: var(--isis-text);
}
.isis-planner-drag-hint > .rz-icon {
    color: var(--isis-mod-gespla);
    flex-shrink: 0;
}
.isis-planner-drag-hint strong {
    font-weight: 600;
    color: color-mix(in srgb, var(--isis-mod-gespla) 70%, var(--isis-text));
}

.isis-planner-heat-legend {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.85rem;
    padding: 0.45rem 0.75rem;
    margin-top: 0.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-planner-heat-legend__label {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-planner-heat-legend__item {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
}
.isis-planner-heat-legend__swatch {
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 3px;
    border: 1px solid var(--isis-border);
    /* Anneau intérieur léger pour le contraste daltoniens — distingue les
       swatches même si la couleur de fond est très diluée (4-10 %). */
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.06);
}
/* Les variantes --cool/--low/--warning/--high réutilisent le background-color
   déjà défini sur les cellules Scheduler, mais sans les sélecteurs descendants
   (.e-date-header-wrap etc.). Pour que le swatch porte la même teinte, on
   redéfinit chaque variante directement sur la classe combinée. */
.isis-planner-heat-legend__swatch.isis-planner-heat--cool {
    background-color: color-mix(in srgb, var(--isis-info, #3b82f6) 30%, var(--isis-surface));
}
.isis-planner-heat-legend__swatch.isis-planner-heat--low {
    background-color: color-mix(in srgb, var(--isis-success, #10b981) 30%, var(--isis-surface));
}
.isis-planner-heat-legend__swatch.isis-planner-heat--warning {
    background-color: color-mix(in srgb, var(--isis-warning) 35%, var(--isis-surface));
}
.isis-planner-heat-legend__swatch.isis-planner-heat--high {
    background-color: color-mix(in srgb, var(--isis-danger) 40%, var(--isis-surface));
}
/* Combinaison heatmap + jour férié : férié (orange rayé) prime visuellement,
   mais on garde le ton heatmap en dessous. Pas de surcharge spécifique nécessaire
   tant que les opacités restent < 15 % (cumul reste lisible). */

/* ── Sprint 3 V1.3 — Bandeau persistant scénario brouillon actif ────────────
   Couleur violet pastel pour différencier sans ambiguïté du mode prod (couleur
   module gespla teal). Pose le contexte « what-if » dès que l'utilisateur active
   un scénario depuis le dialog Scénarios. */
.isis-scenario-banner {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    padding: 0.65rem 1rem;
    margin-bottom: 0.5rem;
    background: color-mix(in srgb, #8b5cf6 8%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, #8b5cf6 35%, var(--isis-border));
    border-left: 3px solid #8b5cf6;
    border-radius: 6px;
    color: var(--isis-text);
    font-size: 0.85rem;
    /* Halo subtil pour ancrer visuellement le mode actif */
    box-shadow: 0 1px 3px color-mix(in srgb, #8b5cf6 18%, transparent);
}
.isis-scenario-banner > .rz-icon {
    color: #8b5cf6;
    flex-shrink: 0;
}
.isis-scenario-banner__text {
    flex: 1 1 auto;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    min-width: 0;
}
.isis-scenario-banner__text strong {
    color: color-mix(in srgb, #8b5cf6 70%, var(--isis-text));
    font-weight: 700;
}
.isis-scenario-banner__name {
    font-style: italic;
    color: var(--isis-text);
}
.isis-scenario-banner__meta {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
}
.isis-scenario-banner__actions {
    display: flex;
    gap: 0.4rem;
    flex-shrink: 0;
}

/* Pastille sur le bouton « Scénarios » toolbar quand un scénario est actif */
.isis-rich-toolbar__btn-dot {
    display: inline-block;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #8b5cf6;
    margin-left: 0.25rem;
}

/* ── Dialog gestion des scénarios ────────────────────────────────────────── */
.isis-scenario-mgmt {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    min-height: 200px;
}
.isis-scenario-mgmt__toolbar {
    display: flex;
    justify-content: flex-end;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-scenario-mgmt__section {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-scenario-mgmt__section-title {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0;
    padding: 0.25rem 0;
    font-size: 0.82rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: var(--isis-text-muted);
}
.isis-scenario-mgmt__section-count {
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    padding: 0 8px;
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--isis-text);
}
.isis-scenario-mgmt__list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.isis-scenario-mgmt__item {
    display: flex;
    align-items: stretch;
    gap: 0.35rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    transition: background-color 0.12s ease, border-color 0.12s ease;
}
.isis-scenario-mgmt__item:hover {
    background: var(--isis-surface-alt);
    border-color: color-mix(in srgb, #8b5cf6 30%, var(--isis-border));
}
.isis-scenario-mgmt__item.is-archived {
    background: var(--isis-surface-alt);
    opacity: 0.85;
}
.isis-scenario-mgmt__item.is-archived:hover {
    background: var(--isis-surface-alt);
    border-color: var(--isis-border);
    cursor: default;
}
.isis-scenario-mgmt__item-main {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.25rem;
    padding: 0.6rem 0.75rem;
    text-align: left;
    background: transparent;
    border: none;
    font: inherit;
    color: inherit;
    cursor: pointer;
    width: 100%;
}
.isis-scenario-mgmt__item.is-archived .isis-scenario-mgmt__item-main {
    cursor: default;
}
.isis-scenario-mgmt__item-main:focus-visible {
    outline: 2px solid color-mix(in srgb, #8b5cf6 60%, transparent);
    outline-offset: -1px;
    border-radius: 6px;
}
.isis-scenario-mgmt__item-name {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-scenario-mgmt__item-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-scenario-mgmt__item-source {
    font-weight: 500;
    color: var(--isis-text);
}
.isis-scenario-mgmt__item-action {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    background: transparent;
    border: none;
    color: var(--isis-text-muted);
    cursor: pointer;
    border-radius: 6px;
    transition: background-color 0.12s ease, color 0.12s ease;
}
.isis-scenario-mgmt__item-action:hover {
    background: color-mix(in srgb, var(--isis-danger) 12%, transparent);
    color: var(--isis-danger);
}
.isis-scenario-mgmt__item-action:focus-visible {
    outline: 2px solid var(--isis-danger);
    outline-offset: -2px;
}

/* Ligne verticale d'indicateur de temps (Syncfusion natif, défaut rouge). */
.isis-planner-schedule .e-current-time-indicator,
.isis-planner-schedule .e-current-time {
    background-color: var(--isis-mod-gespla) !important;
    color: var(--isis-mod-gespla) !important;
    z-index: 2;
}
.isis-planner-lane__name {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.82rem;
    font-weight: 500;
    color: var(--isis-text);
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint A port V3 — layout 2 colonnes (timeline + sidepanel détail à droite)
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-layout {
    position: relative;
    display: flex;
    flex: 1 1 auto;
    min-height: 0;
    gap: 1rem;
}
.isis-planner-layout .isis-planner-host {
    flex: 1 1 auto;
}
.isis-planner-detail {
    flex: 0 0 360px;
    display: flex;
    flex-direction: column;
    min-height: 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    overflow: hidden;
    box-shadow:
        0 12px 28px -8px rgba(15, 23, 42, 0.22),
        0 6px 12px -6px rgba(15, 23, 42, 0.14);
    animation: isis-planner-detail-pop 160ms ease-out;
}
@keyframes isis-planner-detail-pop {
    from { opacity: 0; transform: translateX(8px); }
    to   { opacity: 1; transform: translateX(0); }
}
@media (prefers-reduced-motion: reduce) {
    .isis-planner-detail { animation: none; }
}
@media (max-width: 1100px) {
    /* Viewport étroit : sidepanel passe en bas. */
    .isis-planner-layout { flex-direction: column; }
    .isis-planner-detail { flex: 0 0 auto; max-height: 50vh; }
}

/* Sprint AE V3 — mode plein écran : cache les blocs non-essentiels pour maximiser
   la timeline. La toolbar top reste visible pour exposer le toggle inverse et les
   autres actions (filtres vue, vues, exports). */
.isis-rich-page.is-planner-fullscreen .isis-rich-header,
.isis-rich-page.is-planner-fullscreen .isis-planner-toolbar-merged {
    display: none !important;
}
.isis-rich-page.is-planner-fullscreen .isis-planner-detail {
    /* Le sidepanel est déjà fermé via _selectedEvent=null à l'entrée du mode, mais
       garde-fou si un futur dev oublie le reset côté C#. */
    display: none !important;
}
.isis-rich-page.is-planner-fullscreen .isis-planner-host {
    /* Plus d'espace dispo vertical — le Scheduler autosize via EnableAutoRowHeight. */
    flex: 1 1 auto;
    min-height: 0;
}
.isis-planner-detail__head {
    padding: 0.75rem 0.85rem;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface-soft);
    border-left: 3px solid var(--isis-resource-accent, var(--isis-mod-gespla));
    flex-shrink: 0;
}
.isis-planner-detail__title-row {
    display: flex;
    justify-content: space-between;
    align-items: start;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.isis-planner-detail__title {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}
.isis-planner-detail__close {
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
    color: var(--isis-text-muted);
    cursor: pointer;
    height: 24px;
    width: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-planner-detail__close:hover {
    background: var(--isis-surface);
    border-color: var(--isis-border);
    color: var(--isis-text);
}
.isis-planner-detail__badges {
    display: flex;
    gap: 0.4rem;
    flex-wrap: wrap;
}
.isis-planner-detail__body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0.75rem 0.85rem;
}
.isis-planner-detail__facts {
    display: grid;
    grid-template-columns: 110px 1fr;
    gap: 0.45rem 0.6rem;
    margin: 0;
}
.isis-planner-detail__facts dt {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 600;
    align-self: center;
}
.isis-planner-detail__facts dd {
    margin: 0;
    font-size: 0.85rem;
    color: var(--isis-text);
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
}
.isis-planner-detail__hint {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
}
.isis-planner-detail__id {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-planner-detail__footer {
    padding: 0.6rem 0.85rem;
    border-top: 1px solid var(--isis-border);
    background: var(--isis-surface-soft);
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    flex-shrink: 0;
}

/* V1.1 — sections sidepanel enrichi */
.isis-planner-detail__section {
    padding: 0.6rem 0;
    border-bottom: 1px solid color-mix(in srgb, var(--isis-border) 60%, transparent);
}
.isis-planner-detail__section:last-of-type {
    border-bottom: none;
}
.isis-planner-detail__section.is-danger {
    background: color-mix(in srgb, var(--isis-danger) 6%, transparent);
    border-left: 3px solid var(--isis-danger);
    padding-left: 0.6rem;
    margin: 0.4rem -0.85rem 0.4rem -0.85rem;
}
.isis-planner-detail__section.is-info {
    background: color-mix(in srgb, var(--isis-mod-gespla) 5%, transparent);
    border-left: 3px solid var(--isis-mod-gespla);
    padding-left: 0.6rem;
    margin: 0.4rem -0.85rem 0.4rem -0.85rem;
}
.isis-planner-detail__section.is-meta {
    font-size: 0.78rem;
    opacity: 0.85;
}
.isis-planner-detail__section-title {
    margin: 0 0 0.4rem 0;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 600;
}
.isis-planner-detail__ressource {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}
.isis-planner-detail__ressource-name {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-planner-detail__ressource-type {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-planner-detail__linked {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.85rem;
    color: var(--isis-text);
    margin-bottom: 0.3rem;
}
.isis-planner-detail__notes {
    margin: 0;
    font-size: 0.85rem;
    color: var(--isis-text);
    white-space: pre-wrap;
    font-style: italic;
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint Z1 — CandidatePickerDialog : liste candidats scorés pour mobiliser
   une ressource sur un besoin de commande.
   ───────────────────────────────────────────────────────────────────────── */
.isis-candidate-picker {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 720px;
}
.isis-candidate-picker__loader {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-muted);
}
.isis-candidate-picker__header {
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    border-left: 3px solid var(--isis-mod-gespla);
}
.isis-candidate-picker__context {
    font-size: 0.9rem;
}
.isis-candidate-picker__hint {
    color: var(--isis-text-muted);
    font-size: 0.82rem;
}
.isis-candidate-picker__filters {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
}
.isis-candidate-picker__filter-label {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
}
.isis-candidate-picker__distance-filter {
    display: flex;
    align-items: center;
    gap: 0.3rem;
}
.isis-candidate-picker__filler {
    flex: 1 1 auto;
}
.isis-candidate-picker__count {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-grid--candidate-picker {
    --grid-cols: 32px 1fr 70px 70px 80px 80px 44px;
}
.isis-grid--candidate-picker .isis-grid__head,
.isis-grid--candidate-picker .isis-grid__row {
    display: grid;
    grid-template-columns: var(--grid-cols);
    gap: 0.5rem;
    padding: 0.4rem 0.6rem;
    align-items: center;
}
.isis-grid--candidate-picker .isis-grid__head {
    position: sticky;
    top: 0;
    background: var(--isis-surface);
    border-bottom: 1px solid var(--isis-border);
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    z-index: 1;
}
.isis-grid--candidate-picker .isis-grid__row {
    border-bottom: 1px solid color-mix(in srgb, var(--isis-border) 60%, transparent);
    transition: background 100ms ease;
}
.isis-grid--candidate-picker .isis-grid__row:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 6%, var(--isis-surface));
}
.isis-grid--candidate-picker .isis-grid__row.is-disqualified {
    opacity: 0.55;
    background: repeating-linear-gradient(
        135deg,
        transparent 0 6px,
        color-mix(in srgb, var(--isis-danger) 6%, transparent) 6px 8px);
}
.isis-candidate-picker__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    color: #fff;
    font-weight: 700;
    font-size: 0.66rem;
    letter-spacing: 0.02em;
    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.4) inset;
}
.isis-candidate-picker__avatar.is-collab { border-radius: 50%; }
.isis-candidate-picker__avatar.is-equip  { border-radius: 4px; }
.isis-candidate-picker__name {
    font-weight: 600;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-candidate-picker__missing {
    margin-top: 2px;
    font-size: 0.72rem;
    color: var(--isis-danger);
    display: inline-flex;
    align-items: center;
    gap: 3px;
}
.isis-grid--candidate-picker {
    max-height: 50vh;
    overflow-y: auto;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}

/* Z2.2 — Mob couplée : section toggle + liste équipements embarqués */
.isis-candidate-picker__coupled {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
}
.isis-candidate-picker__coupled-list {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}
.isis-candidate-picker__coupled-item {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.25rem 0.5rem 0.25rem 0.35rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    font-size: 0.82rem;
    cursor: pointer;
    transition: background 100ms ease;
}
.isis-candidate-picker__coupled-item:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 8%, var(--isis-surface));
}
.isis-candidate-picker__coupled-item.is-disabled {
    opacity: 0.55;
    cursor: not-allowed;
}
.isis-candidate-picker__coupled-item input[type="checkbox"] {
    margin: 0;
}

/* ─────────────────────────────────────────────────────────────────────────
   Sidepanel droit détail + édition inline (Sprint A)
   Sprint N+ — Passage en overlay flottant : ancré en position absolute sur
   .isis-planner-layout (qui porte position:relative), flotte par-dessus la
   timeline sans réduire sa largeur. Ombre marquée pour décollement visuel.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-detail {
    position: absolute;
    top: 6px;
    right: 6px;
    bottom: 6px;
    width: 360px;
    z-index: 40;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    box-shadow:
        0 12px 28px -8px rgba(15, 23, 42, 0.22),
        0 6px 12px -6px rgba(15, 23, 42, 0.14);
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
    /* Apparition fluide */
    animation: isis-planner-detail-pop 160ms ease-out;
}
@keyframes isis-planner-detail-pop {
    from {
        opacity: 0;
        transform: translateX(8px);
    }
    to {
        opacity: 1;
        transform: translateX(0);
    }
}
/* WCAG 2.3.3 — respect prefers-reduced-motion. */
@media (prefers-reduced-motion: reduce) {
    .isis-planner-detail {
        animation: none;
    }
}

/* Point #7 roadmap — sidepanel en mode languette (collapsed).
   Width 44 px, juste un bouton vertical pour réouvrir. Permet de récupérer
   l'espace timeline sans perdre la sélection (clic sur ⏏ pour réouvrir). */
.isis-planner-detail.is-collapsed {
    width: 44px;
    background: var(--isis-surface);
    cursor: pointer;
    box-shadow:
        0 4px 12px -4px rgba(15, 23, 42, 0.18),
        0 2px 6px -3px rgba(15, 23, 42, 0.10);
}
.isis-planner-detail__expand {
    width: 100%;
    height: 100%;
    background: transparent;
    border: none;
    cursor: pointer;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.75rem 0;
    color: var(--isis-mod-gespla);
    transition: background 120ms ease;
}
.isis-planner-detail__expand:hover {
    background: color-mix(in srgb, var(--isis-mod-gespla) 8%, var(--isis-surface));
}
.isis-planner-detail__expand:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: -2px;
}
.isis-planner-detail__expand-label {
    writing-mode: vertical-rl;
    transform: rotate(180deg);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--isis-text-muted);
}
/* Bouton « réduire » dans le header — calque visuel du bouton close, à sa gauche. */
.isis-planner-detail__collapse {
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
    color: var(--isis-text-muted);
    cursor: pointer;
    height: 24px;
    width: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    margin-right: 2px;
}
.isis-planner-detail__collapse:hover {
    background: var(--isis-surface);
    border-color: var(--isis-border);
    color: var(--isis-text);
}
.isis-planner-detail__collapse:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
@media (max-width: 1100px) {
    /* Viewport étroit : le panel devient full-width overlay en bas du layout. */
    .isis-planner-detail {
        top: auto;
        left: 6px;
        right: 6px;
        bottom: 6px;
        width: auto;
        max-height: 60vh;
    }
}
.isis-planner-detail__head {
    padding: 0.75rem 0.85rem;
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface-soft);
    border-left: 3px solid var(--isis-mod-gespla);
    flex-shrink: 0;                       /* ne shrink jamais — préserve l'espace du body */
}
.isis-planner-detail__title-row {
    display: flex;
    justify-content: space-between;
    align-items: start;
    gap: 0.5rem;
}
.isis-planner-detail__title {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    line-height: 1.3;
    word-break: break-word;
}
.isis-planner-detail__close {
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
    color: var(--isis-text-muted);
    cursor: pointer;
    height: 24px;
    width: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.isis-planner-detail__close:hover {
    background: var(--isis-surface);
    border-color: var(--isis-border);
    color: var(--isis-text);
}
.isis-planner-detail__close:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
.isis-planner-detail__badges {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.45rem;
}

.isis-planner-detail__body {
    flex: 1 1 auto;
    min-height: 0;                        /* indispensable pour scroll en flex column */
    overflow-y: auto;
    padding: 0.75rem 0.85rem 0;
}
.isis-planner-detail__section + .isis-planner-detail__section {
    margin-top: 1rem;
    padding-top: 0.75rem;
    border-top: 1px solid var(--isis-border);
}
.isis-planner-detail__section-title {
    margin: 0 0 0.4rem 0;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    font-weight: 600;
    display: flex;
    align-items: center;
    gap: 0.35rem;
}
/* Sprint N+ — Section « Équipements embarqués » dans le sidepanel détail */
.isis-planner-detail__count {
    background: color-mix(in srgb, var(--isis-mod-gespla) 14%, var(--isis-surface-soft));
    color: var(--isis-mod-gespla);
    padding: 0 0.4rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 1.4;
    text-transform: none;
    letter-spacing: 0;
}
.isis-planner-detail__empty {
    margin: 0.2rem 0 0.5rem 0;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-planner-detail__linked-list {
    list-style: none;
    margin: 0 0 0.5rem 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}
.isis-planner-detail__linked-item {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.35rem 0.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-left: 3px solid color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 60%, transparent);
    border-radius: 4px;
    font-size: 0.82rem;
}
.isis-planner-detail__linked-label {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--isis-text);
}
.isis-planner-detail__linked-remove {
    flex: 0 0 auto;
    background: transparent;
    border: none;
    cursor: pointer;
    padding: 0.1rem;
    border-radius: 3px;
    color: var(--isis-text-muted);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background 120ms ease, color 120ms ease;
}
.isis-planner-detail__linked-remove:hover {
    background: color-mix(in srgb, var(--isis-danger) 14%, transparent);
    color: var(--isis-danger);
}
.isis-planner-detail__linked-remove:focus-visible {
    outline: 2px solid var(--isis-danger);
    outline-offset: 1px;
}

.isis-planner-detail__dirty-flag {
    color: var(--isis-warning);
    font-size: 0.9rem;
    line-height: 1;
}

/* Facts liste — clé : valeur */
.isis-planner-detail__facts {
    display: grid;
    grid-template-columns: minmax(80px, 0.7fr) 1fr;
    gap: 0.35rem 0.6rem;
    margin: 0;
    font-size: 0.82rem;
}
.isis-planner-detail__facts dt {
    color: var(--isis-text-muted);
    font-weight: 500;
}
.isis-planner-detail__facts dd {
    margin: 0;
    color: var(--isis-text);
    word-break: break-word;
}
.isis-planner-detail__hint {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    margin-left: 0.2rem;
}

/* Sprint T C1 — historique des décisions d'approbation (sidepanel planner). */
.isis-planner-detail__approval-steps {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-planner-detail__approval-step {
    border-left: 3px solid var(--isis-border);
    padding: 0.4rem 0.55rem;
    background: var(--isis-surface-soft);
    border-radius: 4px;
    font-size: 0.78rem;
}
.isis-planner-detail__approval-step.is-pending {
    border-left-color: var(--isis-warning);
}
.isis-planner-detail__approval-step.is-ok {
    border-left-color: var(--isis-success);
}
.isis-planner-detail__approval-step.is-danger {
    border-left-color: var(--isis-danger);
}
.isis-planner-detail__approval-step.is-muted {
    border-left-color: var(--isis-border);
    opacity: 0.7;
}
.isis-planner-detail__approval-step-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 0.5rem;
    margin-bottom: 0.15rem;
}
.isis-planner-detail__approval-step-order {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-planner-detail__approval-step-status {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}
.isis-planner-detail__approval-step-validator {
    color: var(--isis-text);
    margin-bottom: 0.15rem;
}
.isis-planner-detail__approval-step-date,
.isis-planner-detail__approval-step-comment {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-planner-detail__approval-step-comment {
    margin-top: 0.2rem;
}

/* Champs édition inline */
.isis-planner-detail__field + .isis-planner-detail__field {
    margin-top: 0.5rem;
}
.isis-planner-detail__label {
    display: block;
    font-size: 0.78rem;
    color: var(--isis-text);
    margin-bottom: 0.2rem;
    font-weight: 500;
}
.isis-planner-detail__inline-actions {
    display: flex;
    justify-content: flex-end;
    gap: 0.4rem;
    margin-top: 0.6rem;
}

.isis-planner-detail__footer {
    padding: 0.6rem 0.85rem;
    border-top: 1px solid var(--isis-border);
    background: var(--isis-surface-soft);
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    flex-shrink: 0;                       /* le footer garde sa hauteur intrinsèque */
}

/* Mini-toolbar d'actions au-dessus de la timeline quand un bloc est sélectionné. */
.isis-planner-actions-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    padding: 0.55rem 0.85rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-mod-gespla);
    border-radius: 6px;
    margin-bottom: 0.5rem;
}
.isis-planner-actions-bar__label {
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-planner-actions-bar__buttons {
    display: flex;
    gap: 0.5rem;
}

/* Drop target visuel (palette → bloc) */
.isis-planner-item.isis-planner-item--drop-target {
    outline: 2px dashed var(--isis-mod-gespla);
    outline-offset: 2px;
}

/* Content interne d'un item : label + bouton ⋮ à droite.
   Vis-timeline pose son own wrapper .vis-item-content avec overflow:hidden ;
   on force le flex pour que le bouton ne soit jamais coupé, même si le label
   est plus long que la largeur de l'item. */
.isis-planner-item.vis-item .vis-item-content {
    display: flex;
    align-items: center;
    gap: 4px;
    width: 100%;
    overflow: visible;  /* le bouton ne doit pas être tronqué */
}
.isis-planner-item .isis-planner-item-label {
    flex: 1 1 auto;
    min-width: 0;        /* permet à flex-shrink de réduire le label sous son contenu */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Sprint N+ — icônes Material Symbols préfixant les blocs timeline ET les
   labels des sous-lanes ressources de la vue Par commande.
   La font « Material Symbols » est fournie par Radzen (cf. material-base.css). */
.isis-planner-item-icon {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-family: 'Material Symbols';
    font-weight: normal;
    font-style: normal;
    font-size: 14px;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    white-space: nowrap;
    direction: ltr;
    font-feature-settings: 'liga';
    -webkit-font-feature-settings: 'liga';
    -webkit-font-smoothing: antialiased;
    font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 20;
    margin-right: 2px;
    vertical-align: middle;
}
.isis-planner-item-icon--collab {
    color: var(--isis-mod-sirh, #16a34a);
}
.isis-planner-item-icon--equip {
    color: var(--isis-mod-gesmat, #44403c);
}
.isis-planner-item-icon--absence {
    color: var(--isis-warning, #d97706);
}
.isis-planner-item-icon--maintenance,
.isis-planner-item-icon--calibration {
    color: var(--isis-mod-gesmat, #44403c);
}
.isis-planner-item-icon--panne {
    color: var(--isis-danger, #dc2626);
}
.isis-planner-item-icon--pret {
    color: var(--isis-accent, #4b5fad);
}
.isis-planner-item-icon--indispo {
    color: var(--isis-text-muted);
}
/* Bouton menu en fin de bloc — flex-shrink:0 garantit qu'il reste visible. */
.isis-planner-item .isis-planner-item-actions-btn {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 4px;
    height: 18px;
    width: 18px;
    background: rgba(255, 255, 255, 0.55);
    border: 1px solid rgba(0, 0, 0, 0.08);
    border-radius: 3px;
    color: var(--isis-text);
    cursor: pointer;
    line-height: 1;
    /* Désactive complètement le drag pour cet élément — fortifie le stopPropagation
       côté JS. Sans ça certains navigateurs initient un drag-image fantôme. */
    -webkit-user-drag: none;
}
.isis-planner-item .isis-planner-item-actions-btn:hover {
    background: var(--isis-surface);
    border-color: var(--isis-mod-gespla);
}
.isis-planner-item .isis-planner-item-actions-btn:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
.isis-planner-item-actions-btn__glyph {
    font-size: 0.95rem;
    font-weight: 700;
    line-height: 1;
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint X — Refonte barres de mobilisation (2026-05-21)
   Structure 3-rows dense :
     • meta-top   : état (chip 3 lettres) · durée · charge · demi-journée · menu ⋮
     • title      : icône type + label principal
     • caption    : besoin / prêt / notes (optionnel)
   Container queries dégradent gracieusement quand le bloc est étroit.
   ───────────────────────────────────────────────────────────────────────── */

/* Le wrapper vis-item-content devient stretch en hauteur pour laisser __inner
   occuper toute la cellule. Padding remis à zéro (le __inner gère son padding). */
.isis-planner-item.vis-item .vis-item-content:has(.isis-planner-item__inner) {
    align-items: stretch;
    padding: 0;
}
.isis-planner-item__inner {
    container-type: inline-size;
    container-name: planner-item;
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    min-width: 0;
    padding: 3px 6px 4px;
    gap: 2px;
    overflow: hidden;
}

/* Ligne meta-top : chips + métriques + menu ⋮ */
.isis-planner-item__meta-top {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 0.66rem;
    line-height: 1;
    color: var(--isis-text-muted);
    white-space: nowrap;
    min-width: 0;
}
.isis-planner-item__meta-spacer {
    flex: 1 1 auto;
    min-width: 4px;
}

/* Chip d'état — 3 lettres, couleur cohérente avec le fond du bloc */
.isis-planner-item__state-chip {
    display: inline-flex;
    align-items: center;
    padding: 1px 4px;
    border-radius: 3px;
    font-size: 0.6rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    line-height: 1.3;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    color: var(--isis-text);
    flex-shrink: 0;
}
.isis-planner-item__state-chip.is-previsionnel {
    background: color-mix(in srgb, var(--isis-warning) 18%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 50%, transparent);
    color: color-mix(in srgb, var(--isis-warning) 70%, var(--isis-text));
}
.isis-planner-item__state-chip.is-ferme {
    background: color-mix(in srgb, var(--isis-mod-gespla) 20%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-mod-gespla) 55%, transparent);
    color: color-mix(in srgb, var(--isis-mod-gespla) 80%, var(--isis-text));
}
.isis-planner-item__state-chip.is-realise {
    background: var(--isis-surface-soft);
    border-color: color-mix(in srgb, var(--isis-success, #16a34a) 40%, transparent);
    color: var(--isis-success, #16a34a);
}
.isis-planner-item__state-chip.is-annule {
    background: var(--isis-surface);
    border-color: var(--isis-border);
    color: var(--isis-danger, #dc2626);
    text-decoration: line-through;
}

/* Métriques durée + charge — monospace tabular-nums pour alignement */
.isis-planner-item__duration,
.isis-planner-item__charge {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: var(--isis-text);
    flex-shrink: 0;
}

/* Chip demi-journée — couleur accent secondaire, visible uniquement si != FULL/FULL */
.isis-planner-item__half-chip {
    display: inline-flex;
    align-items: center;
    padding: 1px 4px;
    border-radius: 3px;
    font-size: 0.58rem;
    font-weight: 700;
    background: color-mix(in srgb, var(--isis-accent) 14%, var(--isis-surface));
    color: var(--isis-accent);
    border: 1px solid color-mix(in srgb, var(--isis-accent) 32%, transparent);
    flex-shrink: 0;
    line-height: 1.3;
}

/* Ligne titre — icône type + libellé principal */
.isis-planner-item__title {
    display: flex;
    align-items: center;
    gap: 4px;
    font-weight: 600;
    font-size: 0.78rem;
    line-height: 1.2;
    min-width: 0;
}
.isis-planner-item__title .isis-planner-item-icon {
    /* On garde la taille standard mais sans le margin-right hérité — on a gap parent */
    margin-right: 0;
}
.isis-planner-item__title-text {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-planner-item__linked-mark {
    color: var(--isis-text-muted);
    margin-right: 1px;
}

/* Ligne caption — besoin / prêt / notes — un seul des 3 affiché */
.isis-planner-item__caption {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 0.7rem;
    line-height: 1.2;
    color: var(--isis-text-muted);
    min-width: 0;
}
.isis-planner-item__caption > span:last-child {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-planner-item__caption-icon {
    font-size: 0.9rem !important;       /* override .isis-planner-item-icon font-size: 14px */
    flex: 0 0 auto;
    margin-right: 0;
}
.isis-planner-item__caption.is-besoin .isis-planner-item__caption-icon {
    color: var(--isis-mod-gespla);
}
.isis-planner-item__caption.is-pret {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-planner-item__caption.is-pret .isis-planner-item__caption-icon {
    color: var(--isis-accent-warm, var(--isis-accent));
}
.isis-planner-item__caption.is-notes {
    font-style: italic;
}

/* Bouton menu ⋮ dans meta-top : surcharge le margin/positionnement legacy */
.isis-planner-item__meta-top .isis-planner-item-actions-btn {
    height: 16px;
    width: 16px;
    padding: 0 2px;
}

/* ─── Dégradation graceful via container queries ─────────────────────────── */
@container planner-item (max-width: 200px) {
    .isis-planner-item__caption.is-notes { display: none; }
}
@container planner-item (max-width: 160px) {
    .isis-planner-item__caption { display: none; }
}
@container planner-item (max-width: 130px) {
    /* Bloc moyen : retire les métriques numériques (état + half + menu suffisent) */
    .isis-planner-item__duration,
    .isis-planner-item__charge { display: none; }
}
@container planner-item (max-width: 90px) {
    /* Bloc court : seul l'état + icône type + menu restent */
    .isis-planner-item__half-chip { display: none; }
    .isis-planner-item__title-text { display: none; }
}
@container planner-item (max-width: 56px) {
    /* Bloc minimal (~1 jour zoomé) : seuls l'icône et menu restent */
    .isis-planner-item__state-chip { display: none; }
}

/* Hauteur minimale du bloc — vis-timeline groupHeightMode=fitItems respecte */
.isis-planner-item__inner {
    min-height: 38px;
}

/* Annule l'override historique « padding: 18px » de --realise sur les blocs riches */
.isis-planner-item--realise:has(.isis-planner-item__inner) {
    padding-left: 0;
}
.isis-planner-item--realise:has(.isis-planner-item__inner)::before {
    display: none;                       /* l'état est désormais porté par le chip __state-chip */
}

/* ─────────────────────────────────────────────────────────────────────────
   Sprint X — Avatar initiales coloré stable par ressource
   Forme ronde pour collab / carré arrondi pour équipement.
   Couleur de fond = hue stable hashé sur l'id (ResourceAccentColor côté C#).
   Texte blanc avec léger text-shadow pour contraste sur fond mid-tone.
   ───────────────────────────────────────────────────────────────────────── */
.isis-planner-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    color: #fff;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.02em;
    user-select: none;
    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.4) inset;
}
.isis-planner-avatar--collab {
    border-radius: 50%;                  /* rond pour personne */
}
.isis-planner-avatar--equip {
    border-radius: 4px;                  /* carré arrondi pour équipement */
}

/* Taille « lane » : label à gauche de chaque sous-lane ressource — bien lisible */
.isis-planner-avatar--lane {
    width: 28px;
    height: 28px;
    font-size: 0.82rem;                  /* ~13px sur les 28px du cercle */
    margin-right: 8px;
}

/* Taille « inline » : titre de chaque barre de mobilisation — compact mais lisible */
.isis-planner-avatar--inline {
    width: 20px;
    height: 20px;
    font-size: 0.7rem;                   /* ~11px sur les 20px du cercle */
}

/* Wrapper du label de lane — aligne l'avatar + nom horizontalement */
.isis-planner-group__label {
    display: inline-flex;
    align-items: center;
    gap: 0;                              /* margin-right géré par l'avatar */
    min-width: 0;
    max-width: 100%;
}
.isis-planner-group__name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

/* Dans le bloc, le titre passe en padding-gauche un peu réduit pour caser l'avatar */
.isis-planner-item__title .isis-planner-avatar--inline {
    margin-right: 0;                     /* gap parent gère l'espacement */
}

/* En conteneur < 90px, l'avatar de la barre est masqué (déjà via container query
   parente qui cache title-text, mais on garde l'avatar) — décision : l'avatar
   reste affiché tant qu'il y a au moins 56px de large car c'est l'élément le
   plus distinctif. Override de la règle title-text:none pour préserver l'avatar : */
@container planner-item (max-width: 90px) {
    .isis-planner-item__title .isis-planner-avatar--inline {
        display: inline-flex;            /* reste visible (override flexbox) */
    }
}

/* Hint sous-titre du bandeau de sélection. */
.isis-planner-actions-bar__hint {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-planner-actions-bar__hint kbd {
    display: inline-block;
    padding: 0 0.35rem;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-style: normal;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-bottom-width: 2px;
    border-radius: 3px;
    font-size: 0.85rem;
}
/* Vis-timeline pose des classes natives (.vis-item, .vis-label, etc.).
   On ne se substitue pas — on cible nos classNames custom posées via PlannerItem.ClassName. */
.isis-planner-item {
    border: 1px solid transparent;
    border-radius: 4px;
    padding: 2px 6px;
    font-size: 0.78rem;
    line-height: 1.2;
    color: var(--isis-text);
    background: var(--isis-surface-soft);
    box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.04);
}
.isis-planner-item.vis-item.vis-selected {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: 1px;
}
/* États */
.isis-planner-item--previsionnel {
    background: color-mix(in srgb, var(--isis-warning) 16%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 30%, transparent);
    background-image: repeating-linear-gradient(
        135deg,
        transparent 0 6px,
        rgba(0, 0, 0, 0.05) 6px 8px);
}
.isis-planner-item--ferme {
    background: color-mix(in srgb, var(--isis-mod-gespla) 18%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-mod-gespla) 38%, transparent);
}
.isis-planner-item--realise {
    background: var(--isis-surface-soft);
    border-color: var(--isis-border);
    color: var(--isis-text-muted);
}
.isis-planner-item--annule {
    opacity: 0.5;
    text-decoration: line-through;
}

/* Sprint S B5 — baseline planifié vs réalisé : marqueur check sur les REALISE.
   Permet de visualiser d'un coup d'œil quelles affectations ont effectivement été
   exécutées (la mob garde ses dates planifiées, mais l'état change). */
.isis-planner-item--realise::before {
    content: "task_alt";
    font-family: 'Material Symbols';
    font-variation-settings: 'FILL' 1, 'wght' 600, 'GRAD' 0, 'opsz' 20;
    position: absolute;
    top: 1px;
    left: 4px;
    color: var(--isis-success, #16a34a);
    font-size: 12px;
    line-height: 1;
    pointer-events: none;
    text-shadow: 0 0 2px color-mix(in srgb, var(--isis-surface) 80%, transparent);
}
.isis-planner-item--realise {
    padding-left: 18px; /* laisse la place pour l'icône ::before */
    position: relative;
}

/* Sprint O B2 — accent couleur par commande source en vue Par ressource.
   Le service pose --isis-source-accent: hsl(N, 55%, 78%) en style inline.
   On l'utilise comme : (a) bordure gauche 3px solid, (b) léger halo de fond
   en color-mix avec la couleur d'état FERME (pour ne pas masquer l'info état).
   PRÉVISIONNEL garde son hachuré + accent à gauche.
   ANNULÉ ignore (opacité 0.5 prédomine). */
.isis-planner-item--source-accent {
    border-left: 3px solid var(--isis-source-accent, transparent);
}
.isis-planner-item--ferme.isis-planner-item--source-accent {
    /* Fond mixé : accent source 70% + état ferme gespla 30% pour cohérence visuelle */
    background: color-mix(in srgb, var(--isis-source-accent, transparent) 50%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-source-accent, transparent) 65%, transparent);
}
.isis-planner-item--realise.isis-planner-item--source-accent {
    border-left-color: color-mix(in srgb, var(--isis-source-accent, transparent) 60%, var(--isis-text-muted));
}

/* Sprint P — filter-bar dédiée à la timeline planner. Compacte verticalement
   (les axes + search s'aligne sur une ligne quand l'écran est large). */
.isis-planner-filter-bar {
    margin-bottom: 0.5rem;
    padding: 0.4rem 0.7rem;
    font-size: 0.78rem;
}
.isis-planner-filter-bar .isis-filter-bar__search {
    flex: 1 1 220px;
    min-width: 200px;
}

/* Sprint P A2 — barre d'actions en masse au-dessus du planner. */
.isis-alert-banner--info {
    background: color-mix(in srgb, var(--isis-accent) 8%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-accent) 35%, transparent);
    border-left: 4px solid var(--isis-accent);
    color: var(--isis-text);
    padding: 0.55rem 0.85rem;
    border-radius: var(--isis-radius);
    margin-bottom: 0.5rem;
    font-size: 0.85rem;
}
.isis-bulk-bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem;
}
.isis-bulk-bar__hint {
    color: var(--isis-text-muted);
    font-size: 0.8rem;
    margin-right: 0.5rem;
}
.isis-bulk-bar__actions {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-left: auto;
    flex-wrap: wrap;
}

/* Sprint T F3 — print-friendly du planner V2.
   Masque la palette, le sidepanel détail et la toolbar, élargit la timeline.
   Le rendu vis-timeline reste tel quel (SVG/canvas) mais sur fond blanc sans ombres. */
@media print {
    .isis-planner-palette,
    .isis-planner-detail,
    .isis-rich-toolbar,
    .isis-planner-filter-bar,
    .isis-bulk-bar {
        display: none !important;
    }
    .isis-planner-layout,
    .isis-planner-layout.has-detail {
        grid-template-columns: 1fr !important;
    }
    .isis-rich-header {
        box-shadow: none !important;
        border: 1px solid var(--isis-border);
        page-break-after: avoid;
    }
    .isis-planner-host {
        box-shadow: none !important;
        page-break-inside: avoid;
    }
}

/* Sprint S D2 — badge pic de charge sur lane ressource. */
.isis-planner-group__peak-badge {
    margin-left: 6px;
    padding: 1px 6px;
    border-radius: var(--isis-radius-pill);
    font-size: 0.65em;
    font-weight: 700;
    letter-spacing: 0.02em;
    vertical-align: middle;
    white-space: nowrap;
}
.isis-planner-group__peak-badge.is-ok {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 14%, transparent);
    color: color-mix(in srgb, var(--isis-success, #16a34a) 80%, var(--isis-text));
}
.isis-planner-group__peak-badge.is-warning {
    background: color-mix(in srgb, var(--isis-warning, #d97706) 18%, transparent);
    color: color-mix(in srgb, var(--isis-warning, #d97706) 80%, var(--isis-text));
}
.isis-planner-group__peak-badge.is-danger {
    background: color-mix(in srgb, var(--isis-danger, #dc2626) 18%, transparent);
    color: var(--isis-danger, #dc2626);
}

/* Sprint U H2 V1.1b — badge cible objectif annuel sur les lanes du planner.
   Position : à droite du peak badge (s'il existe), même style compact pill.
   Variantes : is-neutral / is-ontrack / is-near / is-under / is-over. */
.isis-planner-group__objective-badge {
    margin-left: 4px;
    padding: 1px 6px;
    border-radius: var(--isis-radius-pill);
    font-size: 0.65em;
    font-weight: 600;
    letter-spacing: 0.02em;
    vertical-align: middle;
    white-space: nowrap;
    border: 1px solid transparent;
}
.isis-planner-group__objective-badge.is-neutral {
    background: var(--isis-surface-soft);
    color: var(--isis-text-muted);
    border-color: var(--isis-border);
}
.isis-planner-group__objective-badge.is-ontrack {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 12%, transparent);
    color: color-mix(in srgb, var(--isis-success, #16a34a) 80%, var(--isis-text));
}
.isis-planner-group__objective-badge.is-near {
    background: var(--isis-surface-soft);
    color: var(--isis-text);
    border-color: color-mix(in srgb, var(--isis-warning, #d97706) 40%, var(--isis-border));
}
.isis-planner-group__objective-badge.is-under {
    background: color-mix(in srgb, var(--isis-warning, #d97706) 14%, transparent);
    color: color-mix(in srgb, var(--isis-warning, #d97706) 80%, var(--isis-text));
}
.isis-planner-group__objective-badge.is-over {
    background: color-mix(in srgb, var(--isis-danger, #dc2626) 14%, transparent);
    color: var(--isis-danger, #dc2626);
    border-color: color-mix(in srgb, var(--isis-danger, #dc2626) 30%, var(--isis-border));
}

/* Sprint O B1 — distinction temporelle passé / présent / futur :
   1) Background item passé en gris léger (couvre [periodStart, hier]) ;
   2) Ligne « aujourd'hui » accentuée (recolore le .vis-current-time natif). */
.isis-planner-host .vis-item.isis-planner-past-overlay {
    background: color-mix(in srgb, var(--isis-text-muted) 8%, transparent);
    border: none;
    pointer-events: none;
}
.isis-planner-host .vis-current-time {
    background-color: var(--isis-accent-warm, #c2410c) !important;
    width: 2px;
    box-shadow: 0 0 8px color-mix(in srgb, var(--isis-accent-warm, #c2410c) 35%, transparent);
}

/* Sprint N — mob enfant matériel liée à une mob collab parente.
   Bordure gauche pointillée pour signaler la dépendance + opacité légère. */
.isis-planner-item--linked {
    border-left: 2px dashed color-mix(in srgb, var(--isis-mod-gespla) 55%, transparent);
    opacity: 0.85;
    /* Pas de cursor pointer car non-éditable (set via editable:false) — vis-timeline
       gère le cursor default natif. */
}
.isis-planner-item--linked:hover {
    opacity: 1;
}
.isis-planner-item--linked .isis-planner-item-actions-btn {
    display: none;   /* défensif : pas de bouton même si le HTML en porte un */
}

/* Sprint N+ — item miroir : reflet d'une mob équipement enfant affiché sur la
   lane du collab parent (vue par ressource). Read-only, distingué visuellement
   par une bordure pointillée gauche (couleur module gesmat) + fond rayé léger.
   Empile au-dessous ou à côté de la mob collab parente selon la lib de stacking. */
.isis-planner-item--mirror {
    border-left: 3px dashed color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 70%, transparent);
    background-image: repeating-linear-gradient(
        45deg,
        transparent,
        transparent 6px,
        color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 10%, transparent) 6px,
        color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 10%, transparent) 8px
    );
    opacity: 0.78;
    cursor: default;
}
.isis-planner-item--mirror:hover {
    opacity: 1;
}
.isis-planner-item--mirror .isis-planner-item-actions-btn {
    display: none;
}
.isis-planner-mirror-label {
    font-size: 0.78em;
    font-style: italic;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Badge « lié » suffixant le label miroir — signal explicite francophone
   que cet item est un reflet, non éditable directement (l'édition passe
   par la mob collab parente). */
.isis-planner-mirror-badge {
    margin-left: 4px;
    padding: 1px 5px;
    font-size: 0.6em;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 80%, var(--isis-text));
    background: color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 16%, transparent);
    border-radius: 2px;
    vertical-align: middle;
}

/* Affectation en conflit DÉJÀ commitée (state FERME chevauché par une autre FERME
   sur ressource non-partageable, OU sur-allocation collab > 100%). État durable qui
   signale visuellement le problème à résoudre. Bordure rouge dashed + label « CONFLIT »
   via pseudo-element pour ne pas dépendre du content HTML.
   (Cleanup 2026-05-22 : la classe transitoire `.isis-planner-item--conflict-preview`
   et son keyframe `@isis-planner-conflict-pulse` ont été supprimés avec la bascule V3
   — plus aucun code applicatif ne les utilisait.) */
.isis-planner-item--conflict {
    outline: 2px dashed var(--isis-danger);
    outline-offset: -1px;
    background-image: repeating-linear-gradient(
        135deg,
        transparent,
        transparent 8px,
        color-mix(in srgb, var(--isis-danger) 14%, transparent) 8px,
        color-mix(in srgb, var(--isis-danger) 14%, transparent) 10px
    );
    position: relative;
}
.isis-planner-item--conflict::after {
    /* Material Symbols ligature « warning » — pas d'emoji (DESIGN.md §10).
       Cohérent avec les autres pseudo-icônes du codebase. */
    content: "warning";
    font-family: 'Material Symbols';
    font-variation-settings: 'FILL' 1, 'wght' 700, 'GRAD' 0, 'opsz' 20;
    position: absolute;
    top: 1px;
    right: 4px;
    color: var(--isis-danger);
    font-size: 12px;
    line-height: 1;
    pointer-events: none;
    text-shadow: 0 0 2px color-mix(in srgb, var(--isis-surface) 80%, transparent);
}
/* ─── Sprint C : bandes capacité (background items vis-timeline) ─────────
   Items type='background' affichés derrière les blocs affectation dans
   la lane parente. Niveaux : warning 80-100%, danger >100%. */
.isis-planner-cap {
    border: none;
    box-shadow: none;
    /* vis-timeline pose .vis-item-overflow + background sur ces items.
       On colorise via le pseudo-fond (couleur très douce). */
}
.isis-planner-cap--warning {
    background: color-mix(in srgb, var(--isis-warning) 14%, transparent);
}
.isis-planner-cap--danger {
    background: color-mix(in srgb, var(--isis-danger) 18%, transparent);
    /* Hachures discrètes pour renforcer le signal danger même daltonien. */
    background-image:
        color-mix(in srgb, var(--isis-danger) 18%, transparent),
        repeating-linear-gradient(
            45deg,
            transparent 0 5px,
            color-mix(in srgb, var(--isis-danger) 10%, transparent) 5px 7px);
}

/* ─── Sprint B : overlays read-only (absences SIRH + indispos GESMAT) ───── */
.isis-planner-item--indispo {
    background: repeating-linear-gradient(
        135deg,
        color-mix(in srgb, var(--isis-text-muted) 18%, var(--isis-surface)) 0 4px,
        color-mix(in srgb, var(--isis-text-muted) 28%, var(--isis-surface)) 4px 8px
    );
    color: var(--isis-text);
    border: 1px dashed var(--isis-text-muted);
    cursor: not-allowed;
    opacity: 0.85;
}
.isis-planner-item--indispo .isis-planner-item-label {
    font-style: italic;
    color: var(--isis-text-muted);
}
.isis-planner-item--indispo .isis-planner-item-actions-btn {
    display: none;   /* pas de menu d'actions sur les overlays read-only */
}
.isis-planner-item--indispo:hover {
    /* léger lift pour signaler que c'est cliquable pour info (tooltip) */
    opacity: 1;
}

/* Variantes selon le type d'indispo gesmat — bordure colorée par sémantique. */
.isis-planner-item--indispo-absence {
    border-color: color-mix(in srgb, var(--isis-mod-sirh, var(--isis-text-muted)) 55%, transparent);
}
.isis-planner-item--indispo-equip {
    border-color: color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 55%, transparent);
}
.isis-planner-item--indispo-panne,
.isis-planner-item--indispo-maintenance_corrective {
    border-color: color-mix(in srgb, var(--isis-danger) 55%, transparent);
}
.isis-planner-item--indispo-calibration {
    border-color: color-mix(in srgb, var(--isis-warning) 60%, transparent);
}
/* Groupes — labels à gauche */
.isis-planner-group.vis-label {
    font-size: 0.82rem;
}
.isis-planner-group--ent.vis-label {
    font-weight: 700;
    background: var(--isis-surface-soft);
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    font-size: 0.72rem;
}
.isis-planner-group--collab.vis-label,
.isis-planner-group--equip.vis-label {
    padding: 6px 8px 6px 10px;
    color: var(--isis-text);
    /* Sprint X — bordure colorée stable par ressource. La couleur de fond est
       posée dynamiquement par PlannerV2Page (un <style> injecté avec 1 règle par
       ressource visible). Fallback border si --lane-accent absent. */
    border-left: 4px solid var(--lane-accent, var(--isis-text-muted));
    border-bottom: 1px solid var(--isis-border);
    box-sizing: border-box;
    transition: background 120ms ease;
}

/* Séparateur horizontal entre lanes côté zone items pour matcher le border-bottom
   du label et bien isoler chaque ligne (synchro visuelle gauche/droite). */
.vis-foreground .vis-group {
    border-bottom: 1px solid color-mix(in srgb, var(--isis-border) 60%, transparent);
}

/* Vue Par commande (nested) — lane parent = commande. */
.isis-planner-group--cmd.vis-label {
    font-weight: 600;
    background: var(--isis-surface-soft);
    border-left: 3px solid var(--isis-mod-gespla);
}
/* Différenciation ferme vs prévisionnelle (Sprint N+ : la vue couvre les 2). */
.isis-planner-group--cmd-ferme.vis-label {
    border-left: 3px solid var(--isis-success, #16a34a);
    background: color-mix(in srgb, var(--isis-success, #16a34a) 6%, var(--isis-surface-soft));
}
.isis-planner-group--cmd-previsionnelle.vis-label {
    border-left: 3px dashed var(--isis-warning, #d97706);
    background: color-mix(in srgb, var(--isis-warning, #d97706) 5%, var(--isis-surface-soft));
}
/* Badge ferme/prév. injecté dans le content du group commande */
.isis-planner-group__kind-badge {
    display: inline-block;
    padding: 1px 6px;
    border-radius: 3px;
    font-size: 0.62rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    margin-right: 4px;
    vertical-align: middle;
    line-height: 1.3;
}
.isis-planner-group__kind-badge--ferme {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 18%, transparent);
    color: var(--isis-success, #16a34a);
    border: 1px solid color-mix(in srgb, var(--isis-success, #16a34a) 35%, transparent);
}
.isis-planner-group__kind-badge--prev {
    background: color-mix(in srgb, var(--isis-warning, #d97706) 16%, transparent);
    color: color-mix(in srgb, var(--isis-warning, #d97706) 75%, var(--isis-text));
    border: 1px dashed color-mix(in srgb, var(--isis-warning, #d97706) 50%, transparent);
}
/* Sous-lane = ressource mobilisée sous une commande.
   Sprint N+ : indentation accentuée + caret hiérarchique + icône typée
   pour que la colonne label se lise clairement comme « commande → ressource » */
.isis-planner-group--res.vis-label {
    padding-left: 2.2rem !important;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    background: color-mix(in srgb, var(--isis-text-muted) 4%, transparent);
}
.isis-planner-group--res-collab.vis-label {
    border-left: 2px solid color-mix(in srgb, var(--isis-mod-sirh, var(--isis-text-muted)) 50%, transparent);
}
.isis-planner-group--res-equip.vis-label {
    border-left: 2px solid color-mix(in srgb, var(--isis-mod-gesmat, var(--isis-text-muted)) 50%, transparent);
}
.isis-planner-group__sub-caret {
    color: var(--isis-text-muted);
    opacity: 0.55;
    margin-right: 4px;
    font-family: monospace;
    font-size: 0.85em;
    letter-spacing: -1px;
}
.isis-planner-group__sub-label {
    font-weight: 500;
    color: var(--isis-text);
}
/* L'icône Material Symbols dans la sous-lane utilise les variantes définies plus haut
   (.isis-planner-item-icon--collab / --equip). Pas de redéfinition ici. */
.isis-planner-group--res.vis-label .isis-planner-item-icon {
    font-size: 13px;
    margin-right: 4px;
    vertical-align: middle;
}

/* ──────────────────────────────────────────────────────────────────────────
   Sprint I — Vue calendrier mensuel gespla (/gespla/calendrier)
   ────────────────────────────────────────────────────────────────────────── */
.isis-cal {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    background: var(--isis-surface);
    overflow: hidden;
}
.isis-cal__head {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    background: var(--isis-surface-soft);
    border-bottom: 1px solid var(--isis-border);
}
.isis-cal__head-cell {
    padding: 0.45rem 0.6rem;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: 600;
    color: var(--isis-text-muted);
}
.isis-cal__week {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
}
.isis-cal__cell {
    position: relative;
    min-height: 88px;
    padding: 0.4rem 0.5rem;
    background: var(--isis-surface);
    border-right: 1px solid var(--isis-border);
    border-bottom: 1px solid var(--isis-border);
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.2rem;
    cursor: pointer;
    text-align: left;
}
.isis-cal__cell:hover {
    background: var(--isis-surface-soft);
}
.isis-cal__cell:focus-visible {
    outline: 2px solid var(--isis-mod-gespla);
    outline-offset: -2px;
}
/* Sprint T G2 — marqueur conflit dans le calendrier mensuel. */
.isis-cal__cell.has-conflict {
    box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--isis-danger) 60%, transparent);
}
.isis-cal__conflict-marker {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--isis-danger);
    color: white;
    font-weight: 700;
    font-size: 11px;
    line-height: 16px;
    text-align: center;
    pointer-events: none;
}
.isis-cal__cell.is-out {
    background: var(--isis-surface-soft);
    color: var(--isis-text-muted);
    opacity: 0.6;
}
.isis-cal__cell.is-today {
    box-shadow: inset 3px 0 0 0 var(--isis-mod-gespla);
}
.isis-cal__day-num {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
}
.isis-cal__count {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}
.isis-cal__load {
    font-size: 0.7rem;
    font-weight: 700;
    padding: 1px 5px;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-soft);
}
.isis-cal__cell.is-ok       .isis-cal__load { background: color-mix(in srgb, var(--isis-success) 18%, transparent); color: var(--isis-success); }
.isis-cal__cell.is-warning  .isis-cal__load { background: color-mix(in srgb, var(--isis-warning) 22%, transparent); color: color-mix(in srgb, var(--isis-warning) 80%, var(--isis-text)); }
.isis-cal__cell.is-danger   .isis-cal__load { background: color-mix(in srgb, var(--isis-danger) 22%, transparent);  color: var(--isis-danger); }
.isis-cal__cell.is-warning  { background: color-mix(in srgb, var(--isis-warning) 6%, var(--isis-surface)); }
.isis-cal__cell.is-danger   { background: color-mix(in srgb, var(--isis-danger) 7%, var(--isis-surface)); }
.isis-cal-legend {
    display: flex;
    gap: 1rem;
    margin-top: 0.6rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-cal-legend__sw {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 2px;
    margin-right: 0.3rem;
    vertical-align: middle;
}

/* Sprint H — Dialog vues sauvegardées du planner */
.isis-grid--planner-views .isis-grid__head,
.isis-grid--planner-views .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1fr) 100px 80px;
    min-width: 0;
}

/* ──────────────────────────────────────────────────────────────────────────
   Sprint G — Vue capacité agrégée (page /gespla/capacite)
   ────────────────────────────────────────────────────────────────────────── */
/* Tableau collaborateurs : status | nom | entreprise | charge | cible | écart | aff | actions
   (Sprint U H2 — +Cible/Écart/Actions) */
.isis-grid--capacite-collab .isis-grid__head,
.isis-grid--capacite-collab .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.6fr) minmax(140px, 0.9fr) 120px 80px 100px 60px 60px;
    min-width: 1020px;
}
/* Tableau équipements : status | code | libellé | entreprise | charge | cible | écart | aff | actions */
.isis-grid--capacite-equip .isis-grid__head,
.isis-grid--capacite-equip .isis-grid__row {
    grid-template-columns: 32px 120px minmax(200px, 1.6fr) minmax(140px, 0.9fr) 120px 80px 100px 60px 60px;
    min-width: 1140px;
}
/* Texte coloré charge */
.isis-capacite-text--warning {
    color: var(--isis-warning);
}
.isis-capacite-text--danger {
    color: var(--isis-danger);
}

/* Grille couverture besoins N3 V1.8 — 7 cols
   status | besoin | requis | planifié | progression | nb aff | actions */
.isis-grid--besoin-coverage .isis-grid__head,
.isis-grid--besoin-coverage .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.6fr) 100px 110px minmax(200px, 1.4fr) 60px 60px;
    min-width: 920px;
}
/* Cellules numériques alignées à droite + tabular-nums pour scan vertical. */
.isis-grid--besoin-coverage .isis-grid__col-num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* Bandeau récapitulatif au-dessus de la grille couverture. */
.isis-besoin-coverage {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
.isis-besoin-coverage__summary {
    display: flex;
    flex-wrap: wrap;
    gap: 1.5rem 2rem;
    padding: 0.6rem 0.85rem;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    border-radius: 6px;
}
.isis-besoin-coverage__summary-pair {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 80px;
}
.isis-besoin-coverage__summary-label {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}
.isis-besoin-coverage__summary-value {
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}
.isis-besoin-coverage__summary-value.is-success { color: var(--isis-success); }
.isis-besoin-coverage__summary-value.is-warning { color: var(--isis-warning); }
.isis-besoin-coverage__summary-value.is-danger  { color: var(--isis-danger); }

/* Barre de progression "couverture" — fond gris + remplissage coloré selon le statut. */
.isis-coverage-bar {
    position: relative;
    width: 100%;
    height: 8px;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    overflow: hidden;
}
.isis-coverage-bar__fill {
    height: 100%;
    transition: width 200ms ease-out;
    background: var(--isis-accent);
}
.isis-coverage-bar__fill.is-success { background: var(--isis-success); }
.isis-coverage-bar__fill.is-ok      { background: var(--isis-success); }
.isis-coverage-bar__fill.is-warning { background: var(--isis-warning); }
.isis-coverage-bar__fill.is-danger  { background: var(--isis-danger); }
.isis-coverage-bar__fill.is-info    { background: var(--isis-accent); }
.isis-coverage-bar__pct {
    display: block;
    margin-top: 0.15rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* Ligne de groupe (séparateur visuel entre ressources ou entre projets).
   Audit a11y M3 : trait gauche couleur module pour distinguer non-color-seule
   (daltoniens) — fortifie le signal au-delà du font-weight + uppercase. */
.isis-grid__group-row {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    grid-column: 1 / -1;
    background: var(--isis-surface-soft);
    border-bottom: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-current-mod, var(--isis-accent));
    padding: 0.4rem 0.85rem 0.4rem calc(0.85rem - 3px);
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    position: sticky;
    top: 34px; /* sous le head */
    z-index: 2;
}

/* Section riche — header titre + sous-titre, séparateur visuel entre blocs
   d'une rich-page. Audit ui-ux 2026-05-20 : classes manquantes, utilisées
   par DashboardPage.razor (section conflits). */
.isis-rich-section {
    margin-top: 1.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-1);
    padding: 1rem 1.1rem;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
/* Sections imbriquees dans une grille 2-col : pas de marge top (la grille gere le gap) */
.isis-dash-2col > .isis-rich-section {
    margin-top: 0;
}
.isis-rich-section__header {
    margin-bottom: 0.25rem;
    padding: 0;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--isis-border);
}
.isis-rich-section__title {
    font-size: 1rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0 0 0.2rem;
}
.isis-rich-section__subtitle {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    display: block;
}

/* Pastille d'alerte sur un onglet — signale à l'arrivée sur la fiche
   qu'un onglet réclame de l'attention (ex : calibration expirée).
   Audit ui-ux 2026-05-19, Phase 1.4. */
.isis-tab__alert-dot {
    display: inline-block;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--isis-danger);
    margin-left: 4px;
    vertical-align: middle;
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.5);
}


/* ============================================================================
 * V1.2 contrat-cadre — bloc consommation du sidepanel marché (gesmaff)
 * Affiche la barre de progression plafond + alertes 80%/100% + count BC.
 * ============================================================================ */
.isis-cadre-block {
    margin-top: 0.6rem;
    padding: 0.75rem;
    background: var(--isis-mod-gesmaff-soft);
    border: 1px solid color-mix(in srgb, var(--isis-mod-gesmaff) 18%, transparent);
    border-radius: 6px;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.isis-cadre-block__head {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-cadre-block__amounts {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.3rem;
    font-family: var(--isis-font-mono);
    font-size: 0.95rem;
}
.isis-cadre-block__consumed {
    font-weight: 600;
    color: var(--isis-text);
}
.isis-cadre-block__separator { color: var(--isis-text-soft); }
.isis-cadre-block__cap { color: var(--isis-text); }
.isis-cadre-block__devise {
    font-size: 0.75rem;
    color: var(--isis-text-soft);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-left: 0.3rem;
}
.isis-cadre-block__pct {
    margin-left: auto;
    font-weight: 600;
    font-size: 0.85rem;
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
}
.isis-cadre-block__pct.is-neutral { background: var(--isis-surface-alt); color: var(--isis-text-soft); }
.isis-cadre-block__pct.is-ok      { background: color-mix(in srgb, var(--isis-success) 12%, transparent); color: var(--isis-success); }
.isis-cadre-block__pct.is-warning { background: color-mix(in srgb, var(--isis-warning) 14%, transparent); color: var(--isis-warning); }
.isis-cadre-block__pct.is-danger  { background: color-mix(in srgb, var(--isis-danger)  14%, transparent); color: var(--isis-danger); }

.isis-cadre-block__bar {
    height: 8px;
    background: var(--isis-surface-alt);
    border-radius: var(--isis-radius-pill);
    overflow: hidden;
}
.isis-cadre-block__bar-fill {
    height: 100%;
    transition: width 220ms ease-out;
}
.isis-cadre-block__bar-fill.is-ok      { background: var(--isis-success); }
.isis-cadre-block__bar-fill.is-warning { background: var(--isis-warning); }
.isis-cadre-block__bar-fill.is-danger  { background: var(--isis-danger); }
.isis-cadre-block__bar-fill.is-neutral { background: var(--isis-text-soft); }

.isis-cadre-block__alert {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.78rem;
    padding: 0.3rem 0.5rem;
    border-radius: 4px;
}
.isis-cadre-block__alert.is-warning {
    background: color-mix(in srgb, var(--isis-warning) 12%, transparent);
    color: var(--isis-warning);
}
.isis-cadre-block__alert.is-danger {
    background: color-mix(in srgb, var(--isis-danger) 12%, transparent);
    color: var(--isis-danger);
}
.isis-cadre-block__counts {
    font-size: 0.8rem;
    color: var(--isis-text-soft);
}

/* ============================================================================
   Zone géographique (Sprint 2 chantier géo)
   Sections affichées sur fiche détail AO/Marché/Demande/Devis/Commande.
   ============================================================================ */

/* ============================================================================
   Couches géographiques multi-layers (V1.4 — 2026-05-22)
   ============================================================================ */
.isis-geo-layers {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    padding: 1rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    flex: 1 1 auto;
    min-height: 0;
}

/* Mode plein écran (V1.4.2 — porté depuis ZoneGeoSection V1.3, 2026-05-23).
   Toggle agrandir : la section quitte le flux normal et occupe l'espace sous
   le header global (--isis-header-h ~56px). Z-index 950 : au-dessus du
   contenu normal mais EN-DESSOUS des dialogs Radzen (1010+). Touche Échap
   = sortie.
   Refonte 2026-05-29 : `left` calibré sur la largeur du subnav module pour
   laisser la nav latérale visible (cohérence avec .isis-focus-zone). La
   navigation entre fiches reste possible sans sortir du plein écran. */
.isis-geo-layers--expanded {
    position: fixed;
    top: var(--isis-header-h, 56px);
    left: var(--isis-subnav-w, 280px);
    right: 0;
    bottom: 0;
    z-index: 950;
    border-radius: 0;
    border: none;
    border-top: 1px solid var(--isis-border);
    padding: 0.75rem 1rem 1rem;
    outline: none;
    transition: left 200ms cubic-bezier(0.4, 0, 0.2, 1);
}
.isis-shell.is-subnav-collapsed .isis-geo-layers--expanded {
    left: var(--isis-subnav-w-collapsed, 64px);
}

.isis-geo-layers--expanded:focus-visible {
    box-shadow: inset 0 0 0 2px var(--isis-accent);
}

/* ─────────────────────────────────────────────────────────────────────────
   Tokens d'espacement & typographie (A3 + B7 — refonte 2026-05-23)
   Système 3 niveaux d'espacement réutilisé sur toute la section géo :
     --isis-pad-card    : padding extérieur d'un bloc (1rem)
     --isis-pad-compact : padding header/footer de bloc (0.6rem 0.75rem)
     --isis-pad-tight   : padding row/item dense (0.4rem 0.55rem)
   ───────────────────────────────────────────────────────────────────────── */
.isis-geo-layers,
.isis-zone-map-shell,
.isis-proximity-panel {
    --isis-pad-card: 1rem;
    --isis-pad-compact: 0.6rem 0.75rem;
    --isis-pad-tight: 0.4rem 0.55rem;
}

/* Header unique (A1 — fusion). Plus de doublon dans le rail.
   Layout : titre + compteur à gauche, actions à droite. */
.isis-geo-layers__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding-bottom: 0.25rem;
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 0.25rem;
}

.isis-geo-layers__head-titles {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
}

.isis-geo-layers__head-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
}

/* Hiérarchie typographique (B7) — opposable, réutilisable cross-page.
   Title : titre de section (0.95rem, 600, --isis-text).
   Subtitle : tag/légende (0.75rem, 600, uppercase, --isis-text-muted). */
.isis-section-title {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0;
    line-height: 1.3;
}

.isis-section-subtitle {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--isis-text-muted);
    margin: 0;
}

.isis-geo-layers__count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    padding: 1px 7px;
    background: var(--isis-current-mod-soft, var(--isis-accent-soft));
    color: var(--isis-current-mod, var(--isis-accent));
    border-radius: var(--isis-radius);
    font-size: 0.72rem;
    font-weight: 600;
}

/* Empty state inline (C12) — variant de .isis-empty avec padding réduit
   adapté à un inline dans une fiche détail (pas une page complète). */
.isis-empty--inline {
    padding: 2rem 1.5rem;
    max-width: 460px;
}
.isis-empty--inline .isis-empty__icon-wrap {
    width: 72px;
    height: 72px;
}
.isis-empty--inline .isis-empty__icon-wrap .rzi {
    font-size: 32px;
}

.isis-geo-layers__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}

.isis-geo-layers__item {
    display: grid;
    grid-template-columns: auto auto 1fr auto;
    align-items: center;
    gap: 0.55rem;
    padding: var(--isis-pad-tight);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    font-size: 0.85rem;
}

.isis-geo-layers__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius);
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    white-space: nowrap;
}

.isis-geo-layers__name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--isis-text);
    font-weight: 500;
}

.isis-geo-layers__actions {
    display: inline-flex;
    gap: 0.2rem;
}

/* Wrapper carte (C11) — conteneur position:relative pour ancrer la toolbar
   verticale en overlay top-right de la carte. */
.isis-geo-layers__map-wrap {
    position: relative;
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
    display: flex;
}
/* Pas de couche géo : carte de repli (site/pays) + bandeau CTA.
   flex:1 + min-height:0 → l'état vide remplit toute la hauteur restante du
   panneau (le bandeau CTA reste à sa taille, la carte prend le reste). */
.isis-geo-layers__empty-map { display: flex; flex-direction: column; gap: 0.6rem; flex: 1 1 auto; min-height: 0; }
.isis-geo-layers__empty-map > .isis-affaires-map { flex: 1 1 auto; min-height: 0; }
.isis-geo-layers__empty-cta { flex-shrink: 0; }
.isis-geo-layers__empty-cta {
    display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 0.6rem;
    padding: 0.5rem 0.75rem; background: var(--isis-surface-alt, #f7f8fa);
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 6px);
}
.isis-geo-layers__empty-cta-text { display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; color: var(--isis-text-muted); }
.isis-geo-layers__empty-cta-actions { display: flex; gap: 0.4rem; }
.isis-geo-layers__map-wrap > .isis-affaires-map {
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
}

/* Mini-toolbar verticale carte (C11) — overlay top-right, boutons icône.
   Pattern aligné sur les outils Leaflet natifs (zoom +/-) mais en colonne. */
.isis-map-toolbar {
    position: absolute;
    top: 0.6rem;
    right: 0.6rem;
    z-index: 400;     /* au-dessus des tiles Leaflet (200) et controls (300) */
    display: inline-flex;
    flex-direction: column;
    gap: 0.2rem;
    padding: 0.25rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
}

/* Séparateur visuel entre groupes de boutons dans la toolbar verticale. */
.isis-map-toolbar__sep {
    height: 1px;
    background: var(--isis-border);
    margin: 0.2rem 4px;
}

/* Popover basemap switcher — apparaît à gauche du bouton 🗺. */
.isis-map-basemap-popover {
    position: absolute;
    top: 0.6rem;
    right: 3rem;
    z-index: 410;
    min-width: 180px;
    padding: 0.35rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.isis-map-basemap-popover__item {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.6rem;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    cursor: pointer;
    color: var(--isis-text);
    font-size: 0.82rem;
    text-align: left;
    transition: background-color 120ms;
}
.isis-map-basemap-popover__item:hover {
    background: var(--isis-surface-alt);
}
.isis-map-basemap-popover__item.is-active {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-weight: 600;
}

/* Légende dynamique (Sprint-2 #12) — overlay bottom-left, semi-transparente. */
.isis-map-legend {
    position: absolute;
    bottom: 1.5rem;
    left: 0.6rem;
    z-index: 400;
    min-width: 160px;
    max-width: 260px;
    padding: 0.5rem 0.6rem;
    background: rgba(255, 255, 255, 0.92);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
    backdrop-filter: blur(4px);
}
.isis-map-legend__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.35rem;
}
.isis-map-legend__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
.isis-map-legend__item {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    color: var(--isis-text);
}
.isis-map-legend__swatch {
    display: inline-block;
    width: 16px;
    height: 12px;
    border-radius: 2px;
    flex-shrink: 0;
}
.isis-map-legend__label {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.isis-map-legend__toggle {
    position: absolute;
    bottom: 1.5rem;
    left: 0.6rem;
    z-index: 400;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.55rem;
    background: rgba(255, 255, 255, 0.92);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    cursor: pointer;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}
.isis-map-legend__toggle:hover {
    color: var(--isis-text);
    background: var(--isis-surface);
}

/* Status bar overlay (Sprint-3 #6) — coordonnées au survol, en bas centre. */
.isis-map-statusbar {
    position: absolute;
    bottom: 0.4rem;
    left: 50%;
    transform: translateX(-50%);
    z-index: 410;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.2rem 0.6rem;
    background: rgba(255, 255, 255, 0.92);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    font-family: var(--isis-font-mono, monospace);
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    pointer-events: none;
}

/* Label flottant de mesure (Sprint-2 #11) — affiché sur la carte. */
.isis-measure-label {
    display: inline-block;
    padding: 0.15rem 0.45rem;
    background: rgba(75, 95, 173, 0.92);
    color: #ffffff;
    border-radius: 3px;
    font-size: 0.72rem;
    font-weight: 600;
    white-space: nowrap;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
}

/* Drag handle pour les couches du rail (Sprint-1 #1). */
.isis-geo-layers__drag-handle {
    cursor: grab;
    color: var(--isis-text-muted);
    padding: 2px;
    user-select: none;
}
.isis-geo-layers__drag-handle:active { cursor: grabbing; }
.isis-geo-layers__item--rail[draggable="true"]:hover .isis-geo-layers__drag-handle {
    color: var(--isis-text);
}

/* Feedback drag-reorder (V1.5 polish A2 — 2026-05-24). */
.isis-geo-layers__item--rail.is-dragging {
    opacity: 0.45;
    background: var(--isis-surface-alt);
    transition: opacity 120ms;
}
.isis-geo-layers__item--rail.is-drop-target {
    box-shadow: inset 0 3px 0 0 var(--isis-accent);
    background: var(--isis-accent-soft);
}

/* Slider opacité par couche (Sprint-1 #2). */
.isis-geo-layers__opacity {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.1rem 0;
}
.isis-geo-layers__opacity-slider {
    flex: 1 1 auto;
    min-width: 0;
    height: 14px;
    cursor: pointer;
}
.isis-geo-layers__opacity-val {
    font-family: var(--isis-font-mono, monospace);
    font-size: 0.68rem;
    color: var(--isis-text-muted);
    min-width: 32px;
    text-align: right;
}

/* Folder item — fond légèrement teinté + chevron de groupe. */
.isis-geo-layers__item--folder {
    background: var(--isis-surface-alt);
    border-style: dashed;
}

/* Actions du rail-head (bouton + créer groupe). */
.isis-geo-layers__rail-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.4rem;
}
.isis-geo-layers__rail-head-actions {
    display: inline-flex;
    gap: 0.2rem;
}

.isis-map-toolbar__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: background-color 120ms, color 120ms;
}
.isis-map-toolbar__btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-map-toolbar__btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-map-toolbar__btn[aria-pressed="true"] {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}

/* Rail gauche couches — sans header doublé. Le sous-titre « Couches » est
   le seul élément du rail-head, posé via .isis-section-subtitle. */
.isis-geo-layers__rail {
    flex: 0 0 260px;
    align-self: stretch;
    min-height: 0;
    display: flex;
    flex-direction: column;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    overflow: hidden;
}

.isis-geo-layers__rail-head {
    flex: 0 0 auto;
    padding: var(--isis-pad-compact);
    border-bottom: 1px solid var(--isis-border);
    background: var(--isis-surface-alt);
}

.isis-geo-layers__list--rail {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0.45rem;
    gap: 0.35rem;
}

.isis-geo-layers__item--rail {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    padding: var(--isis-pad-tight);
}

.isis-geo-layers__item-row {
    display: flex;
    align-items: center;
    gap: 0.45rem;
}

.isis-geo-layers__item-name {
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--isis-text);
    word-wrap: break-word;
    line-height: 1.3;
}

.isis-geo-layers__item--rail .isis-geo-layers__actions {
    justify-content: flex-end;
    border-top: 1px dashed var(--isis-border-soft, #f1f2f5);
    padding-top: 0.3rem;
    margin-top: 0.1rem;
}

/* Breakpoint < 1280px (C10) — sur laptop 14" / iPad horizontal, le panneau
   proximité 320px + rail 260px laissent < 500px à la carte. On bascule le
   panneau en floating overlay ancré à droite de la carte (sur la carte).
   Largeur 300px, scroll interne, ombre marquée pour le détacher visuellement. */
@media (max-width: 1280px) {
    .isis-zone-map-shell--with-rail > .isis-proximity-panel {
        position: absolute;
        top: 0.6rem;
        right: 0.6rem;
        bottom: 0.6rem;
        z-index: 410;     /* au-dessus de la toolbar carte (400) */
        flex: 0 0 auto;
        width: 300px;
        max-height: calc(100% - 1.2rem);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    }
    .isis-zone-map-shell--with-rail.isis-zone-map-shell--panel-collapsed > .isis-proximity-panel {
        width: 44px;
    }
    /* Le shell devient position:relative pour ancrer le panneau en absolute. */
    .isis-zone-map-shell--with-rail {
        position: relative;
    }
}

/* Responsive : sur écran étroit < 900px, le shell repasse en column et le rail
   se met au-dessus de la carte. Le panneau revient en position normale (column). */
@media (max-width: 900px) {
    .isis-zone-map-shell--with-rail .isis-geo-layers__rail {
        flex: 0 0 auto;
        max-height: 220px;
    }
    .isis-zone-map-shell--with-rail > .isis-proximity-panel {
        position: static;
        width: auto;
        max-height: none;
        box-shadow: none;
    }
}

/* Dialog dessin de couche (V1.4.1 — 2026-05-22). Layout column : meta compact,
   hint, carte plein-flex, actions. La carte doit prendre toute la hauteur dispo.

   Chaîne flex : le caller (GeoLayersSection.OpenDrawDialogAsync) pose
   CssClass="isis-dialog-flex" + ContentCssClass="isis-dialog-content-flex" sur
   les DialogOptions Radzen. Ces 2 classes (définies plus haut dans ce fichier)
   propagent flex column + min-height: 0 sur .rz-dialog et .rz-dialog-content.
   Ici on prolonge la chaîne : .isis-form-linear--dialog (wrapper combiné avec
   .isis-geo-draw-dialog) doit prendre toute la hauteur sans rompre le flex. */
.isis-form-linear--dialog.isis-geo-draw-dialog,
.isis-geo-draw-dialog {
    display: flex;
    flex-direction: column;
    gap: 0.7rem;
    height: 100%;
    min-height: 0;
    flex: 1 1 auto;
}

.isis-geo-draw__meta {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    align-items: flex-end;
    flex: 0 0 auto;
}

.isis-geo-draw__meta-field {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.isis-geo-draw__meta-field--grow {
    flex: 1 1 auto;
    min-width: 200px;
}

.isis-geo-draw__hint {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    padding: 0.45rem 0.65rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text-muted);
    font-size: 0.8rem;
    line-height: 1.4;
    flex: 0 0 auto;
}

.isis-geo-draw__hint strong {
    color: var(--isis-text);
    font-weight: 600;
}

.isis-geo-draw__map {
    flex: 1 1 auto;
    min-height: 0;       /* indispensable pour qu'un enfant flex stretche correctement */
    height: 100%;         /* fallback navigateurs qui ignorent flex sur l'enfant carte */
}

.isis-geo-draw-dialog .isis-form-linear__actions {
    flex: 0 0 auto;
}

.isis-zone-section {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 1rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    /* Chaîne flex : si le panel parent est en --footed (flex column),
       la zone-section prend toute la hauteur disponible, ce qui permet à
       la carte interne de stretcher vers le bas. */
    flex: 1 1 auto;
    min-height: 0;
}

/* Mode plein écran (V1.3 — 2026-05-22).
   Toggle agrandir : la section quitte le flux normal et occupe tout l'espace
   sous le header global de l'app (--isis-header-h ~56px). Z-index 950 :
   au-dessus du contenu normal mais EN-DESSOUS des dialogs Radzen (1010+) qui
   peuvent se poser par-dessus (ex : DialogService.Confirm). Touche Échap = sortie. */
/* Calque .isis-geo-layers--expanded (refonte 2026-05-29) : subnav module
   visible en mode plein écran. La navigation entre fiches reste possible
   sans sortir du focus. */
.isis-zone-section--expanded {
    position: fixed;
    top: var(--isis-header-h, 56px);
    left: var(--isis-subnav-w, 280px);
    right: 0;
    bottom: 0;
    z-index: 950;
    border-radius: 0;
    border: none;
    border-top: 1px solid var(--isis-border);
    padding: 0.75rem 1rem 1rem;
    outline: none;
    transition: left 200ms cubic-bezier(0.4, 0, 0.2, 1);
}
.isis-shell.is-subnav-collapsed .isis-zone-section--expanded {
    left: var(--isis-subnav-w-collapsed, 64px);
}

/* En mode plein écran, focus visible discret sur le root focusable. */
.isis-zone-section--expanded:focus-visible {
    box-shadow: inset 0 0 0 2px var(--isis-accent);
}

/* Bouton agrandir actif (état "en mode plein écran") : feedback visuel léger. */
.isis-grid__action-btn.is-active {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
}

.isis-zone-section__header {
    flex: 0 0 auto;
}

/* Carte interne — quand elle est dans une isis-zone-section flex, elle prend
   tout l'espace restant. min-height garantit une hauteur minimum si le panel
   parent est très petit (mobile). */
.isis-zone-section > .isis-affaires-map {
    flex: 1 1 auto;
    min-height: 240px;
}

.isis-zone-section__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 1.5rem 1rem;
    text-align: center;
}

.isis-zone-section__empty strong {
    color: var(--isis-text);
}

.isis-zone-section__empty span {
    color: var(--isis-text-muted);
    font-size: 0.875rem;
    max-width: 500px;
}

.isis-zone-section__header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
}

.isis-zone-section__meta {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
}

.isis-zone-section__actions {
    display: flex;
    gap: 0.3rem;
}

.isis-zone-section__placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    min-height: 180px;
    background: var(--isis-surface-alt);
    border: 1px dashed var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text-muted);
    font-size: 0.875rem;
}

.isis-zone-summary {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.isis-zone-summary__row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.875rem;
}

.isis-zone-summary__preview {
    margin-top: 0.85rem;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.isis-zone-summary__preview-label {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}

/* ──────────────────────────────────────────────────────────────────────────
   Dialog d'édition inline (V1.2 chantier géo) — Leaflet.draw plein écran
   dans un dialog 880×640. Hint en haut, carte plein-flex, actions en bas.
   ────────────────────────────────────────────────────────────────────────── */
.isis-zone-edit {
    display: flex;
    flex-direction: column;
    gap: 0.7rem;
    height: 100%;
}

.isis-zone-edit__hint {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 0.55rem 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text-muted);
    font-size: 0.83rem;
    line-height: 1.4;
}

.isis-zone-edit__hint strong {
    color: var(--isis-text);
    font-weight: 600;
}

.isis-zone-edit__map {
    flex: 1 1 auto;
    min-height: 380px;
}

/* ============================================================================
   Carte Leaflet (Sprint 3 chantier géo)
   ============================================================================ */

.isis-affaires-map {
    width: 100%;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    overflow: hidden;
}

/* ──────────────────────────────────────────────────────────────────────────
   Vue portfolio (V1.2) — bandeau meta + carte sur AppelOffreListPage et page
   /gesmaff/carte. La carte porte sa propre bordure (.isis-affaires-map),
   le bandeau meta est aligné juste au-dessus.
   ────────────────────────────────────────────────────────────────────────── */
.isis-map-portfolio {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    min-height: 0;
    height: 100%;
}

/* Wrapper qui prend la hauteur restante dans .isis-rich-page (en mode carte
   sur AppelOffreListPage et la future page /gesmaff/carte). Chaîne flex requise
   pour que la carte Leaflet ait une hauteur effective (cf. memory project-isis-grid-pattern). */
.isis-portfolio-wrap {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.isis-portfolio-wrap > .isis-map-portfolio {
    flex: 1 1 auto;
    min-height: 0;
}

.isis-portfolio-wrap > .isis-map-portfolio > .isis-affaires-map {
    flex: 1 1 auto;
    min-height: 0;
}

.isis-map-portfolio__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 2rem 1rem;
    text-align: center;
    background: var(--isis-surface-alt);
    border: 1px dashed var(--isis-border);
    border-radius: 6px;
    color: var(--isis-text-muted);
}

.isis-map-portfolio__empty strong {
    color: var(--isis-text);
    font-size: 0.95rem;
}

.isis-map-portfolio__meta {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
}

.isis-map-portfolio__meta-count strong {
    color: var(--isis-text);
    font-weight: 600;
}

.isis-map-portfolio__meta-detail {
    opacity: 0.85;
}

.isis-affaires-map__error {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.5rem;
    font-size: 0.85rem;
    color: var(--isis-danger);
}

/* Marker custom — pastille ronde couleur module gesmaff (ambre).
   Le wrapper L.divIcon a className `isis-map-marker-wrap`, l'élément interne
   `isis-map-marker` est le rendu HTML défini dans affaires-map.js. */
.isis-map-marker-wrap {
    background: transparent;
    border: none;
}

.isis-map-marker {
    display: inline-block;
    width: 16px;
    height: 16px;
    background: #d97706;
    border: 2px solid #ffffff;
    border-radius: 50%;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
    transform: translate(-2px, -2px);
}

/* Popup Leaflet — alignement avec le ton ISIS. */
.leaflet-popup-content-wrapper {
    border-radius: 4px;
    font-family: inherit;
}

.leaflet-popup-content {
    margin: 8px 12px;
    font-size: 0.85rem;
    line-height: 1.4;
}

/* ───────────────────────────────────────────────────────────────────────────
   Markers proximité — pastille ronde colorée par kind d'affaire
   (Ao/Marche → ambre gesmaff ; DemandeClient → bleu ; Commande → teal gesproj)
   ─────────────────────────────────────────────────────────────────────────── */
.isis-nearby-marker-wrap {
    background: transparent;
    border: none;
}

/* Labels distance posés au milieu des lignes pointillées (V1.3 — 2026-05-22).
   Le wrapper L.divIcon n'a pas de fond ; le span interne a un fond blanc
   semi-opaque + bord léger pour rester lisible sur tous les fonds carto
   (OSM/Satellite/Topo). */
.isis-distance-label-wrap {
    background: transparent;
    border: none;
    pointer-events: none;
}

.isis-distance-label {
    display: inline-block;
    padding: 1px 6px;
    background: rgba(255, 255, 255, 0.92);
    color: #374151;
    font-size: 10px;
    font-weight: 600;
    border-radius: 8px;
    border: 1px solid rgba(0, 0, 0, 0.12);
    white-space: nowrap;
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
}

.isis-nearby-marker {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    border: 2px solid #ffffff;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}

.isis-nearby-marker .material-symbols-outlined {
    font-size: 16px;
    color: #ffffff;
    font-variation-settings: 'FILL' 1, 'wght' 500;
}

/* ───────────────────────────────────────────────────────────────────────────
   Popup proximité — header avec pastille + meta + lien fiche
   ─────────────────────────────────────────────────────────────────────────── */
.isis-nearby-popup__header {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin-bottom: 0.4rem;
}

.isis-nearby-popup__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    flex-shrink: 0;
}

.isis-nearby-popup__icon .material-symbols-outlined {
    font-size: 16px;
    color: #ffffff;
    font-variation-settings: 'FILL' 1, 'wght' 500;
}

.isis-nearby-popup__title {
    line-height: 1.2;
}

.isis-nearby-popup__kind {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.isis-nearby-popup__intitule {
    font-size: 0.82rem;
    color: var(--isis-text);
    margin-bottom: 0.35rem;
}

.isis-nearby-popup__meta {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    margin-bottom: 0.4rem;
}

.isis-nearby-popup__link {
    display: inline-block;
    font-size: 0.82rem;
    font-weight: 500;
    color: var(--isis-accent);
    text-decoration: none;
}

.isis-nearby-popup__link:hover,
.isis-nearby-popup__link:focus-visible {
    text-decoration: underline;
}

/* ───────────────────────────────────────────────────────────────────────────
   Panneau proximité (V1 chantier "affaires à proximité")
   Apparaît sous la carte dans ZoneGeoSection, n'apparaît que si centroïde
   calculable (zone géo non vide).
   ─────────────────────────────────────────────────────────────────────────── */
.isis-proximity-panel {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    padding: var(--isis-pad-compact);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    background: var(--isis-surface);
}

/* Shell carte + panneau proximité côte-à-côte (V1.2 — 2026-05-22)
   La carte et le panneau « À proximité » sont des frères en flex row :
   carte à gauche prend l'espace restant, panneau à droite fixé à 320px.
   Sur mobile (< 900px) on passe en column → panneau sous la carte. */
.isis-zone-map-shell {
    flex: 1 1 auto;
    min-height: 240px;
    display: flex;
    flex-direction: row;
    align-items: stretch;
    gap: 0.75rem;
    min-width: 0;
}

.isis-zone-map-shell > .isis-affaires-map {
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
}

/* Panneau proximité côte-à-côte de la carte (V1.2).
   - Largeur fixe 320px sur desktop
   - Toujours visible (le header contient le switch d'activation)
   - Quand le toggle est ON, le body scrolle si la liste dépasse la hauteur dispo
   - Override le padding pour rester compact en mode collapsed (juste le switch) */
.isis-zone-map-shell > .isis-proximity-panel {
    flex: 0 0 320px;
    align-self: stretch;
    min-height: 0;
    padding: 0.55rem 0.75rem 0.6rem;
    /* Le body interne scrolle, le header reste figé en tête */
    overflow: hidden;
}

/* Body scrollable — contient controls + list. Le header reste visible en haut. */
.isis-proximity-panel__body {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 0;
}

/* Bouton diagnostic (V1.3) — icône « i » dans le header du panneau, au bout
   de la ligne header. Active = fond accent-soft + accent. */
.isis-proximity-panel__diag-btn {
    margin-left: auto;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    width: 24px;
    height: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: background-color 120ms, color 120ms, border-color 120ms;
}

.isis-proximity-panel__diag-btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

.isis-proximity-panel__diag-btn.is-active {
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    border-color: var(--isis-accent-soft);
}

/* Bloc diagnostic — apparait sous le header quand l'user toggle l'icône « i ».
   Encadré teinté + table compacte 3 colonnes. */
.isis-proximity-diag {
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    padding: 0.6rem 0.7rem;
    font-size: 0.78rem;
    color: var(--isis-text);
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.isis-proximity-diag__head {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    justify-content: space-between;
}

.isis-proximity-diag__refresh {
    background: transparent;
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    width: 22px;
    height: 22px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: background-color 120ms, color 120ms;
}

.isis-proximity-diag__refresh:hover {
    background: var(--isis-surface);
    color: var(--isis-accent);
    border-color: var(--isis-accent);
}

.isis-proximity-diag__center {
    font-family: var(--isis-font-mono, monospace);
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}

.isis-proximity-diag__table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.76rem;
}

.isis-proximity-diag__table th,
.isis-proximity-diag__table td {
    padding: 0.25rem 0.4rem;
    text-align: left;
}

.isis-proximity-diag__table th {
    font-weight: 600;
    color: var(--isis-text-muted);
    border-bottom: 1px solid var(--isis-border);
}

.isis-proximity-diag__table td:nth-child(2),
.isis-proximity-diag__table td:nth-child(3),
.isis-proximity-diag__table th:nth-child(2),
.isis-proximity-diag__table th:nth-child(3) {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

.isis-proximity-diag__sep td {
    padding-top: 0.4rem;
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    border-top: 1px dashed var(--isis-border);
}

.isis-proximity-diag__note td {
    font-size: 0.72rem;
    color: var(--isis-warning, #b45309);
    font-style: italic;
}

.isis-proximity-diag__hint {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    line-height: 1.4;
}

.isis-proximity-diag__hint--error {
    color: var(--isis-danger, #b91c1c);
}

.isis-proximity-diag__hint a {
    color: var(--isis-accent);
    text-decoration: underline;
}

/* Responsive : sur écran étroit, repasse en column → panneau sous la carte
   (comportement V1 d'origine). Largeur libérée pour la carte. */
@media (max-width: 900px) {
    .isis-zone-map-shell {
        flex-direction: column;
    }
    .isis-zone-map-shell > .isis-proximity-panel {
        flex: 0 0 auto;
        max-height: 50vh;
    }
}

.isis-proximity-panel__header {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}

/* Le titre du panneau utilise désormais .isis-section-title (B7). La règle
   ci-dessous reste pour la rétro-compatibilité d'éventuels call-sites externes. */
.isis-proximity-panel__title {
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--isis-text);
}

.isis-proximity-panel__count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 20px;
    padding: 0 6px;
    margin-left: auto;
    background: var(--isis-current-mod, var(--isis-accent));
    color: #ffffff;
    border-radius: var(--isis-radius);
    font-size: 0.72rem;
    font-weight: 600;
}

.isis-proximity-panel__controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem;
    padding-top: 0.4rem;
    border-top: 1px dashed var(--isis-border);
}

.isis-proximity-panel__field {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.82rem;
    color: var(--isis-text-muted);
}

/* ─────────────────────────────────────────────────────────────────────────
   Système de chip toggle unifié (B5 — refonte 2026-05-23)
   Remplace .isis-proximity-panel__lines-btn / __strate-btn / __type-label.
   Une seule classe `.isis-toggle-chip` couvre les 3 usages (toggle simple,
   toggle membre d'un group à choix unique, toggle checkbox couleur module).

   États :
     base : fond surface, border, texte muted
     hover : fond surface-alt, texte normal
     :focus-visible : outline accent
     .is-active : fond accent-soft, border accent-soft, texte accent

   Modificateur via style="..." inline (B8) — pour les chips type-colorés
   (AO/marché/demande/commande/collab/équipement), pose background/border/color
   via les vars `--isis-mod-*` calculées côté Razor (helper TypeChipStyle).
   ───────────────────────────────────────────────────────────────────────── */
.isis-toggle-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.22rem 0.6rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    cursor: pointer;
    color: var(--isis-text-muted);
    font-size: 0.78rem;
    font-weight: 500;
    transition: background-color 120ms, color 120ms, border-color 120ms, box-shadow 120ms;
}
.isis-toggle-chip:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-toggle-chip:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-toggle-chip.is-active {
    background: var(--isis-accent-soft);
    border-color: var(--isis-accent);
    color: var(--isis-accent);
    font-weight: 600;
}
/* Quand un chip a un style inline (B8 — TypeChipStyle), l'état actif est
   géré par les vars module CSS. Sinon (chip neutre genre Lignes/Strate),
   l'état actif retombe sur l'accent. */
.isis-toggle-chip[style*="--isis-mod-"].is-active {
    box-shadow: 0 0 0 1px currentColor;
}

/* Group de chips — segmented control horizontal */
.isis-toggle-chip-group {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.3rem;
}

/* Variant checkbox : les chips sont indépendants (toggles multiples),
   contre le pattern segmented (choix unique). Espacement légèrement plus
   généreux pour cliquer sans confusion entre 2 chips voisins. */
.isis-toggle-chip-group--checkbox {
    gap: 0.35rem;
    padding-top: 0.4rem;
    border-top: 1px dashed var(--isis-border);
}

/* Compas de filtre secteur (V1.3 option 7 — pattern boussole conservé).
   Grille 3×3 des 8 directions + bouton « Tous » au centre. Disposition
   spatiale = affordance immédiate (N en haut, S en bas). Pattern visuel
   *différent* du toggle-chip (par design — c'est un compas, pas un toggle). */
.isis-proximity-panel__sector {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    padding-top: 0.4rem;
    border-top: 1px dashed var(--isis-border);
}
.isis-proximity-panel__sector > .isis-section-subtitle {
    padding-top: 0.4rem;
}

.isis-proximity-panel__sector-grid {
    display: grid;
    grid-template-columns: repeat(3, 28px);
    grid-template-rows: repeat(3, 24px);
    gap: 2px;
}

.isis-proximity-panel__sector-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    cursor: pointer;
    color: var(--isis-text-muted);
    font-size: 0.65rem;
    font-weight: 600;
    padding: 0;
    transition: background-color 100ms, color 100ms, border-color 100ms;
}
.isis-proximity-panel__sector-btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-proximity-panel__sector-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}
.isis-proximity-panel__sector-btn.is-active {
    background: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    color: #ffffff;
}

/* Positionnement spatial dans le grid 3×3 (mime une boussole : N en haut, S en bas) */
.isis-proximity-panel__sector-btn--nw  { grid-column: 1; grid-row: 1; }
.isis-proximity-panel__sector-btn--n   { grid-column: 2; grid-row: 1; }
.isis-proximity-panel__sector-btn--ne  { grid-column: 3; grid-row: 1; }
.isis-proximity-panel__sector-btn--w   { grid-column: 1; grid-row: 2; }
.isis-proximity-panel__sector-btn--all { grid-column: 2; grid-row: 2; }
.isis-proximity-panel__sector-btn--e   { grid-column: 3; grid-row: 2; }
.isis-proximity-panel__sector-btn--sw  { grid-column: 1; grid-row: 3; }
.isis-proximity-panel__sector-btn--s   { grid-column: 2; grid-row: 3; }
.isis-proximity-panel__sector-btn--se  { grid-column: 3; grid-row: 3; }

/* Panneau proximité collapsible (C9) — bouton chevron de repli + variant
   colonne étroite pour le mode collapsed. */
.isis-proximity-panel__collapse-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    padding: 0;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 4px;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: background-color 120ms, color 120ms;
}
.isis-proximity-panel__collapse-btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}
.isis-proximity-panel__collapse-btn:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}

/* État collapsed — panneau étroit : juste le chevron (et le compteur si dispo). */
.isis-proximity-panel--collapsed {
    flex: 0 0 44px !important;
    width: 44px !important;
    padding: 0.35rem 0.25rem !important;
}
.isis-proximity-panel--collapsed .isis-proximity-panel__header {
    flex-direction: column;
    align-items: center;
    gap: 0.4rem;
}

.isis-proximity-panel__hint,
.isis-proximity-panel__empty {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    padding: 0.4rem 0;
}

.isis-proximity-panel__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    border-top: 1px dashed var(--isis-border);
    padding-top: 0.35rem;
}

.isis-proximity-panel__item {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.3rem 0;
    font-size: 0.82rem;
}

.isis-proximity-panel__item + .isis-proximity-panel__item {
    border-top: 1px solid var(--isis-border);
}

/* Icône d'un item de la liste proximité — couleurs unifiées (B8).
   Le style est appliqué inline via @TypeChipStyle() côté Razor (background +
   border + color en vars module). Le contenu .rzi hérite de la color du parent. */
.isis-proximity-panel__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    flex-shrink: 0;
}

.isis-proximity-panel__icon .rzi {
    font-size: 14px;
    color: inherit;
}

/* Ligne entreprise dans le popup ressource (icône domain + label). */
.isis-nearby-popup__entreprise {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    margin-bottom: 0.35rem;
}

.isis-nearby-popup__entreprise .material-symbols-outlined {
    font-size: 14px;
}

.isis-proximity-panel__link {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    color: var(--isis-text);
    text-decoration: none;
    line-height: 1.2;
}

.isis-proximity-panel__link strong {
    font-weight: 600;
    font-size: 0.82rem;
}

.isis-proximity-panel__intitule {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.isis-proximity-panel__link:hover strong,
.isis-proximity-panel__link:focus-visible strong {
    color: var(--isis-accent);
    text-decoration: underline;
}

.isis-proximity-panel__distance {
    flex-shrink: 0;
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

.isis-proximity-panel__more {
    padding: 0.35rem 0 0;
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    font-style: italic;
    border-top: 1px solid var(--isis-border);
    text-align: center;
}

/* ───────────────────────────────────────────────────────────────────────────
   Dashboard gesmaff V2 — bandeau alertes, funnel, trend, donut, leaderboards.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-alert-banner-list {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-1);
    padding: 0.85rem 1rem 0.75rem;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.isis-alert-banner-list__header {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    padding-bottom: 0.4rem;
    border-bottom: 1px solid var(--isis-border);
}

.isis-alert-banner-list__title {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
}

.isis-alert-banner-list__subtitle {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
}

.isis-alert-banner-list__items {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.isis-alert-banner-list__row {
    display: grid;
    grid-template-columns: 10px 1fr 32px;
    align-items: center;
    gap: 0.65rem;
    padding: 0.45rem 0.55rem;
    border-radius: 6px;
    background: var(--isis-surface-soft);
    border-left: 3px solid var(--isis-text-muted);
}

.isis-alert-banner-list__row.is-danger {
    border-left-color: var(--isis-danger);
    background: color-mix(in srgb, var(--isis-danger) 7%, var(--isis-surface));
}

.isis-alert-banner-list__row.is-warning {
    border-left-color: var(--isis-warning);
    background: color-mix(in srgb, var(--isis-warning) 7%, var(--isis-surface));
}

.isis-alert-banner-list__row.is-info {
    border-left-color: var(--isis-info, #3b82f6);
    background: color-mix(in srgb, var(--isis-info, #3b82f6) 7%, var(--isis-surface));
}

.isis-alert-banner-list__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.85;
}

.isis-alert-banner-list__row.is-danger .isis-alert-banner-list__dot { color: var(--isis-danger); }
.isis-alert-banner-list__row.is-warning .isis-alert-banner-list__dot { color: var(--isis-warning); }
.isis-alert-banner-list__row.is-info .isis-alert-banner-list__dot { color: var(--isis-info, #3b82f6); }

.isis-alert-banner-list__main {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}

.isis-alert-banner-list__alert-title {
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-alert-banner-list__alert-detail {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}

.isis-alert-banner-list__action {
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    border-radius: 6px;
    height: 28px;
    width: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: all 0.15s ease;
}

.isis-alert-banner-list__action:hover,
.isis-alert-banner-list__action:focus-visible {
    color: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}

.isis-alert-banner-list__footer {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    padding-top: 0.3rem;
    border-top: 1px dashed var(--isis-border);
}

/* ─── Funnel commercial ─────────────────────────────────────────────────── */

.isis-funnel {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    padding: 0;
}
/* Quand une rich-section ne contient qu'un funnel, on compacte son padding
   bas (le contenu compact rendait le padding 1rem visuellement excessif). */
.isis-rich-section:has(> .isis-funnel) {
    padding-bottom: 0.6rem;
}
.isis-rich-section:has(> .isis-funnel) .isis-rich-section__header {
    margin-bottom: 0;
    padding-bottom: 0.4rem;
}

.isis-funnel__row {
    display: grid;
    grid-template-columns: 140px 1fr 170px;
    align-items: center;
    gap: 0.75rem;
}

.isis-funnel__label {
    font-size: 0.82rem;
    color: var(--isis-text);
    font-weight: 500;
}

.isis-funnel__bar-wrap {
    position: relative;
    height: 18px;
    background: var(--isis-surface-soft);
    border-radius: 3px;
    overflow: hidden;
}

.isis-funnel__bar {
    height: 100%;
    background: var(--isis-current-mod, var(--isis-accent));
    border-radius: 3px;
    transition: width 0.3s ease;
}

.isis-funnel__bar.is-demande       { background: color-mix(in srgb, var(--isis-mod-gesmaff) 70%, var(--isis-text-muted)); }
.isis-funnel__bar.is-ao-cree       { background: color-mix(in srgb, var(--isis-mod-gesmaff) 80%, white); }
.isis-funnel__bar.is-ao-depose     { background: var(--isis-mod-gesmaff); }
.isis-funnel__bar.is-ao-obtenu     { background: var(--isis-success); }
.isis-funnel__bar.is-marche-signe  { background: color-mix(in srgb, var(--isis-success) 80%, var(--isis-mod-gesmaff)); }

.isis-funnel__count {
    position: absolute;
    top: 50%;
    left: 0.45rem;
    transform: translateY(-50%);
    color: #fff;
    font-weight: 600;
    font-size: 0.75rem;
    text-shadow: 0 1px 2px rgba(0,0,0,0.35);
    font-variant-numeric: tabular-nums;
}

.isis-funnel__sub {
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* ─── Layout 2 colonnes pour les sections dashboard ────────────────────── */

.isis-dash-2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1.1rem;
}

/* Variante asymétrique 3 colonnes : la 1re section occupe 2/3, la 2de 1/3
   (mockup ARCHITECT : Funnel|Donut et Quota|Mix). */
.isis-dash-2col--2-1 { grid-template-columns: 2fr 1fr; }

/* Une section seule occupe toute la largeur de la mosaïque (dégradation gracieuse
   quand son binôme n'a pas de données — ex : pas de comparaison multi-entreprises). */
.isis-dash-2col > .isis-span-2 { grid-column: 1 / -1; }

/* Bandeau de note (vue lecture seule, info contextuelle non bloquante). */
.isis-rich-banner {
    display: flex; align-items: center; gap: 0.6rem;
    background: var(--isis-accent-soft);
    border: 1px solid color-mix(in srgb, var(--isis-accent) 18%, var(--isis-border));
    color: var(--isis-text-muted);
    border-radius: var(--isis-radius-sm);
    padding: 0.55rem 0.85rem;
    font-size: 0.82rem;
}
.isis-rich-banner .rzi { color: var(--isis-accent); flex-shrink: 0; }

/* Grilles vues lecture seule Gescom (commandes / factures issues des offres de prix). */
.isis-grid--gescom-vente-cmd .isis-grid__head,
.isis-grid--gescom-vente-cmd .isis-grid__row {
    grid-template-columns: 40px minmax(160px, 1.5fr) 130px minmax(140px, 1.2fr) 130px 110px 72px;
}
.isis-grid--gescom-vente-fac .isis-grid__head,
.isis-grid--gescom-vente-fac .isis-grid__row {
    grid-template-columns: 40px minmax(150px, 1.4fr) 120px minmax(140px, 1.2fr) 130px 105px 105px 72px;
}

/* ───────── Catalogue de rapports commerciaux (/gescom/rapports) ───────── */
.isis-master-detail--rapports { grid-template-columns: 340px minmax(0, 1fr); }
@media (max-width: 1000px) { .isis-master-detail--rapports { grid-template-columns: 1fr; } }

.isis-report-cat__group { margin-bottom: 1rem; }
.isis-report-cat__group-title {
    font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--isis-text-soft); font-weight: 600; margin: 0 0 0.4rem 0.25rem;
}
.isis-report-cat__item {
    display: flex; align-items: flex-start; gap: 0.6rem; width: 100%;
    text-align: left; background: var(--isis-surface);
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm);
    padding: 0.6rem 0.7rem; margin-bottom: 0.4rem; cursor: pointer;
    transition: border-color .14s ease, background .14s ease, box-shadow .14s ease;
}
.isis-report-cat__item:hover { border-color: var(--isis-mod-gescom); background: var(--isis-surface-alt); }
.isis-report-cat__item:focus-visible { outline: none; box-shadow: var(--isis-elevation-focus); }
.isis-report-cat__item.is-active {
    border-color: var(--isis-mod-gescom);
    box-shadow: inset 3px 0 0 0 var(--isis-mod-gescom);
    background: color-mix(in srgb, var(--isis-mod-gescom) 6%, var(--isis-surface));
}
.isis-report-cat__icon {
    width: 30px; height: 30px; border-radius: 8px; flex-shrink: 0; display: inline-grid; place-items: center;
    background: color-mix(in srgb, var(--isis-mod-gescom) 11%, var(--isis-surface)); color: var(--isis-mod-gescom);
}
.isis-report-cat__text { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
.isis-report-cat__name { font-size: 0.85rem; font-weight: 600; color: var(--isis-text); }
.isis-report-cat__desc { font-size: 0.72rem; color: var(--isis-text-muted); line-height: 1.3; }

.isis-report-result__header {
    display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
    margin-bottom: 0.85rem; flex-wrap: wrap;
}
.isis-report-result__title { font-size: 1.05rem; font-weight: 700; color: var(--isis-text); margin: 0; letter-spacing: -0.01em; }
.isis-report-result__subtitle { font-size: 0.75rem; color: var(--isis-text-muted); }

.isis-report-table-wrap { overflow-x: auto; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm); }
.isis-report-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
.isis-report-table thead th {
    position: sticky; top: 0; background: var(--isis-surface-alt);
    text-align: left; font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.05em;
    color: var(--isis-text-muted); font-weight: 600; padding: 0.55rem 0.75rem;
    border-bottom: 1px solid var(--isis-border); white-space: nowrap;
}
.isis-report-table tbody td {
    padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--isis-border-soft); color: var(--isis-text);
}
.isis-report-table tbody tr:last-child td { border-bottom: none; }
.isis-report-table tbody tr:hover { background: var(--isis-surface-alt); }
.isis-report-table .is-right { text-align: right; }
.isis-report-table .is-num { font-family: var(--isis-cockpit-mono); font-variant-numeric: tabular-nums; }

/* ───────── Reprise de données (/admin/reprise) ───────── */
.isis-reprise-actions { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 0.85rem; }
.isis-reprise-upload { position: relative; overflow: hidden; cursor: pointer; }
.isis-reprise-upload input[type="file"] {
    position: absolute; inset: 0; opacity: 0; cursor: pointer; font-size: 0; width: 100%; height: 100%;
}
/* Tableau de mappage colonnes (reprise xlsx/csv → champs importeur). */
.isis-reprise-map__select {
    width: 100%;
    max-width: 360px;
    padding: 0.35rem 0.5rem;
    font: inherit;
    font-size: 0.85rem;
    color: var(--isis-text);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-sm, 6px);
}
.isis-reprise-map__select:focus-visible {
    outline: 2px solid color-mix(in srgb, var(--isis-accent) 55%, transparent);
    outline-offset: 1px;
}
.isis-reprise-map tr.is-missing td { background: color-mix(in srgb, var(--isis-warning) 9%, transparent); }
.isis-reprise-map__help { font-size: 0.78rem; color: var(--isis-text-muted); }

.isis-reprise-cols { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; margin-top: 0.85rem; }
.isis-reprise-cols__title { font-size: 0.75rem; color: var(--isis-text-muted); margin-right: 0.25rem; }
.isis-reprise-stats { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-bottom: 0.85rem; }
.isis-reprise-stat {
    font-size: 0.85rem; color: var(--isis-text-muted);
    background: var(--isis-surface-alt); border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius-pill); padding: 0.25rem 0.7rem;
}
.isis-reprise-stat b { color: var(--isis-text); font-family: var(--isis-cockpit-mono); }
.isis-reprise-stat.is-ok { background: var(--isis-success-soft); border-color: color-mix(in srgb, var(--isis-success) 25%, var(--isis-border)); }
.isis-reprise-stat.is-ok b { color: var(--isis-success); }
.isis-reprise-stat.is-danger { background: var(--isis-danger-soft); border-color: color-mix(in srgb, var(--isis-danger) 25%, var(--isis-border)); }
.isis-reprise-stat.is-danger b { color: var(--isis-danger); }
.isis-reprise-issues { margin-top: 0.6rem; max-height: 360px; overflow-y: auto; }

@media (max-width: 1100px) {
    .isis-dash-2col { grid-template-columns: 1fr; }
    .isis-dash-2col--2-1 { grid-template-columns: 1fr; }
}

.isis-dash-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 2rem 1rem;
    color: var(--isis-text-muted);
    text-align: center;
}

.isis-dash-empty strong {
    color: var(--isis-text);
    font-size: 0.95rem;
    font-weight: 600;
}

.isis-dash-empty span {
    font-size: 0.85rem;
}

.isis-dash-empty .rz-icon {
    font-size: 32px !important;
    color: var(--isis-text-muted);
    opacity: 0.6;
}

/* ─── Trend chart SVG ──────────────────────────────────────────────────── */

.isis-trend-chart {
    width: 100%;
    height: auto;
    display: block;
}

.isis-trend-chart__grid {
    stroke: var(--isis-border);
    stroke-width: 1;
    stroke-dasharray: 2 3;
}

.isis-trend-chart__bar {
    fill: color-mix(in srgb, var(--isis-mod-gesmaff) 30%, var(--isis-surface));
    stroke: var(--isis-mod-gesmaff);
    stroke-width: 1;
}

.isis-trend-chart__line {
    fill: none;
    stroke: var(--isis-success);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.isis-trend-chart__point {
    fill: var(--isis-surface);
    stroke: var(--isis-success);
    stroke-width: 2;
}

.isis-trend-chart__point:hover {
    stroke-width: 3;
    r: 5;
}

.isis-trend-chart__xlabel,
.isis-trend-chart__ylabel,
.isis-trend-chart__ylabel-right {
    font-size: 11px;
    fill: var(--isis-text-muted);
    font-family: var(--isis-font);
}

.isis-trend-chart__legend {
    font-size: 12px;
    fill: var(--isis-text);
    font-family: var(--isis-font);
}

/* ─── Donut chart ──────────────────────────────────────────────────────── */

.isis-donut-wrap {
    display: grid;
    grid-template-columns: 200px 1fr;
    align-items: center;
    gap: 1.2rem;
    padding: 0.5rem 0;
}

@media (max-width: 720px) {
    .isis-donut-wrap { grid-template-columns: 1fr; justify-items: center; }
}

.isis-donut {
    width: 200px;
    height: 200px;
    display: block;
}

.isis-donut__slice {
    stroke: var(--isis-surface);
    stroke-width: 1;
    transition: opacity 0.15s ease;
}

.isis-donut__slice:hover { opacity: 0.85; }

.isis-donut__slice.is-prevu      { fill: color-mix(in srgb, var(--isis-mod-gesmaff) 30%, var(--isis-surface)); }
.isis-donut__slice.is-depose     { fill: color-mix(in srgb, var(--isis-mod-gesmaff) 60%, var(--isis-surface)); }
.isis-donut__slice.is-obtenu     { fill: var(--isis-success); }
.isis-donut__slice.is-perdu      { fill: color-mix(in srgb, var(--isis-danger) 60%, var(--isis-surface)); }
.isis-donut__slice.is-abandonne  { fill: color-mix(in srgb, var(--isis-text-muted) 60%, var(--isis-surface)); }
.isis-donut__slice.is-annule     { fill: color-mix(in srgb, var(--isis-text-muted) 30%, var(--isis-surface)); }

.isis-donut__total {
    font-size: 22px;
    font-weight: 700;
    fill: var(--isis-text);
    font-family: var(--isis-font);
}

.isis-donut__total-label {
    font-size: 11px;
    fill: var(--isis-text-muted);
    font-family: var(--isis-font);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.isis-donut__legend {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}

.isis-donut__legend-item {
    display: grid;
    grid-template-columns: 12px 1fr auto auto;
    align-items: center;
    gap: 0.5rem;
    padding: 0.2rem 0;
}

.isis-donut__legend-dot {
    width: 10px;
    height: 10px;
    border-radius: 2px;
}

.isis-donut__legend-dot.is-prevu      { background: color-mix(in srgb, var(--isis-mod-gesmaff) 30%, var(--isis-surface)); }
.isis-donut__legend-dot.is-depose     { background: color-mix(in srgb, var(--isis-mod-gesmaff) 60%, var(--isis-surface)); }
.isis-donut__legend-dot.is-obtenu     { background: var(--isis-success); }
.isis-donut__legend-dot.is-perdu      { background: color-mix(in srgb, var(--isis-danger) 60%, var(--isis-surface)); }
.isis-donut__legend-dot.is-abandonne  { background: color-mix(in srgb, var(--isis-text-muted) 60%, var(--isis-surface)); }
.isis-donut__legend-dot.is-annule     { background: color-mix(in srgb, var(--isis-text-muted) 30%, var(--isis-surface)); }

.isis-donut__legend-label {
    font-size: 0.85rem;
    color: var(--isis-text);
}

.isis-donut__legend-value {
    font-size: 0.82rem;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

.isis-donut__legend-pct {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

/* ─── Leaderboard (Top clients / Demandes / Owner perf) ────────────────── */

.isis-leaderboard {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.isis-leaderboard__row {
    display: grid;
    grid-template-columns: 1fr 140px 130px;
    align-items: center;
    gap: 0.75rem;
    padding: 0.45rem 0.55rem;
    border-radius: 6px;
    background: var(--isis-surface-soft);
    transition: background 0.15s ease;
}

.isis-leaderboard__row:hover {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-mod-gesmaff)) 6%, var(--isis-surface));
}

.isis-leaderboard--demande .isis-leaderboard__row {
    grid-template-columns: 10px 1fr auto 32px;
}

.isis-leaderboard__label {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}

.isis-leaderboard__name {
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-leaderboard__sub {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-leaderboard__bar-wrap {
    height: 8px;
    background: var(--isis-surface);
    border-radius: 4px;
    overflow: hidden;
    border: 1px solid var(--isis-border);
}

.isis-leaderboard__bar {
    height: 100%;
    background: var(--isis-mod-gesmaff);
    border-radius: 4px;
    transition: width 0.3s ease;
}

.isis-leaderboard__value {
    text-align: right;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}

.isis-leaderboard__age {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

.isis-leaderboard__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
}

.isis-leaderboard__dot.is-ok        { background: var(--isis-success); }
.isis-leaderboard__dot.is-warning   { background: var(--isis-warning); }
.isis-leaderboard__dot.is-danger    { background: var(--isis-danger); }

.isis-leaderboard__action {
    border: 1px solid var(--isis-border);
    background: var(--isis-surface);
    border-radius: 6px;
    height: 28px;
    width: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--isis-text-muted);
    transition: all 0.15s ease;
}

.isis-leaderboard__action:hover,
.isis-leaderboard__action:focus-visible {
    color: var(--isis-current-mod, var(--isis-accent));
    border-color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}

/* ─── Carte des affaires (wrapper Leaflet) ─────────────────────────────── */

.isis-dash-map {
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    overflow: hidden;
    background: var(--isis-surface-soft);
}

/* ─── Grille performance par owner ─────────────────────────────────────── */

.isis-grid--gesmaff-owner-perf {
    --isis-grid-min-width: 900px;
}

.isis-grid--gesmaff-owner-perf .isis-grid__head,
.isis-grid--gesmaff-owner-perf .isis-grid__row {
    grid-template-columns: 1.4fr 0.7fr 0.7fr 0.7fr 0.7fr 1fr;
}

.isis-grid__taux {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

.isis-grid__taux.is-success { color: var(--isis-success); }
.isis-grid__taux.is-warning { color: var(--isis-warning); }
.isis-grid__taux.is-muted   { color: var(--isis-text-muted); }

/* ───────────────────────────────────────────────────────────────────────────
   Dashboard gescom V2 — couleurs sémantiques funnel + donut statuts devis.
   Calque pattern gesmaff, adapté au cycle devis (10 statuts) et au module
   gescom. La graduation va du brouillon (pâle) vers signé (saturé).
   ─────────────────────────────────────────────────────────────────────────── */

/* Funnel devis — gradient brouillon → envoyé → signé */
.isis-funnel__bar.is-gescom-draft     { background: color-mix(in srgb, var(--isis-mod-gescom) 25%, var(--isis-surface)); }
.isis-funnel__bar.is-gescom-pending   { background: color-mix(in srgb, var(--isis-mod-gescom) 50%, var(--isis-surface)); }
.isis-funnel__bar.is-gescom-approved  { background: color-mix(in srgb, var(--isis-mod-gescom) 75%, var(--isis-surface)); }
.isis-funnel__bar.is-gescom-sent      { background: var(--isis-mod-gescom); }
.isis-funnel__bar.is-gescom-accepted  { background: var(--isis-success); }

/* Donut devis par statut */
.isis-donut__slice.is-gescom-draft        { fill: color-mix(in srgb, var(--isis-mod-gescom) 20%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-pending      { fill: color-mix(in srgb, var(--isis-mod-gescom) 45%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-approved     { fill: color-mix(in srgb, var(--isis-mod-gescom) 70%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-sent         { fill: var(--isis-mod-gescom); }
.isis-donut__slice.is-gescom-accepted     { fill: var(--isis-success); }
.isis-donut__slice.is-gescom-converted    { fill: color-mix(in srgb, var(--isis-success) 75%, var(--isis-mod-gescom)); }
.isis-donut__slice.is-gescom-rejected     { fill: color-mix(in srgb, var(--isis-danger) 70%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-cancelled    { fill: color-mix(in srgb, var(--isis-text-muted) 70%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-expired      { fill: color-mix(in srgb, var(--isis-warning) 70%, var(--isis-surface)); }
.isis-donut__slice.is-gescom-revised      { fill: color-mix(in srgb, var(--isis-mod-gescom) 35%, var(--isis-text-muted)); }
.isis-donut__slice.is-gescom-default      { fill: var(--isis-text-muted); }

/* Legend dots — memes couleurs en background plutot que fill */
.isis-donut__legend-dot.is-gescom-draft        { background: color-mix(in srgb, var(--isis-mod-gescom) 20%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-pending      { background: color-mix(in srgb, var(--isis-mod-gescom) 45%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-approved     { background: color-mix(in srgb, var(--isis-mod-gescom) 70%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-sent         { background: var(--isis-mod-gescom); }
.isis-donut__legend-dot.is-gescom-accepted     { background: var(--isis-success); }
.isis-donut__legend-dot.is-gescom-converted    { background: color-mix(in srgb, var(--isis-success) 75%, var(--isis-mod-gescom)); }
.isis-donut__legend-dot.is-gescom-rejected     { background: color-mix(in srgb, var(--isis-danger) 70%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-cancelled    { background: color-mix(in srgb, var(--isis-text-muted) 70%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-expired      { background: color-mix(in srgb, var(--isis-warning) 70%, var(--isis-surface)); }
.isis-donut__legend-dot.is-gescom-revised      { background: color-mix(in srgb, var(--isis-mod-gescom) 35%, var(--isis-text-muted)); }
.isis-donut__legend-dot.is-gescom-default      { background: var(--isis-text-muted); }

/* Grille performance par owner gescom */
.isis-grid--gescom-owner-perf {
    --isis-grid-min-width: 900px;
}
.isis-grid--gescom-owner-perf .isis-grid__head,
.isis-grid--gescom-owner-perf .isis-grid__row {
    grid-template-columns: 1.4fr 0.7fr 0.7fr 0.7fr 0.7fr 1.1fr;
}

/* ───────────────────────────────────────────────────────────────────────────
   Dashboard gescom — Performance marges (distribution devis vs seuils
   plancher/cible/max). Composé de :
   1. Barre empilée 100% pour vue d'ensemble (proportion par bucket)
   2. Liste détail (label + barre horizontale + count + valeur)
   3. Drill-down "top devis sous plancher" sur leaderboard
   Sémantique couleur : rouge=plancher / orange=sous-cible / vert=sain /
   bleu=au-dessus max / gris=non classable.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-margin-perf {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.isis-margin-perf__stack {
    display: flex;
    height: 28px;
    border-radius: 6px;
    overflow: hidden;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
}

.isis-margin-perf__stack-seg {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 4px;
    transition: width 0.3s ease, opacity 0.15s ease;
}

.isis-margin-perf__stack-seg:hover {
    opacity: 0.88;
}

.isis-margin-perf__stack-label {
    font-size: 0.72rem;
    font-weight: 600;
    color: #fff;
    text-shadow: 0 1px 2px rgba(0,0,0,0.35);
    font-variant-numeric: tabular-nums;
    padding: 0 0.25rem;
}

/* Couleurs sémantiques des 5 buckets */
.isis-margin-perf__stack-seg.is-sous-plancher,
.isis-margin-perf__bar.is-sous-plancher,
.isis-margin-perf__dot.is-sous-plancher        { background: var(--isis-danger); }

.isis-margin-perf__stack-seg.is-entre-plancher-cible,
.isis-margin-perf__bar.is-entre-plancher-cible,
.isis-margin-perf__dot.is-entre-plancher-cible { background: var(--isis-warning); }

.isis-margin-perf__stack-seg.is-entre-cible-max,
.isis-margin-perf__bar.is-entre-cible-max,
.isis-margin-perf__dot.is-entre-cible-max      { background: var(--isis-success); }

.isis-margin-perf__stack-seg.is-au-dessus-max,
.isis-margin-perf__bar.is-au-dessus-max,
.isis-margin-perf__dot.is-au-dessus-max        { background: var(--isis-mod-gescom); }

.isis-margin-perf__stack-seg.is-non-classifie,
.isis-margin-perf__bar.is-non-classifie,
.isis-margin-perf__dot.is-non-classifie        { background: color-mix(in srgb, var(--isis-text-muted) 60%, var(--isis-surface)); }

.isis-margin-perf__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.isis-margin-perf__row {
    display: grid;
    grid-template-columns: 280px 1fr 180px;
    align-items: center;
    gap: 0.85rem;
    padding: 0.5rem 0.6rem;
    border-radius: 6px;
    background: var(--isis-surface-soft);
    transition: background 0.15s ease;
}

.isis-margin-perf__row:hover {
    background: color-mix(in srgb, var(--isis-mod-gescom) 5%, var(--isis-surface));
}

.isis-margin-perf__label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-width: 0;
}

.isis-margin-perf__dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
}

.isis-margin-perf__name {
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
    flex-shrink: 0;
}

.isis-margin-perf__hint {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-margin-perf__bar-wrap {
    height: 10px;
    background: var(--isis-surface);
    border-radius: 5px;
    overflow: hidden;
    border: 1px solid var(--isis-border);
}

.isis-margin-perf__bar {
    height: 100%;
    border-radius: 5px;
    transition: width 0.3s ease;
}

.isis-margin-perf__counts {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 0.1rem;
    font-variant-numeric: tabular-nums;
}

.isis-margin-perf__count {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
}

.isis-margin-perf__value {
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--isis-text);
}

.isis-margin-perf__drill {
    margin-top: 0.6rem;
    padding-top: 0.8rem;
    border-top: 1px dashed var(--isis-border);
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.isis-margin-perf__drill-title {
    margin: 0;
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--isis-text);
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

@media (max-width: 900px) {
    .isis-margin-perf__row {
        grid-template-columns: 1fr;
        gap: 0.4rem;
    }
    .isis-margin-perf__counts {
        flex-direction: row;
        gap: 0.5rem;
    }
}

/* ───────────────────────────────────────────────────────────────────────────
   Phase A — chip warning + section Comparaison entreprises.
   Le chip warn signale une entreprise sans seuils marge configures.
   La section comparaison utilise une grille standard ISIS avec une colonne
   speciale "Contribution" qui affiche une barre + le %.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-chip__warn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--isis-warning);
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
    margin-left: 0.35rem;
}

.isis-grid--gescom-ent-comparison {
    --isis-grid-min-width: 980px;
}

.isis-grid--gescom-ent-comparison .isis-grid__head,
.isis-grid--gescom-ent-comparison .isis-grid__row {
    grid-template-columns: 1.6fr 1.1fr 1.4fr 1.1fr 0.8fr 0.9fr 50px;
}

.isis-grid__col-sublabel {
    font-size: 0.76rem;
    color: var(--isis-text-muted);
    margin-top: 0.1rem;
}

.isis-ent-comp__contrib {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.isis-ent-comp__contrib-bar-wrap {
    flex: 1;
    height: 8px;
    background: var(--isis-surface);
    border-radius: 4px;
    overflow: hidden;
    border: 1px solid var(--isis-border);
}

.isis-ent-comp__contrib-bar {
    height: 100%;
    background: var(--isis-mod-gescom);
    border-radius: 4px;
    transition: width 0.3s ease;
}

.isis-ent-comp__contrib-pct {
    font-size: 0.82rem;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    min-width: 50px;
    text-align: right;
}

/* ───────────────────────────────────────────────────────────────────────────
   Phase B — Progression vs quota + grille admin quotas.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-quota-progress {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.isis-quota-progress__numbers {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    font-variant-numeric: tabular-nums;
}

.isis-quota-progress__realise {
    font-size: 1.4rem;
    font-weight: 700;
    color: var(--isis-text);
}

.isis-quota-progress__sep      { color: var(--isis-text-muted); font-size: 1.1rem; }
.isis-quota-progress__quota    { color: var(--isis-text-muted); font-size: 1.1rem; }

.isis-quota-progress__pct {
    margin-left: auto;
    font-size: 1.6rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

.isis-quota-progress__pct.is-success { color: var(--isis-success); }
.isis-quota-progress__pct.is-warning { color: var(--isis-warning); }
.isis-quota-progress__pct.is-danger  { color: var(--isis-danger); }
.isis-quota-progress__pct.is-muted   { color: var(--isis-text-muted); }

.isis-quota-progress__bar-wrap {
    height: 18px;
    background: var(--isis-surface-soft);
    border-radius: 9px;
    overflow: hidden;
    border: 1px solid var(--isis-border);
}

.isis-quota-progress__bar {
    height: 100%;
    border-radius: 9px;
    transition: width 0.5s ease;
    background: var(--isis-mod-gescom);
}

.isis-quota-progress__bar.is-success { background: var(--isis-success); }
.isis-quota-progress__bar.is-warning { background: var(--isis-warning); }
.isis-quota-progress__bar.is-danger  { background: var(--isis-danger); }

.isis-quota-progress__overshoot {
    padding: 0.45rem 0.6rem;
    background: color-mix(in srgb, var(--isis-success) 12%, var(--isis-surface));
    border-radius: 6px;
    color: var(--isis-success);
    font-size: 0.85rem;
    font-weight: 500;
    border-left: 3px solid var(--isis-success);
}

/* Grille admin quotas */
.isis-grid--gescom-quotas {
    --isis-grid-min-width: 900px;
}

.isis-grid--gescom-quotas .isis-grid__head,
.isis-grid--gescom-quotas .isis-grid__row {
    grid-template-columns: 1.4fr 1fr 1fr 1.5fr 0.8fr 70px;
}

/* Variante "danger" du leaderboard pour les motifs de rejet */
.isis-leaderboard__bar.isis-leaderboard__bar--danger {
    background: var(--isis-danger);
}

/* ───────────────────────────────────────────────────────────────────────────
   Phase C — Mix Standard vs BPU. Barre empilée 100% + 2 cards detail.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-typemix {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.isis-typemix__stack {
    display: flex;
    height: 32px;
    border-radius: 6px;
    overflow: hidden;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
}

.isis-typemix__stack-seg {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 4px;
    color: #fff;
    font-size: 0.78rem;
    font-weight: 600;
    text-shadow: 0 1px 2px rgba(0,0,0,0.35);
    transition: width 0.3s ease;
}

.isis-typemix__stack-seg.is-standard { background: var(--isis-mod-gescom); }
.isis-typemix__stack-seg.is-bpu      { background: color-mix(in srgb, var(--isis-mod-gescom) 50%, var(--isis-warning)); }

.isis-typemix__detail {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.8rem;
}

@media (max-width: 720px) {
    .isis-typemix__detail { grid-template-columns: 1fr; }
}

.isis-typemix__card {
    padding: 0.85rem 1rem;
    border-radius: 8px;
    background: var(--isis-surface-soft);
    border-left: 4px solid var(--isis-mod-gescom);
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}

.isis-typemix__card.is-bpu {
    border-left-color: color-mix(in srgb, var(--isis-mod-gescom) 50%, var(--isis-warning));
}

.isis-typemix__card-label {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.isis-typemix__card-count {
    font-size: 1.6rem;
    font-weight: 700;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}

.isis-typemix__card-value {
    font-size: 0.85rem;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}

/* ───────────────────────────────────────────────────────────────────────────
   Phase D — Cycle détaillé + ligne N-1 sur le trend chart + KPI vélocité.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-cycle-detail {
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
}

.isis-cycle-detail__stack {
    display: flex;
    height: 32px;
    border-radius: 6px;
    overflow: hidden;
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border);
}

.isis-cycle-detail__stack-seg {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 4px;
    color: #fff;
    font-size: 0.78rem;
    font-weight: 600;
    text-shadow: 0 1px 2px rgba(0,0,0,0.35);
    padding: 0 0.5rem;
    transition: width 0.3s ease;
}

.isis-cycle-detail__stack-seg.is-create { background: var(--isis-mod-gescom); }
.isis-cycle-detail__stack-seg.is-sent   { background: var(--isis-success); }

.isis-cycle-detail__legend {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.6rem;
}

@media (max-width: 720px) {
    .isis-cycle-detail__legend { grid-template-columns: 1fr; }
}

.isis-cycle-detail__legend-item {
    display: grid;
    grid-template-columns: 12px 1fr auto;
    grid-template-rows: auto auto;
    grid-column-gap: 0.5rem;
    grid-row-gap: 0.1rem;
    padding: 0.45rem 0.6rem;
    border-radius: 6px;
    background: var(--isis-surface-soft);
    align-items: center;
}

.isis-cycle-detail__dot {
    grid-row: 1 / 3;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    align-self: center;
}

.isis-cycle-detail__dot.is-create { background: var(--isis-mod-gescom); }
.isis-cycle-detail__dot.is-sent   { background: var(--isis-success); }

.isis-cycle-detail__label {
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--isis-text);
}

.isis-cycle-detail__value {
    grid-row: 1;
    font-size: 0.95rem;
    font-weight: 700;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
}

.isis-cycle-detail__hint {
    grid-column: 2 / 4;
    grid-row: 2;
    font-size: 0.76rem;
    color: var(--isis-text-muted);
}

/* Ligne N-1 en pointillé sur le trend chart */
.isis-trend-chart__line.isis-trend-chart__line--prev {
    stroke: var(--isis-text-muted);
    stroke-width: 1.5;
    stroke-dasharray: 4 3;
    fill: none;
}

/* KPI vélocité — indicateur trend up/down dans le hint */
.isis-kpi-card__trend.is-up   { color: var(--isis-success); font-weight: 600; }
.isis-kpi-card__trend.is-down { color: var(--isis-warning); font-weight: 600; }

/* ───────────────────────────────────────────────────────────────────────────
   Sélecteur de Vue hiérarchique — control segmenté avec icônes Material
   Symbols. Distinct du filter-bar (axe primaire = qui on regarde, alors que
   Entreprise et Période sont secondaires). Refonte 2026-05-21.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-view-selector {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    margin: 0;
}

.isis-view-selector__label {
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    flex-shrink: 0;
}

.isis-view-selector__group {
    display: inline-flex;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    padding: 3px;
    gap: 2px;
    box-shadow: var(--isis-elevation-1);
}

.isis-view-selector__btn {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.5rem 0.85rem;
    background: transparent;
    border: none;
    border-radius: 7px;
    color: var(--isis-text-muted);
    font-size: 0.86rem;
    font-weight: 500;
    cursor: pointer;
    transition: all 0.15s ease;
    white-space: nowrap;
    font-family: inherit;
}

.isis-view-selector__btn:hover:not(.is-active) {
    background: var(--isis-surface-soft);
    color: var(--isis-text);
}

.isis-view-selector__btn:focus-visible {
    outline: 2px solid color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 60%, transparent);
    outline-offset: 1px;
}

.isis-view-selector__btn.is-active {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 12%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
    box-shadow: 0 1px 2px rgba(0,0,0,0.06);
}

.isis-view-selector__btn .rz-icon {
    font-size: 18px !important;
    line-height: 1;
}

.isis-view-selector__btn-label {
    line-height: 1;
}

@media (max-width: 720px) {
    .isis-view-selector {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.4rem;
    }
    .isis-view-selector__group {
        width: 100%;
    }
    .isis-view-selector__btn {
        flex: 1;
        justify-content: center;
        padding: 0.55rem 0.5rem;
    }
    /* En mobile : icônes seulement, libellé masqué (tooltip via title= reste accessible) */
    .isis-view-selector__btn-label {
        display: none;
    }
}

/* Variante text-only : pas d'icône, juste le libellé court (utilisée pour Période). */
.isis-view-selector__btn--text-only {
    padding-left: 1rem;
    padding-right: 1rem;
}

/* ───────────────────────────────────────────────────────────────────────────
   Layout des 3 sélecteurs sur une seule ligne (dashboard gescom V2).
   - Vue : segmented control avec icônes
   - Entreprise : dropdown calqué workspace switcher
   - Période : segmented control texte court
   Sur petit écran : wrap intelligent en colonne, chaque selector pleine largeur.
   ─────────────────────────────────────────────────────────────────────────── */

.isis-dash-filters {
    display: flex;
    align-items: center;
    gap: 1.25rem;
    flex-wrap: wrap;
}
/* Barre de filtres en carte (calque mockup ARCHITECT) — scopé dashboard gescom */
.isis-gescom-dash .isis-dash-filters {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 0.75rem;
    box-shadow: var(--isis-elevation-1);
    padding: 0.55rem 0.85rem;
    gap: 0.9rem;
}

.isis-dash-filter-group {
    display: flex;
    align-items: center;
    gap: 0.85rem;
}

@media (max-width: 900px) {
    .isis-dash-filters {
        flex-direction: column;
        align-items: stretch;
        gap: 0.75rem;
    }
    .isis-dash-filter-group {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.4rem;
    }
}

/* ───────────────────────────────────────────────────────────────────────────
   DashboardEntrepriseFilter — sélecteur d'entreprise stylé comme le workspace
   switcher du header (avatar pastel + nom + chevron + menu déroulant).
   Calqué sur .isis-header__workspace mais en variante "dashboard local" :
   - taille adaptée au filter-bar (pas pleine hauteur header)
   - bouton "Toutes" en tête de menu (équivalent "no filter")
   - badge warn `!` sur les entreprises sans seuils marge configurés
   ─────────────────────────────────────────────────────────────────────────── */

.isis-dash-entfilter {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.6rem 0.4rem 0.4rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-1);
    cursor: pointer;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
    min-width: 200px;
    max-width: 320px;
}

.isis-dash-entfilter:hover,
.isis-dash-entfilter:focus-visible {
    border-color: var(--isis-current-mod, var(--isis-accent));
    outline: none;
}

.isis-dash-entfilter:focus-visible {
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 35%, transparent);
}

.isis-dash-entfilter.is-open {
    border-color: var(--isis-current-mod, var(--isis-accent));
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 25%, transparent);
}

.isis-dash-entfilter__avatar {
    width: 30px;
    height: 30px;
    border-radius: 7px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.78rem;
    font-weight: 700;
    flex-shrink: 0;
    overflow: hidden;
}

.isis-dash-entfilter__name {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
}

.isis-dash-entfilter__warn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--isis-warning);
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
    flex-shrink: 0;
}

.isis-dash-entfilter__chevron {
    color: var(--isis-text-muted);
    font-size: 0.85rem;
    transition: transform 0.15s ease;
    flex-shrink: 0;
}

.isis-dash-entfilter.is-open .isis-dash-entfilter__chevron {
    transform: rotate(180deg);
}

/* Menu déroulant */
.isis-dash-entfilter__menu {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    z-index: 1000;
    min-width: 280px;
    max-width: 360px;
    max-height: 420px;
    overflow-y: auto;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-2);
    padding: 0.4rem;
    display: flex;
    flex-direction: column;
    gap: 1px;
}

.isis-dash-entfilter__menu-header {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    padding: 0.5rem 0.7rem 0.4rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 0.2rem;
}

.isis-dash-entfilter__menu-count {
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
}

.isis-dash-entfilter__menu-search {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.6rem;
    margin-bottom: 0.3rem;
    background: var(--isis-surface-soft);
    border-radius: 7px;
    border: 1px solid transparent;
}

.isis-dash-entfilter__menu-search:focus-within {
    border-color: var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-surface);
}

.isis-dash-entfilter__menu-search input {
    flex: 1;
    border: none;
    background: transparent;
    font-size: 0.85rem;
    outline: none;
    color: var(--isis-text);
    font-family: inherit;
}

.isis-dash-entfilter__menu-item {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    /* Indentation par profondeur hiérarchique : 14px par niveau, capped à 56px
       (4 niveaux visibles). Au-delà, l'arbre est probablement trop profond pour
       être lisible — le bullet `└` continue de signaler "enfant" sans tabuler plus. */
    padding: 0.5rem 0.6rem 0.5rem calc(0.6rem + min(var(--ent-depth, 0) * 14px, 56px));
    background: transparent;
    border: none;
    border-radius: 7px;
    color: var(--isis-text);
    font-size: 0.88rem;
    cursor: pointer;
    text-align: left;
    width: 100%;
    transition: background 0.1s ease;
    font-family: inherit;
}

/* Bullet `└` pour les enfants — signal visuel discret de relation parent/enfant.
   Calqué sur WorkspaceSwitcher (memory: workspace switcher pattern). */
.isis-dash-entfilter__menu-bullet {
    color: var(--isis-text-muted);
    font-family: ui-monospace, "JetBrains Mono", monospace;
    font-size: 0.78rem;
    line-height: 1;
    margin-right: -0.2rem;
    flex-shrink: 0;
    user-select: none;
}

.isis-dash-entfilter__menu-item:hover {
    background: var(--isis-surface-soft);
}

.isis-dash-entfilter__menu-item.is-active {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 10%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
}

.isis-dash-entfilter__menu-avatar {
    width: 26px;
    height: 26px;
    border-radius: 6px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.72rem;
    font-weight: 700;
    flex-shrink: 0;
}

.isis-dash-entfilter__menu-avatar.is-all {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 12%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
}

.isis-dash-entfilter__menu-name {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-dash-entfilter__menu-warn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--isis-warning);
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
    flex-shrink: 0;
}

.isis-dash-entfilter__menu-empty {
    padding: 0.85rem 0.7rem;
    font-size: 0.83rem;
    color: var(--isis-text-muted);
    text-align: center;
}

.isis-dash-entfilter__backdrop {
    position: fixed;
    inset: 0;
    z-index: 999;
    background: transparent;
}

/* ============================================================
   ROADMAP — page /roadmap
   Transcription visuelle de CLAUDE.md §6 (chantiers + dette).
   ============================================================ */

.isis-grid--roadmap {
    grid-template-columns:
        40px           /* status dot */
        76px           /* date */
        180px          /* module */
        minmax(0, 1fr) /* titre */
        160px          /* sprint */
        110px;         /* priorité */
    min-width: 920px;
}

.isis-grid--roadmap .isis-grid__head {
    text-transform: uppercase;
    font-size: 0.7rem;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
}

.isis-roadmap-row__date {
    font-family: var(--isis-font-mono, "JetBrains Mono", "Consolas", monospace);
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
}

.isis-roadmap-row__module {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.83rem;
    color: var(--isis-text);
}

.isis-roadmap-row__module-dot {
    width: 8px;
    height: 8px;
    border-radius: var(--isis-radius-pill);
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
    flex-shrink: 0;
}

.isis-roadmap-row__title {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}

.isis-roadmap-row__title > span:first-child {
    font-weight: 500;
    color: var(--isis-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-roadmap-row__sub {
    font-size: 0.7rem;
    color: var(--isis-warning, #d97706);
    font-weight: 500;
}

.isis-roadmap-row__sprint {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    font-family: var(--isis-font-mono, "JetBrains Mono", monospace);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-roadmap-row__priority {
    display: flex;
    align-items: center;
}

/* Status dots roadmap — étend les variantes existantes du design system. */
.isis-grid__status-dot.is-delivered { background: var(--isis-success, #16a34a); }
.isis-grid__status-dot.is-partial   { background: var(--isis-warning, #d97706); }
.isis-grid__status-dot.is-deferred  { background: var(--isis-text-muted, #6e7785); }
.isis-grid__status-dot.is-open      { background: var(--isis-danger, #dc2626); }
.isis-grid__status-dot.is-planned   { background: var(--isis-info, #0ea5e9); }
.isis-grid__status-dot.is-blocked   { background: #6b21a8; }

.isis-grid__group-dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: var(--isis-radius-pill);
    margin-right: 0.55rem;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
    vertical-align: middle;
}

/* Sidepanel détail roadmap */
.isis-roadmap-detail {
    padding: 0.5rem 0.25rem 1rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.isis-roadmap-detail__header {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}

.isis-roadmap-status {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.18rem 0.55rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.02em;
}

.isis-roadmap-status--delivered {
    color: var(--isis-success, #16a34a);
    background: color-mix(in srgb, var(--isis-success, #16a34a) 12%, transparent);
}
.isis-roadmap-status--partial {
    color: var(--isis-warning, #d97706);
    background: color-mix(in srgb, var(--isis-warning, #d97706) 14%, transparent);
}
.isis-roadmap-status--deferred {
    color: var(--isis-text-muted, #6e7785);
    background: var(--isis-surface-alt, #ecedf1);
}
.isis-roadmap-status--open {
    color: var(--isis-danger, #dc2626);
    background: color-mix(in srgb, var(--isis-danger, #dc2626) 12%, transparent);
}
.isis-roadmap-status--planned {
    color: var(--isis-info, #0ea5e9);
    background: color-mix(in srgb, var(--isis-info, #0ea5e9) 12%, transparent);
}
.isis-roadmap-status--blocked {
    color: #6b21a8;
    background: #f3e8ff;
}
.isis-roadmap-status--critical {
    color: #ffffff;
    background: var(--isis-danger, #dc2626);
}
.isis-roadmap-status--high {
    color: #ffffff;
    background: var(--isis-warning, #d97706);
}

.isis-roadmap-detail__title {
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--isis-text);
    margin: 0;
    line-height: 1.35;
}

.isis-roadmap-detail__meta {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
}

.isis-roadmap-meta__chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.15rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface, #f7f8fa);
    color: var(--isis-text);
    font-size: 0.72rem;
    font-weight: 500;
    border: 1px solid var(--isis-border, #d6d8dd);
}

.isis-roadmap-meta__chip.is-muted {
    color: var(--isis-text-muted, #6e7785);
}

.isis-roadmap-detail__summary {
    font-size: 0.88rem;
    color: var(--isis-text);
    line-height: 1.55;
    margin: 0;
    padding: 0.75rem 0.85rem;
    background: var(--isis-surface, #f7f8fa);
    border-left: 3px solid var(--isis-accent);
    border-radius: 0 6px 6px 0;
}

.isis-roadmap-section {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.isis-roadmap-section__title {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

.isis-roadmap-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}

.isis-roadmap-list li {
    position: relative;
    padding-left: 1.1rem;
    font-size: 0.83rem;
    color: var(--isis-text);
    line-height: 1.5;
}

.isis-roadmap-list li::before {
    content: "▸";
    position: absolute;
    left: 0;
    color: var(--isis-success, #16a34a);
    font-weight: bold;
}

.isis-roadmap-list--limits li::before {
    content: "⚠";
    color: var(--isis-warning, #d97706);
}

.isis-roadmap-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    padding-top: 0.25rem;
}

.isis-roadmap-tag {
    display: inline-block;
    padding: 0.12rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-alt, #ecedf1);
    color: var(--isis-text-muted, #6e7785);
    font-size: 0.7rem;
    font-family: var(--isis-font-mono, "JetBrains Mono", monospace);
}

/* KPI variants spécifiques roadmap */
.isis-kpi-card__value--success  { color: var(--isis-success, #16a34a); }
.isis-kpi-card__value--warning  { color: var(--isis-warning, #d97706); }
.isis-kpi-card__value--info     { color: var(--isis-info, #0ea5e9); }
.isis-kpi-card__value--muted    { color: var(--isis-text-muted, #6e7785); }
.isis-kpi-card__value--danger   { color: var(--isis-danger, #dc2626); }
.isis-kpi-card__value--critical {
    color: #ffffff;
    background: var(--isis-danger, #dc2626);
    padding: 0.15rem 0.55rem;
    border-radius: 6px;
    display: inline-block;
    align-self: flex-start;
}

/* ============================================================
   ROADMAP — Panneau « Avancement par module »
   Barres stackées par statut, style GitHub language bars.
   ============================================================ */

.isis-roadmap-progress {
    background: var(--isis-surface, #f7f8fa);
    border: 1px solid var(--isis-border, #d6d8dd);
    border-radius: 10px;
    padding: 0.95rem 1.1rem;
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
}

.isis-roadmap-progress__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

.isis-roadmap-progress__title {
    margin: 0;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
}

.isis-roadmap-progress__legend {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    font-size: 0.72rem;
    color: var(--isis-text-muted);
}

.isis-roadmap-progress__legend-item {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
}

.isis-roadmap-progress__legend-dot {
    width: 9px;
    height: 9px;
    border-radius: 2px;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
}

.isis-roadmap-progress__legend-dot.is-delivered { background: var(--isis-success, #16a34a); }
.isis-roadmap-progress__legend-dot.is-partial   { background: var(--isis-warning, #d97706); }
.isis-roadmap-progress__legend-dot.is-deferred  { background: var(--isis-text-muted, #6e7785); }
.isis-roadmap-progress__legend-dot.is-open      { background: var(--isis-danger, #dc2626); }
.isis-roadmap-progress__legend-dot.is-planned   { background: var(--isis-info, #0ea5e9); }

.isis-roadmap-progress__list {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.4rem;
}

.isis-roadmap-progress__row {
    /* C'est un <button> — on neutralise les styles natifs. */
    all: unset;
    cursor: pointer;
    display: grid;
    grid-template-columns: 220px minmax(0, 1fr) 64px;
    align-items: center;
    gap: 0.85rem;
    padding: 0.45rem 0.55rem;
    border-radius: 7px;
    transition: background 0.12s ease;
}

.isis-roadmap-progress__row:hover {
    background: var(--isis-surface-alt, #ecedf1);
}

.isis-roadmap-progress__row.is-active {
    background: color-mix(in srgb, var(--isis-accent) 9%, transparent);
    box-shadow: inset 3px 0 0 var(--isis-accent);
}

.isis-roadmap-progress__row:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}

.isis-roadmap-progress__label {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    min-width: 0;
}

.isis-roadmap-progress__module-dot {
    width: 10px;
    height: 10px;
    border-radius: 3px;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
    flex-shrink: 0;
}

.isis-roadmap-progress__module-name {
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.isis-roadmap-progress__count {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    margin-left: auto;
    padding-left: 0.4rem;
    flex-shrink: 0;
}

.isis-roadmap-progress__bar {
    display: flex;
    height: 10px;
    width: 100%;
    background: var(--isis-surface-alt, #ecedf1);
    border-radius: var(--isis-radius-pill);
    overflow: hidden;
    box-shadow: inset 0 0 0 1px var(--isis-border, #d6d8dd);
}

.isis-roadmap-progress__seg {
    display: block;
    height: 100%;
    transition: filter 0.15s ease;
}

.isis-roadmap-progress__seg:hover {
    filter: brightness(1.08);
}

.isis-roadmap-progress__seg.is-delivered { background: var(--isis-success, #16a34a); }
.isis-roadmap-progress__seg.is-partial   { background: var(--isis-warning, #d97706); }
.isis-roadmap-progress__seg.is-deferred  { background: var(--isis-text-muted, #6e7785); }
.isis-roadmap-progress__seg.is-open      { background: var(--isis-danger, #dc2626); }
.isis-roadmap-progress__seg.is-planned   { background: var(--isis-info, #0ea5e9); }

.isis-roadmap-progress__pct {
    font-size: 0.95rem;
    font-weight: 700;
    color: var(--isis-text);
    text-align: right;
    font-variant-numeric: tabular-nums;
    font-family: var(--isis-font-mono, "JetBrains Mono", "Consolas", monospace);
}

.isis-roadmap-progress__pct-unit {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    font-weight: 500;
    margin-left: 1px;
}

/* Responsive — empile le label / la barre / le % sur tablette */
@media (max-width: 768px) {
    .isis-roadmap-progress__row {
        grid-template-columns: minmax(0, 1fr) 56px;
        grid-template-areas:
            "label pct"
            "bar bar";
        gap: 0.5rem 0.6rem;
    }
    .isis-roadmap-progress__label { grid-area: label; }
    .isis-roadmap-progress__bar { grid-area: bar; }
    .isis-roadmap-progress__pct { grid-area: pct; }
}

/* ============================================================
   ROADMAP — Picker Module (dropdown style workspace switcher)
   Calque visuel de .isis-dash-entfilter (dashboard gescom V2)
   mais simplifié : pastille couleur + nom + compteur, pas d'avatar.
   ============================================================ */

.isis-filter-bar--search-only {
    /* Quand on a seulement la search dans la barre, on retire le contour
       pour ne pas alourdir avant les 3 sélecteurs qui suivent. */
    border: none;
    background: transparent;
    padding: 0;
    box-shadow: none;
}

.isis-roadmap-picker {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.5rem 0.7rem 0.5rem 0.75rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    cursor: pointer;
    transition: all 0.15s ease;
    min-width: 200px;
    max-width: 320px;
    user-select: none;
    box-shadow: var(--isis-elevation-1);
}

.isis-roadmap-picker:hover {
    background: var(--isis-surface-soft, #f3f4f6);
    border-color: color-mix(in srgb, var(--isis-accent) 40%, var(--isis-border));
}

.isis-roadmap-picker:focus-visible {
    outline: 2px solid color-mix(in srgb, var(--isis-accent) 60%, transparent);
    outline-offset: 1px;
}

.isis-roadmap-picker.is-open {
    border-color: var(--isis-accent);
    background: color-mix(in srgb, var(--isis-accent) 4%, var(--isis-surface));
}

.isis-roadmap-picker__dot {
    width: 12px;
    height: 12px;
    border-radius: 4px;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
    flex-shrink: 0;
}

.isis-roadmap-picker__name {
    flex: 1;
    min-width: 0;
    font-size: 0.86rem;
    font-weight: 500;
    color: var(--isis-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.isis-roadmap-picker__count {
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    background: var(--isis-surface-alt, #ecedf1);
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    font-variant-numeric: tabular-nums;
    flex-shrink: 0;
}

.isis-roadmap-picker__chevron {
    font-size: 0.65rem;
    color: var(--isis-text-muted);
    transition: transform 0.18s ease;
    flex-shrink: 0;
}

.isis-roadmap-picker.is-open .isis-roadmap-picker__chevron {
    transform: rotate(180deg);
}

/* Menu déroulant */
.isis-roadmap-picker__menu {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    z-index: 1000;
    min-width: 100%;
    max-width: 360px;
    max-height: 420px;
    overflow-y: auto;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    box-shadow: var(--isis-elevation-2);   /* dropdown picker roadmap — token (était ad-hoc) */
    padding: 0.35rem;
    display: flex;
    flex-direction: column;
    gap: 1px;
}

.isis-roadmap-picker__menu-header {
    padding: 0.5rem 0.65rem;
    font-size: 0.7rem;
    font-weight: 700;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 0.3rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
}

.isis-roadmap-picker__menu-count {
    font-size: 0.7rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    text-transform: none;
    letter-spacing: 0;
}

.isis-roadmap-picker__menu-item {
    all: unset;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.5rem 0.65rem;
    border-radius: 7px;
    color: var(--isis-text);
    font-size: 0.85rem;
    transition: background 0.12s ease;
}

.isis-roadmap-picker__menu-item:hover {
    background: var(--isis-surface-soft, #f3f4f6);
}

.isis-roadmap-picker__menu-item.is-active {
    background: color-mix(in srgb, var(--isis-accent) 12%, transparent);
    color: var(--isis-accent);
    font-weight: 600;
}

.isis-roadmap-picker__menu-item:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 1px;
}

.isis-roadmap-picker__menu-dot {
    width: 12px;
    height: 12px;
    border-radius: 4px;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
    flex-shrink: 0;
}

.isis-roadmap-picker__menu-dot.is-all {
    background: var(--isis-surface-alt, #ecedf1);
    color: var(--isis-text-muted);
    width: 18px;
    height: 18px;
    border-radius: 5px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin: -3px 0; /* compenser la taille différente */
}

.isis-roadmap-picker__menu-name {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.isis-roadmap-picker__menu-meta {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    font-variant-numeric: tabular-nums;
    background: var(--isis-surface-alt, #ecedf1);
    padding: 0.08rem 0.4rem;
    border-radius: var(--isis-radius-pill);
    font-weight: 600;
    flex-shrink: 0;
}

.isis-roadmap-picker__menu-item.is-active .isis-roadmap-picker__menu-meta {
    background: color-mix(in srgb, var(--isis-accent) 20%, transparent);
    color: var(--isis-accent);
}

/* Backdrop transparent pour fermer au clic extérieur */
.isis-roadmap-picker__backdrop {
    position: fixed;
    inset: 0;
    z-index: 999;
    background: transparent;
}

/* Responsive — sélecteurs en colonne sur mobile */
@media (max-width: 720px) {
    .isis-roadmap-picker {
        min-width: 0;
        max-width: 100%;
        width: 100%;
    }
}

/* ============================================================
   ROADMAP — Card à onglets (Avancement / Détail)
   .isis-tabs-card pose déjà fond + bordure + radius.
   On ajoute uniquement :
   - le compteur dans l'onglet Liste (pastille nb entrées filtrées)
   - variante "inline" du panneau Avancement (perd son fond redondant)
   ============================================================ */

.isis-tab__counter {
    margin-left: 0.35rem;
    padding: 0.05rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    background: color-mix(in srgb, var(--isis-accent) 14%, transparent);
    color: var(--isis-accent);
    font-size: 0.72rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    line-height: 1.3;
}

.isis-tab:not(.is-active) .isis-tab__counter {
    background: var(--isis-surface-alt, #ecedf1);
    color: var(--isis-text-muted);
}

/* Panneau Avancement embarqué — pas de double fond/bordure */
.isis-roadmap-progress--inline {
    background: transparent;
    border: none;
    padding: 0;
}

/* Espacement vertical après le bandeau des tabs */
.isis-roadmap-tabs-card .isis-tab-panel--rich:not(.is-hidden) {
    padding-top: 0.85rem;
}

/* ───────────────────────────────────────────────────────────────────────────
   Avenants formalisés (gesmaff_marche_avenant — migration 0226).
   ─────────────────────────────────────────────────────────────────────────── */

/* Utility row 3 colonnes pour saisie deltas HT/TVA/TTC côte à côte dans le dialog */
.isis-form-linear__field-row {
    display: flex;
    gap: 0.75rem;
    align-items: flex-start;
    flex-wrap: wrap;
}

.isis-form-linear__field-row > .isis-form-linear__field {
    flex: 1;
    min-width: 140px;
}

/* Grille de l'onglet Avenants */
.isis-grid--marche-avenants {
    --isis-grid-min-width: 1100px;
}

.isis-grid--marche-avenants .isis-grid__head,
.isis-grid--marche-avenants .isis-grid__row {
    grid-template-columns: 0.7fr 1.6fr 0.9fr 0.9fr 1fr 0.9fr 0.9fr 110px;
}

/* Bouton action vert "Signer" — variante success (calque pattern --danger) */
.isis-grid__action-btn--success {
    color: var(--isis-success);
}
.isis-grid__action-btn--success:hover,
.isis-grid__action-btn--success:focus-visible {
    background: color-mix(in srgb, var(--isis-success) 12%, var(--isis-surface));
    border-color: var(--isis-success);
}

/* ─────────────────────────────────────────────────────────────────────────
   Scheduler visuel scopé commande (onglet Mobilisation de CommandeDetail).
   Calque allégé du planner V3 gespla, deux couches superposées planifié + réalisé.
   ───────────────────────────────────────────────────────────────────────── */

.isis-cmd-scheduler {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    height: 100%;
    min-height: 0;
}

.isis-cmd-scheduler__loading,
.isis-cmd-scheduler__error,
.isis-cmd-scheduler__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 3rem 1rem;
    color: var(--isis-text-muted);
    text-align: center;
}

.isis-cmd-scheduler__empty strong { color: var(--isis-text); font-size: 0.95rem; }
.isis-cmd-scheduler__error { color: var(--isis-danger); }

.isis-cmd-scheduler__toolbar {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
    padding: 0.5rem 0.75rem;
    background: var(--isis-surface-alt);
    border-radius: 8px;
}

.isis-cmd-scheduler__toggle {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.875rem;
    color: var(--isis-text);
    cursor: pointer;
}

.isis-cmd-scheduler__mode {
    display: inline-flex;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    overflow: hidden;
}

.isis-cmd-scheduler__mode-btn {
    background: var(--isis-surface);
    border: 0;
    padding: 0.4rem 0.75rem;
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    transition: background 120ms, color 120ms;
}

.isis-cmd-scheduler__mode-btn:not(:last-child) {
    border-right: 1px solid var(--isis-border);
}

.isis-cmd-scheduler__mode-btn:hover {
    background: var(--isis-surface-alt);
    color: var(--isis-text);
}

.isis-cmd-scheduler__mode-btn.is-active {
    background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 14%, var(--isis-surface));
    color: var(--isis-current-mod, var(--isis-accent));
    font-weight: 600;
}

.isis-cmd-scheduler__mode-btn:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: 1px;
    z-index: 1;
}

.isis-cmd-scheduler__spacer { flex: 1; }

.isis-cmd-scheduler__legend {
    display: flex;
    gap: 1.25rem;
    align-items: center;
    flex-wrap: wrap;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    padding: 0 0.25rem;
}

.isis-cmd-scheduler__legend-item {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
}

.isis-cmd-scheduler__legend-swatch {
    width: 18px;
    height: 12px;
    border-radius: 3px;
    display: inline-block;
}

/* Audit ui-ux : swatch légende harmonisé avec le bloc planifié réel (color-mix 18% + bordure accent). */
.isis-cmd-scheduler__legend-item.is-planned .isis-cmd-scheduler__legend-swatch {
    background: color-mix(in srgb, var(--isis-accent) 18%, var(--isis-surface));
    border-left: 3px solid var(--isis-accent);
}

/* Idem pour le swatch réalisé : motif hachuré 18%/10% calque du bloc .isis-cmd-evt--realized. */
.isis-cmd-scheduler__legend-item.is-realized .isis-cmd-scheduler__legend-swatch {
    background: repeating-linear-gradient(
        135deg,
        color-mix(in srgb, var(--isis-success) 18%, var(--isis-surface)),
        color-mix(in srgb, var(--isis-success) 18%, var(--isis-surface)) 6px,
        color-mix(in srgb, var(--isis-success) 10%, var(--isis-surface)) 6px,
        color-mix(in srgb, var(--isis-success) 10%, var(--isis-surface)) 12px
    );
    border-left: 3px solid var(--isis-success);
}

.isis-cmd-scheduler__host {
    flex: 1;
    min-height: 480px;
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    overflow: hidden;
    background: var(--isis-surface);
}

/* V2.0 — Templates events densifiés (calque pattern PlannerV3 NetLogger).
   2 rows : meta (avatar + chips) + title (libellé tâche). Couleur stable via --isis-event-accent. */
.isis-cmd-evt {
    --isis-event-accent: var(--isis-accent);
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    padding: 0.2rem 0.4rem;
    height: 100%;
    color: var(--isis-text);
    font-size: 0.72rem;
    border-radius: 4px;
    overflow: hidden;
    border-left: 3px solid var(--isis-event-accent);
}

.isis-cmd-evt--planned {
    background: color-mix(in srgb, var(--isis-event-accent) 18%, var(--isis-surface));
}

.isis-cmd-evt--realized {
    background: repeating-linear-gradient(
        135deg,
        color-mix(in srgb, var(--isis-event-accent) 22%, var(--isis-surface)),
        color-mix(in srgb, var(--isis-event-accent) 22%, var(--isis-surface)) 5px,
        color-mix(in srgb, var(--isis-event-accent) 12%, var(--isis-surface)) 5px,
        color-mix(in srgb, var(--isis-event-accent) 12%, var(--isis-surface)) 10px
    );
}

.isis-cmd-evt.is-overload {
    border-left-color: var(--isis-danger);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--isis-danger) 40%, transparent);
}

.isis-cmd-evt__meta {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    font-weight: 600;
    font-size: 0.68rem;
    line-height: 1.1;
}

.isis-cmd-evt__avatar {
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: var(--isis-event-accent);
    color: white;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.6rem;
    font-weight: 700;
    flex-shrink: 0;
    letter-spacing: -0.02em;
}

.isis-cmd-evt__chip {
    font-variant-numeric: tabular-nums;
    padding: 0.05rem 0.35rem;
    background: var(--isis-surface);
    border-radius: var(--isis-radius-pill);
    color: var(--isis-text);
    font-weight: 600;
}

.isis-cmd-evt__duration {
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
    font-size: 0.62rem;
    font-weight: 500;
}

.isis-cmd-evt__status {
    margin-left: auto;
    font-size: 0.6rem;
    padding: 0.05rem 0.35rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface);
    color: var(--isis-text-muted);
    font-weight: 500;
}

.isis-cmd-evt__status.status-brouillon { background: var(--isis-surface-alt); }
.isis-cmd-evt__status.status-soumis { background: color-mix(in srgb, var(--isis-accent) 20%, var(--isis-surface)); color: var(--isis-accent); }
.isis-cmd-evt__status.status-valide_manager { background: color-mix(in srgb, var(--isis-success) 18%, var(--isis-surface)); color: var(--isis-success); }
.isis-cmd-evt__status.status-valide_projet { background: var(--isis-success); color: white; }
.isis-cmd-evt__status.status-rejete { background: color-mix(in srgb, var(--isis-danger) 18%, var(--isis-surface)); color: var(--isis-danger); }

.isis-cmd-evt__warn {
    margin-left: auto;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--isis-danger);
    color: white;
    font-weight: 700;
    font-size: 0.7rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}

.isis-cmd-evt__title {
    font-size: 0.7rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--isis-text);
    font-weight: 500;
}

/* V2.0 — Décorations cellule via OnRenderCell. */
.isis-cmd-cell--weekend {
    background: color-mix(in srgb, var(--isis-text-muted) 8%, transparent) !important;
}
.isis-cmd-cell--today {
    box-shadow: inset 0 -2px 0 0 var(--isis-accent);
}
.isis-cmd-cell--today.e-date-header,
.isis-cmd-cell--today .e-date-header-name {
    color: var(--isis-accent);
    font-weight: 700;
}

/* V2.0 — Heatmap charge cumulée par jour (5 paliers, fonds très atténués pour ne pas masquer les events). */
.isis-cmd-heat--cool    { background: color-mix(in srgb, #93c5fd 14%, transparent) !important; }
.isis-cmd-heat--low     { background: color-mix(in srgb, var(--isis-success) 10%, transparent) !important; }
.isis-cmd-heat--normal  { /* 80-100% : neutre, pas de fond pour ne pas saturer */ }
.isis-cmd-heat--warning { background: color-mix(in srgb, var(--isis-warning) 14%, transparent) !important; }
.isis-cmd-heat--high    { background: color-mix(in srgb, var(--isis-danger) 16%, transparent) !important; }

/* V2.0 — KPI hero sticky quand l'utilisateur scrolle dans l'onglet. */
.isis-cmd-scheduler .isis-kpi-hero {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--isis-surface);
    padding-top: 0.25rem;
    padding-bottom: 0.25rem;
}

/* V2.0 — Compaction Syncfusion : on cible uniquement le header de ressource (lane à gauche)
   sans toucher la hauteur des work-cells (Syncfusion les calcule en fonction du nombre
   d'events superposés — un override !important rend les events invisibles). */
.isis-cmd-scheduler-schedule.e-schedule .e-resource-cells {
    min-height: 42px;
    height: auto;
}
.isis-cmd-scheduler-schedule.e-schedule .e-date-header-wrap,
.isis-cmd-scheduler-schedule.e-schedule .e-timeline-header-list {
    z-index: 1;
}

/* Resource header (lane gauche) */
.isis-cmd-scheduler__resource-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.5rem;
}

.isis-cmd-scheduler__resource-avatar {
    /* V2.0 — couleur stable hashée sur CollabId, posée en variable inline par le composant. */
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: var(--isis-lane-accent, color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 22%, var(--isis-surface)));
    color: white;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    font-size: 0.7rem;
    flex-shrink: 0;
    letter-spacing: -0.02em;
}

.isis-cmd-scheduler__resource-name {
    font-size: 0.82rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* KPI hero variantes — calque kpi-card existants */
.isis-cmd-scheduler .isis-kpi-card.is-success .isis-kpi-card__value { color: var(--isis-success); }
.isis-cmd-scheduler .isis-kpi-card.is-warning .isis-kpi-card__value { color: var(--isis-warning); }
.isis-cmd-scheduler .isis-kpi-card.is-danger .isis-kpi-card__value { color: var(--isis-danger); }

/* ============================================================================
   GESFAC — Composant interactif plan d'étage (V1.1, 2026-05-25)
   Container avec aspect-ratio préservé, image de fond (placeholder si absent),
   markers HTML absolus positionnés via coord_x/y_ratio * 100%.
   ============================================================================ */

/* ----------------------------------------------------------------------------
   Plan d'étage V1.3 — refonte Leaflet zone carto.
   Le host wrap le container Leaflet + les overlays (hints) avec position
   absolute. Le card parent doit avoir une hauteur définie pour que .__leaflet
   puisse remplir (sinon Leaflet ne se rend pas, height:0).
   ---------------------------------------------------------------------------- */
.isis-plan-etage-host {
    position: relative;
    width: 100%;
    height: 100%;
    min-height: 480px; /* fallback si le parent n'a pas de hauteur explicite */
}

/* Panneau master du plan : ancre l'overlay .isis-map-toolbar (outils carte). */
.isis-master-detail__master.isis-plan-master { position: relative; }

.isis-plan-etage {
    position: absolute;
    inset: 0;
    /* z-index:0 → crée un contexte d'empilement qui PIÈGE les couches internes de
       Leaflet (panes/contrôles z-index 200–800). Sinon le pane image (z-index 400)
       fuit et passe au-dessus de la toolbar overlay (.isis-map-toolbar, z-index 400). */
    z-index: 0;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    overflow: hidden;
    box-shadow: var(--isis-elevation-1);
}

.isis-plan-etage__leaflet {
    /* Container Leaflet : prend toute la place dispo */
    width: 100%;
    height: 100%;
}

.isis-plan-etage.is-placement-mode {
    outline: 2px dashed color-mix(in srgb, var(--isis-mod-gesfac) 50%, transparent);
    outline-offset: 2px;
}

.isis-plan-etage.is-placement-mode .leaflet-container {
    cursor: crosshair;
}

.isis-plan-etage__placement-hint {
    position: absolute;
    top: 0.75rem;
    left: 50%;
    transform: translateX(-50%);
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.875rem;
    background: var(--isis-mod-gesfac);
    color: white;
    border-radius: var(--isis-radius-pill);
    font-size: 0.8125rem;
    font-weight: 500;
    box-shadow: var(--isis-elevation-2);
    z-index: 10;
    pointer-events: none;
    animation: isis-plan-etage-hint-pulse 1.8s ease-in-out infinite;
}

@keyframes isis-plan-etage-hint-pulse {
    0%, 100% { transform: translateX(-50%) scale(1); }
    50% { transform: translateX(-50%) scale(1.05); }
}

/* ----------------------------------------------------------------------------
   Markers : rendus via L.divIcon Leaflet (HTML custom dans .leaflet-marker-icon).
   Leaflet pose translate3d sur le wrapper externe — donc le marker LUI-MÊME
   doit rester en static (pas de position:absolute ni transform). Le wrapper
   externe `.isis-plan-etage__marker-wrap` neutralise le style par défaut Leaflet
   (qui pose un fond, padding, etc.).
   ---------------------------------------------------------------------------- */
.isis-plan-etage__marker-wrap {
    background: transparent;
    border: none;
}

.isis-plan-etage__marker {
    /* Cercle nu : icône du type au centre, le code est affiché au survol (tooltip).
       Pas de position absolute — Leaflet gère la position via translate3d sur le parent. */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    padding: 0;
    background: var(--isis-surface);
    color: var(--isis-text);
    border: 2px solid var(--isis-border);
    border-radius: 50%;
    cursor: pointer;
    box-shadow: var(--isis-elevation-1);
    transition: transform 120ms ease, box-shadow 120ms ease, border-color 120ms ease;
}

.isis-plan-etage__marker .material-symbols-rounded { font-size: 18px; line-height: 1; }

.isis-plan-etage__marker:hover {
    transform: scale(1.08);
    box-shadow: var(--isis-elevation-hover);
}

.isis-plan-etage__marker:focus-visible {
    outline: 2px solid var(--isis-mod-gesfac);
    outline-offset: 2px;
}

.isis-plan-etage__marker.is-selected {
    border-color: var(--isis-mod-gesfac);
    background: color-mix(in srgb, var(--isis-mod-gesfac) 14%, var(--isis-surface));
    box-shadow: var(--isis-elevation-2);
}

.isis-plan-etage__marker .rzi { font-size: 14px; }
.isis-plan-etage__marker-code { font-family: var(--isis-mono, monospace); }

/* Vue verrouillée : zoom + pan désactivés → curseur normal (pas de main de drag).
   La classe is-view-locked est posée sur le conteneur Leaflet lui-même.
   Les marqueurs gardent leur propre cursor:pointer (cliquables même verrouillé). */
.isis-plan-etage.is-view-locked { cursor: default; }

/* Tooltip de survol du marqueur (code + occupancy) — boîte ISIS */
.isis-plan-etage__tip.leaflet-tooltip {
    background: var(--isis-surface);
    color: var(--isis-text);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    box-shadow: var(--isis-elevation-2);
    padding: 0.45rem 0.6rem;
    font-size: 0.78rem;
    line-height: 1.4;
    font-weight: 500;
    max-width: 260px;
    white-space: normal;
}
.isis-plan-etage__tip.leaflet-tooltip strong { font-family: var(--isis-mono, monospace); }
.isis-plan-etage__tip.leaflet-tooltip-top::before { border-top-color: var(--isis-border); }
.isis-plan-etage__tip .isis-plan-etage__tip-occ  { color: var(--isis-success); }
.isis-plan-etage__tip .isis-plan-etage__tip-eq   { color: var(--isis-info, #3b82f6); }
.isis-plan-etage__tip .isis-plan-etage__tip-free { color: var(--isis-text-muted); }
.isis-plan-etage__tip .isis-plan-etage__tip-hint { color: var(--isis-text-muted); font-style: italic; }

/* Variantes par état */
.isis-plan-etage__marker--ok        { border-color: color-mix(in srgb, var(--isis-success) 50%, var(--isis-border)); }
.isis-plan-etage__marker--ok .rzi   { color: var(--isis-success); }

.isis-plan-etage__marker--warning      { border-color: color-mix(in srgb, var(--isis-warning) 50%, var(--isis-border)); }
.isis-plan-etage__marker--warning .rzi { color: var(--isis-warning); }

.isis-plan-etage__marker--danger       { border-color: color-mix(in srgb, var(--isis-danger) 50%, var(--isis-border)); background: color-mix(in srgb, var(--isis-danger) 8%, var(--isis-surface)); }
.isis-plan-etage__marker--danger .rzi  { color: var(--isis-danger); }

.isis-plan-etage__marker--muted        { opacity: 0.55; }
.isis-plan-etage__marker--muted .rzi   { color: var(--isis-text-muted); }

/* Mode flexible (hot desk) : trait pointillé pour différencier visuellement */
.isis-plan-etage__marker--flexible {
    border-style: dashed;
}

/* ----------------------------------------------------------------------------
   Variantes occupancy V1.3 — couleur de fond selon affectation courante :
   - occupied : un collab est assigné (vert clair = poste vivant)
   - equipped : que des équipements, pas de collab (bleu clair = poste meublé)
   - empty    : ni l'un ni l'autre (gris muet = poste libre, candidat à affecter)
   Coexiste avec les variantes d'état (--ok/--warning/--danger/--muted) qui
   restent visibles via la bordure (occupancy = remplissage, state = bordure).
   ---------------------------------------------------------------------------- */
.isis-plan-etage__marker--occ-occupied {
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
}
.isis-plan-etage__marker--occ-equipped {
    background: color-mix(in srgb, var(--isis-info, #3b82f6) 12%, var(--isis-surface));
}
.isis-plan-etage__marker--occ-empty {
    background: var(--isis-surface);
    opacity: 0.85;
}
.isis-plan-etage__marker--occ-empty:hover {
    opacity: 1;
}

/* Badge occupancy : pastille colorée en haut-droite du marker */
.isis-plan-etage__marker-badge {
    position: absolute;
    top: -6px;
    right: -6px;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--isis-surface);
    border: 1.5px solid var(--isis-border);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-shadow: var(--isis-elevation-1);
}
.isis-plan-etage__marker-badge .material-symbols-rounded {
    font-size: 10px;
    line-height: 1;
}
.isis-plan-etage__marker-badge--occupant {
    background: var(--isis-success);
    border-color: var(--isis-success);
}
.isis-plan-etage__marker-badge--occupant .material-symbols-rounded { color: white; }

.isis-plan-etage__marker-badge--equip {
    background: var(--isis-info, #3b82f6);
    border-color: var(--isis-info, #3b82f6);
}
.isis-plan-etage__marker-badge--equip .material-symbols-rounded { color: white; }

/* Le marker a besoin de position:relative pour positionner le badge en absolute */
.isis-plan-etage__marker { position: relative; }

/* Mode placement actif : markers atténués pour donner la priorité visuelle au clic vide */
.isis-plan-etage.is-placement-mode .isis-plan-etage__marker {
    opacity: 0.7;
}
.isis-plan-etage.is-placement-mode .isis-plan-etage__marker:hover {
    opacity: 1;
}

/* ----------------------------------------------------------------------------
   V1.2 — Mode édition glisser-déposer.
   Markers draggable affichent un curseur grab/grabbing + visuel pendant le drag.
   ---------------------------------------------------------------------------- */
.isis-plan-etage.is-edit-mode {
    outline: 2px dashed color-mix(in srgb, var(--isis-accent) 60%, transparent);
    outline-offset: 2px;
}

.isis-plan-etage.is-edit-mode .isis-plan-etage__marker[draggable="true"] {
    cursor: grab;
}

.isis-plan-etage.is-edit-mode .isis-plan-etage__marker[draggable="true"]:active,
.isis-plan-etage__marker.is-dragging {
    cursor: grabbing;
    opacity: 0.55;
    transform: scale(0.95);
}

/* En mode édition, le wrapper Leaflet doit indiquer le curseur grab même quand
   le pointeur n'est pas exactement sur le bouton interne. */
.isis-plan-etage.is-edit-mode .leaflet-marker-icon { cursor: grab; }
.isis-plan-etage.is-edit-mode .leaflet-marker-icon:active { cursor: grabbing; }

.isis-plan-etage__placement-hint--edit {
    background: var(--isis-accent);
}

/* ----------------------------------------------------------------------------
   Statut occupancy d'un emplacement sélectionné (sidepanel PlanEtageDetail)
   ---------------------------------------------------------------------------- */
.isis-emplacement-status {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.3rem 0.7rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.78rem;
    font-weight: 600;
    margin: 0.5rem 0 0.75rem;
}
.isis-emplacement-status .rzi { font-size: 14px; }

.isis-emplacement-status--is-occupied {
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
    color: var(--isis-success);
    border: 1px solid color-mix(in srgb, var(--isis-success) 30%, transparent);
}
.isis-emplacement-status--is-equipped {
    background: color-mix(in srgb, var(--isis-info, #3b82f6) 12%, var(--isis-surface));
    color: var(--isis-info, #3b82f6);
    border: 1px solid color-mix(in srgb, var(--isis-info, #3b82f6) 30%, transparent);
}
.isis-emplacement-status--is-empty {
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    border: 1px solid var(--isis-border);
}
.isis-emplacement-status__more {
    color: var(--isis-text-muted);
    font-size: 0.75rem;
}

/* ----------------------------------------------------------------------------
   Mini-dashboard occupancy au niveau du plan (sidepanel par défaut)
   ---------------------------------------------------------------------------- */
.isis-plan-occupancy-summary {
    margin: 0.5rem 0 1rem;
    padding: 0.75rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
}
.isis-plan-occupancy-summary__pct {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
}
.isis-plan-occupancy-summary__pct-value {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--isis-mod-gesfac);
}
.isis-plan-occupancy-summary__pct-label {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}

.isis-plan-occupancy-summary__bar {
    margin-top: 0.45rem;
    height: 6px;
    background: var(--isis-border);
    border-radius: var(--isis-radius-pill);
    overflow: hidden;
}
.isis-plan-occupancy-summary__bar-fill {
    height: 100%;
    background: var(--isis-success);
    border-radius: var(--isis-radius-pill);
    transition: width 240ms ease;
}

.isis-plan-occupancy-summary__legend {
    list-style: none; padding: 0; margin: 0.65rem 0 0;
    display: grid; gap: 0.3rem;
}
.isis-plan-occupancy-summary__legend li {
    display: grid;
    grid-template-columns: 12px 28px 1fr;
    align-items: center;
    gap: 0.45rem;
    font-size: 0.82rem;
}
.isis-plan-occupancy-summary__legend .dot {
    width: 10px; height: 10px; border-radius: 50%;
    border: 1px solid var(--isis-border);
}
.isis-plan-occupancy-summary__legend .cnt {
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    text-align: right;
}
.isis-plan-occupancy-summary__legend .lbl {
    color: var(--isis-text-muted);
}
.isis-plan-occupancy-summary__legend .is-occupied .dot { background: var(--isis-success); border-color: var(--isis-success); }
.isis-plan-occupancy-summary__legend .is-equipped .dot { background: var(--isis-info, #3b82f6); border-color: var(--isis-info, #3b82f6); }
.isis-plan-occupancy-summary__legend .is-empty .dot    { background: var(--isis-surface); }


/* ============================================================================
   Kanban — vue pipeline commercial (migrations 0234 pilotage commercial)
   ----------------------------------------------------------------------------
   Utilisé par : /gesmaff/demandes-client/pipeline (V1)
   Pattern : 1 colonne par statut, drag-drop natif HTML5 entre colonnes.
   Conformité DESIGN.md : palette --isis-* uniquement, pas de couleurs ad-hoc.
   ============================================================================ */
.isis-kanban {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: minmax(260px, 1fr);
    gap: 0.75rem;
    overflow-x: auto;
    align-items: start;
    padding-bottom: 0.5rem;
}

.isis-kanban__column {
    display: flex;
    flex-direction: column;
    min-height: 320px;
    max-height: calc(100vh - 320px);
    background: var(--isis-surface-soft);
    border: 1px solid var(--isis-border-soft);
    border-radius: 8px;
    box-shadow: var(--isis-elevation-1);
    transition: box-shadow 0.15s ease, border-color 0.15s ease;
}

.isis-kanban__column.is-drop-target {
    border-color: var(--isis-accent);
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-accent) 25%, transparent),
                var(--isis-elevation-1);
}

.isis-kanban__col-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.75rem 0.85rem;
    border-bottom: 1px solid var(--isis-border-soft);
    position: sticky;
    top: 0;
    background: var(--isis-surface-soft);
    border-radius: 8px 8px 0 0;
    z-index: 1;
}

.isis-kanban__col-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--isis-text);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

.isis-kanban__col-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
}

.isis-kanban__col-dot.is-aqualifier { background: var(--isis-info); }
.isis-kanban__col-dot.is-qualifiee  { background: var(--isis-success); }
.isis-kanban__col-dot.is-perdue     { background: var(--isis-danger); }
.isis-kanban__col-dot.is-abandonnee { background: var(--isis-text-muted); }
.isis-kanban__col-dot.is-default    { background: var(--isis-text-muted); }

.isis-kanban__col-count {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border-soft);
    border-radius: var(--isis-radius-pill);
    padding: 0.15rem 0.55rem;
    min-width: 28px;
    text-align: center;
}

.isis-kanban__col-body {
    flex: 1;
    overflow-y: auto;
    padding: 0.6rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.isis-kanban__col-empty {
    padding: 1.5rem 0.5rem;
    text-align: center;
    border: 1px dashed var(--isis-border-soft);
    border-radius: 6px;
    background: color-mix(in srgb, var(--isis-surface) 50%, transparent);
}

/* ── Carte ─────────────────────────────────────────────────────────────── */
.isis-kanban__card {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border-soft);
    border-radius: 6px;
    padding: 0.6rem 0.7rem;
    cursor: grab;
    box-shadow: var(--isis-elevation-1);
    transition: box-shadow 0.15s ease, transform 0.1s ease, opacity 0.1s ease;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.isis-kanban__card:hover,
.isis-kanban__card:focus-visible {
    box-shadow: var(--isis-elevation-hover);
    outline: 2px solid color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 25%, transparent);
    outline-offset: 0;
}

.isis-kanban__card.is-dragging {
    opacity: 0.45;
    cursor: grabbing;
    transform: scale(0.97);
}

.isis-kanban__card-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
}

.isis-kanban__card-ref {
    font-family: var(--isis-font-mono);
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-soft);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 60%;
}

.isis-kanban__card-canal {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    padding: 0.1rem 0.4rem;
    background: var(--isis-surface-soft);
    border-radius: 3px;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 40%;
}

.isis-kanban__card-title {
    font-size: 0.88rem;
    font-weight: 500;
    color: var(--isis-text);
    line-height: 1.3;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.isis-kanban__card-tiers {
    font-size: 0.78rem;
    color: var(--isis-text-soft);
    display: flex;
    align-items: center;
    gap: 0.25rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.isis-kanban__card-foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    border-top: 1px dashed var(--isis-border-soft);
    padding-top: 0.35rem;
    margin-top: 0.15rem;
}

.isis-kanban__card-date,
.isis-kanban__card-owner {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
}

.isis-kanban__card-owner.is-unassigned {
    color: var(--isis-accent-warm);
}

/* ── Responsive ────────────────────────────────────────────────────────── */
@media (max-width: 768px) {
    .isis-kanban {
        grid-auto-columns: 85vw;
    }
}

/* Kanban — extensions colonne CONVERTIE virtuelle (read-only) */
.isis-kanban__col-dot.is-convertie {
    background: var(--isis-success);
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--isis-success) 25%, transparent);
}

.isis-kanban__column.is-readonly {
    background: color-mix(in srgb, var(--isis-success) 4%, var(--isis-surface-soft));
    border-color: color-mix(in srgb, var(--isis-success) 25%, var(--isis-border-soft));
}

.isis-kanban__column.is-readonly .isis-kanban__col-head {
    background: color-mix(in srgb, var(--isis-success) 5%, var(--isis-surface-soft));
}

.isis-kanban__col-derived {
    display: inline-flex;
    align-items: center;
    color: var(--isis-success);
    margin-left: 0.3rem;
    cursor: help;
}

.isis-kanban__card.is-readonly {
    cursor: pointer; /* clic = ouvrir fiche, mais pas de drag */
    border-left: 3px solid var(--isis-success);
}

.isis-kanban__card.is-readonly:hover,
.isis-kanban__card.is-readonly:focus-visible {
    background: color-mix(in srgb, var(--isis-success) 4%, var(--isis-surface));
}

.isis-kanban__card-won-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--isis-success);
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-success) 30%, transparent);
    padding: 0.1rem 0.45rem;
    border-radius: var(--isis-radius-pill);
    flex-shrink: 0;
}

/* ============================================================================
   Kanban devis (N2.7) — variantes de dot par statut devis + drop forbidden
   Réutilise la majorité du système kanban existant (gesmaff DemandeClient).
   ============================================================================ */
.isis-kanban__col-dot.is-devis-draft            { background: var(--isis-info); }
.isis-kanban__col-dot.is-devis-pending_approval { background: var(--isis-warning); }
.isis-kanban__col-dot.is-devis-approved         { background: var(--isis-info); }
.isis-kanban__col-dot.is-devis-sent             { background: var(--isis-accent); }
.isis-kanban__col-dot.is-devis-accepted         { background: var(--isis-success); }

.isis-kanban__column--devis {
    min-width: 240px;
    max-width: 320px;
}

.isis-kanban__column.is-drop-forbidden {
    border-color: color-mix(in srgb, var(--isis-danger) 35%, var(--isis-border-soft));
    background: color-mix(in srgb, var(--isis-danger) 4%, var(--isis-surface-soft));
}

.isis-kanban__column.is-drop-forbidden::after {
    content: "Transition non autorisée — passer par la fiche";
    display: block;
    margin: 0.4rem 0.6rem;
    padding: 0.3rem 0.5rem;
    font-size: 0.72rem;
    color: var(--isis-danger);
    background: color-mix(in srgb, var(--isis-danger) 8%, var(--isis-surface));
    border: 1px dashed color-mix(in srgb, var(--isis-danger) 40%, transparent);
    border-radius: 4px;
    text-align: center;
}

.isis-kanban__card-owner.is-warning {
    color: var(--isis-warning);
    background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
}

.isis-kanban__card-owner.is-expired {
    color: var(--isis-danger);
    background: color-mix(in srgb, var(--isis-danger) 12%, var(--isis-surface));
}

/* ============================================================================
   Funnel pipeline (N2.8) — bandes proportionnelles par statut, drill-down clic.
   V1 = visualisation lecture-seule. Bandes centrées avec largeur dynamique
   selon le nombre d'offres par statut. Clic = bascule en mode Liste + filtre.
   ============================================================================ */
.isis-funnel {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 1rem 0;
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 0;
}

.isis-funnel__band {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.85rem 1.4rem;
    font-size: 0.92rem;
    font-weight: 500;
    color: var(--isis-text);
    background: color-mix(in srgb, var(--isis-info) 12%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-info) 30%, transparent);
    border-radius: 8px;
    cursor: pointer;
    transition: all 0.16s ease;
    min-height: 56px;
    box-shadow: var(--isis-elevation-1);
}

.isis-funnel__band:hover:not(:disabled) {
    transform: translateY(-1px);
    box-shadow: var(--isis-elevation-hover);
}

.isis-funnel__band:focus-visible {
    outline: 2px solid var(--isis-accent);
    outline-offset: 2px;
}

.isis-funnel__band.is-empty {
    opacity: 0.45;
    cursor: not-allowed;
}

.isis-funnel__band--info {
    background: color-mix(in srgb, var(--isis-info) 12%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-info) 32%, transparent);
}

.isis-funnel__band--warning {
    background: color-mix(in srgb, var(--isis-warning) 14%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-warning) 35%, transparent);
}

.isis-funnel__band--success {
    background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface));
    border-color: color-mix(in srgb, var(--isis-success) 35%, transparent);
}

.isis-funnel__band-label {
    font-weight: 600;
    letter-spacing: 0.02em;
}

.isis-funnel__band-count {
    font-size: 1.1rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--isis-accent);
    background: var(--isis-surface);
    padding: 0.1rem 0.6rem;
    border-radius: var(--isis-radius-pill);
    min-width: 2.4rem;
    text-align: center;
}

/* ============================================================================
   Command palette (Ctrl+K) — refonte shell 2026-05-26
   Modal overlay centré, recherche fuzzy de pages. Pattern Linear/Stripe.
   Position : top 20vh (style premium SaaS), pas dead center.
   ============================================================================ */
.isis-cmdp-backdrop {
    position: fixed;
    inset: 0;
    z-index: 1000;
    background-color: color-mix(in srgb, #0f172a 55%, transparent);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: 20vh 1rem 1rem;
    /* Fade-in léger à l'ouverture pour le sentiment "app native". */
    animation: isis-cmdp-fade-in 120ms ease-out;
}
@keyframes isis-cmdp-fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
.isis-cmdp {
    width: 100%;
    max-width: 640px;
    max-height: 60vh;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 14px;
    /* Ombre marquée — au-dessus des dialogs (--isis-elevation-2). */
    box-shadow: 0 30px 60px -15px rgba(15, 23, 42, 0.35),
                0 12px 24px -10px rgba(15, 23, 42, 0.15);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    /* Scale-in subtil — donne le sentiment de pop modal. */
    animation: isis-cmdp-scale-in 150ms cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes isis-cmdp-scale-in {
    from { transform: scale(0.96); opacity: 0; }
    to   { transform: scale(1);    opacity: 1; }
}
.isis-cmdp__header {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.85rem 1rem;
    border-bottom: 1px solid var(--isis-border-soft);
    flex-shrink: 0;
}
.isis-cmdp__input {
    flex: 1;
    min-width: 0;
    border: none;
    outline: none;
    background: transparent;
    font-size: 1rem;
    color: var(--isis-text);
    font-family: inherit;
}
.isis-cmdp__input::placeholder {
    color: var(--isis-text-soft);
}
.isis-cmdp__esc {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.7rem;
    padding: 2px 6px;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 4px;
    color: var(--isis-text-soft);
    flex-shrink: 0;
}
.isis-cmdp__results {
    flex: 1;
    overflow-y: auto;
    padding: 0.35rem;
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-height: 0;
}
.isis-cmdp__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 3rem 1.5rem;
    color: var(--isis-text-muted);
    font-size: 0.9rem;
    text-align: center;
}
.isis-cmdp__empty strong { color: var(--isis-text); font-weight: 600; }
.isis-cmdp__result {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.6rem 0.75rem;
    border: none;
    background: transparent;
    border-radius: 8px;
    color: var(--isis-text);
    text-align: left;
    cursor: pointer;
    transition: background-color 80ms ease;
    width: 100%;
}
.isis-cmdp__result.is-active {
    background-color: var(--isis-current-mod-soft, var(--isis-accent-soft));
}
.isis-cmdp__result-icon {
    width: 32px;
    height: 32px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    border-radius: 7px;
    flex-shrink: 0;
}
.isis-cmdp__result-icon .rzi { font-size: 18px; }
/* Couleur d'icône par module — donne un repère visuel sur la source du résultat. */
.isis-cmdp__result.mod-gescom    .isis-cmdp__result-icon { background-color: var(--isis-mod-gescom-soft);    color: var(--isis-mod-gescom); }
.isis-cmdp__result.mod-gescompta .isis-cmdp__result-icon { background-color: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-cmdp__result.mod-sirh      .isis-cmdp__result-icon { background-color: var(--isis-mod-sirh-soft);      color: var(--isis-mod-sirh); }
.isis-cmdp__result.mod-admin     .isis-cmdp__result-icon { background-color: var(--isis-mod-admin-soft);     color: var(--isis-mod-admin); }
.isis-cmdp__result.mod-ged       .isis-cmdp__result-icon { background-color: var(--isis-mod-ged-soft);       color: var(--isis-mod-ged); }
.isis-cmdp__result.mod-gesproj   .isis-cmdp__result-icon { background-color: var(--isis-mod-gesproj-soft);   color: var(--isis-mod-gesproj); }
.isis-cmdp__result.mod-gesmaff   .isis-cmdp__result-icon { background-color: var(--isis-mod-gesmaff-soft);   color: var(--isis-mod-gesmaff); }
.isis-cmdp__result.mod-gesst     .isis-cmdp__result-icon { background-color: var(--isis-mod-gesst-soft);     color: var(--isis-mod-gesst); }
.isis-cmdp__result.mod-gesmat    .isis-cmdp__result-icon { background-color: var(--isis-mod-gesmat-soft);    color: var(--isis-mod-gesmat); }
.isis-cmdp__result.mod-gespla    .isis-cmdp__result-icon { background-color: var(--isis-mod-gespla-soft);    color: var(--isis-mod-gespla); }
.isis-cmdp__result.mod-monespace .isis-cmdp__result-icon { background-color: var(--isis-accent-soft);        color: var(--isis-accent); }

.isis-cmdp__result-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.isis-cmdp__result-label {
    font-size: 0.9rem;
    font-weight: 500;
    color: var(--isis-text);
    line-height: 1.2;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-cmdp__result-path {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    line-height: 1.2;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-cmdp__result-sep {
    margin: 0 0.35rem;
    opacity: 0.5;
}
.isis-cmdp__result-hint {
    color: var(--isis-text-soft);
    opacity: 0;
    transition: opacity 80ms;
    flex-shrink: 0;
}
.isis-cmdp__result.is-active .isis-cmdp__result-hint {
    opacity: 0.7;
    color: var(--isis-current-mod, var(--isis-accent));
}
.isis-cmdp__footer {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 0.6rem 0.9rem;
    border-top: 1px solid var(--isis-border-soft);
    background-color: var(--isis-surface-alt);
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    flex-shrink: 0;
}
.isis-cmdp__shortcut {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
}
.isis-cmdp__shortcut kbd {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.65rem;
    padding: 1px 4px;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 3px;
    color: var(--isis-text-muted);
    line-height: 1;
}
.isis-cmdp__count {
    margin-left: auto;
    font-variant-numeric: tabular-nums;
}

/* Sentinelles focus trap (a11y WCAG 2.4.3) — focusables au clavier mais
   invisibles à l'œil. Pattern sr-only standard (clip:rect 0) qui garantit que
   l'élément reste focusable sous Firefox/Safari/Chrome — opacity:0 ou
   display:none retireraient l'élément du focus order. Refonte a11y 2026-05-27. */
.isis-cmdp__sentinel {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

/* prefers-reduced-motion : désactive les animations d'entrée. */
@media (prefers-reduced-motion: reduce) {
    .isis-cmdp-backdrop,
    .isis-cmdp {
        animation: none !important;
    }
}

/* ============================================================================
   Skeleton loading (refonte shell 2026-05-26, 3e chantier « SaaS premium »)
   Composants : IsisSkeleton (atomique) + IsisGridSkeleton (wrapper liste).
   Animation shimmer = gradient horizontal qui défile, 1.6s ease-in-out infini.
   ============================================================================ */
.isis-skeleton {
    display: block;
    background-color: var(--isis-surface-alt);
    background-image: linear-gradient(
        90deg,
        var(--isis-surface-alt) 0%,
        color-mix(in srgb, var(--isis-surface-alt) 50%, var(--isis-border-soft)) 50%,
        var(--isis-surface-alt) 100%);
    background-size: 200% 100%;
    background-repeat: no-repeat;
    border-radius: 4px;
    animation: isis-skeleton-shimmer 1.6s ease-in-out infinite;
}
.isis-skeleton--muted {
    /* Variante un cran plus discrète — utile pour les sub-labels secondaires. */
    opacity: 0.55;
}
@keyframes isis-skeleton-shimmer {
    0%   { background-position: 100% 0; }
    100% { background-position: -100% 0; }
}

/* Wrapper grid skeleton — réplique la hauteur 52px d'une row standard de .isis-grid
   pour éviter le "saut de layout" quand les vraies données arrivent. */
.isis-grid-skeleton {
    display: flex;
    flex-direction: column;
    gap: 0;
}
.isis-grid-skeleton__row {
    display: grid;
    grid-template-columns: 18px minmax(160px, 1.4fr) 100px 110px 80px 32px;
    gap: 0.85rem;
    align-items: center;
    height: 52px;
    padding: 0 1rem;
    border-bottom: 1px solid var(--isis-border-soft);
}
.isis-grid-skeleton__row:last-child {
    border-bottom: none;
}
.isis-grid-skeleton__col-main {
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-width: 0;
}

/* prefers-reduced-motion : skeleton statique (pas d'animation shimmer).
   On garde le fond gris pour signaler le placeholder, juste sans le défilement. */
@media (prefers-reduced-motion: reduce) {
    .isis-skeleton { animation: none !important; }
}

/* ─────────────────────────────────────────────────────────────────────────
   Pages marketing publiques (Landing /, MarketingLayout)
   Layout entièrement autonome — pas de dépendance à .isis-shell.
   ───────────────────────────────────────────────────────────────────────── */

.isis-marketing {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--isis-surface);
    color: var(--isis-text);
    font-family: var(--isis-font, "Geist", -apple-system, BlinkMacSystemFont, system-ui, "Segoe UI", sans-serif);
}

/* Header sticky : logo + nav + CTA */
.isis-marketing__header {
    position: sticky; top: 0; z-index: 50;
    display: flex; align-items: center; gap: 2rem;
    padding: 0.75rem 2rem;
    background: color-mix(in srgb, var(--isis-surface) 92%, transparent);
    backdrop-filter: saturate(180%) blur(8px);
    -webkit-backdrop-filter: saturate(180%) blur(8px);
    border-bottom: 1px solid var(--isis-border);
}
.isis-marketing__brand {
    display: flex; align-items: center; gap: 0.65rem;
    text-decoration: none; color: inherit;
}
.isis-marketing__brand-logo { width: 36px; height: 36px; border-radius: 8px; }
.isis-marketing__brand-text { display: flex; flex-direction: column; line-height: 1.15; }
.isis-marketing__brand-name { font-weight: 700; font-size: 0.95rem; letter-spacing: -0.01em; }
.isis-marketing__brand-tag { font-size: 0.72rem; color: var(--isis-text-muted); letter-spacing: 0.02em; }

.isis-marketing__nav {
    display: flex; align-items: center; gap: 1.5rem;
    margin-left: auto;
}
.isis-marketing__nav a {
    text-decoration: none;
    color: var(--isis-text-muted);
    font-size: 0.9rem;
    font-weight: 500;
    padding: 0.4rem 0;
    transition: color 120ms ease;
}
.isis-marketing__nav a:hover,
.isis-marketing__nav a:focus-visible {
    color: var(--isis-accent);
    outline: none;
}

.isis-marketing__actions { display: flex; align-items: center; gap: 0.75rem; }
.isis-marketing__login {
    display: inline-flex; align-items: center; gap: 0.5rem;
    padding: 0.55rem 1rem;
    background: var(--isis-accent);
    color: #fff;
    border-radius: var(--isis-radius, 8px);
    text-decoration: none;
    font-size: 0.88rem;
    font-weight: 600;
    box-shadow: var(--isis-elevation-1, 0 2px 6px rgba(0, 0, 0, 0.08));
    transition: background 120ms ease, transform 120ms ease;
}
.isis-marketing__login:hover { background: var(--isis-accent-strong); transform: translateY(-1px); }
.isis-marketing__login:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--isis-accent) 35%, transparent);
}
.isis-marketing__login .material-symbols-outlined { font-size: 18px; }

/* Conteneur principal */
.isis-marketing__main { flex: 1; }

/* Hero — fond dégradé subtil module-accent + warm */
.isis-marketing-hero {
    position: relative;
    padding: 5rem 2rem 4rem;
    background:
        radial-gradient(circle at 15% 20%, color-mix(in srgb, var(--isis-accent) 8%, transparent) 0%, transparent 55%),
        radial-gradient(circle at 85% 10%, color-mix(in srgb, var(--isis-accent-warm) 6%, transparent) 0%, transparent 55%),
        var(--isis-surface);
    overflow: hidden;
}
.isis-marketing-hero::before {
    content: "";
    position: absolute; inset: 0 0 auto 0; height: 4px;
    background: linear-gradient(90deg,
        var(--isis-accent) 0%,
        var(--isis-accent-warm) 50%,
        var(--isis-mod-sirh, #059669) 100%);
    opacity: 0.55;
}
.isis-marketing-hero__inner {
    max-width: 920px; margin: 0 auto; text-align: center;
}
.isis-marketing-hero__eyebrow {
    display: inline-block;
    padding: 0.3rem 0.8rem;
    background: var(--isis-accent-soft);
    color: var(--isis-accent-strong);
    border-radius: var(--isis-radius-pill);
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-bottom: 1.5rem;
}
.isis-marketing-hero__title {
    font-size: clamp(2rem, 4.5vw, 3.25rem);
    font-weight: 800;
    line-height: 1.1;
    letter-spacing: -0.02em;
    margin: 0 0 1.25rem;
    color: var(--isis-text);
}
.isis-marketing-hero__title-prefix {
    display: block;
    font-size: clamp(0.95rem, 1.4vw, 1.15rem);
    font-weight: 500;
    letter-spacing: 0.02em;
    color: var(--isis-text-muted);
    margin-bottom: 0.6rem;
    text-transform: none;
}
.isis-marketing-hero__subtitle {
    font-size: clamp(1rem, 1.6vw, 1.18rem);
    line-height: 1.55;
    color: var(--isis-text-muted);
    margin: 0 auto 2.25rem;
    max-width: 720px;
}
.isis-marketing-hero__actions {
    display: inline-flex; gap: 0.75rem; flex-wrap: wrap; justify-content: center;
}

/* Boutons marketing */
.isis-marketing-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    padding: 0.75rem 1.4rem;
    border-radius: var(--isis-radius, 8px);
    font-size: 0.95rem;
    font-weight: 600;
    text-decoration: none;
    border: 1px solid transparent;
    transition: background 120ms ease, transform 120ms ease, border-color 120ms ease;
}
.isis-marketing-btn .material-symbols-outlined { font-size: 18px; }
.isis-marketing-btn--primary {
    background: var(--isis-accent);
    color: #fff;
    box-shadow: var(--isis-elevation-1, 0 4px 12px rgba(0, 0, 0, 0.1));
}
.isis-marketing-btn--primary:hover { background: var(--isis-accent-strong); transform: translateY(-1px); }
.isis-marketing-btn--ghost {
    background: transparent;
    color: var(--isis-text);
    border-color: var(--isis-border);
}
.isis-marketing-btn--ghost:hover {
    border-color: var(--isis-accent);
    color: var(--isis-accent);
}
.isis-marketing-btn:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--isis-accent) 35%, transparent);
}

/* Sections génériques */
.isis-marketing-section {
    padding: 4.5rem 2rem;
    max-width: 1200px; margin: 0 auto;
}
.isis-marketing-section--alt {
    background: var(--isis-surface-alt, #f7f8fa);
    max-width: none;
    padding-left: max(2rem, calc((100vw - 1200px) / 2));
    padding-right: max(2rem, calc((100vw - 1200px) / 2));
}
.isis-marketing-section__head {
    text-align: center;
    margin-bottom: 3rem;
}
.isis-marketing-section__head h2 {
    font-size: clamp(1.5rem, 3vw, 2.25rem);
    font-weight: 700;
    letter-spacing: -0.015em;
    margin: 0 0 0.65rem;
}
.isis-marketing-section__head p {
    font-size: 1rem;
    color: var(--isis-text-muted);
    margin: 0 auto;
    max-width: 640px;
}

/* Grille modules */
.isis-marketing-modules {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 1.25rem;
}
.isis-marketing-module {
    position: relative;
    padding: 1.5rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius, 12px);
    transition: transform 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
}
.isis-marketing-module:hover {
    transform: translateY(-3px);
    border-color: color-mix(in srgb, var(--isis-accent) 40%, var(--isis-border));
    box-shadow: var(--isis-elevation-hover, 0 12px 28px rgba(0, 0, 0, 0.08));
}
.isis-marketing-module__icon {
    display: inline-flex;
    align-items: center; justify-content: center;
    width: 44px; height: 44px;
    border-radius: 10px;
    background: var(--isis-accent-soft);
    color: var(--isis-accent);
    font-size: 24px !important;
    margin-bottom: 1rem;
}
.isis-marketing-module h3 {
    font-size: 1.1rem; font-weight: 700; letter-spacing: -0.01em;
    margin: 0 0 0.4rem;
}
.isis-marketing-module p {
    color: var(--isis-text-muted);
    font-size: 0.92rem;
    line-height: 1.5;
    margin: 0;
}

/* Couleurs module — icône tinted */
.isis-marketing-module.mod-gescom    .isis-marketing-module__icon { background: var(--isis-mod-gescom-soft);    color: var(--isis-mod-gescom); }
.isis-marketing-module.mod-gescompta .isis-marketing-module__icon { background: var(--isis-mod-gescompta-soft); color: var(--isis-mod-gescompta); }
.isis-marketing-module.mod-sirh      .isis-marketing-module__icon { background: var(--isis-mod-sirh-soft);      color: var(--isis-mod-sirh); }
.isis-marketing-module.mod-gesproj   .isis-marketing-module__icon { background: var(--isis-mod-gesproj-soft, #fef3c7); color: var(--isis-mod-gesproj, #d97706); }
.isis-marketing-module.mod-gesmaff   .isis-marketing-module__icon { background: var(--isis-mod-gesmaff-soft, #fef3c7); color: var(--isis-mod-gesmaff, #d97706); }
.isis-marketing-module.mod-gesst     .isis-marketing-module__icon { background: var(--isis-mod-gesst-soft, #fce7f3);  color: var(--isis-mod-gesst, #be185d); }
.isis-marketing-module.mod-gespla    .isis-marketing-module__icon { background: var(--isis-mod-gespla-soft, #ccfbf1); color: var(--isis-mod-gespla, #0f766e); }
.isis-marketing-module.mod-gesmat    .isis-marketing-module__icon { background: var(--isis-mod-gesmat-soft, #f5f5f4);  color: var(--isis-mod-gesmat, #44403c); }
.isis-marketing-module.mod-ged       .isis-marketing-module__icon { background: var(--isis-accent-warm-soft); color: var(--isis-accent-warm); }

/* Valeurs */
.isis-marketing-values {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 1.25rem;
}
.isis-marketing-value {
    padding: 1.5rem;
    background: var(--isis-surface);
    border-radius: var(--isis-radius, 12px);
    border: 1px solid var(--isis-border);
}
.isis-marketing-value__icon {
    display: inline-flex;
    align-items: center; justify-content: center;
    width: 40px; height: 40px;
    border-radius: 10px;
    background: var(--isis-accent-warm-soft);
    color: var(--isis-accent-warm);
    font-size: 22px !important;
    margin-bottom: 0.85rem;
}
.isis-marketing-value h3 {
    font-size: 1.05rem; font-weight: 700;
    margin: 0 0 0.35rem;
}
.isis-marketing-value p {
    color: var(--isis-text-muted);
    font-size: 0.9rem;
    line-height: 1.5;
    margin: 0;
}

/* CTA finale */
.isis-marketing-cta {
    text-align: center;
    padding: 5rem 2rem;
}
.isis-marketing-cta__inner { max-width: 720px; margin: 0 auto; }
.isis-marketing-cta h2 {
    font-size: clamp(1.6rem, 3.2vw, 2.4rem);
    font-weight: 700;
    margin: 0 0 1rem;
    letter-spacing: -0.015em;
}
.isis-marketing-cta > .isis-marketing-cta__inner > p {
    font-size: 1.05rem;
    color: var(--isis-text-muted);
    line-height: 1.55;
    margin: 0 0 2rem;
}
.isis-marketing-cta__actions {
    display: inline-flex; gap: 0.75rem; flex-wrap: wrap; justify-content: center;
    margin-bottom: 1.5rem;
}
.isis-marketing-cta__small {
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-marketing-cta__small a {
    color: var(--isis-accent);
    text-decoration: none;
    font-weight: 500;
}
.isis-marketing-cta__small a:hover { text-decoration: underline; }

/* Footer */
.isis-marketing__footer {
    border-top: 1px solid var(--isis-border);
    padding: 1.5rem 2rem;
    background: var(--isis-surface-alt, #f7f8fa);
    font-size: 0.85rem;
    color: var(--isis-text-muted);
}
.isis-marketing__footer-inner {
    max-width: 1200px; margin: 0 auto;
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem; flex-wrap: wrap;
}
.isis-marketing__footer-links { display: inline-flex; gap: 0.6rem; align-items: center; }
.isis-marketing__footer-links a {
    color: var(--isis-text-muted);
    text-decoration: none;
}
.isis-marketing__footer-links a:hover { color: var(--isis-accent); }

/* Responsive : nav d'ancres masquée < 720px (CTA Espace client reste visible) */
@media (max-width: 720px) {
    .isis-marketing__nav { display: none; }
    .isis-marketing__header { gap: 1rem; padding: 0.65rem 1rem; }
    .isis-marketing__brand-tag { display: none; }
    .isis-marketing-hero { padding: 3rem 1.25rem 2.5rem; }
    .isis-marketing-section { padding: 3rem 1.25rem; }
    .isis-marketing-section--alt {
        padding-left: 1.25rem; padding-right: 1.25rem;
    }
    .isis-marketing-cta { padding: 3.5rem 1.25rem; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   Landing publique — refonte 2026 « un seul écran » (route /, EmptyLayout).
   Fond CLAIR sur le thème ISIS (near-white + voiles accent/warm subtils), un seul
   écran sans scroll : header transparent + hero (titre cinétique couleur-module +
   tableau de bord produit illustratif animé) + bande modules.
   Tout est namespacé .isis-ld-* / .isis-ld__*. Données maquette illustratives.
   ═══════════════════════════════════════════════════════════════════════════ */
.isis-ld {
    --isis-ld-w: #c2410c;
    height: 100vh; height: 100dvh; display: flex; flex-direction: column; overflow: hidden;
    position: relative; color: var(--isis-text);
    background:
        radial-gradient(60% 55% at 15% 0%, color-mix(in srgb, var(--isis-accent) 9%, transparent) 0%, transparent 55%),
        radial-gradient(55% 55% at 88% 100%, color-mix(in srgb, var(--isis-accent-warm) 6%, transparent) 0%, transparent 50%),
        var(--isis-surface-alt);
}
.isis-ld__bg { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; }

/* header transparent (sur fond clair) */
.isis-ld__hd { position: relative; z-index: 3; display: flex; align-items: center; gap: 2rem; padding: 1.1rem clamp(1.5rem, 5vw, 4rem) .6rem; }
.isis-ld__brand { display: flex; align-items: center; gap: .6rem; text-decoration: none; color: inherit; }
.isis-ld__mark { width: 32px; height: 32px; border-radius: 8px; background: linear-gradient(135deg, var(--isis-accent), var(--isis-accent-strong)); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: .82rem; color: #fff; box-shadow: 0 4px 12px -5px color-mix(in srgb, var(--isis-accent) 55%, transparent); }
.isis-ld__bname { font-weight: 700; font-size: .95rem; letter-spacing: -.01em; }
.isis-ld__btag { display: block; font-size: .7rem; color: var(--isis-text-muted); font-weight: 500; }
.isis-ld__nav { display: flex; gap: 1.4rem; margin-left: auto; }
.isis-ld__nav a { color: var(--isis-text-muted); text-decoration: none; font-size: .88rem; font-weight: 500; }
.isis-ld__nav a:hover { color: var(--isis-accent); }
.isis-ld__login { display: inline-flex; align-items: center; gap: .4rem; padding: .5rem .95rem; border-radius: 8px; background: var(--isis-accent); color: #fff; text-decoration: none; font-size: .85rem; font-weight: 600; box-shadow: 0 4px 12px -5px color-mix(in srgb, var(--isis-accent) 55%, transparent); }
.isis-ld__login:hover { background: var(--isis-accent-strong); }
.isis-ld__login .material-symbols-outlined { font-size: 18px; }

/* hero */
.isis-ld__hero { flex: 1; min-height: 0; display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(2rem, 4vw, 3.5rem); align-items: center; width: 100%; max-width: 78rem; margin: 0 auto; padding: .5rem clamp(1.5rem, 5vw, 4rem); position: relative; z-index: 1; }
.isis-ld__copy { display: flex; flex-direction: column; align-items: flex-start; gap: 1.1rem; }
.isis-ld__kicker { margin: 0; font-size: clamp(.95rem, 1.5vw, 1.2rem); font-weight: 500; color: var(--isis-text-muted); }
.isis-ld__line { margin: 0; font-weight: 700; letter-spacing: -.035em; line-height: 1.03; font-size: clamp(2.2rem, 4.6vw, 3.9rem); min-height: 1.05em; }
.isis-ld__word { display: inline-block; color: var(--isis-accent); transition: color .38s ease, opacity .38s ease, transform .38s cubic-bezier(.16, 1, .3, 1); will-change: opacity, transform; }
.isis-ld__word.is-out { opacity: 0; transform: translateY(-.34em); }
.isis-ld__lead { margin: 0; font-size: clamp(.95rem, 1.4vw, 1.1rem); line-height: 1.5; color: var(--isis-text-muted); max-width: 30rem; }
.isis-ld__cta { display: flex; gap: .7rem; flex-wrap: wrap; }
.isis-ld__btn { display: inline-flex; align-items: center; gap: .5rem; padding: .75rem 1.35rem; border-radius: 8px; font-size: .95rem; font-weight: 600; text-decoration: none; border: 1px solid transparent; transition: transform .12s ease, background .12s ease, border-color .12s ease, color .12s ease; }
.isis-ld__btn .material-symbols-outlined { font-size: 18px; }
.isis-ld__btn--p { background: var(--isis-accent); color: #fff; box-shadow: 0 8px 22px -10px color-mix(in srgb, var(--isis-accent) 70%, transparent); }
.isis-ld__btn--p:hover { transform: translateY(-1px); background: var(--isis-accent-strong); }
.isis-ld__btn--g { background: var(--isis-surface); color: var(--isis-text); border-color: var(--isis-border); }
.isis-ld__btn--g:hover { border-color: var(--isis-accent); color: var(--isis-accent); transform: translateY(-1px); }
.isis-ld__trust { display: flex; flex-wrap: wrap; gap: .45rem; list-style: none; padding: 0; margin: .2rem 0 0; }
.isis-ld__trust li { display: inline-flex; align-items: center; gap: .35rem; font-size: .78rem; font-weight: 500; color: var(--isis-text-muted); background: var(--isis-surface); border: 1px solid var(--isis-border); padding: .3rem .65rem; border-radius: 999px; }
.isis-ld__trust .material-symbols-outlined { font-size: 15px; color: var(--isis-accent); }

/* tableau de bord produit (illustratif, animé) */
.isis-ld__visual { display: flex; justify-content: center; align-items: center; min-height: 0; }
.isis-ld-dash { width: 100%; max-width: 520px; border-radius: 14px; background: var(--isis-surface); color: var(--isis-text); overflow: hidden; border: 1px solid var(--isis-border); box-shadow: 0 30px 60px -28px rgba(31, 35, 40, 0.22), 0 8px 22px -14px rgba(31, 35, 40, 0.12); transform: perspective(1500px) rotateY(-5deg) rotateX(2deg); }
.isis-ld-dash__bar { display: flex; align-items: center; gap: .5rem; padding: .5rem .7rem; border-bottom: 1px solid var(--isis-border); background: var(--isis-surface-alt); }
.isis-ld-dash__mk { width: 18px; height: 18px; border-radius: 5px; background: linear-gradient(135deg, var(--isis-accent), var(--isis-accent-strong)); color: #fff; font-size: .5rem; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.isis-ld-dash__tab { height: 7px; border-radius: 4px; background: #dfe4e9; width: 32px; }
.isis-ld-dash__tab:nth-child(2) { width: 54px; background: color-mix(in srgb, var(--isis-accent) 35%, #dfe4e9); }
.isis-ld-dash__tab:nth-child(4) { width: 46px; }
.isis-ld-dash__search { margin-left: auto; width: 96px; height: 16px; border-radius: 8px; background: var(--isis-surface); border: 1px solid var(--isis-border); }
.isis-ld-dash__body { display: grid; grid-template-columns: 38px 1fr; }
.isis-ld-dash__rail { display: flex; flex-direction: column; align-items: center; gap: .4rem; padding: .55rem 0; background: var(--isis-surface-alt); border-right: 1px solid var(--isis-border); }
.isis-ld-dash__rd { width: 18px; height: 18px; border-radius: 5px; background: color-mix(in srgb, var(--rc) 24%, #fff); }
.isis-ld-dash__rd.on { box-shadow: 0 0 0 2px color-mix(in srgb, var(--rc) 55%, transparent); }
.isis-ld-dash__main { padding: .7rem; display: flex; flex-direction: column; gap: .6rem; }
.isis-ld-dash__kpis { display: grid; grid-template-columns: repeat(3, 1fr); gap: .5rem; }
.isis-ld-dash__kpi { border: 1px solid var(--isis-border); border-radius: 8px; padding: .45rem .5rem; display: flex; flex-direction: column; gap: .32rem; }
.isis-ld-dash__klab { width: 62%; height: 5px; border-radius: 3px; background: #e3e6eb; }
.isis-ld-dash__kval { height: 11px; border-radius: 4px; transform-origin: left; animation: isisLdGrow 1s cubic-bezier(.16, 1, .3, 1) both; }
.isis-ld-dash__kpi:nth-child(1) .isis-ld-dash__kval { width: 74%; background: color-mix(in srgb, var(--isis-accent) 70%, #fff); animation-delay: .1s; }
.isis-ld-dash__kpi:nth-child(2) .isis-ld-dash__kval { width: 56%; background: color-mix(in srgb, #16a34a 62%, #fff); animation-delay: .22s; }
.isis-ld-dash__kpi:nth-child(3) .isis-ld-dash__kval { width: 66%; background: color-mix(in srgb, var(--isis-ld-w) 70%, #fff); animation-delay: .34s; }
@keyframes isisLdGrow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.isis-ld-dash__charts { display: grid; grid-template-columns: 1.5fr 1fr; gap: .5rem; }
.isis-ld-dash__card { border: 1px solid var(--isis-border); border-radius: 8px; padding: .5rem; }
.isis-ld-dash__bars { display: flex; align-items: flex-end; gap: .34rem; height: 74px; }
.isis-ld-dash__bars span { flex: 1; border-radius: 3px 3px 0 0; background: linear-gradient(180deg, color-mix(in srgb, var(--isis-accent) 75%, #fff), color-mix(in srgb, var(--isis-accent) 30%, #fff)); transform: scaleY(0); transform-origin: bottom; animation: isisLdBar .7s cubic-bezier(.16, 1, .3, 1) both; }
.isis-ld-dash__bars span:nth-child(1) { height: 42%; animation-delay: .30s; }
.isis-ld-dash__bars span:nth-child(2) { height: 66%; animation-delay: .38s; }
.isis-ld-dash__bars span:nth-child(3) { height: 52%; animation-delay: .46s; }
.isis-ld-dash__bars span:nth-child(4) { height: 84%; background: linear-gradient(180deg, var(--isis-ld-w), color-mix(in srgb, var(--isis-ld-w) 40%, #fff)); animation-delay: .54s; }
.isis-ld-dash__bars span:nth-child(5) { height: 60%; animation-delay: .62s; }
.isis-ld-dash__bars span:nth-child(6) { height: 92%; animation-delay: .70s; }
@keyframes isisLdBar { to { transform: scaleY(1); } }
.isis-ld-dash__donut { display: flex; align-items: center; justify-content: center; height: 74px; }
.isis-ld-dash__donut svg { width: 74px; height: 74px; transform: rotate(-90deg); }
.isis-ld-dash__donut .ring { fill: none; stroke: #eaedf0; stroke-width: 5; }
.isis-ld-dash__donut .seg { fill: none; stroke: var(--isis-accent); stroke-width: 5; stroke-linecap: round; stroke-dasharray: 100; stroke-dashoffset: 100; animation: isisLdDraw 1.1s cubic-bezier(.16, 1, .3, 1) .5s forwards; }
.isis-ld-dash__donut .seg2 { fill: none; stroke: var(--isis-ld-w); stroke-width: 5; stroke-linecap: round; stroke-dasharray: 100; stroke-dashoffset: 100; animation: isisLdDraw2 1.1s cubic-bezier(.16, 1, .3, 1) .7s forwards; }
@keyframes isisLdDraw { to { stroke-dashoffset: 38; } }
@keyframes isisLdDraw2 { to { stroke-dashoffset: 80; } }
.isis-ld-dash__list { display: flex; flex-direction: column; gap: .34rem; }
.isis-ld-dash__row { display: grid; grid-template-columns: 8px 1fr 42px; gap: .45rem; align-items: center; }
.isis-ld-dash__rdot { width: 7px; height: 7px; border-radius: 50%; }
.isis-ld-dash__rc { height: 7px; border-radius: 4px; background: #e8ebee; }
.isis-ld-dash__ra { height: 7px; border-radius: 4px; background: color-mix(in srgb, var(--isis-accent) 22%, #e3e6eb); justify-self: end; width: 100%; }

/* bande modules */
.isis-ld__band { position: relative; z-index: 1; padding: .5rem clamp(1.5rem, 5vw, 4rem) 1.1rem; }
.isis-ld__band-top { display: flex; align-items: center; gap: .6rem; margin: 0 auto .55rem; max-width: 78rem; }
.isis-ld__band-top span { font-size: .74rem; letter-spacing: .1em; text-transform: uppercase; color: var(--isis-text-subtle, #8b95a3); font-weight: 600; }
.isis-ld__band-top hr { flex: 1; border: 0; border-top: 1px solid var(--isis-border); }
.isis-ld__mods { max-width: 78rem; margin: 0 auto; display: flex; flex-wrap: wrap; gap: .5rem; justify-content: center; }
.isis-ld-mod { display: inline-flex; align-items: center; gap: .5rem; padding: .42rem .7rem; border-radius: 10px; background: var(--isis-surface); border: 1px solid var(--isis-border); text-decoration: none; transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease; }
.isis-ld-mod:hover { transform: translateY(-2px); box-shadow: 0 10px 22px -14px rgba(31, 35, 40, 0.3); border-color: color-mix(in srgb, var(--mc) 45%, var(--isis-border)); }
.isis-ld-mod .material-symbols-outlined { font-size: 18px; color: var(--mc); }
.isis-ld-mod b { font-weight: 600; font-size: .82rem; color: var(--isis-text); }

@media (max-width: 900px) {
    .isis-ld { height: auto; min-height: 100vh; overflow: visible; }
    .isis-ld__hero { grid-template-columns: 1fr; gap: 1.6rem; text-align: center; padding-top: 1rem; padding-bottom: 1.4rem; }
    .isis-ld__copy { align-items: center; }
    .isis-ld__nav { display: none; }
    .isis-ld-dash { max-width: 440px; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
    .isis-ld__word { transition: none; }
    .isis-ld-dash__kval, .isis-ld-dash__bars span { animation: none; transform: none; }
    .isis-ld-dash__donut .seg { animation: none; stroke-dashoffset: 38; }
    .isis-ld-dash__donut .seg2 { animation: none; stroke-dashoffset: 80; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   Logigramme animé « De l'AO au paiement » (route /logigramme, EmptyLayout).
   Autoplay : fenêtres modules + cascades système + bonshommes acteurs.
   Tout est namespacé .isis-lg-* ; construit par js/isis-logigramme.js.
   ═══════════════════════════════════════════════════════════════════════════ */
.isis-lg {
    --isis-warm: #f4a06a; --isis-lg-dur: 5s;
    height: 100vh; height: 100dvh; display: flex; flex-direction: column;
    padding: 1.6rem clamp(1rem, 4vw, 3rem) 1.2rem; color: #eaf2f4; -webkit-font-smoothing: antialiased;
    background:
        radial-gradient(120% 90% at 28% -10%, #1b515f 0%, transparent 55%),
        radial-gradient(90% 80% at 100% 110%, #123a45 0%, transparent 55%),
        linear-gradient(160deg, #0c2a33 0%, #091e25 100%);
    overflow: hidden;
}
.isis-lg__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.isis-lg__brand { display: flex; align-items: center; gap: .7rem; }
.isis-lg__mark { width: 34px; height: 34px; border-radius: 8px; background: linear-gradient(135deg, var(--isis-accent), var(--isis-accent-strong)); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: .85rem; color: #fff; box-shadow: 0 6px 18px -6px rgba(58, 144, 168, .6); }
.isis-lg__titles h1 { margin: 0; font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 600; letter-spacing: -.02em; }
.isis-lg__titles p { margin: .1rem 0 0; font-size: .82rem; color: rgba(234, 242, 244, .6); }
.isis-lg__phase { text-align: right; }
.isis-lg__phase-n { font-size: .75rem; letter-spacing: .14em; text-transform: uppercase; color: var(--isis-warm); font-weight: 600; }
.isis-lg__phase-t { font-size: clamp(1.1rem, 2.4vw, 1.7rem); font-weight: 600; letter-spacing: -.02em; }
.isis-lg__prog { display: flex; gap: 6px; margin-top: 1rem; }
.isis-lg-seg { flex: 1; height: 4px; border-radius: 3px; background: rgba(255, 255, 255, .10); overflow: hidden; position: relative; }
.isis-lg-seg.is-past { background: rgba(255, 255, 255, .32); }
.isis-lg-seg.is-current .isis-lg-seg__fill { position: absolute; inset: 0; background: var(--isis-warm); transform-origin: left; animation: isisLgSeg var(--isis-lg-dur) linear forwards; }
@keyframes isisLgSeg { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.isis-lg__stage { flex: 1; position: relative; min-height: 0; }
.isis-lg-scene { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: clamp(1rem, 2.5vh, 2rem); opacity: 0; visibility: hidden; }
.isis-lg-scene.is-active { opacity: 1; visibility: visible; }
.isis-lg-scene__main { position: relative; display: flex; align-items: center; justify-content: center; gap: 2.2rem; }
.isis-lg-win { width: clamp(280px, 38vw, 440px); border-radius: 14px; background: #fbfdfe; color: #1f2328; border: 1px solid rgba(255, 255, 255, .6); overflow: hidden; box-shadow: 0 40px 80px -28px rgba(0, 0, 0, .6), 0 0 0 1px rgba(255, 255, 255, .35); }
.isis-lg-scene.is-active .isis-lg-win { animation: isisLgWin .6s cubic-bezier(.16, 1, .3, 1) both; }
@keyframes isisLgWin { from { opacity: 0; transform: translateY(14px) scale(.94); } to { opacity: 1; transform: none; } }
.isis-lg-win__bar { display: flex; align-items: center; gap: .55rem; padding: .6rem .8rem; border-bottom: 1px solid #e3e6eb; background: color-mix(in srgb, var(--wc) 10%, #f6f7fa); }
.isis-lg-win__dot { width: 9px; height: 9px; border-radius: 50%; background: var(--wc); box-shadow: 0 0 0 3px color-mix(in srgb, var(--wc) 20%, transparent); }
.isis-lg-win__title { font-weight: 600; font-size: .9rem; }
.isis-lg-win__badge { margin-left: auto; font-size: .7rem; font-weight: 600; padding: .2rem .55rem; border-radius: 999px; background: color-mix(in srgb, var(--wc) 14%, #fff); color: color-mix(in srgb, var(--wc) 75%, #1f2328); border: 1px solid color-mix(in srgb, var(--wc) 30%, #e3e6eb); }
.isis-lg-win__body { padding: .9rem; display: flex; flex-direction: column; gap: .55rem; }
.isis-lg-win__row { display: grid; grid-template-columns: 10px 1fr 54px; gap: .5rem; align-items: center; }
.isis-lg-win__rd { width: 8px; height: 8px; border-radius: 50%; background: var(--rc, #cbd5e1); }
.isis-lg-win__rc { height: 9px; border-radius: 5px; background: linear-gradient(90deg, #e3e6eb, #eef1f4); }
.isis-lg-win__ra { height: 9px; border-radius: 5px; background: color-mix(in srgb, var(--wc) 22%, #e3e6eb); }
.isis-lg-scene.is-active .isis-lg-win__row { animation: isisLgRise .5s ease both; }
.isis-lg-win__row:nth-child(1) { animation-delay: .22s; }
.isis-lg-scene.is-active .isis-lg-win__row:nth-child(2) { animation-delay: .34s; }
.isis-lg-scene.is-active .isis-lg-win__row:nth-child(3) { animation-delay: .46s; }
@keyframes isisLgRise { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
.isis-lg-cascade { display: flex; flex-direction: column; align-items: center; gap: .4rem; color: var(--isis-warm); }
.isis-lg-cascade__disc { width: 64px; height: 64px; border-radius: 18px; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--isis-warm) 16%, transparent); border: 1px solid color-mix(in srgb, var(--isis-warm) 45%, transparent); }
.isis-lg-cascade__disc .material-symbols-outlined { font-size: 34px; }
.isis-lg-scene.is-active .isis-lg-cascade__disc { animation: isisLgFire .6s cubic-bezier(.16, 1, .3, 1) both, isisLgPulse 1.8s ease-in-out .6s infinite; }
@keyframes isisLgFire { from { opacity: 0; transform: scale(.4); } to { opacity: 1; transform: scale(1); } }
@keyframes isisLgPulse { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--isis-warm) 30%, transparent); } 50% { box-shadow: 0 0 0 14px color-mix(in srgb, var(--isis-warm) 0%, transparent); } }
.isis-lg-cascade__lbl { font-size: .72rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; }
.isis-lg-chips { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; justify-content: center; }
.isis-lg-chip { font-size: .72rem; font-weight: 600; letter-spacing: .04em; padding: .28rem .6rem; border-radius: 999px; background: rgba(255, 255, 255, .07); border: 1px solid rgba(255, 255, 255, .16); color: rgba(234, 242, 244, .75); opacity: 0; }
.isis-lg-chip .material-symbols-outlined { font-size: 13px; vertical-align: -2px; margin-right: 1px; }
.isis-lg-chip.is-final { background: color-mix(in srgb, var(--isis-warm) 22%, transparent); border-color: color-mix(in srgb, var(--isis-warm) 55%, transparent); color: #fff; }
.isis-lg-chip-arrow { color: rgba(234, 242, 244, .4); font-size: .8rem; opacity: 0; }
.isis-lg-scene.is-active .isis-lg-chips > * { animation: isisLgChip .4s ease both; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(1) { animation-delay: .55s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(2) { animation-delay: .68s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(3) { animation-delay: .80s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(4) { animation-delay: .92s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(5) { animation-delay: 1.04s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(6) { animation-delay: 1.16s; }
.isis-lg-scene.is-active .isis-lg-chips > *:nth-child(7) { animation-delay: 1.28s; }
@keyframes isisLgChip { to { opacity: 1; } }
.isis-lg-actors { position: relative; display: flex; align-items: flex-end; justify-content: center; gap: clamp(2rem, 7vw, 5rem); min-height: 96px; }
.isis-lg-actor { display: flex; flex-direction: column; align-items: center; gap: .45rem; width: 88px; }
.isis-lg-actor__svg { width: 42px; height: 50px; filter: drop-shadow(0 6px 14px color-mix(in srgb, var(--ac) 45%, transparent)); }
.isis-lg-actor__svg circle, .isis-lg-actor__svg path { fill: var(--ac); }
.isis-lg-actor__label { font-size: .74rem; font-weight: 500; color: rgba(234, 242, 244, .85); white-space: nowrap; }
.isis-lg-scene.is-active .isis-lg-actor { animation: isisLgActor .5s cubic-bezier(.16, 1, .3, 1) both; }
.isis-lg-scene.is-active .isis-lg-actor:nth-child(2) { animation-delay: .12s; }
.isis-lg-scene.is-active .isis-lg-actor:nth-child(3) { animation-delay: .24s; }
@keyframes isisLgActor { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
.isis-lg-dossier { position: absolute; top: 6px; left: 12%; width: 30px; height: 30px; border-radius: 8px; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--isis-warm) 90%, #fff); color: #5a2a12; box-shadow: 0 8px 18px -6px rgba(244, 160, 106, .7); opacity: 0; }
.isis-lg-dossier .material-symbols-outlined { font-size: 18px; }
.isis-lg-scene.is-active .isis-lg-dossier { animation: isisLgTravel 2.6s cubic-bezier(.65, 0, .35, 1) 1s both; }
@keyframes isisLgTravel { 0% { opacity: 0; left: 12%; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { opacity: 1; left: calc(100% - 12% - 30px); } }
.isis-lg-caption { max-width: 42rem; text-align: center; font-size: clamp(.95rem, 1.8vw, 1.15rem); color: rgba(234, 242, 244, .9); line-height: 1.5; min-height: 2.6em; }
.isis-lg-caption b { color: #fff; font-weight: 600; }
.isis-lg-sod { display: inline-flex; align-items: center; gap: .4rem; font-size: .76rem; color: var(--isis-warm); background: color-mix(in srgb, var(--isis-warm) 12%, transparent); border: 1px solid color-mix(in srgb, var(--isis-warm) 35%, transparent); padding: .25rem .6rem; border-radius: 999px; }
.isis-lg-sod .material-symbols-outlined { font-size: 15px; }
.isis-lg__ctrl { display: flex; align-items: center; justify-content: center; gap: 1rem; margin-top: .6rem; }
.isis-lg__btn { width: 40px; height: 40px; border-radius: 50%; border: 1px solid rgba(255, 255, 255, .2); background: rgba(255, 255, 255, .06); color: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; }
.isis-lg__btn:hover { background: rgba(255, 255, 255, .12); }
.isis-lg__dots { display: flex; gap: 8px; }
.isis-lg-dot { width: 9px; height: 9px; border-radius: 50%; background: rgba(255, 255, 255, .18); border: 0; cursor: pointer; padding: 0; }
.isis-lg-dot.is-on { background: var(--isis-warm); transform: scale(1.2); }
@media (max-width: 680px) {
    .isis-lg-scene__main { flex-direction: column; gap: 1.2rem; }
    .isis-lg-actors { gap: 1.6rem; }
    .isis-lg__head { align-items: flex-start; }
}
@media (prefers-reduced-motion: reduce) {
    .isis-lg-scene.is-active * { animation-duration: .01ms !important; }
    .isis-lg-seg.is-current .isis-lg-seg__fill { animation: none; transform: scaleX(1); }
}

/* ─── CGV admin page (/gescom/parametres/cgv) — chantier CGV-in-Gescom 2026-05-29 ─── */

/* Grille master : 4 colonnes (état / entreprise / CGV active / versions). */
.isis-grid--cgv .isis-grid__head,
.isis-grid--cgv .isis-grid__row {
    grid-template-columns: 32px minmax(220px, 1.6fr) minmax(200px, 1.4fr) 130px;
    min-width: 720px;
}

/* Sidepanel : carte historique CGV par entreprise sélectionnée. */
.isis-cgv-versions {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.isis-cgv-version {
    border: 1px solid var(--isis-border-soft, #e5e7eb);
    border-left: 3px solid var(--isis-border-soft, #e5e7eb);
    border-radius: 6px;
    padding: 0.75rem 0.9rem;
    background: var(--isis-surface);
    transition: background 120ms ease;
}

.isis-cgv-version.is-active {
    border-left-color: var(--isis-success, #16a34a);
    background: color-mix(in srgb, var(--isis-success, #16a34a) 4%, var(--isis-surface));
}

.isis-cgv-version.is-draft {
    border-left-color: var(--isis-warning, #f59e0b);
    background: color-mix(in srgb, var(--isis-warning, #f59e0b) 4%, var(--isis-surface));
}

.isis-cgv-version.is-archived {
    opacity: 0.78;
}

.isis-cgv-version__head {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.4rem;
}

.isis-cgv-version__badge {
    display: inline-block;
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    padding: 0.12rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    flex-shrink: 0;
}

.isis-cgv-version.is-active .isis-cgv-version__badge {
    background: color-mix(in srgb, var(--isis-success, #16a34a) 18%, var(--isis-surface));
    color: var(--isis-success, #16a34a);
}

.isis-cgv-version.is-draft .isis-cgv-version__badge {
    background: color-mix(in srgb, var(--isis-warning, #f59e0b) 18%, var(--isis-surface));
    color: var(--isis-warning, #f59e0b);
}

.isis-cgv-version__label {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--isis-text);
}

.isis-cgv-version__meta {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    margin-bottom: 0.18rem;
}

.isis-cgv-version__notes {
    font-size: 0.78rem;
    color: var(--isis-text);
    font-style: italic;
    background: var(--isis-surface-alt);
    border-radius: 4px;
    padding: 0.35rem 0.5rem;
    margin: 0.4rem 0;
}

.isis-cgv-version__actions {
    display: flex;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-top: 0.5rem;
}

/* ============================================================================
   Gesmat — Gestion prédictive (plan prévisionnel + santé du parc)
   ============================================================================ */
.isis-kpi-card__unit {
    font-size: 0.6em;
    font-weight: 500;
    color: var(--isis-text-muted);
    margin-left: 0.15rem;
}

.isis-prev-grid {
    display: flex;
    flex-direction: column;
    gap: 0;
    flex: 1 1 auto;
    min-height: 0;
}
/* Zone principale scrollable : Plan de charge (+ Répartition) occupent le reste de la page. */
.isis-prev-main {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    padding-bottom: 0.5rem;
}
.isis-rich-section--fill {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}
.isis-rich-section--fill > .isis-prev-plan,
.isis-rich-section--fill > .isis-prev-cal {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}
/* Budget de maintenance : footer collé en bas, séparé de la zone principale. */
.isis-prev-footer {
    flex: 0 0 auto;
    border-top: 1px solid var(--isis-border);
    padding-top: 0.85rem;
    margin-top: 0.25rem;
    background: var(--isis-surface);
}

/* Plan de charge mensuel (barres proportionnelles) */
.isis-prev-plan {
    display: flex;
    flex-direction: column;
    gap: 2px;
    margin-top: 0.5rem;
}
.isis-prev-plan__row {
    display: grid;
    grid-template-columns: 110px 1fr 48px 110px;
    align-items: center;
    gap: 0.75rem;
    padding: 0.3rem 0.5rem;
    border-radius: 6px;
}
.isis-prev-plan__row:hover { background: var(--isis-surface-alt); }
.isis-prev-plan__row.is-overdue {
    background: color-mix(in srgb, var(--isis-danger) 7%, var(--isis-surface));
}
.isis-prev-plan__month {
    font-size: 0.82rem;
    font-weight: 500;
    color: var(--isis-text);
    white-space: nowrap;
}
.isis-prev-plan__row.is-overdue .isis-prev-plan__month {
    color: var(--isis-danger);
    font-weight: 600;
}
.isis-prev-plan__bar-wrap {
    display: flex;
    align-items: center;
    gap: 3px;
    min-height: 16px;
}
.isis-prev-plan__bar {
    height: 14px;
    border-radius: 3px;
    min-width: 0;
    transition: width 0.2s ease;
}
.isis-prev-plan__bar.is-ext { background: var(--isis-accent); }
.isis-prev-plan__bar.is-int { background: color-mix(in srgb, var(--isis-mod-gesmat) 70%, var(--isis-accent)); }
.isis-prev-plan__count {
    font-size: 0.82rem;
    font-weight: 600;
    text-align: right;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
}
.isis-prev-plan__cost {
    font-size: 0.78rem;
    text-align: right;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text-muted);
}

.isis-prev-legend {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 1rem;
    margin-top: 0.75rem;
    font-size: 0.78rem;
    color: var(--isis-text-muted);
}
.isis-prev-legend__item { display: inline-flex; align-items: center; gap: 0.35rem; }
.isis-prev-legend__swatch { width: 14px; height: 14px; border-radius: 3px; display: inline-block; }
.isis-prev-legend__swatch.is-ext { background: var(--isis-accent); }
.isis-prev-legend__swatch.is-int { background: color-mix(in srgb, var(--isis-mod-gesmat) 70%, var(--isis-accent)); }
.isis-prev-legend__note { font-style: italic; opacity: 0.85; }

.isis-grid--prev-renouv .isis-grid__head,
.isis-grid--prev-renouv .isis-grid__row,
.isis-grid--prev-renouv .isis-grid__foot {
    grid-template-columns: 1fr 200px 160px 60px;
}

/* Santé du parc (indice de risque) */
.isis-grid--sante .isis-grid__head,
.isis-grid--sante .isis-grid__row {
    grid-template-columns: 60px 1fr 90px 1.4fr 60px;
}
.isis-sante-score {
    display: inline-flex;
    align-items: baseline;
    gap: 2px;
    font-variant-numeric: tabular-nums;
    font-weight: 700;
    font-size: 1.05rem;
}
.isis-sante-score.is-high { color: var(--isis-danger); }
.isis-sante-score.is-mid { color: var(--isis-warning); }
.isis-sante-score.is-low { color: var(--isis-text-muted); }
.isis-sante-bar {
    position: relative;
    height: 8px;
    border-radius: 4px;
    background: var(--isis-surface-alt);
    overflow: hidden;
    min-width: 60px;
}
.isis-sante-bar__fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 4px; }
.isis-sante-bar__fill.is-high { background: var(--isis-danger); }
.isis-sante-bar__fill.is-mid { background: var(--isis-warning); }
.isis-sante-bar__fill.is-low { background: var(--isis-success); }
.isis-sante-factors {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
}
.isis-sante-factor {
    font-size: 0.72rem;
    padding: 0.1rem 0.4rem;
    border-radius: 10px;
    background: var(--isis-surface-alt);
    color: var(--isis-text-muted);
    white-space: nowrap;
}
.isis-sante-factor.is-alert {
    background: color-mix(in srgb, var(--isis-danger) 12%, var(--isis-surface));
    color: var(--isis-danger);
}

/* Gesmat prévisionnel — vue calendrier */
.isis-prev-cal { margin-top: 0.5rem; }
.isis-prev-cal__nav {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    margin-bottom: 0.6rem;
}
.isis-prev-cal__title {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    min-width: 160px;
    text-align: center;
}
.isis-prev-cal__grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 4px;
}
.isis-prev-cal__dow {
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    text-align: center;
    padding: 0.2rem 0;
}
.isis-prev-cal__cell {
    min-height: 78px;
    border: 1px solid var(--isis-border);
    border-radius: 6px;
    padding: 0.25rem;
    background: var(--isis-surface);
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.isis-prev-cal__cell.is-empty { background: transparent; border: none; }
.isis-prev-cal__cell.is-today { border-color: var(--isis-accent); box-shadow: inset 0 0 0 1px var(--isis-accent); }
.isis-prev-cal__cell.has-events { background: var(--isis-surface-alt); }
.isis-prev-cal__daynum {
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    text-align: right;
}
.isis-prev-cal__cell.is-today .isis-prev-cal__daynum { color: var(--isis-accent); }
.isis-prev-cal__evt {
    /* <button> depuis l'audit 2026-05-30 (accès clavier) — reset des défauts bouton */
    display: block;
    width: 100%;
    border: 0;
    margin: 0;
    text-align: left;
    font-family: inherit;
    font-size: 0.68rem;
    font-weight: 600;
    padding: 0.05rem 0.3rem;
    border-radius: 3px;
    color: #fff;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.isis-prev-cal__evt:focus-visible { outline: 2px solid var(--isis-accent); outline-offset: 1px; }
.isis-prev-cal__evt.is-ext { background: var(--isis-accent); }
.isis-prev-cal__evt.is-int { background: color-mix(in srgb, var(--isis-mod-gesmat) 70%, var(--isis-accent)); }
.isis-prev-cal__more {
    font-size: 0.66rem;
    color: var(--isis-text-muted);
    text-align: center;
}

/* Gesmat prévisionnel — cartes budget maintenance */
.isis-prev-budget {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 0.75rem;
    margin-top: 0.5rem;
}
.isis-prev-budget__card {
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    padding: 0.75rem 0.9rem;
    background: var(--isis-surface);
}
.isis-prev-budget__card.is-total { background: var(--isis-surface-alt); }
.isis-prev-budget__label {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
}
.isis-prev-budget__value {
    font-size: 1.4rem;
    font-weight: 700;
    color: var(--isis-text);
    margin-top: 0.3rem;
    font-variant-numeric: tabular-nums;
}
.isis-prev-budget__sub {
    font-size: 0.74rem;
    color: var(--isis-text-muted);
    margin-top: 0.15rem;
}

/* Gesmat prévisionnel — répartition analytique par segment */
.isis-grid--prev-seg .isis-grid__head,
.isis-grid--prev-seg .isis-grid__row {
    grid-template-columns: 1.6fr 100px 90px 120px 120px 1.4fr 80px;
}
.isis-prev-seg__bar-cell {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-width: 0;
}
.isis-prev-seg__bar {
    height: 10px;
    border-radius: 3px;
    background: color-mix(in srgb, var(--isis-mod-gesmat) 70%, var(--isis-accent));
    flex: 0 0 auto;
    min-width: 2%;
    max-width: 60%;
}
.isis-prev-seg__bar-label {
    font-size: 0.78rem;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    white-space: nowrap;
}

/* Gesmat prévisionnel — liste « À traiter » + compteur de section */
.isis-rich-section__count {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    margin-left: 0.5rem;
}
.isis-grid--prev-treat .isis-grid__head,
.isis-grid--prev-treat .isis-grid__row {
    grid-template-columns: 1.8fr 160px 220px 140px 60px;
}

/* Gesmat — grille équipements (10 colonnes : statut / code / libellé / type / marque-modèle / entreprise / service / utilisateur / anomalie / actions) */
.isis-grid--equipement .isis-grid__head,
.isis-grid--equipement .isis-grid__row {
    grid-template-columns: 32px 115px minmax(150px, 1.2fr) 125px minmax(130px, 1fr) 130px 140px 140px minmax(150px, 0.9fr) 96px;
    min-width: 1300px;
}

/* Gespark — grille parc auto (7 colonnes : statut / immatriculation+code / marque-modèle+type /
   énergie / kilométrage / entreprise / actions). Identifiant primaire = immatriculation
   (le code VH-NNN devient sous-libellé). Libellé synthétisé retiré (redondant). */
.isis-grid--gespark-vehicule .isis-grid__head,
.isis-grid--gespark-vehicule .isis-grid__row {
    grid-template-columns: 32px minmax(140px, 1fr) minmax(160px, 1.3fr) 120px 110px minmax(140px, 1fr) 96px;
    min-width: 1000px;
}
.isis-grid--gespark-vehicule .isis-grid__col-km {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* Gespark — réservations (6 colonnes : statut / véhicule / demandeur / créneau / motif / actions) */
.isis-grid--gespark-reservation .isis-grid__head,
.isis-grid--gespark-reservation .isis-grid__row {
    grid-template-columns: 110px minmax(160px, 1.3fr) minmax(130px, 1fr) 230px minmax(140px, 1fr) 120px;
    min-width: 1000px;
}
.isis-grid--gespark-reservation .isis-grid__col-period { font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Gespark — référentiels du parc auto (page admin Types/Catégories/Modèles = 6 cols, Marques = 3 cols).
   Clone du layout gesmat-ref (les classes gespark-ref n'avaient aucune règle → grille mal présentée). */
.isis-grid--gespark-ref .isis-grid__head,
.isis-grid--gespark-ref .isis-grid__row {
    grid-template-columns: minmax(220px, 2fr) minmax(160px, 1fr) minmax(140px, 1fr) 90px 100px 90px;
    min-width: 880px;
}
.isis-grid--gespark-ref-3col .isis-grid__head,
.isis-grid--gespark-ref-3col .isis-grid__row {
    grid-template-columns: minmax(280px, 2fr) 160px 90px;
    min-width: 540px;
}

/* Gespark — chips du calendrier de réservations (tint clair + accent gauche par statut) */
.isis-resa-chip {
    display: inline-flex; align-items: center; max-width: 100%;
    padding: 1px 5px; border-radius: 4px;
    font-size: 0.62rem; font-weight: 700; line-height: 1.4;
    color: var(--isis-text); background: var(--isis-surface-alt);
    border-left: 3px solid var(--isis-text-muted);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.isis-resa-chip.is-pending { border-left-color: var(--isis-warning); background: color-mix(in srgb, var(--isis-warning) 14%, var(--isis-surface)); }
.isis-resa-chip.is-ok      { border-left-color: var(--isis-success); background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface)); }
.isis-resa-chip.is-danger  { border-left-color: var(--isis-danger);  background: color-mix(in srgb, var(--isis-danger) 14%, var(--isis-surface)); }
.isis-resa-chip.is-info    { border-left-color: var(--isis-accent);   background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface)); }
.isis-resa-chip.is-draft   { border-left-color: var(--isis-text-muted); }
.isis-resa-chip.is-overflow { font-weight: 600; color: var(--isis-text-muted); border-left-color: transparent; background: transparent; }

/* Gespark — calendrier de réservations à BARRES CONTINUES (multi-jours = une seule barre) */
.isis-resa-cal {
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    background: var(--isis-surface);
    /* Occupe toute la hauteur restante de la rich-page (flex parent height:100%). */
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
}
.isis-resa-cal__head {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    background: var(--isis-surface-alt);
    border-bottom: 1px solid var(--isis-border);
    flex-shrink: 0;
    position: sticky;
    top: 0;
    z-index: 2;
}
.isis-resa-cal__head-cell {
    padding: 0.4rem 0.5rem;
    font-size: 0.72rem; font-weight: 700; text-transform: uppercase;
    letter-spacing: 0.03em; color: var(--isis-text-muted);
}
.isis-resa-week {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    position: relative;
    /* Les semaines se répartissent l'espace vertical (le calendrier remplit la page).
       min-height auto respecte le contenu (numéro + lanes) sans l'écraser. */
    flex: 1 1 0;
}
.isis-resa-week__day {
    border-right: 1px solid var(--isis-border-soft, var(--isis-border));
    border-bottom: 1px solid var(--isis-border-soft, var(--isis-border));
    padding: 2px 4px;
    min-width: 0;
}
.isis-resa-week__day:nth-child(7n) { border-right: none; }
.isis-resa-week__day.is-out { background: color-mix(in srgb, var(--isis-text-muted) 6%, var(--isis-surface)); }
.isis-resa-week__day.is-today { background: color-mix(in srgb, var(--isis-current-mod, var(--isis-accent)) 8%, var(--isis-surface)); }
.isis-resa-week__num { font-size: 0.72rem; font-weight: 600; color: var(--isis-text-muted); }
.isis-resa-week__day.is-today .isis-resa-week__num { color: var(--isis-current-mod, var(--isis-accent)); font-weight: 700; }

.isis-resa-bar {
    z-index: 1;
    align-self: center;
    margin: 0 2px;
    padding: 1px 6px;
    border-radius: 4px;
    font-size: 0.66rem; font-weight: 600; line-height: 1.5;
    color: var(--isis-text);
    background: var(--isis-surface-alt);
    border-left: 3px solid var(--isis-text-muted);
    overflow: hidden;
    cursor: default;
}
.isis-resa-bar__label { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-resa-bar.is-pending { border-left-color: var(--isis-warning); background: color-mix(in srgb, var(--isis-warning) 16%, var(--isis-surface)); }
.isis-resa-bar.is-ok      { border-left-color: var(--isis-success); background: color-mix(in srgb, var(--isis-success) 16%, var(--isis-surface)); }
.isis-resa-bar.is-danger  { border-left-color: var(--isis-danger);  background: color-mix(in srgb, var(--isis-danger) 16%, var(--isis-surface)); }
.isis-resa-bar.is-info    { border-left-color: var(--isis-accent);   background: color-mix(in srgb, var(--isis-accent) 14%, var(--isis-surface)); }
.isis-resa-bar.is-draft   { border-left-color: var(--isis-text-muted); }
/* Continuation : bord plat du côté où la réservation déborde de la semaine */
.isis-resa-bar.is-cont-left  { border-top-left-radius: 0; border-bottom-left-radius: 0; border-left-width: 0; margin-left: 0; }
.isis-resa-bar.is-cont-right { border-top-right-radius: 0; border-bottom-right-radius: 0; margin-right: 0; }

/* Gespark dashboards V2 — utilitaires (audit ui-ux 2026-06-01 : sortir les styles inline). */
.isis-page-note { color: var(--isis-text-muted); font-size: 0.8rem; margin-top: 0.75rem; }
.isis-stats-grid-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.isis-calc-card { max-width: 640px; }
.isis-calc-amount { font-size: 1.2rem; font-weight: 600; }
.isis-calc-hint { color: var(--isis-text-muted); font-size: 0.85rem; }
@media (max-width: 720px) { .isis-stats-grid-2col { grid-template-columns: 1fr; } }

/* Gesproj — encours de production (7 cols : commande / avancement / vendu / produit / facturé / encours / reste). */
.isis-grid--gesproj-encours .isis-grid__head,
.isis-grid--gesproj-encours .isis-grid__row {
    grid-template-columns: minmax(200px, 1.6fr) 110px 130px 130px 130px 130px 140px;
    min-width: 1080px;
}

/* Gespark — historique conducteur (6 colonnes : conducteur / type / du / au / notes / actions) */
.isis-grid--gespark-affectation .isis-grid__head,
.isis-grid--gespark-affectation .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) 120px 110px 110px minmax(140px, 1fr) 60px;
    min-width: 860px;
}

/* Gespark — relevés kilométriques (5 colonnes : date / km / source / notes / actions) */
.isis-grid--gespark-releve .isis-grid__head,
.isis-grid--gespark-releve .isis-grid__row {
    grid-template-columns: 120px 140px 150px minmax(160px, 1fr) 60px;
    min-width: 740px;
}
.isis-grid--gespark-releve .isis-grid__col-km,
.isis-grid--gespark-reparation .isis-grid__col-km,
.isis-grid--gespark-carburant .isis-grid__col-km,
.isis-grid--gespark-sinistre .isis-grid__col-km,
.isis-grid--gespark-contravention .isis-grid__col-km {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* Gespark — entretien (7 col : date / type / garage / km / coût / description / actions) */
.isis-grid--gespark-reparation .isis-grid__head,
.isis-grid--gespark-reparation .isis-grid__row {
    grid-template-columns: 110px 120px minmax(140px, 1fr) 90px 110px minmax(160px, 1.2fr) 60px;
    min-width: 920px;
}

/* Gespark — carburant (8 col : date / type / quantité / montant / km / station / payé par / actions) */
.isis-grid--gespark-carburant .isis-grid__head,
.isis-grid--gespark-carburant .isis-grid__row {
    grid-template-columns: 110px 120px 110px 110px 90px minmax(130px, 1fr) 120px 60px;
    min-width: 960px;
}

/* Gespark — sinistres (8 col : date / type / conducteur / lieu / resp / coût / statut / actions) */
.isis-grid--gespark-sinistre .isis-grid__head,
.isis-grid--gespark-sinistre .isis-grid__row {
    grid-template-columns: 110px 120px minmax(140px, 1fr) minmax(120px, 1fr) 80px 110px 110px 60px;
    min-width: 980px;
}

/* Gespark — contraventions (8 col : date / type / conducteur / montant / points / payé par / statut / actions) */
.isis-grid--gespark-contravention .isis-grid__head,
.isis-grid--gespark-contravention .isis-grid__row {
    grid-template-columns: 110px 140px minmax(140px, 1fr) 110px 80px 120px 110px 60px;
    min-width: 980px;
}

/* Gespark — échéancier flotte (7 col : statut / véhicule / échéance / organisme / expire / reste / actions) */
.isis-grid--gespark-echeancier .isis-grid__head,
.isis-grid--gespark-echeancier .isis-grid__row {
    grid-template-columns: 32px minmax(150px, 1.2fr) 150px minmax(130px, 1fr) 110px 110px 60px;
    min-width: 920px;
}
.isis-grid--gespark-echeancier .isis-grid__col-km { text-align: right; font-variant-numeric: tabular-nums; }
.isis-grid__col-km.is-danger-text { color: var(--isis-danger); font-weight: 600; }
.isis-grid__col-km.is-warning-text { color: var(--isis-warning); font-weight: 600; }

/* Gespark — responsables flotte (4 col : entreprise / responsable / depuis / actions) */
.isis-grid--gespark-responsable .isis-grid__head,
.isis-grid--gespark-responsable .isis-grid__row,
.isis-grid--gesmat-responsable .isis-grid__head,
.isis-grid--gesmat-responsable .isis-grid__row,
.isis-grid--gesinfo-responsable .isis-grid__head,
.isis-grid--gesinfo-responsable .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) minmax(180px, 1.4fr) 120px 100px;
    min-width: 680px;
}

/* MonEspace — Mes véhicules (cartes conducteur) */
.isis-mes-vehicules { display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: 1rem; }
.isis-mes-vehicule-card__head { display: flex; align-items: center; gap: 0.75rem; }
.isis-mes-vehicule-card__head > div:first-of-type { flex: 1 1 auto; min-width: 0; }
.isis-mes-vehicule-card__km { text-align: right; white-space: nowrap; }
.isis-mes-vehicule-card__echeances { display: flex; flex-wrap: wrap; gap: 0.4rem; margin: 0.75rem 0; }
.isis-mes-vehicule-card__actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.5rem; }

/* Gespark — aperçu inline d'un document dans le sidepanel (calque /ged/documents) */
.isis-doc-preview {
    height: 250px; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 6px);
    overflow: hidden; background: var(--isis-surface);
}
.isis-doc-preview > * { height: 100%; }
.isis-doc-preview__pending {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 0.4rem; height: 100%; padding: 1rem; text-align: center; color: var(--isis-text-muted);
}
.isis-doc-preview__chips { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.5rem; }
.isis-gesmaff-side__doc-name { font-size: 0.8rem; font-weight: 600; margin: 0.4rem 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Gespark — miniatures de justificatifs (sidepanel échéancier) */
.isis-justif-thumbs { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.isis-justif-thumb {
    display: flex; flex-direction: column; align-items: center; gap: 0.25rem;
    width: 96px; padding: 0.4rem; border: 1px solid var(--isis-border); border-radius: 8px;
    background: var(--isis-surface); cursor: pointer; text-align: center;
}
.isis-justif-thumb:hover { border-color: var(--isis-current-mod, var(--isis-accent)); box-shadow: var(--isis-elevation-1); }
.isis-justif-thumb:focus-visible { outline: 2px solid var(--isis-accent); outline-offset: 2px; }
.isis-justif-thumb img { width: 100%; height: 64px; object-fit: cover; border-radius: 4px; }
.isis-justif-thumb__icon { display: flex; align-items: center; justify-content: center; height: 64px; width: 100%; color: var(--isis-text-muted); }
.isis-justif-thumb__icon .rzi { font-size: 36px; }
.isis-justif-thumb__name { font-size: 0.7rem; color: var(--isis-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }

/* Gespark — sidepanel « Vie actuelle » du véhicule */
.isis-gesmaff-side__section-title {
    font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--isis-text-muted); margin: 1rem 0 0.4rem; padding-top: 0.6rem;
    border-top: 1px solid var(--isis-border);
}
.isis-gesmaff-side__live-loading {
    display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; color: var(--isis-text-muted); padding: 0.3rem 0;
}

/* Gespark — contrats de financement (7 col : type / loueur / période / loyer / km / statut / actions) */
.isis-grid--gespark-contrat .isis-grid__head,
.isis-grid--gespark-contrat .isis-grid__row {
    grid-template-columns: 110px minmax(140px, 1fr) 180px 120px 110px 100px 80px;
    min-width: 900px;
}
.isis-grid--gespark-contrat .isis-grid__col-km { text-align: right; font-variant-numeric: tabular-nums; }

/* Gespark — TCO flotte (6 col : véhicule / total / km / coût/km / devise / actions) */
.isis-grid--gespark-tco .isis-grid__head,
.isis-grid--gespark-tco .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) 140px 110px 120px 90px 60px;
    min-width: 760px;
}
.isis-grid--gespark-tco .isis-grid__col-km { text-align: right; font-variant-numeric: tabular-nums; }

/* Gespark — renouvellement (7 col : véhicule / fin contrat / âge / km / coût/km / signal / actions) */
.isis-grid--gespark-renouv .isis-grid__head,
.isis-grid--gespark-renouv .isis-grid__row {
    grid-template-columns: minmax(170px, 1.3fr) 120px 90px 110px 110px minmax(140px, 1fr) 60px;
    min-width: 920px;
}
.isis-grid--gespark-renouv .isis-grid__col-km { text-align: right; font-variant-numeric: tabular-nums; }

/* Gespark — cartes carburant (6 col : fournisseur / numéro / véhicule / plafond / statut / actions) */
.isis-grid--gespark-carte .isis-grid__head,
.isis-grid--gespark-carte .isis-grid__row {
    grid-template-columns: minmax(150px, 1.2fr) 140px minmax(140px, 1fr) 120px 100px 90px;
    min-width: 800px;
}
.isis-grid--gespark-carte .isis-grid__col-km { text-align: right; font-variant-numeric: tabular-nums; }

/* Catalogue logiciels métier (gesmat S2) : status / nom / éditeur / catégorie / version / licence / support / actions */
.isis-grid--logiciel .isis-grid__head,
.isis-grid--logiciel .isis-grid__row {
    grid-template-columns: 32px minmax(180px, 1.4fr) minmax(140px, 1fr) minmax(130px, 0.9fr) 90px 120px 90px 110px;
    min-width: 1020px;
}

/* Licences logiciel (gesmat S3) : status / matricule / logiciel / type / sièges / échéance / coût / actions */
.isis-grid--licence .isis-grid__head,
.isis-grid--licence .isis-grid__row {
    grid-template-columns: 32px 140px minmax(160px, 1.3fr) 120px 90px 110px 120px 110px;
    min-width: 1060px;
}

/* Parc logiciel par machine (gesinfo, ITAM niveau 3 polymorphe) :
   logiciel / poste / collaborateur / version / date / conformité / statut / actions */
.isis-grid--parc-logiciel .isis-grid__head,
.isis-grid--parc-logiciel .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) 130px minmax(170px, 1fr) 90px 110px 120px 110px 80px;
    min-width: 1050px;
}

/* Hub déploiement — onglet « Sièges de licence » */
.isis-grid--seat-tracking .isis-grid__head,
.isis-grid--seat-tracking .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) 130px 120px 90px 110px 90px minmax(160px, 1fr);
    min-width: 980px;
}

/* Parc auto — échéances réglementaires véhicule (onglet fiche véhicule) */
.isis-grid--gespark-echeance .isis-grid__head,
.isis-grid--gespark-echeance .isis-grid__row {
    grid-template-columns: minmax(150px, 1fr) 150px 110px minmax(140px, 1fr) 130px 110px 70px;
    min-width: 900px;
}
.isis-seat-bar {
    height: 6px;
    background: var(--isis-surface-alt);
    border-radius: 3px;
    overflow: hidden;
    margin-bottom: 2px;
}
.isis-seat-bar__fill {
    height: 100%;
    background: var(--isis-mod-gesinfo);
    border-radius: 3px;
    transition: width .2s ease;
}
.isis-seat-bar__fill.is-warning { background: var(--isis-warning); }
.isis-seat-bar__fill.is-danger  { background: var(--isis-danger); }

/* Hub déploiement — liste des déploiements dans le sidepanel licence */
.isis-side-deploy-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .35rem; }
.isis-side-deploy-list__item {
    display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    padding: .4rem .55rem; background: var(--isis-surface-alt); border-radius: 6px;
}
.isis-side-deploy-list__info { display: flex; flex-direction: column; gap: .1rem; min-width: 0; }
.isis-side-deploy-list__machine { font-weight: 600; font-size: .85rem; }

/* Dialog de déploiement — 2 colonnes : formulaire (gauche) + diagnostic machine (droite) */
.isis-deploy-dialog {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(380px, 430px);
    gap: 1.25rem;
    align-items: start;
}
.isis-deploy-dialog__form { min-width: 0; }
.isis-deploy-dialog__diag {
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    padding: 0.85rem;
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
}
.isis-deploy-diag__empty {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: .5rem; text-align: center; color: var(--isis-text-soft); padding: 1.5rem .5rem; min-height: 200px;
}
.isis-deploy-diag__head { border-bottom: 1px solid var(--isis-border); padding-bottom: .5rem; }
.isis-deploy-diag__title { font-weight: 600; font-size: .95rem; }
.isis-deploy-diag__sub { font-size: .78rem; color: var(--isis-text-muted); }
.isis-deploy-diag__block-title {
    font-size: .76rem; font-weight: 600; text-transform: uppercase; letter-spacing: .03em;
    color: var(--isis-text-muted); display: flex; align-items: center; gap: .3rem; margin-bottom: .35rem;
}
.isis-deploy-diag__block-title .rz-icon,
.isis-deploy-diag__block-title .notranslate { font-size: 15px; }
.isis-deploy-diag__sw { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .3rem; }
.isis-deploy-diag__sw li { display: flex; justify-content: space-between; gap: .5rem; align-items: baseline; }
.isis-deploy-diag__sw-name { font-size: .85rem; }
@media (max-width: 760px) {
    .isis-deploy-dialog { grid-template-columns: 1fr; }
}

/* Logiciels installés sur une machine (onglet fiche équipement gesinfo) :
   statut / logiciel / licence / version / installé le / conformité / actions */
.isis-grid--machine-soft .isis-grid__head,
.isis-grid--machine-soft .isis-grid__row {
    grid-template-columns: 110px minmax(180px, 1.5fr) 120px 100px 110px 120px 70px;
    min-width: 850px;
}

/* Pastilles de légende de la carte des affaires (Gesmaff) — couleurs des couches
   Leaflet (AO / marché / demande). Centralisées ici (plus d'hex inline en .razor) ;
   synchronisées avec affaires-map.js. */
.isis-chip__dot--carte-ao       { background: #d97706; }
.isis-chip__dot--carte-marche   { background: #92400e; }
.isis-chip__dot--carte-demande  { background: #3b82f6; }

/* Bannière « coût total réel » (AffaireRealCostBlock) — gradient module tokenisé
   (gesst → gesproj), conforme DESIGN.md (gradient module via isis-theme.css). */
.isis-cost-total-banner {
    margin-top: 1rem;
    padding: 0.9rem;
    border-radius: 8px;
    border: 1px solid var(--isis-border);
    background: linear-gradient(90deg,
        color-mix(in srgb, var(--isis-mod-gesst) 6%, var(--isis-surface)),
        color-mix(in srgb, var(--isis-mod-gesproj) 6%, var(--isis-surface)));
}

/* Dashboard SAM/FinOps (gesmat S5) */
.isis-grid--sam-echeance .isis-grid__head,
.isis-grid--sam-echeance .isis-grid__row {
    grid-template-columns: 90px 140px minmax(160px, 1.4fr) 150px 110px 120px;
    min-width: 880px;
}
.isis-grid--sam-soususage .isis-grid__head,
.isis-grid--sam-soususage .isis-grid__row {
    grid-template-columns: 140px minmax(160px, 1.4fr) 100px 90px minmax(150px, 1fr) 120px;
    min-width: 880px;
}
.isis-grid--sam-budget .isis-grid__head,
.isis-grid--sam-budget .isis-grid__row {
    grid-template-columns: 100px 100px 110px minmax(180px, 1fr);
    min-width: 540px;
}
/* Entreprise allégée : texte discret (la criticité est portée par la colonne Anomalie). */
.isis-grid--equipement .isis-grid__col-light {
    color: var(--isis-text-muted);
    font-size: 0.82rem;
}
/* Colonne Anomalie : badges empilés/wrap. */
.isis-grid--equipement .isis-grid__col-anomalie {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    align-content: center;
}

/* Gesmat — onglets du panneau latéral (Détail / Recherche avancée) */
.isis-side-tabs {
    display: flex;
    gap: 0;
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 0.75rem;
    position: sticky;
    top: 0;
    background: var(--isis-surface);
    z-index: 2;
}
.isis-side-tab {
    flex: 1;
    background: none;
    border: none;
    padding: 0.55rem 0.5rem;
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--isis-text-muted);
    cursor: pointer;
    border-bottom: 2px solid transparent;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.3rem;
}
.isis-side-tab:hover { background: var(--isis-surface-alt); }
.isis-side-tab.is-active {
    color: var(--isis-current-mod, var(--isis-accent));
    border-bottom-color: var(--isis-current-mod, var(--isis-accent));
}
.isis-side-tab__badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 9px;
    background: var(--isis-current-mod, var(--isis-accent));
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
}
.isis-side-search { display: flex; flex-direction: column; gap: 0.65rem; padding: 0 0.15rem; }
.isis-side-search .field { display: flex; flex-direction: column; gap: 0.2rem; }
.isis-side-search .label {
    font-size: 0.72rem; font-weight: 600; text-transform: uppercase;
    letter-spacing: 0.04em; color: var(--isis-text-muted);
}
.isis-side-search__actions { display: flex; gap: 0.5rem; margin-top: 0.35rem; }
.isis-side-search__hint { font-size: 0.74rem; color: var(--isis-text-muted); margin: 0.25rem 0 0; line-height: 1.4; }

/* Gesmat — barre d'amortissement (fiche équipement, carte TCO) */
.isis-amort-bar {
    height: 8px;
    border-radius: 4px;
    background: var(--isis-surface-alt);
    overflow: hidden;
    margin: 0.25rem 0 0.15rem;
}
.isis-amort-bar__fill {
    height: 100%;
    border-radius: 4px;
    background: color-mix(in srgb, var(--isis-mod-gesmat) 70%, var(--isis-accent));
}
.isis-amort-bar__fill.is-done { background: var(--isis-text-muted); }

/* ============================================================================
   Gescompta — Analyse comparative + dashboard (Priorité 3 audit ERP 2026-05-30)
   ============================================================================ */

.isis-quickactions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem 0;
}

/* Grille top impayés : 8 colonnes */
.isis-grid--analyse-impayes .isis-grid__head,
.isis-grid--analyse-impayes .isis-grid__row {
    display: grid;
    grid-template-columns: 130px minmax(180px, 1.4fr) 100px 100px 70px 130px 100px 50px;
    gap: 0.5rem;
    align-items: center;
}

/* Grille top clients : 4 colonnes */
.isis-grid--analyse-top-clients .isis-grid__head,
.isis-grid--analyse-top-clients .isis-grid__row {
    display: grid;
    grid-template-columns: 60px minmax(200px, 1.6fr) 130px 160px;
    gap: 0.5rem;
    align-items: center;
}

/* Indicateurs textuels (positif/négatif/neutre/warning/danger) sur les KPI hero
   et cellules variation : couleurs sémantiques + poids accentué. */
.isis-kpi-card__value.is-positive,
.isis-grid__col-right.is-positive,
.isis-analyse-pivot__col-var.is-positive { color: var(--isis-success); font-weight: 600; }
.isis-kpi-card__value.is-negative,
.isis-grid__col-right.is-negative,
.isis-analyse-pivot__col-var.is-negative { color: var(--isis-danger); font-weight: 600; }
.isis-kpi-card__value.is-neutral,
.isis-grid__col-right.is-neutral,
.isis-analyse-pivot__col-var.is-neutral { color: var(--isis-text-muted); }
.isis-kpi-card__value.is-warning,
.isis-grid__col-right.is-warning,
.isis-analyse-pivot__col-var.is-warning { color: var(--isis-warning); font-weight: 600; }
.isis-kpi-card__value.is-danger,
.isis-grid__col-right.is-danger { color: var(--isis-danger); font-weight: 600; }
.isis-kpi-card__hint .is-positive { color: var(--isis-success); }
.isis-kpi-card__hint .is-negative { color: var(--isis-danger); }
.isis-kpi-card__hint .is-neutral  { color: var(--isis-text-muted); }
.isis-kpi-card__hint .is-warning  { color: var(--isis-warning); }

/* Tableau croisé dynamique pivot */
.isis-analyse-pivot-wrapper {
    width: 100%;
    overflow-x: auto;
    padding-bottom: 0.25rem;
}

.isis-analyse-pivot {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-variant-numeric: tabular-nums;
    font-size: 0.875rem;
}

.isis-analyse-pivot thead th {
    position: sticky;
    top: 0;
    background: var(--isis-surface-soft);
    text-transform: uppercase;
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    color: var(--isis-text-muted);
    padding: 0.5rem 0.625rem;
    text-align: right;
    border-bottom: 1px solid var(--isis-border);
}

.isis-analyse-pivot thead th.isis-analyse-pivot__year-group {
    text-align: center;
    background: color-mix(in srgb, var(--isis-current-mod) 8%, var(--isis-surface-soft));
    color: var(--isis-text);
    font-size: 0.875rem;
    border-bottom: 1px solid var(--isis-current-mod);
}

.isis-analyse-pivot thead th.isis-analyse-pivot__sticky-col,
.isis-analyse-pivot tbody td.isis-analyse-pivot__sticky-col,
.isis-analyse-pivot tfoot td.isis-analyse-pivot__sticky-col {
    position: sticky;
    left: 0;
    background: var(--isis-surface);
    text-align: left;
    z-index: 2;
    border-right: 1px solid var(--isis-border);
}

.isis-analyse-pivot thead th.isis-analyse-pivot__sticky-col {
    background: var(--isis-surface-soft);
    z-index: 3;
}

.isis-analyse-pivot tbody td {
    padding: 0.4rem 0.625rem;
    text-align: right;
    border-bottom: 1px solid var(--isis-border-soft);
}

.isis-analyse-pivot tbody tr:hover td { background: var(--isis-surface-soft); }

.isis-analyse-pivot__col-month { color: var(--isis-text); font-weight: 500; }
.isis-analyse-pivot__col-cum   { color: var(--isis-text-muted); font-size: 0.8125rem; }
.isis-analyse-pivot__col-var   { font-size: 0.8125rem; font-weight: 600; }

.isis-analyse-pivot tfoot tr.isis-analyse-pivot__total td {
    padding: 0.55rem 0.625rem;
    background: var(--isis-surface-soft);
    font-weight: 600;
    border-top: 2px solid var(--isis-current-mod);
}

.isis-analyse-pivot tfoot tr.isis-analyse-pivot__total td.isis-analyse-pivot__sticky-col {
    background: var(--isis-surface-soft);
}

/* Charts SVG inline */
.isis-analyse-chart-wrap {
    margin-top: 1rem;
    padding: 0.5rem 0;
}

.isis-analyse-chart {
    width: 100%;
    height: auto;
    max-height: 280px;
    display: block;
}

.isis-analyse-chart__legend {
    display: flex;
    gap: 1rem;
    margin-top: 0.5rem;
    font-size: 0.8125rem;
    color: var(--isis-text-muted);
    justify-content: center;
}

.isis-analyse-chart__legend-item { display: inline-flex; align-items: center; gap: 0.375rem; }
.isis-analyse-chart__legend-dot {
    display: inline-block;
    width: 12px;
    height: 12px;
    border-radius: 3px;
}

/* Gesmat — grille des prêts (check-out / check-in) */
.isis-grid--pret .isis-grid__head,
.isis-grid--pret .isis-grid__row {
    grid-template-columns: minmax(180px, 1.4fr) 110px 130px 130px 130px 110px;
}

/* Gesmat — carte du parc (niveau 2 localisation) */
.isis-parc-carte {
    flex: 1 1 auto;
    min-height: 440px;
    border-radius: 10px;
    overflow: hidden;
    box-shadow: var(--isis-elevation-1);
}
.isis-parc-carte__toggle {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.85rem;
    color: var(--isis-text);
}
.isis-parc-carte__unknown {
    margin-top: 0.5rem;
    font-size: 0.85rem;
}
.isis-parc-carte__unknown > summary {
    cursor: pointer;
    color: var(--isis-text-muted);
    padding: 0.35rem 0;
}
.isis-parc-carte__unknown-list {
    list-style: none;
    margin: 0.25rem 0 0;
    padding: 0;
    display: grid;
    gap: 0.3rem;
}
.isis-parc-carte__unknown-list li {
    display: flex;
    align-items: baseline;
    gap: 0.6rem;
}
.isis-parc-carte__unknown-hint {
    color: var(--isis-text-muted);
    font-size: 0.78rem;
}

/* ============================================================================
 * Comptes bancaires (Bloc 1 préalable lettrage — V1 2026-05-30)
 * Page /gescompta/banques + sidepanel détail.
 * Cf. memory project-isis-listpage-with-kpi-header + project-isis-grid-pattern.
 * ============================================================================ */

.isis-grid--bank-accounts .isis-grid__head,
.isis-grid--bank-accounts .isis-grid__row {
    display: grid;
    grid-template-columns:
        40px                            /* Default ⭐ */
        60px                            /* Status dot */
        minmax(180px, 1.3fr)            /* Libellé */
        minmax(220px, 1.4fr)            /* IBAN */
        minmax(180px, 1fr)              /* Banque */
        80px                            /* Devise */
        minmax(140px, 1fr)              /* Entreprise */
        80px;                           /* Actions */
    gap: 0.5rem;
    align-items: center;
    padding: 0.45rem 0.75rem;
}

.isis-grid--bank-accounts .isis-grid__col-iban {
    font-family: var(--isis-font-mono, 'JetBrains Mono', 'Geist Mono', 'SF Mono', monospace);
    font-size: 0.8125rem;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.02em;
    color: var(--isis-text);
}

/* Étoile ⭐ marquant le compte par défaut. Couleur ambre warning (jamais hex
 * inline — variables --isis-* uniquement, cf. DESIGN.md §10). */
.isis-bank-account-default-icon {
    color: var(--isis-warning);
}

/* ── Feedback live IBAN/BIC dans le form dialog (success / error) ─────────── */
.isis-form-linear__hint--success {
    color: var(--isis-success);
}
.isis-form-linear__hint--error {
    color: var(--isis-danger);
}

/* ── Sidepanel détail compte : bloc IBAN en grand (chiffre clé) ───────────── */
.isis-side-iban {
    margin-top: 0.75rem;
    padding: 0.75rem 0.85rem;
    background: var(--isis-surface-alt, var(--isis-surface-soft));
    border-radius: 6px;
    border-left: 3px solid var(--isis-mod-gescompta);
}
.isis-side-iban__label {
    font-size: 0.7rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    margin-bottom: 0.25rem;
}
.isis-side-iban__value {
    font-family: var(--isis-font-mono, 'JetBrains Mono', 'Geist Mono', 'SF Mono', monospace);
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--isis-text);
    letter-spacing: 0.03em;
    word-break: break-all;
}
.isis-side-iban__bic {
    margin-top: 0.35rem;
    font-size: 0.8rem;
}
.isis-side-iban__bic-label {
    color: var(--isis-text-muted);
}
.isis-side-iban__bic-value {
    font-family: var(--isis-font-mono, 'JetBrains Mono', 'Geist Mono', 'SF Mono', monospace);
    font-weight: 500;
    color: var(--isis-text);
    margin-left: 0.35rem;
}

/* Gesmat — onglet Localisation (niveau 3) */
.isis-loc-map {
    border-radius: 10px;
    overflow: hidden;
    box-shadow: var(--isis-elevation-1);
    margin-bottom: 0.85rem;
}
.isis-loc-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 0.85rem;
    margin-bottom: 0.85rem;
}
.isis-loc-card {
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
    padding: 0.85rem 1rem;
}
.isis-loc-card__title {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    margin-bottom: 0.35rem;
}
.isis-loc-card__main { font-weight: 600; color: var(--isis-text); }
.isis-loc-card__sub { color: var(--isis-text-muted); font-size: 0.85rem; margin-top: 0.15rem; }
.isis-loc-card__coords {
    font-family: var(--isis-font-mono, monospace);
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    margin-top: 0.2rem;
}
.isis-loc-section { margin-top: 0.85rem; }
.isis-loc-section__title {
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--isis-text-muted);
    margin-bottom: 0.4rem;
}
.isis-loc-section__empty { color: var(--isis-text-muted); font-size: 0.85rem; }
.isis-loc-tracker-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.4rem; }
.isis-loc-tracker-list li {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.4rem 0.6rem;
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    background: var(--isis-surface);
}
.isis-loc-tracker-list li.is-active { border-color: color-mix(in srgb, var(--isis-current-mod) 35%, var(--isis-border)); }
.isis-loc-tracker__dev { font-family: var(--isis-font-mono, monospace); font-size: 0.85rem; color: var(--isis-text); }
.isis-loc-tracker__meta { color: var(--isis-text-muted); font-size: 0.82rem; flex: 1; }
.isis-loc-hist { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.25rem; }
.isis-loc-hist li {
    display: flex;
    align-items: baseline;
    gap: 0.8rem;
    font-size: 0.82rem;
    padding: 0.25rem 0;
    border-bottom: 1px solid var(--isis-border-soft, var(--isis-border));
}
.isis-loc-hist__date { color: var(--isis-text); min-width: 130px; }
.isis-loc-hist__src { color: var(--isis-text-muted); min-width: 64px; }
.isis-loc-hist__coords { font-family: var(--isis-font-mono, monospace); color: var(--isis-text-muted); flex: 1; }
.isis-loc-hist__batt { color: var(--isis-text-muted); }
.isis-tracker-key {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: 8px;
    padding: 0.5rem 0.6rem;
    margin-top: 0.3rem;
}
.isis-tracker-key code {
    flex: 1;
    font-family: var(--isis-font-mono, monospace);
    font-size: 0.82rem;
    word-break: break-all;
    color: var(--isis-text);
}

/* Utilitaires audit ui-ux 2026-05-30 (extraction styles inline) */
.isis-tab-toolbar--flush { border: 0; padding-bottom: 0.75rem; }
.isis-tab-toolbar__hint { color: var(--isis-text-muted); font-size: 0.85rem; }
.isis-form-linear__section-title--spaced { margin-top: 0.75rem; }
.isis-parc-carte__toggle-hint { color: var(--isis-text-muted); font-size: 0.8rem; }

/* ── Chantier #2 — Budget d'heures (CommandeBudgetSection) ─────────────────── */
/* (le modificateur .is-ok de la coverage-bar est défini dans le bloc canonique) */
.isis-budget { display: flex; flex-direction: column; gap: 1rem; }
.isis-budget__section-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--isis-text-muted); margin: 0.25rem 0 0; }
.isis-budget__loading { display: flex; align-items: center; gap: 0.6rem; padding: 0.75rem 0; }
.isis-budget__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.isis-budget__head-left { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; }
.isis-budget__head-right { display: flex; align-items: center; gap: 0.5rem; }
.isis-budget__summary { display: flex; flex-direction: column; gap: 0.4rem; }
.isis-budget__summary-row { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; font-size: 0.9rem; }
.isis-budget__taches { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.85rem; }
.isis-budget__tache { display: flex; flex-direction: column; gap: 0.3rem; }
.isis-budget__tache-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; }
.isis-budget__tache-name { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-budget__tache-val { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Couleurs de valeur scopées aux montants (jamais aux badges du header). */
.isis-budget__tache-val.is-warning, .isis-budget__summary-row strong.is-warning { color: var(--isis-warning); }
.isis-budget__tache-val.is-danger,  .isis-budget__summary-row strong.is-danger  { color: var(--isis-danger); }
.isis-budget-divider { height: 1px; background: var(--isis-border); margin: 1.25rem 0 0.5rem; }
.isis-budget-heading { display: flex; align-items: center; gap: 0.4rem; font-size: 1rem; font-weight: 600; margin: 0 0 0.5rem; }

/* ── Chantier #3 — Avenants de commande (CommandeAvenantSection) ───────────── */
.isis-avenants { display: flex; flex-direction: column; gap: 1rem; }
.isis-avenants__toolbar { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.isis-avenants__count { font-size: 0.9rem; font-weight: 500; }
.isis-avenants__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.isis-avenants__row { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; padding: 0.65rem 0; border-bottom: 1px solid var(--isis-border); }
.isis-avenants__row:last-child { border-bottom: none; }
.isis-avenants__main { display: flex; align-items: center; gap: 0.5rem; min-width: 0; }
.isis-avenants__numero { font-family: var(--isis-font-mono, monospace); font-weight: 600; }
.isis-avenants__type { color: var(--isis-text-muted); font-size: 0.85rem; }
.isis-avenants__meta { display: flex; align-items: baseline; gap: 0.75rem; flex-wrap: wrap; font-size: 0.85rem; font-variant-numeric: tabular-nums; }
.isis-avenants__meta .is-danger { color: var(--isis-danger); }
.isis-avenants__motif { color: var(--isis-text-muted); font-style: italic; max-width: 22ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-avenants__actions { display: flex; align-items: center; gap: 0.35rem; margin-left: auto; }
/* Message d'erreur de validation dans les dialogs form-linear. */
.isis-form-linear__error { color: var(--isis-danger); font-size: 0.82rem; padding: 0.4rem 0.6rem; background: var(--isis-danger-soft); border-radius: 6px; border-left: 3px solid var(--isis-danger); }

/* ────────────────────────────────────────────────────────────────────────── *
 *  Bloc 2 — Rapprochement bancaire (V1 2026-05-30, Priorité 2 audit ERP)     *
 *  Convention naming « rapprochement » (cf. memory                           *
 *  feedback_vocabulaire_rapprochement_vs_lettrage) — JAMAIS « lettrage ».    *
 * ────────────────────────────────────────────────────────────────────────── */

/* Grille liste relevés (page /gescompta/rapprochement).
   8 cols : Status / Période / Compte / Format / Fichier / Lignes / Importé / Actions. */
.isis-grid--bank-statements .isis-grid__head,
.isis-grid--bank-statements .isis-grid__row {
    display: grid;
    grid-template-columns: 40px minmax(160px, 1fr) minmax(180px, 1.3fr) 120px minmax(160px, 1fr) 140px 130px 80px;
    gap: 0.5rem;
    align-items: center;
    min-width: 1080px;
}

/* Grille liste lignes (page détail).
   8 cols : Status / Date / Sens / Montant / Libellé / Donneur / État / Actions. */
.isis-grid--bank-lines .isis-grid__head,
.isis-grid--bank-lines .isis-grid__row {
    display: grid;
    grid-template-columns: 40px 90px 60px 110px minmax(220px, 1.6fr) minmax(140px, 1fr) minmax(140px, 1fr) 80px;
    gap: 0.5rem;
    align-items: center;
    min-width: 1020px;
}

/* Colonne montant : alignement droit + monospace tabular pour lecture verticale rapide. */
.isis-grid--bank-lines .isis-grid__col-amount {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-variant-numeric: tabular-nums;
    text-align: right;
}

/* Icônes direction CRÉDIT/DÉBIT (sens du flux financier).
   CRÉDIT = paiement reçu (vert success), DÉBIT = paiement émis (rouge danger). */
.isis-bank-direction-icon--credit {
    color: var(--isis-success);
    font-size: 18px;
}
.isis-bank-direction-icon--debit {
    color: var(--isis-danger);
    font-size: 18px;
}

/* Badge de score match suggéré.
   3 niveaux : ≥ 90 success vert / 60-89 warning orange / < 60 muted gris. */
.isis-rapprochement-score-badge {
    display: inline-block;
    padding: 0.18rem 0.5rem;
    border-radius: var(--isis-radius-pill);
    font-size: 0.78rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.2px;
}
.isis-rapprochement-score-badge--high {
    background: color-mix(in srgb, var(--isis-success) 18%, white);
    color: var(--isis-success);
}
.isis-rapprochement-score-badge--medium {
    background: color-mix(in srgb, var(--isis-warning) 18%, white);
    color: var(--isis-warning);
}
.isis-rapprochement-score-badge--low {
    background: color-mix(in srgb, var(--isis-text-muted) 18%, white);
    color: var(--isis-text-muted);
}

/* Carte « candidat suggéré » dans le sidepanel de la page détail.
   La bordure left reprend la couleur du score (gradation rouge → vert). */
.isis-rapprochement-candidate-card {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.75rem 0.85rem;
    border: 1px solid var(--isis-border);
    border-left: 3px solid var(--isis-text-muted);
    border-radius: 6px;
    background: var(--isis-surface);
    transition: border-color 120ms, background 120ms;
}
.isis-rapprochement-candidate-card--high { border-left-color: var(--isis-success); }
.isis-rapprochement-candidate-card--medium { border-left-color: var(--isis-warning); }
.isis-rapprochement-candidate-card--low { border-left-color: var(--isis-text-muted); }
.isis-rapprochement-candidate-card--reconciled {
    border-left-color: var(--isis-success);
    background: color-mix(in srgb, var(--isis-success) 6%, var(--isis-surface));
}
.isis-rapprochement-candidate-card--rejected {
    border-left-color: var(--isis-text-muted);
    background: var(--isis-surface-alt);
}
.isis-rapprochement-candidate-card--info {
    border-left-color: var(--isis-accent);
    background: color-mix(in srgb, var(--isis-accent) 6%, var(--isis-surface));
}
.isis-rapprochement-candidate-card--empty {
    flex-direction: row;
    align-items: center;
    gap: 0.5rem;
    color: var(--isis-text-muted);
    font-size: 0.875rem;
    background: var(--isis-surface-alt);
}

.isis-rapprochement-candidate-card__title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-weight: 600;
    font-size: 0.9rem;
}
.isis-rapprochement-candidate-card__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
}
.isis-rapprochement-candidate-card__numero {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-weight: 600;
    font-size: 0.95rem;
}
.isis-rapprochement-candidate-card__body {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    font-size: 0.875rem;
    color: var(--isis-text);
}
.isis-rapprochement-candidate-card__reason {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    font-style: italic;
}
.isis-rapprochement-candidate-card__criteria {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin-top: 0.15rem;
}

/* Titre de section « Suggérer un rapprochement » dans le sidepanel. */
.isis-rapprochement-candidates {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.isis-rapprochement-candidates__title {
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--isis-text);
    margin-top: 0.4rem;
}

/* KPIs lignes inline dans le sidepanel de la page liste (compteurs par état). */
.isis-rapprochement-stats {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0.5rem;
    margin: 0.5rem 0 0.75rem;
}
.isis-rapprochement-stat {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 0.5rem 0.4rem;
    background: var(--isis-surface-alt);
    border-radius: 6px;
}
.isis-rapprochement-stat__value {
    font-size: 1.25rem;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--isis-text);
    line-height: 1.1;
}
.isis-rapprochement-stat__value.is-success { color: var(--isis-success); }
.isis-rapprochement-stat__value.is-warning { color: var(--isis-warning); }
.isis-rapprochement-stat__value.is-muted { color: var(--isis-text-muted); }
.isis-rapprochement-stat__label {
    font-size: 0.72rem;
    color: var(--isis-text-muted);
    text-align: center;
    margin-top: 0.15rem;
}

/* ============================================================================
   V1.1 Bloc 2 Session 2 — Rapprochement N-pour-1
   ============================================================================ */

/* Grille candidats factures dans le dialog groupé */
.isis-grid--candidate-factures .isis-grid__head,
.isis-grid--candidate-factures .isis-grid__row {
    display: grid;
    grid-template-columns: 40px 130px minmax(180px, 1.4fr) 100px 110px 110px 120px;
    gap: 0.5rem;
    align-items: center;
}
.isis-grid--candidate-factures .isis-grid__col-amount {
    text-align: right;
    font-variant-numeric: tabular-nums;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.85rem;
}
.isis-grid--candidate-factures .isis-grid__col-numero {
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.85rem;
}
.isis-grid--candidate-factures .isis-grid__row.is-disabled {
    opacity: 0.5;
    pointer-events: none;
}
.isis-grid--candidate-factures .isis-grid__row input[type="checkbox"] {
    cursor: pointer;
    width: 16px;
    height: 16px;
}
.isis-grid--candidate-factures .isis-grid__row.is-disabled input[type="checkbox"] {
    cursor: not-allowed;
}

/* Dialog plein-écran N-pour-1 */
.isis-rapprochement-groupe {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}
.isis-rapprochement-groupe__body {
    flex: 1 1 auto;
    display: grid;
    grid-template-columns: 40% 60%;
    gap: 1rem;
    min-height: 0;
    overflow: hidden;
}
@media (max-width: 960px) {
    .isis-rapprochement-groupe__body {
        grid-template-columns: 1fr;
        grid-template-rows: auto 1fr;
    }
}
.isis-rapprochement-groupe__line {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 0.5rem;
    overflow-y: auto;
    min-height: 0;
}
.isis-rapprochement-groupe__factures {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    min-height: 0;
    overflow: hidden;
}
.isis-rapprochement-groupe__factures .isis-grid {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

/* Card récap montant à imputer (zone gauche) */
.isis-rapprochement-groupe-summary {
    background: color-mix(in srgb, var(--isis-mod-gescompta) 6%, white);
    border-left: 3px solid var(--isis-mod-gescompta);
    padding: 0.85rem 1rem;
    border-radius: 6px;
}
.isis-rapprochement-groupe-summary--remaining {
    border-left-color: var(--isis-text-muted);
    background: color-mix(in srgb, var(--isis-text-muted) 6%, white);
}
.isis-rapprochement-groupe-summary--remaining.ok {
    border-left-color: var(--isis-success);
    background: color-mix(in srgb, var(--isis-success) 8%, white);
}
.isis-rapprochement-groupe-summary--remaining.warning {
    border-left-color: var(--isis-warning);
    background: color-mix(in srgb, var(--isis-warning) 8%, white);
}
.isis-rapprochement-groupe-summary--remaining.danger {
    border-left-color: var(--isis-danger);
    background: color-mix(in srgb, var(--isis-danger) 8%, white);
}
.isis-rapprochement-groupe-summary__label {
    font-size: 0.78rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin-bottom: 0.25rem;
}
.isis-rapprochement-groupe-summary__amount-large {
    font-size: 1.55rem;
    font-weight: 700;
    color: var(--isis-text);
    font-variant-numeric: tabular-nums;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    letter-spacing: -0.01em;
}
.isis-rapprochement-groupe-summary__remaining--ok {
    color: var(--isis-success);
}
.isis-rapprochement-groupe-summary__remaining--warning {
    color: var(--isis-warning);
}
.isis-rapprochement-groupe-summary__remaining--danger {
    color: var(--isis-danger);
}
.isis-rapprochement-groupe-summary__sub {
    font-size: 0.82rem;
    color: var(--isis-text-muted);
    margin-top: 0.2rem;
}

.isis-rapprochement-groupe__facts {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.65rem;
}
.isis-rapprochement-groupe__facts li {
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
}
.isis-rapprochement-groupe__fact-label {
    font-size: 0.75rem;
    color: var(--isis-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.isis-rapprochement-groupe__fact-value {
    font-size: 0.9rem;
    word-break: break-word;
}
.isis-rapprochement-groupe__fact-value--small {
    font-size: 0.82rem;
}
.isis-rapprochement-groupe__counter {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.7rem;
    background: var(--isis-surface-alt, #f7f8fa);
    border-radius: 4px;
    font-size: 0.85rem;
}

.isis-filter-bar--inline {
    padding: 0;
    background: transparent;
    border: 0;
}
.isis-filter-bar--inline .isis-filter-bar__chips {
    align-items: center;
    flex-wrap: wrap;
}

/* Footer dialog (sticky bottom) */
.isis-rapprochement-groupe__footer {
    flex: 0 0 auto;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.75rem 1rem;
    border-top: 1px solid var(--isis-border, #e5e7eb);
    background: var(--isis-surface);
    gap: 1rem;
    flex-wrap: wrap;
}
.isis-rapprochement-groupe__footer-status {
    font-size: 0.88rem;
    color: var(--isis-text);
}
.isis-rapprochement-groupe__footer-actions {
    display: flex;
    gap: 0.5rem;
}

/* Badge multi-factures (grille + sidepanel) */
.isis-rapprochement-multifactures-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.125rem 0.55rem;
    background: color-mix(in srgb, var(--isis-mod-gescompta) 14%, white);
    color: var(--isis-mod-gescompta);
    border-radius: var(--isis-radius-pill);
    font-size: 0.8125rem;
    font-weight: 600;
    line-height: 1.4;
    white-space: nowrap;
}

/* Liste factures liées dans sidepanel */
.isis-rapprochement-multifactures-list {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    margin: 0.25rem 0 0;
    padding: 0;
    list-style: none;
}
.isis-rapprochement-multifactures-list__item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
    padding: 0.35rem 0.55rem;
    background: var(--isis-surface-alt, #f7f8fa);
    border-radius: 4px;
}
.isis-rapprochement-multifactures-list__amount {
    font-variant-numeric: tabular-nums;
    font-family: var(--isis-font-mono, ui-monospace, monospace);
    font-size: 0.85rem;
    color: var(--isis-text);
    font-weight: 500;
}

.isis-text-muted {
    color: var(--isis-text-muted);
}

/* ── Chantier #1 CRM — journal d'activités commerciales (TiersActiviteSection) ── */
.isis-crm { display: flex; flex-direction: column; gap: 1rem; }
.isis-crm__toolbar { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.isis-crm__count { font-size: 0.9rem; font-weight: 500; }
.isis-crm__section-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--isis-text-muted); margin: 0.5rem 0 0; }
.isis-crm__tasks { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
.isis-crm__task { display: flex; align-items: center; gap: 0.6rem; padding: 0.5rem 0.7rem; background: var(--isis-surface-alt); border-radius: 8px; border-left: 3px solid var(--isis-accent); }
.isis-crm__task.is-late { border-left-color: var(--isis-danger); }
.isis-crm__task-check { background: none; border: none; cursor: pointer; color: var(--isis-text-muted); display: flex; padding: 0; }
.isis-crm__task-check:hover { color: var(--isis-success); }
.isis-crm__task-main { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; flex: 1; }
.isis-crm__task-subject { font-weight: 500; }
.isis-crm__task-due { font-size: 0.78rem; color: var(--isis-text-muted); display: inline-flex; align-items: center; gap: 0.25rem; }
.isis-crm__task-due.is-late { color: var(--isis-danger); }
.isis-crm__timeline { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.isis-crm__item { display: flex; gap: 0.7rem; padding: 0.6rem 0; border-bottom: 1px solid var(--isis-border); }
.isis-crm__item:last-child { border-bottom: none; }
.isis-crm__item-dot { flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface)); color: var(--isis-accent); }
.isis-crm__item-dot.crm-rdv { background: color-mix(in srgb, var(--isis-warning) 14%, var(--isis-surface)); color: var(--isis-warning); }
.isis-crm__item-dot.crm-tache { background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface)); color: var(--isis-success); }
.isis-crm__item-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.2rem; }
.isis-crm__item-head { display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; }
.isis-crm__item-type { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--isis-text-muted); }
.isis-crm__item-subject { font-weight: 500; }
.isis-crm__item-text { margin: 0; font-size: 0.85rem; color: var(--isis-text); white-space: pre-wrap; }
.isis-crm__item-date { font-size: 0.75rem; color: var(--isis-text-muted); }
.isis-crm__del { background: none; border: none; cursor: pointer; color: var(--isis-text-muted); padding: 0.2rem; align-self: flex-start; }
.isis-crm__del:hover { color: var(--isis-danger); }

/* ════════════════════════════════════════════════════════════════════════════
   MonEspace › Mes projets (chantier « Mes projets » — saisie temps + frais)
   ════════════════════════════════════════════════════════════════════════════ */

/* Identité chromatique module monespace (icône header + soft). */
.isis-shell__content.mod-monespace { --isis-current-mod: var(--isis-mod-monespace); }
.isis-rich-header__icon.mod-monespace-soft { background: var(--isis-mod-monespace-soft); color: var(--isis-mod-monespace); }

/* Liste des projets (master). */
.isis-proj-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.25rem; }
.isis-proj-item {
	display: flex; align-items: flex-start; gap: 0.6rem; width: 100%;
	text-align: left; background: transparent; border: none; cursor: pointer;
	padding: 0.6rem 0.7rem; border-radius: 8px; border-left: 3px solid transparent;
	transition: background 0.12s ease, border-color 0.12s ease;
}
.isis-proj-item:hover { background: var(--isis-surface-alt); }
.isis-proj-item:focus-visible { outline: 2px solid var(--isis-mod-monespace); outline-offset: 1px; }
.isis-proj-item.is-active { background: var(--isis-mod-monespace-soft); border-left-color: var(--isis-mod-monespace); }
.isis-proj-item__dot { width: 9px; height: 9px; border-radius: 50%; margin-top: 0.35rem; flex: 0 0 auto; box-shadow: inset 0 0 0 1px rgba(0,0,0,0.18); }
.isis-proj-item__dot.is-ready { background: var(--isis-success); }
.isis-proj-item__dot.is-pending { background: var(--isis-mod-monespace); }
.isis-proj-item__dot.is-archived { background: var(--isis-text-muted); }
.isis-proj-item__main { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; flex: 1; }
.isis-proj-item__num { font-family: var(--isis-font-mono, monospace); font-size: 0.78rem; color: var(--isis-text-muted); }
.isis-proj-item__title { font-weight: 600; font-size: 0.9rem; color: var(--isis-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-proj-item__meta { font-size: 0.76rem; color: var(--isis-text-muted); }
.isis-proj-item__alert {
	flex: 0 0 auto; width: 18px; height: 18px; border-radius: 50%;
	background: var(--isis-danger); color: #fff; font-weight: 700; font-size: 0.75rem;
	display: inline-flex; align-items: center; justify-content: center; margin-top: 0.25rem;
}

/* En-tête du panneau détail. */
.isis-detail-head { padding: 0 0 0.6rem; border-bottom: 1px solid var(--isis-border); margin-bottom: 0.6rem; }
.isis-detail-head__title { font-size: 1rem; font-weight: 600; margin: 0 0 0.2rem; color: var(--isis-text); }
.isis-detail-head__sub { font-size: 0.8rem; color: var(--isis-text-muted); display: flex; flex-wrap: wrap; gap: 0.4rem; }

/* Barre d'action interne à un onglet. */
.isis-panel-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; margin: 0.5rem 0 0.5rem; }
.isis-panel-toolbar__title { font-weight: 600; font-size: 0.88rem; color: var(--isis-text); }
.isis-panel-empty { color: var(--isis-text-muted); font-size: 0.85rem; padding: 0.8rem 0; }
.isis-panel-foot { display: flex; justify-content: flex-end; margin-top: 0.6rem; }
.isis-ndf-detail { margin-top: 0.8rem; padding-top: 0.6rem; border-top: 1px dashed var(--isis-border); }

/* Colonnes utilitaires de grille. */
.isis-tabular { font-variant-numeric: tabular-nums; }
.isis-grid__col-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Templates de grilles « Mes projets ». */
.isis-grid--proj-temps .isis-grid__head,
.isis-grid--proj-temps .isis-grid__row {
	display: grid; grid-template-columns: 28px 80px minmax(120px, 1fr) 80px 130px 90px; gap: 0.5rem; align-items: center;
}
/* Bandeau de regroupement par semaine + ligne de total projet (full width,
   hors grille — enfants flex directs de .isis-grid). */
.isis-proj-temps__week,
.isis-proj-temps__foot {
	display: flex; align-items: center; justify-content: space-between;
	padding: 0.4rem 0.55rem; font-size: 0.78rem;
}
.isis-proj-temps__week {
	background: var(--isis-surface-alt);
	color: var(--isis-text-muted);
	font-weight: 600; text-transform: uppercase; letter-spacing: 0.02em;
	border-top: 1px solid var(--isis-border-soft, #eef0f3);
}
.isis-proj-temps__foot {
	border-top: 2px solid var(--isis-border);
	margin-top: 0.2rem; font-weight: 700; color: var(--isis-text);
}
.isis-proj-temps__week-total { font-variant-numeric: tabular-nums; }
.isis-grid--proj-ndf .isis-grid__head,
.isis-grid--proj-ndf .isis-grid__row {
	display: grid; grid-template-columns: 130px minmax(140px, 1fr) 120px 130px 80px; gap: 0.5rem; align-items: center;
}
.isis-grid--proj-ndf-ligne .isis-grid__head,
.isis-grid--proj-ndf-ligne .isis-grid__row {
	display: grid; grid-template-columns: 80px minmax(120px, 1fr) minmax(100px, 1fr) 120px 80px; gap: 0.5rem; align-items: center;
}
.isis-grid--proj-mob .isis-grid__head,
.isis-grid--proj-mob .isis-grid__row {
	display: grid; grid-template-columns: minmax(120px, 1fr) 140px 170px 100px; gap: 0.5rem; align-items: center;
}

/* ════════════════════════════════════════════════════════════════════════════
   MonEspace › Mes projets — vue calendrier intelligente de saisie de temps
   ════════════════════════════════════════════════════════════════════════════ */

.isis-filter-bar__hint { font-size: 0.82rem; color: var(--isis-text-muted); }

.isis-ts-cal-wrap { display: flex; flex-direction: column; gap: 0.75rem; flex: 1 1 auto; min-height: 0; overflow: auto; }

.isis-ts-cal-banner {
	display: flex; align-items: center; gap: 0.5rem;
	padding: 0.6rem 0.9rem; border-radius: 8px;
	background: color-mix(in srgb, var(--isis-warning) 12%, var(--isis-surface));
	color: var(--isis-text); font-size: 0.85rem;
	border-left: 3px solid var(--isis-warning);
}
.isis-ts-cal-banner .rzi { color: var(--isis-warning); }

.isis-ts-cal { display: flex; flex-direction: column; gap: 0.6rem; flex: 1 1 auto; min-height: 0; }

/* Toolbar mois. */
.isis-ts-cal__toolbar { display: flex; align-items: center; gap: 0.5rem; }
.isis-ts-cal__nav {
	display: inline-flex; align-items: center; justify-content: center;
	width: 30px; height: 30px; border-radius: 7px; border: 1px solid var(--isis-border);
	background: var(--isis-surface); cursor: pointer; color: var(--isis-text);
}
.isis-ts-cal__nav:hover { background: var(--isis-surface-alt); }
.isis-ts-cal__nav:focus-visible { outline: 2px solid var(--isis-mod-monespace); outline-offset: 1px; }
.isis-ts-cal__month { font-weight: 600; font-size: 0.95rem; min-width: 140px; text-align: center; }
.isis-ts-cal__today {
	border: 1px solid var(--isis-border); background: var(--isis-surface); cursor: pointer;
	border-radius: 7px; padding: 0.3rem 0.7rem; font-size: 0.8rem; color: var(--isis-text);
}
.isis-ts-cal__today:hover { background: var(--isis-surface-alt); }
.isis-ts-cal__total { margin-left: auto; font-size: 0.85rem; color: var(--isis-text-muted); font-variant-numeric: tabular-nums; }

/* Grille. */
/* Plein écran : la grille prend toute la hauteur restante du wrap (flex), les
   semaines se partagent l'espace à parts égales, les cellules s'étirent. */
.isis-ts-cal__grid { border: 1px solid var(--isis-border); border-radius: 10px; overflow: hidden; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.isis-ts-cal__head { display: grid; grid-template-columns: repeat(7, 1fr); background: var(--isis-surface-alt); flex: 0 0 auto; }
.isis-ts-cal__head-cell { padding: 0.45rem 0.5rem; font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; color: var(--isis-text-muted); text-align: center; }
.isis-ts-cal__body { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.isis-ts-cal__row { display: grid; grid-template-columns: repeat(7, 1fr); flex: 1 1 0; min-height: 64px; }

/* Cellule jour : flex column. Les lanes de barres sont poussées en bas
   (margin-top:auto) et restent alignées entre cellules car chaque cellule de la
   semaine réserve le même nombre de lanes (slots vides inclus). */
.isis-ts-cal__cell {
	min-height: 64px;
	overflow: visible;
	display: flex; flex-direction: column; gap: 0.2rem;
	padding: 0.35rem 0.4rem; text-align: left; cursor: pointer;
	background: var(--isis-surface); border: none;
	border-top: 1px solid var(--isis-border-soft, #eef0f3);
	border-left: 1px solid var(--isis-border-soft, #eef0f3);
	transition: background 0.12s ease;
}
.isis-ts-cal__row > .isis-ts-cal__cell:first-child { border-left: none; }
.isis-ts-cal__cell:hover:not(:disabled) { background: var(--isis-surface-alt); }
.isis-ts-cal__cell:focus-visible { outline: 2px solid var(--isis-mod-monespace); outline-offset: -2px; }
.isis-ts-cal__cell.is-out { background: var(--isis-surface-alt); cursor: default; opacity: 0.5; }
.isis-ts-cal__cell.is-today .isis-ts-cal__cell-num {
	background: var(--isis-mod-monespace); color: var(--isis-surface);
	border-radius: 50%; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center;
}

.isis-ts-cal__cell-top { display: flex; align-items: center; justify-content: space-between; }
.isis-ts-cal__cell-num { font-size: 0.8rem; font-weight: 600; color: var(--isis-text); }
.isis-ts-cal__cell-h { font-size: 0.78rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--isis-text); }
.isis-ts-cal__cell-flag {
	width: 16px; height: 16px; border-radius: 50%; background: var(--isis-danger); color: var(--isis-surface);
	font-size: 0.7rem; font-weight: 700; display: inline-flex; align-items: center; justify-content: center;
}

/* Bandeau d'état coloré en bas de cellule (left border accent). */
.isis-ts-cal__cell.is-complet  { box-shadow: inset 3px 0 0 0 var(--isis-success); }
.isis-ts-cal__cell.is-partiel  { box-shadow: inset 3px 0 0 0 var(--isis-warning); }
.isis-ts-cal__cell.is-topoint  { box-shadow: inset 3px 0 0 0 var(--isis-danger); background: color-mix(in srgb, var(--isis-danger) 5%, var(--isis-surface)); }
.isis-ts-cal__cell.is-rejete   { box-shadow: inset 3px 0 0 0 var(--isis-danger); }
.isis-ts-cal__cell.is-repos    { background: var(--isis-surface-alt); }

/* Tag férié (reste dans la cellule). */
.isis-ts-cal__tag { font-size: 0.68rem; border-radius: 4px; padding: 0.05rem 0.3rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin: 0 0.3rem; }
.isis-ts-cal__tag.is-holiday { color: var(--isis-mod-monespace); background: var(--isis-mod-monespace-soft); font-style: italic; }

/* ── Barres de mobilisation (mini-Gantt par lanes, DANS les cases) ─────────
   Chaque cellule empile une pile de lanes (1 par tâche se chevauchant). Les
   slots vides réservent la hauteur → alignement vertical parfait entre cellules.
   Une barre multi-jours = un segment par cellule à la MÊME lane, sans gap
   horizontal → continuité visuelle. pointer-events:none : le clic reste sur la
   cellule. Aucune superposition possible (une lane = une seule barre par jour). */
.isis-ts-cal__lanes {
	margin-top: auto;          /* colle la pile de barres au bas de la cellule */
	display: flex;
	flex-direction: column;
	gap: 2px;
	pointer-events: none;
}
.isis-ts-cal__lane-empty { height: 15px; }
.isis-ts-cal__lane-bar {
	position: relative;
	height: 15px;
	display: flex;
	align-items: center;
	border-radius: 0;          /* arrondi seulement aux extrémités du segment */
	overflow: visible;
}
.isis-ts-cal__lane-bar.is-l { border-top-left-radius: 4px; border-bottom-left-radius: 4px; }
.isis-ts-cal__lane-bar.is-r { border-top-right-radius: 4px; border-bottom-right-radius: 4px; }
.isis-ts-cal__lane-label {
	position: absolute;
	left: 6px;
	white-space: nowrap;       /* déborde sur la suite de SA barre (même couleur) */
	font-size: 0.62rem;
	font-weight: 600;
	line-height: 1;
	pointer-events: none;
	z-index: 1;
}
/* Palette stable 6 teintes (fond / texte) — alignée sur ColorClass(Guid). */
.isis-ts-cal__lane-bar.is-c0 { background: #e0e7ff; }
.isis-ts-cal__lane-bar.is-c0 .isis-ts-cal__lane-label { color: #3730a3; }
.isis-ts-cal__lane-bar.is-c1 { background: #ccfbf1; }
.isis-ts-cal__lane-bar.is-c1 .isis-ts-cal__lane-label { color: #115e59; }
.isis-ts-cal__lane-bar.is-c2 { background: #fef3c7; }
.isis-ts-cal__lane-bar.is-c2 .isis-ts-cal__lane-label { color: #92400e; }
.isis-ts-cal__lane-bar.is-c3 { background: #ffe4e6; }
.isis-ts-cal__lane-bar.is-c3 .isis-ts-cal__lane-label { color: #9f1239; }
.isis-ts-cal__lane-bar.is-c4 { background: #e0f2fe; }
.isis-ts-cal__lane-bar.is-c4 .isis-ts-cal__lane-label { color: #075985; }
.isis-ts-cal__lane-bar.is-c5 { background: #ede9fe; }
.isis-ts-cal__lane-bar.is-c5 .isis-ts-cal__lane-label { color: #5b21b6; }

/* Légende. */
.isis-ts-cal__legend { display: flex; flex-wrap: wrap; gap: 0.9rem; padding: 0.3rem 0.1rem; }
.isis-ts-cal__legend-item { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.78rem; color: var(--isis-text-muted); }
.isis-ts-cal__dot { width: 10px; height: 10px; border-radius: 3px; }
.isis-ts-cal__dot.is-complet { background: var(--isis-success); }
.isis-ts-cal__dot.is-partiel { background: var(--isis-warning); }
.isis-ts-cal__dot.is-topoint { background: var(--isis-danger); }
.isis-ts-cal__dot.is-rejete  { background: var(--isis-danger); opacity: 0.6; }
.isis-ts-cal__dot.is-repos   { background: var(--isis-text-muted); opacity: 0.5; }

/* (Tâches planifiées désormais rendues en barres mini-Gantt — cf. .isis-ts-cal__bar.) */

/* ── Carte flotte gespark (géoloc temps réel, 0333) ───────────────────────── */
.isis-fleet-map {
    display: grid;
    grid-template-columns: 1fr 320px;
    gap: 1rem;
    align-items: stretch;
    min-height: 0;
}
.isis-fleet-map__canvas { min-width: 0; border-radius: 10px; overflow: hidden; box-shadow: var(--isis-elevation-1); }
.isis-fleet-map__list {
    overflow-y: auto;
    max-height: 68vh;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: 10px;
}
.isis-fleet-list { list-style: none; margin: 0; padding: 0; }
.isis-fleet-list__item {
    display: flex; gap: 0.6rem; align-items: flex-start;
    padding: 0.6rem 0.75rem; cursor: pointer;
    border-bottom: 1px solid var(--isis-border-soft, var(--isis-border));
}
.isis-fleet-list__item:hover { background: var(--isis-surface-alt); }
.isis-fleet-list__item:focus-visible {
    outline: none;
    box-shadow: inset 3px 0 0 0 var(--isis-current-mod, var(--isis-accent));
    background: var(--isis-surface-alt);
}
.isis-fleet-list__dot {
    width: 10px; height: 10px; border-radius: 50%; margin-top: 0.3rem; flex: 0 0 auto;
    box-shadow: inset 0 0 0 1px rgba(0,0,0,0.18);
}
.isis-fleet-list__dot.is-ok      { background: var(--isis-success); }
.isis-fleet-list__dot.is-pending { background: var(--isis-warning); }
.isis-fleet-list__dot.is-danger  { background: var(--isis-danger); }
.isis-fleet-list__dot.is-draft   { background: var(--isis-text-muted); }
.isis-fleet-list__main { min-width: 0; }
.isis-fleet-list__title { font-weight: 600; font-size: 0.85rem; }
.isis-fleet-list__sub { font-size: 0.8rem; color: var(--isis-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-fleet-list__meta { font-size: 0.72rem; color: var(--isis-text-muted); margin-top: 0.1rem; }

@media (max-width: 1100px) {
    .isis-fleet-map { grid-template-columns: 1fr; }
    .isis-fleet-map__list { max-height: 32vh; }
}

/* ============================================================================
   Onglet Analyse pivot — factures émises (/gescompta/factures/emises)
   Cadrage : docs/gescompta-pivot-analyse-cadrage.md
   ============================================================================ */
.isis-tabs--page {
    margin: 0.25rem 0 0.5rem;
}

.isis-pivot-tab-panel {
    display: flex;
    flex-direction: column;
    min-height: 0;
    padding-top: 0.25rem;
}

.isis-pivot-analyse {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    min-height: 0;
}

.isis-pivot-analyse__toolbar {
    display: flex;
    align-items: flex-end;
    flex-wrap: wrap;
    gap: 1rem;
    padding: 0.75rem 1rem;
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius, 8px);
    box-shadow: var(--isis-elevation-1);
}

.isis-pivot-analyse__field {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.isis-pivot-analyse__field label {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--isis-text-muted);
}

.isis-pivot-analyse__hint {
    flex: 1 1 240px;
    align-self: center;
    font-size: 0.82rem;
    color: var(--isis-text-muted);
}

.isis-pivot-analyse__state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 3rem 1rem;
    text-align: center;
    color: var(--isis-text-muted);
    background: var(--isis-surface);
    border: 1px dashed var(--isis-border);
    border-radius: var(--isis-radius, 8px);
}

.isis-pivot-analyse__state strong {
    color: var(--isis-text);
}

/* ── Lot 1 — File comptable « À facturer » (handoff commande → facturation) ── */
.isis-grid--billing-worklist .isis-grid__head,
.isis-grid--billing-worklist .isis-grid__row {
    display: grid;
    grid-template-columns:
        60px                     /* Status PV */
        120px                    /* N° */
        minmax(180px, 1.4fr)     /* Client + intitulé */
        minmax(120px, 1fr)       /* Structure */
        110px                    /* Pile */
        130px                    /* Total HT */
        130px;                   /* Reste */
    align-items: center;
}

.isis-grid--billing-devis .isis-grid__head,
.isis-grid--billing-devis .isis-grid__row {
    display: grid;
    grid-template-columns:
        120px                    /* N° */
        minmax(180px, 1.6fr)     /* Client + intitulé */
        minmax(140px, 1fr)       /* Structure */
        140px;                   /* Montant HT */
    align-items: center;
}

.isis-grid--billing-echeance .isis-grid__head,
.isis-grid--billing-echeance .isis-grid__row {
    display: grid;
    grid-template-columns:
        130px                    /* Commande */
        minmax(180px, 1.6fr)     /* Échéance (libellé) */
        minmax(140px, 1fr)       /* Client */
        140px;                   /* Montant HT */
    align-items: center;
}

.isis-billing-liv {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.6rem;
    padding: 0.45rem 0;
    border-bottom: 1px solid var(--isis-border);
}

.isis-billing-liv:last-child {
    border-bottom: none;
}

.isis-billing-liv__id {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-variant-numeric: tabular-nums;
}

.isis-billing-liv__hint {
    font-size: 0.8rem;
    color: var(--isis-text-muted);
    margin-bottom: 0.5rem;
    line-height: 1.35;
}

/* ════════════════════════════════════════════════════════════════════════
   ISIS v2 « Instrument » — PROMU GLOBAL le 2026-06-04 dans :root (canvas cool
   near-white, accent pétrole, encre froide, hairlines, rayons resserrés).
   Le bloc de tokens scopé .isis-cmd-v2 a donc été supprimé (redondant).
   La classe .isis-cmd-v2 reste sur les 2 pages gesproj pour les quelques
   touches structurelles ci-dessous + la grille Pilotage / les sous-onglets.
   ════════════════════════════════════════════════════════════════════════ */

/* Mono tabulaire sur les valeurs KPI — signal « instrument » promu global. */
.isis-kpi-card__value {
    font-family: 'Geist Mono', ui-monospace, monospace;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.01em;
}
/* En-têtes de grille gesproj : tracking un peu plus large (scan de colonnes). */
.isis-cmd-v2 .isis-grid__head { letter-spacing: .05em; }

/* Sous-onglets — regroupement 13→6 onglets de la fiche commande (2026-06-04).
   Rendus sous la barre de 6 groupes ; n'apparaissent que pour les groupes
   multi-feuilles. Pilotés par _tab (la feuille), panneaux inchangés. */
.isis-subtabs {
    display: flex;
    gap: 0.25rem;
    flex-wrap: wrap;
    align-items: center;
    padding: 0.55rem 1rem 0.45rem;
    flex: 0 0 auto;
    border-bottom: 1px solid var(--isis-border);
    margin-bottom: 0.5rem;
}
.isis-subtab {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    border: 0;
    background: transparent;
    padding: 0.4rem 0.75rem;
    border-radius: var(--isis-radius-sm);
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--isis-text-muted);
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease;
}
.isis-subtab:hover { color: var(--isis-text); background: var(--isis-surface-alt); }
.isis-subtab.is-active {
    background: var(--isis-current-mod-soft);
    color: var(--isis-current-mod);
    font-weight: 600;
}
.isis-subtab:focus-visible { outline: 2px solid var(--isis-current-mod); outline-offset: 1px; }

/* Toolbar fiche — indicateur d'étape sans action (ex-style inline opacity/cursor). */
.isis-rich-toolbar__btn--hint { opacity: 0.75; cursor: default; }
.isis-rich-toolbar__btn--hint:hover { border-color: var(--isis-border); color: var(--isis-text-soft); box-shadow: none; }

/* Toolbar fiche — menu « Plus » (refonte 2026-06-04) : lignes d'actions dans le
   panneau dropdown réutilisé (.isis-toolbar-dropdown__panel). */
.isis-toolbar-menu { display: flex; flex-direction: column; gap: 2px; min-width: 230px; }
.isis-toolbar-menu__item {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    width: 100%;
    height: 34px;
    padding: 0 0.6rem;
    border: 0;
    background: transparent;
    border-radius: var(--isis-radius-sm);
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--isis-text);
    text-align: left;
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease;
}
.isis-toolbar-menu__item:hover { background: var(--isis-surface-alt); }
.isis-toolbar-menu__item:focus-visible { outline: 2px solid var(--isis-current-mod); outline-offset: -1px; }
.isis-toolbar-menu__item:disabled { opacity: 0.5; cursor: default; }
.isis-toolbar-menu__item--danger { color: var(--isis-danger); }
.isis-toolbar-menu__item--danger:hover { background: var(--isis-danger-soft); }
.isis-toolbar-menu__sep { border: 0; border-top: 1px solid var(--isis-border); margin: 0.35rem 0; }

/* ── Polices d'assurance — onglet « Biens couverts » (migration 0353) ─────── */
.isis-police-biens { display: flex; flex-direction: column; gap: 0.85rem; }
.isis-police-summary {
    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.6rem;
    padding: 0.85rem 1rem; border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius); background: var(--isis-surface-alt);
}
.isis-police-summary__label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--isis-text-muted); }
.isis-police-summary__value { font-size: 1.05rem; font-weight: 600; color: var(--isis-text); margin-top: 0.15rem; font-variant-numeric: tabular-nums; }
.isis-police-summary__value.is-ok { color: var(--isis-success); }
.isis-police-summary__value.is-warning { color: var(--isis-warning); }
.isis-police-summary__value.is-danger { color: var(--isis-danger); }
.isis-police-summary__hint { font-size: 0.72rem; color: var(--isis-text-muted); margin-top: 0.1rem; }
.isis-police-biens__toolbar { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.isis-grid--police-biens .isis-grid__head,
.isis-grid--police-biens .isis-grid__row {
    grid-template-columns: 64px minmax(180px, 1.4fr) 150px 150px 110px 90px;
}
.isis-module-tag {
    display: inline-block; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.04em;
    padding: 0.1rem 0.4rem; border-radius: var(--isis-radius-sm);
    background: var(--isis-surface-alt); color: var(--isis-text-muted); border: 1px solid var(--isis-border);
}

/* ── Badge « Couverture d'assurance » sur fiche équipement (migration 0353) ── */
.isis-assurance-badge {
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius);
    background: var(--isis-surface); padding: 0.7rem 0.9rem; margin-bottom: 0.85rem;
}
.isis-assurance-badge__head {
    display: flex; align-items: center; gap: 0.4rem;
    font-size: 0.78rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em;
    color: var(--isis-text-muted); margin-bottom: 0.4rem;
}
.isis-assurance-badge__head .rz-icon, .isis-assurance-badge__head i { font-size: 18px; color: var(--isis-success); }
.isis-assurance-badge__empty { font-size: 0.82rem; color: var(--isis-text-muted); }
.isis-assurance-badge__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.3rem; }
.isis-assurance-badge__row {
    display: grid; grid-template-columns: minmax(70px, auto) 1fr auto auto; gap: 0.6rem; align-items: center;
    padding: 0.35rem 0.5rem; border-radius: var(--isis-radius-sm); cursor: pointer;
    border: 1px solid transparent;
}
.isis-assurance-badge__row:hover { background: var(--isis-surface-alt); border-color: var(--isis-border); }
.isis-assurance-badge__num { font-weight: 600; font-variant-numeric: tabular-nums; color: var(--isis-text); }
.isis-assurance-badge__title { color: var(--isis-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isis-assurance-badge__fin { font-size: 0.78rem; color: var(--isis-text-muted); }
.isis-assurance-badge__prime { font-size: 0.82rem; font-variant-numeric: tabular-nums; color: var(--isis-text-muted); }

/* ── Polish audit assurance (alignements colonnes + focus badge + utilitaire) ── */
.isis-grid--police-biens .isis-grid__head > div:nth-child(3),
.isis-grid--police-biens .isis-grid__head > div:nth-child(4),
.isis-grid--police-biens .isis-grid__head > div:nth-child(6),
.isis-grid--police-biens .isis-grid__row > div:nth-child(3),
.isis-grid--police-biens .isis-grid__row > div:nth-child(4),
.isis-grid--police-biens .isis-grid__row > div:nth-child(6) {
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.isis-assurance-badge__row:focus-visible {
    outline: 2px solid var(--isis-current-mod, var(--isis-accent));
    outline-offset: -2px;
    background: var(--isis-surface-alt);
}
.isis-mb-sm { margin-bottom: 0.75rem; }

/* ── File « À facturer » — bandeau financier + badge maturité (Lot 1) ── */
.isis-billing-money {
    display: flex; align-items: center; flex-wrap: wrap; gap: 0.85rem;
    padding: 0.5rem 0.85rem;
    background: var(--isis-surface-alt);
    border: 1px solid var(--isis-border);
    border-radius: var(--isis-radius);
    margin-bottom: 0.5rem;
}
.isis-billing-money__label { display: flex; align-items: center; gap: 0.4rem; font-size: 0.8rem; font-weight: 600; color: var(--isis-text-muted); }
.isis-billing-money__amount { font-variant-numeric: tabular-nums; font-size: 1.05rem; font-weight: 700; color: var(--isis-text); }
.isis-billing-money__devise { font-size: 0.72rem; font-weight: 600; color: var(--isis-text-muted); margin-left: 2px; }

/* Badge maturité (1 voyant par ligne) */
.isis-mat-badge { display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.72rem; font-weight: 600; padding: 1px 7px; border-radius: 999px; white-space: nowrap; }
.isis-mat-badge::before { content: ""; width: 7px; height: 7px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0,0,0,0.18); }
.isis-mat-badge--ok { background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface)); color: var(--isis-success); }
.isis-mat-badge--ok::before { background: var(--isis-success); }
.isis-mat-badge--warn { background: color-mix(in srgb, var(--isis-warning) 16%, var(--isis-surface)); color: var(--isis-warning); }
.isis-mat-badge--warn::before { background: var(--isis-warning); }
.isis-mat-badge--blocked { background: color-mix(in srgb, var(--isis-danger) 12%, var(--isis-surface)); color: var(--isis-danger); }
.isis-mat-badge--blocked::before { background: var(--isis-danger); }

/* Retard d'échéance */
.isis-billing-overdue { color: var(--isis-danger); font-weight: 600; }
.isis-billing-soon { color: var(--isis-warning); font-weight: 600; }
.isis-billing-cell-head { display: flex; align-items: center; gap: 0.45rem; flex-wrap: wrap; }

/* File « À facturer » — filtres avancés + tri (Lot 3) */
.isis-filter-bar--adv { margin-top: -0.15rem; gap: 0.5rem; flex-wrap: wrap; align-items: center; }
.isis-filter-select { height: 30px; border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 6px); background: var(--isis-surface); color: var(--isis-text); font-size: 0.82rem; padding: 0 0.5rem; max-width: 210px; }
.isis-filter-bar__sort { display: inline-flex; align-items: center; gap: 0.25rem; flex-wrap: wrap; }
.isis-filter-bar__sort-label { font-size: 0.78rem; font-weight: 600; color: var(--isis-text-muted); margin-right: 0.15rem; }
.isis-chip-sm { font-size: 0.76rem; font-weight: 600; padding: 2px 9px; border-radius: 999px; border: 1px solid var(--isis-border); background: var(--isis-surface); color: var(--isis-text-muted); cursor: pointer; }
.isis-chip-sm:hover { background: var(--isis-surface-alt); }
.isis-chip-sm.is-active { background: var(--isis-current-mod, var(--isis-accent)); color: #fff; border-color: transparent; }

/* File « À facturer » — barre de facturation en lot (Lot 2) */
.isis-batch-bar { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; padding: 0.5rem 0.85rem; margin-bottom: 0.4rem; background: color-mix(in srgb, var(--isis-mod-gescompta, #6d28d9) 8%, var(--isis-surface)); border: 1px solid var(--isis-border); border-radius: var(--isis-radius); }
.isis-batch-bar__count { font-weight: 700; }
.isis-grid__col-check { width: 34px; display: flex; align-items: center; justify-content: center; }

/* ── Sinistres transverses — grille (gesst_sinistre, V2 assurance 0354) ────── */
.isis-grid--sinistre .isis-grid__head,
.isis-grid--sinistre .isis-grid__row {
    grid-template-columns: 110px 130px minmax(140px, 1.4fr) 110px 120px 90px;
}
.isis-grid--sinistre.with-conducteur .isis-grid__head,
.isis-grid--sinistre.with-conducteur .isis-grid__row {
    grid-template-columns: 100px 120px minmax(140px, 1fr) minmax(120px, 1fr) 110px 110px 90px;
}
.isis-grid--sinistre .isis-grid__head > div:nth-last-child(2),
.isis-grid--sinistre .isis-grid__row > div:nth-last-child(2) { font-variant-numeric: tabular-nums; }
.isis-batch-bar__hint { font-size: 0.8rem; color: var(--isis-text-muted); }

/* ── Quittances / échéancier de prime (V2 assurance 0355) ─────────────────── */
.isis-grid--quittance .isis-grid__head,
.isis-grid--quittance .isis-grid__row {
    grid-template-columns: minmax(110px, 1fr) 160px 140px 100px 120px 110px;
}
.isis-grid--quittance .isis-grid__head > div:nth-child(3),
.isis-grid--quittance .isis-grid__row > div:nth-child(3) { font-variant-numeric: tabular-nums; }

/* ── Onglet Communication (marché & commande) — branded depth ──────────── */
.isis-comm-actions { display: flex; gap: 0.5rem; justify-content: flex-end; margin-bottom: 1rem; }
.isis-comm-tab { display: flex; flex-direction: column; gap: 1.5rem; }

/* Section = carte élevée, en-tête teinté module */
.isis-comm-section {
    border-radius: var(--isis-radius-lg);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    box-shadow: var(--isis-elevation-1);
    overflow: hidden;
    transition: box-shadow 0.18s ease;
}
.isis-comm-section:hover { box-shadow: var(--isis-elevation-hover); }
.isis-comm-section__title {
    margin: 0; padding: 0.7rem 1.1rem;
    font-size: 0.98rem; font-weight: 600; color: var(--isis-text);
    display: flex; align-items: center; gap: 0.6rem;
    background: linear-gradient(180deg,
        color-mix(in srgb, var(--isis-current-mod) 9%, var(--isis-surface)),
        var(--isis-surface));
    border-bottom: 1px solid var(--isis-border);
}
.isis-comm-section__icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 28px; height: 28px; border-radius: 50%;
    background: var(--isis-current-mod-soft);
    color: var(--isis-current-mod);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--isis-current-mod) 20%, transparent);
}
.isis-comm-section__icon .rzi, .isis-comm-section__icon i { font-size: 17px; }

.isis-comm-section__body { display: grid; grid-template-columns: minmax(230px, 1fr) 2fr; gap: 1.5rem; align-items: start; padding: 1.1rem; }

/* Bloc interlocuteur principal = panneau teinté « primaire » */
.isis-comm-principal {
    display: flex; flex-direction: column; gap: 0.4rem;
    background: color-mix(in srgb, var(--isis-current-mod) 5%, var(--isis-surface));
    border: 1px solid color-mix(in srgb, var(--isis-current-mod) 16%, var(--isis-border));
    border-radius: var(--isis-radius); padding: 0.85rem;
}
.isis-comm-principal .label {
    font-size: 0.74rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em;
    color: color-mix(in srgb, var(--isis-current-mod) 65%, var(--isis-text-muted));
}

.isis-comm-copies { display: flex; flex-direction: column; gap: 0.5rem; }
.isis-comm-copies__title { font-size: 0.74rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; color: var(--isis-text-muted); }
.isis-comm-copies__empty {
    font-size: 0.85rem; color: var(--isis-text-muted); font-style: italic;
    padding: 0.7rem 0.8rem; background: var(--isis-surface-alt); border-radius: var(--isis-radius-sm);
}

/* Ligne personne = carte avec avatar + hover */
.isis-comm-person {
    display: grid; grid-template-columns: auto minmax(140px, 1.3fr) 2fr auto auto;
    gap: 0.65rem; align-items: center;
    padding: 0.5rem 0.7rem; border-radius: var(--isis-radius-sm);
    background: var(--isis-surface);
    border: 1px solid var(--isis-border);
    box-shadow: var(--isis-elevation-1);
    transition: box-shadow 0.15s ease;
}
.isis-comm-person:hover { box-shadow: var(--isis-elevation-hover); }
.isis-comm-person__avatar {
    display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; border-radius: 50%;
    font-size: 0.72rem; font-weight: 700; letter-spacing: 0.02em;
    background: var(--isis-current-mod-soft);
    color: color-mix(in srgb, var(--isis-current-mod) 78%, var(--isis-text));
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--isis-current-mod) 18%, transparent);
}
.isis-comm-person__id { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
.isis-comm-person__name { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.isis-comm-person__email { color: var(--isis-text-muted); font-size: 0.8rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.isis-comm-person__cats { display: flex; flex-wrap: wrap; gap: 0.3rem; }
.isis-comm-person__cats .isis-chip {
    background: var(--isis-current-mod-soft);
    color: color-mix(in srgb, var(--isis-current-mod) 72%, var(--isis-text));
    border: 1px solid color-mix(in srgb, var(--isis-current-mod) 20%, transparent);
}

/* Zone d'ajout = sous-panneau teinté, séparé */
.isis-comm-add {
    display: flex; flex-direction: column; gap: 0.65rem; margin-top: 0.5rem;
    background: var(--isis-surface-alt);
    border: 1px dashed color-mix(in srgb, var(--isis-current-mod) 28%, var(--isis-border));
    border-radius: var(--isis-radius); padding: 0.85rem;
}
.isis-comm-add__cats { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; }
@media (max-width: 800px) { .isis-comm-section__body { grid-template-columns: 1fr; } }

/* ───────────────────────── gesqhse — risques & matrice de criticité ───────────────────────── */
.isis-mono { font-family: var(--isis-font-mono, 'Geist Mono', monospace); font-variant-numeric: tabular-nums; }

.isis-grid--gesqhse-risque .isis-grid__head,
.isis-grid--gesqhse-risque .isis-grid__row {
    grid-template-columns: 110px 130px minmax(220px, 1.4fr) 150px 130px 110px 112px;
}

.isis-crit-badge {
    display: inline-flex; align-items: center; gap: 0.3rem;
    padding: 0.1rem 0.5rem; border-radius: var(--isis-radius-pill, 999px);
    font-size: 0.78rem; font-weight: 600; font-variant-numeric: tabular-nums;
    border: 1px solid transparent; white-space: nowrap;
}
.isis-crit-badge.is-ok      { background: color-mix(in srgb, var(--isis-success) 14%, var(--isis-surface)); color: var(--isis-success); border-color: color-mix(in srgb, var(--isis-success) 30%, transparent); }
.isis-crit-badge.is-pending { background: color-mix(in srgb, var(--isis-accent) 12%, var(--isis-surface));  color: var(--isis-accent);  border-color: color-mix(in srgb, var(--isis-accent) 28%, transparent); }
.isis-crit-badge.is-warning { background: color-mix(in srgb, var(--isis-warning) 16%, var(--isis-surface)); color: var(--isis-warning); border-color: color-mix(in srgb, var(--isis-warning) 34%, transparent); }
.isis-crit-badge.is-danger  { background: color-mix(in srgb, var(--isis-danger) 14%, var(--isis-surface));  color: var(--isis-danger);  border-color: color-mix(in srgb, var(--isis-danger) 32%, transparent); }
.isis-crit-badge.is-draft   { background: var(--isis-surface-alt); color: var(--isis-text-muted); }

/* Matrice cliquable probabilité × impact */
.isis-matrice-grid {
    display: grid; grid-template-columns: auto repeat(5, minmax(44px, 1fr));
    gap: 4px; margin: 0.25rem 0 0.5rem;
    max-width: 540px; /* sinon les cellules aspect-ratio 1/1 deviennent d'énormes carrés sur une page pleine largeur */
}
.isis-matrice-grid__rowlabel,
.isis-matrice-grid__collabel { font-size: 0.72rem; color: var(--isis-text-muted); display: flex; align-items: center; }
.isis-matrice-grid__rowlabel { justify-content: flex-end; padding-right: 0.4rem; text-align: right; }
.isis-matrice-grid__collabel { justify-content: center; text-align: center; padding-top: 0.2rem; }
.isis-matrice-cell {
    aspect-ratio: 1 / 1; min-height: 38px;
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 5px);
    font-size: 0.82rem; font-weight: 600; font-variant-numeric: tabular-nums;
    color: var(--isis-text); cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    transition: transform 0.08s ease, box-shadow 0.08s ease;
}
.isis-matrice-cell:hover { transform: scale(1.04); }
.isis-matrice-cell:focus-visible { outline: 2px solid var(--isis-current-mod, var(--isis-accent)); outline-offset: 1px; }
.isis-matrice-cell.is-selected { box-shadow: 0 0 0 2px var(--isis-current-mod, var(--isis-accent)); border-color: var(--isis-current-mod, var(--isis-accent)); }
.isis-matrice-result { display: flex; align-items: center; gap: 0.6rem; margin-top: 0.35rem; font-size: 0.85rem; }

.isis-grid--gesqhse-action .isis-grid__head,
.isis-grid--gesqhse-action .isis-grid__row {
    grid-template-columns: minmax(260px, 1fr) 130px 130px 100px;
}
.isis-grid--gesqhse-categorie .isis-grid__head,
.isis-grid--gesqhse-categorie .isis-grid__row {
    grid-template-columns: minmax(220px, 1.4fr) 160px 90px 100px 100px;
}
.isis-grid--gesqhse-probleme .isis-grid__head,
.isis-grid--gesqhse-probleme .isis-grid__row {
    grid-template-columns: 110px 130px minmax(200px, 1.3fr) 110px 120px 90px 112px;
}
.isis-grid--gesqhse-probleme-suivi .isis-grid__head,
.isis-grid--gesqhse-probleme-suivi .isis-grid__row {
    grid-template-columns: 110px 130px minmax(220px, 1.4fr) 110px 120px 110px 90px;
}
.isis-matrice-legend { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.75rem; }

/* Vue matrice / cartographie des risques (pastilles + panneau latéral) */
.isis-riskmap__grid {
    display: grid; grid-template-columns: auto repeat(5, minmax(76px, 1fr)); gap: 5px;
}
.isis-riskmap__rowlabel,
.isis-riskmap__collabel { font-size: 0.72rem; color: var(--isis-text-muted); display: flex; align-items: center; }
.isis-riskmap__rowlabel { justify-content: flex-end; padding-right: 0.4rem; text-align: right; }
.isis-riskmap__collabel { justify-content: center; text-align: center; padding-top: 0.2rem; }
.isis-riskmap__cell {
    min-height: 84px; padding: 4px; cursor: pointer; text-align: left;
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 5px);
    transition: box-shadow 0.08s ease;
}
.isis-riskmap__cell:hover { box-shadow: 0 0 0 1px var(--isis-current-mod, var(--isis-accent)); }
.isis-riskmap__cell:focus-visible { outline: 2px solid var(--isis-current-mod, var(--isis-accent)); outline-offset: 1px; }
.isis-riskmap__cell.is-selected { box-shadow: 0 0 0 2px var(--isis-current-mod, var(--isis-accent)); border-color: var(--isis-current-mod, var(--isis-accent)); }
.isis-riskmap__pins { display: flex; flex-wrap: wrap; gap: 3px; align-content: flex-start; }
.isis-riskmap__pin {
    display: inline-flex; align-items: center; justify-content: center;
    width: 24px; height: 24px; border-radius: 50%;
    background: var(--isis-surface); border: 1px solid var(--isis-border);
    font-size: 0.62rem; font-weight: 700; color: var(--isis-text);
}
.isis-riskmap__more { display: inline-flex; align-items: center; font-size: 0.66rem; font-weight: 600; color: var(--isis-text-muted); padding: 0 4px; }
.isis-riskmap__footer { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; margin-top: 0.6rem; }
.isis-riskmap__axislabel { font-size: 0.72rem; color: var(--isis-text-muted); }
.isis-riskmap-list { display: flex; flex-direction: column; gap: 0.35rem; }
.isis-riskmap-item {
    display: flex; align-items: center; gap: 0.5rem; width: 100%; text-align: left;
    padding: 0.4rem 0.5rem; cursor: pointer;
    border: 1px solid var(--isis-border); border-radius: var(--isis-radius-sm, 5px); background: var(--isis-surface);
}
.isis-riskmap-item:hover { background: var(--isis-surface-alt); }
.isis-riskmap-item__titre { flex: 1; font-size: 0.85rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Gantt commande (onglet Tâches) — Axe A : wrapper largeur. La hauteur « occupe le reste de la page
   sans scroll » est posée PRÉCISÉMENT par JS (isisGanttSplit.fitHeight : viewport − top réel du Gantt
   − réserve pour l'aide+légende dessous). Ci-dessous = repli CSS avant que le JS ne s'exécute (évite
   un effondrement de la timeline interne au 1er paint). La hauteur DEFINITE est requise (pas 100%). */
.isis-gantt-host { width: 100%; max-width: 100%; min-width: 0; }
.isis-gantt-host .rz-gantt { height: calc(100vh - 420px); min-height: 340px; }

/* Gantt commande via amCharts (CommandeGanttView) — hauteur fixée par le JS (lignes × ~38px). */
.isis-amgantt-host { width: 100%; max-width: 100%; min-width: 0; min-height: 180px; }
