/*
 * ============================================================
 *  BATIFREE LIGHT THEME
 *  DevExpress XAF Blazor v25.x — Fluent mode
 *
 *  File structure
 *  ──────────────
 *  1.   Design tokens (Batifree palette)
 *  2.   DevExpress / Bootstrap variable overrides
 *  2b.  DXDS color token mapping (full 172-token set)
 *  3.   Base typography
 *  4.   Global button reset
 *  5.   Primary button
 *  5b.  Toolbar outline-primary → promoted to filled primary
 *  6.   Secondary button
 *  7.   Tertiary button
 *  8.   Danger button
 *  9.   Icon-only buttons
 *  10.  XAF toolbar
 *  11.  Tabs / detail-view nav
 *  12.  Grid (DataGrid) + checkboxes
 *  13b. Tree List
 *  13c. Grid ListView (row height / checkbox alignment)
 *  13.  Inputs / Search / Editors
 *  14.  Page title / top bar
 *  15.  Focus ring
 *  16.  Modal / popup
 *  17.  Detail View (object forms)
 *  18.  Pager
 *  19.  Nav-ribbon (DxTabs)
 *  20.  Icon overrides (DevExpress native icons)
 *  20b. RichText popup renderer
 *  21.  Stat-card PropertyEditor
 *  22.  Image PropertyEditor — fill group + center icon
 *  22b. Popup Facturer le devis (VenteConfirmDvsParameters_DetailView)
 *  23.  Card Stack — stacked-card navigation for address tabs
 *  24.  Auto-height popup ListView
 *  25.  Report Viewer toolbar
 *  26.  Situations — origin grid search box
 *
 *  Note: Sidebar navigation → sidebar.css (dedicated file)
 *  Note: Dark mode → batifree-dark.css (token overrides only, loaded after this file)
 *
 *  Override strategy for DevExpress components
 *  ────────────────────────────────────────────
 *  DevExpress Fluent theme relies on a two-level CSS variable chain:
 *    component variable  →  dxds token  →  value
 *  Adding !important on a property such as background-color has NO
 *  effect when the component reads its color from a CSS variable at
 *  render time.  The only reliable approach is to re-declare the
 *  component-level CSS variable on a scoped selector so the cascade
 *  resolves to our value first.
 *
 *  Example (grid selected row):
 *    core.min.css sets --dxbl-grid-selection-bg: var(--dxds-color-surface-primary-deep-rest)
 *    → we override --dxbl-grid-selection-bg directly on .dxbl-grid
 *
 *  When in doubt, search core.min.css for the component class and
 *  trace back the variable chain before writing overrides.
 * ============================================================
 */

@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap');


/* ============================================================
   1. DESIGN TOKENS — Batifree palette
   All colours, shadows, radii and button metrics live here.
   Every section below references these variables; raw hex
   values should never appear outside of this block.
   ============================================================ */
:root,
.dxbl-theme-fluent-mode-light,
.dxbl-theme-batifree-mode-light,
[data-bs-theme=dark],
.dxbl-theme-fluent-mode-dark,
.dxbl-theme-dark {
    /* ── Brand — Primary (orange) ───────────────────────────── */
    --batifree-primary-10: #fff2eb;
    --batifree-primary-20: #ffe4d6;
    --batifree-primary-30: #ffc9ad;
    --batifree-primary-40: #ffbb99;
    --batifree-primary-50: #FFA070;
    --batifree-primary-60: #FF925C;
    --batifree-primary-70: #FF8547;
    --batifree-primary-80: #ff7725;
    --batifree-primary-90: #ff640a;
    --batifree-primary-100: #ff5a00;
    --batifree-primary-110: #e05200;
    --batifree-primary-120: #c24700;
    --batifree-primary-130: #a33d00;
    --batifree-primary-140: #8a3300;
    --batifree-primary-160: #6b2700;
    /* ── Brand — Secondary (violet) ─────────────────────────── */
    --batifree-secondary-10: #eae8ee;
    --batifree-secondary-20: #dfdce5;
    --batifree-secondary-30: #ccc8d5;
    --batifree-secondary-40: #b4adc2;
    --batifree-secondary-50: #a099b0;
    --batifree-secondary-60: #8c869e;
    --batifree-secondary-70: #7e7295;
    --batifree-secondary-80: #73688d;
    --batifree-secondary-90: #6d6386;
    --batifree-secondary-100: #695f81;
    --batifree-secondary-110: #5e5475;
    --batifree-secondary-120: #534a6a;
    /* ── Metalic Grey ───────────────────────────────────────── */
    --batifree-metalic-grey-10: #EAE8EE;
    --batifree-metalic-grey-20: #DFDCE5;
    --batifree-metalic-grey-30: #C9C4D4;
    --batifree-metalic-grey-40: #B4ADC2;
    --batifree-metalic-grey-50: #A9A1BA;
    --batifree-metalic-grey-60: #9E95B1;
    --batifree-metalic-grey-70: #938AA8;
    --batifree-metalic-grey-80: #887EA0;
    --batifree-metalic-grey-90: #7D7297;
    --batifree-metalic-grey-100: #73688D;
    --batifree-metalic-grey-110: #695F81;
    /* ── Neutral (greyscale) ────────────────────────────────── */
    --batifree-neutral-0: #fffefd;
    --batifree-neutral-5: #FCFCFC;
    --batifree-neutral-10: #f9f9f9;
    --batifree-neutral-20: #f3f3f3;
    --batifree-neutral-30: #ebebea;
    --batifree-neutral-40: #e1e1e0;
    --batifree-neutral-50: #D7D7D5;
    --batifree-neutral-60: #cdcdcb;
    --batifree-neutral-70: #b9b9b6;
    --batifree-neutral-80: #91918d;
    --batifree-neutral-90: #686864;
    --batifree-neutral-100: #535350;
    --batifree-neutral-110: #3e3e3c;
    --batifree-neutral-120: #2f2f2d;
    --batifree-neutral-130: #252523;
    --batifree-neutral-140: #1d1d1b;
    /* ── Accent ─────────────────────────────────────────────── */
    --batifree-dark-teal: #164147;
    /* ── Semantic — Danger ──────────────────────────────────── */
    --batifree-danger-10: #fceaea;
    --batifree-danger-20: #f7d0d0;
    --batifree-danger-40: #e99999;
    --batifree-danger-90: #be1010;
    --batifree-danger-110: #980c0c;
    --batifree-danger-130: #720808;
    /* ── Semantic — Info (bleu) ─────────────────────────────── */
    --batifree-info-10: #f0f8fe;
    --batifree-info-20: #e8f4fd;
    --batifree-info-30: #e0f1fc;
    --batifree-info-40: #cce5f8;
    --batifree-info-50: #aad2f3;
    --batifree-info-90: #0078d4;
    --batifree-info-100: #005fa3;
    --batifree-info-110: #004a80;
    /* ── Semantic — Success (vert) ──────────────────────────── */
    --batifree-success-10: #f0faf2;
    --batifree-success-20: #e6f4ea;
    --batifree-success-30: #dff0e3;
    --batifree-success-40: #c8e6ce;
    --batifree-success-50: #a3d6ab;
    --batifree-success-60: #86efac;
    --batifree-success-90: #1a7f37;
    --batifree-success-100: #146329;
    --batifree-success-110: #0e4a1e;
    /* ── Semantic — Warning (ambre) ─────────────────────────── */
    --batifree-warning-10: #fffde7;
    --batifree-warning-20: #fff8e1;
    --batifree-warning-30: #ffecb3;
    --batifree-warning-40: #ffe082;
    --batifree-warning-90: #b45309;
    --batifree-warning-100: #92400e;
    --batifree-warning-110: #78350f;
    /* ── Shadows ────────────────────────────────────────────── */
    --batifree-shadow-sm: 0 4px 10px rgba(0, 0, 0, 0.03);
    --batifree-shadow-focus: 0 0 0 2px rgba(255, 90, 0, 0.20);
    /* ── Radii ──────────────────────────────────────────────── */
    --batifree-radius-sm: 2px;
    --batifree-radius-md: 4px;
    --batifree-radius-lg: 6px;
    /* ── Card gap (visible gap between 2 adjacent cards = 2 × --batifree-card-gap) ── */
    --batifree-card-gap: 6px;
    /* ── Typography ─────────────────────────────────────────── */
    --batifree-font: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    /* ── Button metrics ─────────────────────────────────────── */
    --batifree-btn-font-size: 14px;
    --batifree-btn-font-weight: 400;
    --batifree-btn-padding-y: 7px;
    --batifree-btn-padding-x: 12px;
    --batifree-btn-gap: 4px;
    --batifree-btn-icon-size: 19px;
    --batifree-btn-icon-only-size: 33px;
    --batifree-btn-icon-only-size-sm: 26px;
    /* Compact mode (dxbl-sm) button metrics — Figma "small" size */
    --batifree-btn-sm-font-size: 12px;
    --batifree-btn-sm-padding-y: 5px;
    --batifree-btn-sm-padding-x: 10px;
    --batifree-btn-sm-line-height: 16px;
    /* ── Placeholder (Figma node 26-273) ───────────────────────── */
    --placeholder-enable-bg: var(--batifree-neutral-10);
    --placeholder-enable-border: var(--batifree-neutral-30);
    --placeholder-enable-content: var(--batifree-neutral-80);
    --placeholder-hover-bg: var(--batifree-neutral-20);
    --placeholder-hover-border: var(--batifree-neutral-40);
    --placeholder-hover-content: var(--batifree-neutral-80);
    --placeholder-active-bg: var(--batifree-neutral-10);
    --placeholder-active-border: var(--batifree-primary-100);
    --placeholder-active-content: var(--batifree-ink);
    --placeholder-disabled-bg: var(--batifree-neutral-30);
    --placeholder-disabled-border: var(--batifree-neutral-30);
    --placeholder-disabled-content: var(--batifree-neutral-70);
    /* ── Semantic aliases (neutral in light; redefined in batifree-dark.css) ── */
    --batifree-white: #fffefd;
    --batifree-solid-bg: #ffffff;
    --batifree-ink: var(--batifree-dark-teal);
    --batifree-ink-on-tint: var(--batifree-dark-teal);
    --batifree-ink-on-violet: var(--batifree-dark-teal);
    --batifree-text-strong: #1a1a1a;
    --batifree-filter-ink: brightness(0) saturate(100%) invert(17%) sepia(55%) saturate(415%) hue-rotate(143deg) brightness(120%) contrast(104%);
    --batifree-filter-disabled-primary: brightness(0) saturate(100%) invert(84%) sepia(23%) saturate(803%) hue-rotate(317deg) brightness(103%) contrast(101%);
    --batifree-filter-placeholder: brightness(0) saturate(0%) invert(57%);
    --batifree-filter-placeholder-active: brightness(0) saturate(100%) invert(22%) sepia(28%) saturate(665%) hue-rotate(155deg) brightness(93%) contrast(95%);
    --batifree-filter-placeholder-disabled: brightness(0) saturate(0%) invert(73%);
}


/* ============================================================
   2. DEVEXPRESS / BOOTSTRAP VARIABLE OVERRIDES
   Maps framework-level variables to Batifree tokens so that
   DevExpress components pick up brand colours automatically,
   reducing the number of component-level overrides needed.
   ============================================================ */
:root,
[data-bs-theme=light],
.dxbl-theme-fluent-mode-light,
[data-bs-theme=dark],
.dxbl-theme-fluent-mode-dark,
.dxbl-theme-dark {
    /* DevExpress design system */
    --dxds-font-family-sans-serif: var(--batifree-font);
    /* Font size — 14px everywhere (dxds tokens + component tokens) */
    --dxds-font-size-140: 14px;
    --dxds-font-size-base-md: 14px;
    --dxbl-grid-font-size: 14px;
    --dxbl-fl-font-size-m: 14px;
    --dxbl-fl-font-size: 14px;
    --dxbl-fl-caption-font-size-m: 14px;
    --dxbl-toolbar-font-size: 14px;
    --dxds-border-radius-20: var(--batifree-radius-sm);
    --dxds-border-radius-40: var(--batifree-radius-md);
    --dxds-spacing-30: 4px;
    --dxds-box-shadow-md: var(--batifree-shadow-sm);
    --dx-accent-color: var(--batifree-primary-100);
    --dx-accent-shadow-color: rgba(255, 90, 0, 0.30);
    /* Bootstrap colour system */
    --bs-primary: var(--batifree-primary-100);
    --bs-primary-rgb: 255, 90, 0;
    --bs-primary-text-emphasis: var(--batifree-primary-160);
    --bs-primary-bg-subtle: var(--batifree-primary-10);
    --bs-primary-border-subtle: var(--batifree-primary-30);
    --bs-secondary: var(--batifree-secondary-80);
    --bs-secondary-rgb: 115, 104, 141;
    --bs-secondary-text-emphasis: #3d3654;
    --bs-secondary-bg-subtle: var(--batifree-secondary-10);
    --bs-secondary-border-subtle: var(--batifree-secondary-40);
    --bs-danger: var(--batifree-danger-90);
    --bs-danger-rgb: 190, 16, 16;
    --bs-danger-text-emphasis: var(--batifree-danger-130);
    --bs-danger-bg-subtle: var(--batifree-danger-10);
    --bs-danger-border-subtle: var(--batifree-danger-20);
    --bs-light: var(--batifree-neutral-10);
    --bs-light-rgb: 250, 250, 250;
    --bs-dark: var(--batifree-dark-teal);
    --bs-dark-rgb: 22, 65, 71;
    /* Bootstrap body */
    --bs-body-font-family: var(--batifree-font);
    --bs-body-font-size: 1rem;
    --bs-body-color: var(--batifree-neutral-100);
    --bs-body-bg: var(--batifree-neutral-10);
    /* Bootstrap links / borders / radii */
    --bs-link-color: var(--batifree-primary-100);
    --bs-link-hover-color: var(--batifree-primary-110);
    --bs-border-color: var(--batifree-neutral-40);
    --bs-border-radius: var(--batifree-radius-md);
    --bs-border-radius-sm: var(--batifree-radius-sm);
    --bs-border-radius-lg: var(--batifree-radius-lg);
    --bs-focus-ring-color: rgba(255, 90, 0, 0.25);
    /* Bootstrap nav */
    --bs-nav-link-color: var(--batifree-neutral-100);
    --bs-nav-link-hover-color: var(--batifree-primary-100);
    --bs-nav-tabs-link-active-color: var(--batifree-primary-100);
    --bs-nav-tabs-link-active-bg: transparent;
    --bs-nav-tabs-border-color: var(--batifree-neutral-40);
}


/* ============================================================
   2b. DXDS COLOR TOKEN MAPPING — Full 172-token set
   These tokens are consumed by core.min.css and all DevExpress
   components. Defining them here upstream removes the need for
   many !important overrides later in the file.
   ============================================================ */
:root,
.dxbl-theme-fluent-mode-light,
[data-bs-theme=dark],
.dxbl-theme-fluent-mode-dark,
.dxbl-theme-dark {
    /* ── Surface — Neutral ──────────────────────────────────── */
    --dxds-color-surface-neutral-default-rest: var(--batifree-neutral-0);
    --dxds-color-surface-neutral-default-hovered: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-default-active: var(--batifree-neutral-30);
    --dxds-color-surface-neutral-default-selected: var(--batifree-primary-10);
    --dxds-color-surface-neutral-default-selected-hovered: var(--batifree-primary-20);
    --dxds-color-surface-neutral-default-disabled: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-default-inverted-rest: var(--batifree-dark-teal);
    --dxds-color-surface-neutral-subdued-rest: var(--batifree-neutral-10);
    --dxds-color-surface-neutral-subdued-hovered: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-subdued-active: var(--batifree-neutral-30);
    --dxds-color-surface-neutral-deep-rest: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-deep-hovered: var(--batifree-neutral-30);
    --dxds-color-surface-neutral-default-static-light-rest: var(--batifree-white);
    --dxds-color-surface-neutral-default-static-light-hovered: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-default-static-light-active: var(--batifree-neutral-30);
    --dxds-color-surface-neutral-default-static-light-disabled: var(--batifree-neutral-20);
    --dxds-color-surface-neutral-default-static-light-selected: var(--batifree-primary-10);
    --dxds-color-surface-neutral-default-static-dark-rest: var(--batifree-dark-teal);
    --dxds-color-surface-neutral-default-static-dark-hovered: rgba(255, 255, 255, 0.10);
    --dxds-color-surface-neutral-default-static-dark-active: rgba(255, 255, 255, 0.15);
    --dxds-color-surface-neutral-default-static-dark-disabled: rgba(255, 255, 255, 0.05);
    --dxds-color-surface-neutral-default-static-dark-selected: var(--batifree-primary-100);
    --dxds-color-surface-transparent-rest: transparent;
    /* ── Surface — Primary ──────────────────────────────────── */
    --dxds-color-surface-primary-default-rest: var(--batifree-primary-100);
    --dxds-color-surface-primary-default-hovered: var(--batifree-primary-110);
    --dxds-color-surface-primary-default-active: var(--batifree-primary-120);
    --dxds-color-surface-primary-default-selected: var(--batifree-primary-100);
    --dxds-color-surface-primary-default-disabled: var(--batifree-primary-20);
    --dxds-color-surface-primary-subdued-rest: var(--batifree-primary-10);
    --dxds-color-surface-primary-subdued-hovered: var(--batifree-primary-20);
    --dxds-color-surface-primary-subdued-active: var(--batifree-primary-30);
    --dxds-color-surface-primary-subdued-selected: var(--batifree-primary-20);
    --dxds-color-surface-primary-deep-rest: var(--batifree-primary-100);
    --dxds-color-surface-primary-deep-hovered: var(--batifree-primary-110);
    --dxds-color-surface-primary-deep-selected: var(--batifree-primary-100);
    --dxds-color-surface-primary-deep-static-light-rest: var(--batifree-primary-100);
    --dxds-color-surface-primary-deep-static-light-selected: var(--batifree-primary-100);
    /* ── Surface — Secondary ────────────────────────────────── */
    --dxds-color-surface-secondary-default-rest: var(--batifree-secondary-10);
    --dxds-color-surface-secondary-default-hovered: var(--batifree-secondary-100);
    --dxds-color-surface-secondary-default-active: var(--batifree-secondary-110);
    --dxds-color-surface-secondary-default-selected: var(--batifree-secondary-20);
    --dxds-color-surface-secondary-default-disabled: var(--batifree-secondary-20);
    /* ── Surface — Danger ───────────────────────────────────── */
    --dxds-color-surface-danger-default-rest: var(--batifree-danger-90);
    --dxds-color-surface-danger-default-hovered: var(--batifree-danger-110);
    --dxds-color-surface-danger-default-active: var(--batifree-danger-130);
    --dxds-color-surface-danger-default-selected: var(--batifree-danger-90);
    --dxds-color-surface-danger-deep-rest: var(--batifree-danger-90);
    /* ── Surface — Backdrop / Highlight ────────────────────── */
    --dxds-color-surface-backdrop-default-rest: rgba(22, 65, 71, 0.40);
    --dxds-color-surface-highlight-rest: var(--batifree-primary-20);
    /* ── Surface — Info ─────────────────────────────────────── */
    --dxds-color-surface-info-default-rest: var(--batifree-info-20);
    --dxds-color-surface-info-default-hovered: var(--batifree-info-40);
    --dxds-color-surface-info-default-active: var(--batifree-info-50);
    --dxds-color-surface-info-default-selected: var(--batifree-info-40);
    --dxds-color-surface-info-subdued-rest: var(--batifree-info-10);
    --dxds-color-surface-info-subdued-hovered: var(--batifree-info-30);
    --dxds-color-surface-info-subdued-active: var(--batifree-info-40);
    --dxds-color-surface-info-subdued-selected: var(--batifree-info-30);
    --dxds-color-surface-info-deep-rest: var(--batifree-info-90);
    /* ── Surface — Success ──────────────────────────────────── */
    --dxds-color-surface-success-default-rest: var(--batifree-success-20);
    --dxds-color-surface-success-default-hovered: var(--batifree-success-40);
    --dxds-color-surface-success-default-active: var(--batifree-success-50);
    --dxds-color-surface-success-default-selected: var(--batifree-success-40);
    --dxds-color-surface-success-subdued-rest: var(--batifree-success-10);
    --dxds-color-surface-success-subdued-hovered: var(--batifree-success-30);
    --dxds-color-surface-success-subdued-active: var(--batifree-success-40);
    --dxds-color-surface-success-subdued-selected: var(--batifree-success-30);
    --dxds-color-surface-success-deep-rest: var(--batifree-success-90);
    /* ── Surface — Warning ──────────────────────────────────── */
    --dxds-color-surface-warning-default-rest: var(--batifree-warning-20);
    --dxds-color-surface-warning-default-hovered: var(--batifree-warning-30);
    --dxds-color-surface-warning-default-active: var(--batifree-warning-40);
    --dxds-color-surface-warning-default-selected: var(--batifree-warning-30);
    --dxds-color-surface-warning-subdued-rest: var(--batifree-warning-10);
    --dxds-color-surface-warning-subdued-hovered: var(--batifree-warning-20);
    --dxds-color-surface-warning-subdued-active: var(--batifree-warning-30);
    --dxds-color-surface-warning-subdued-selected: var(--batifree-warning-20);
    --dxds-color-surface-warning-deep-rest: var(--batifree-warning-90);
    /* ── Surface — Utility ──────────────────────────────────── */
    --dxds-color-surface-utility-blue-default-rest: #dbeafe;
    --dxds-color-surface-utility-blue-subdued-rest: #eff6ff;
    --dxds-color-surface-utility-cyan-default-rest: #cffafe;
    --dxds-color-surface-utility-cyan-subdued-rest: #ecfeff;
    --dxds-color-surface-utility-gray-subdued-rest: var(--batifree-neutral-20);
    --dxds-color-surface-utility-green-default-rest: #dcfce7;
    --dxds-color-surface-utility-green-subdued-rest: #f0fdf4;
    --dxds-color-surface-utility-indigo-subdued-rest: #eef2ff;
    --dxds-color-surface-utility-orange-default-rest: var(--batifree-primary-10);
    --dxds-color-surface-utility-orange-subdued-rest: var(--batifree-primary-10);
    --dxds-color-surface-utility-pink-subdued-rest: #fdf2f8;
    --dxds-color-surface-utility-purple-subdued-rest: var(--batifree-secondary-10);
    --dxds-color-surface-utility-red-default-rest: var(--batifree-danger-10);
    --dxds-color-surface-utility-red-subdued-rest: #fef2f2;
    --dxds-color-surface-utility-teal-subdued-rest: #f0fdfa;
    --dxds-color-surface-utility-yellow-subdued-rest: #fefce8;
    /* ── Content — Neutral ──────────────────────────────────── */
    --dxds-color-content-neutral-default-rest: var(--batifree-neutral-100);
    --dxds-color-content-neutral-default-hovered: var(--batifree-neutral-110);
    --dxds-color-content-neutral-default-active: var(--batifree-neutral-120);
    --dxds-color-content-neutral-default-selected: var(--batifree-neutral-100);
    --dxds-color-content-neutral-default-selected-hovered: var(--batifree-neutral-110);
    --dxds-color-content-neutral-default-disabled: var(--batifree-neutral-70);
    --dxds-color-content-neutral-default-inverted-rest: var(--batifree-white);
    --dxds-color-content-neutral-subdued-rest: var(--batifree-neutral-80);
    --dxds-color-content-neutral-subdued-hovered: var(--batifree-neutral-90);
    --dxds-color-content-neutral-subdued-active: var(--batifree-neutral-100);
    --dxds-color-content-neutral-subdued-selected: var(--batifree-neutral-90);
    --dxds-color-content-neutral-subdued-disabled: var(--batifree-neutral-60);
    --dxds-color-content-neutral-deep-rest: var(--batifree-neutral-130);
    --dxds-color-content-neutral-default-static-light-rest: var(--batifree-neutral-100);
    --dxds-color-content-neutral-default-static-light-hovered: var(--batifree-neutral-110);
    --dxds-color-content-neutral-default-static-light-active: var(--batifree-neutral-120);
    --dxds-color-content-neutral-default-static-light-disabled: var(--batifree-neutral-60);
    --dxds-color-content-neutral-default-static-dark-rest: var(--batifree-white);
    --dxds-color-content-neutral-default-static-dark-hovered: rgba(255, 255, 255, 0.90);
    --dxds-color-content-neutral-default-static-dark-active: var(--batifree-white);
    --dxds-color-content-neutral-default-static-dark-disabled: rgba(255, 255, 255, 0.40);
    /* ── Content — Primary ──────────────────────────────────── */
    --dxds-color-content-primary-default-rest: var(--batifree-primary-100);
    --dxds-color-content-primary-default-hovered: var(--batifree-primary-110);
    --dxds-color-content-primary-default-active: var(--batifree-primary-120);
    /* compound-rest is used as the checkbox check-mark colour (icon on filled bg).
       Setting it to neutral-0 (white) makes the tick visible on an orange checkbox. */
    --dxds-color-content-primary-compound-rest: var(--batifree-white);
    --dxds-color-content-primary-compound-hovered: var(--batifree-white);
    /* ── Content — Secondary ────────────────────────────────── */
    --dxds-color-content-secondary-default-rest: var(--batifree-secondary-100);
    --dxds-color-content-secondary-default-hovered: var(--batifree-secondary-110);
    --dxds-color-content-secondary-default-active: var(--batifree-secondary-120);
    /* ── Content — Danger ───────────────────────────────────── */
    --dxds-color-content-danger-default-rest: var(--batifree-danger-90);
    --dxds-color-content-danger-default-hovered: var(--batifree-danger-110);
    --dxds-color-content-danger-default-active: var(--batifree-danger-130);
    --dxds-color-content-danger-compound-rest: var(--batifree-white);
    --dxds-color-content-danger-compound-hovered: var(--batifree-white);
    /* ── Content — Info / Success / Warning ─────────────────── */
    --dxds-color-content-info-default-rest: var(--batifree-info-90);
    --dxds-color-content-info-default-hovered: var(--batifree-info-100);
    --dxds-color-content-info-default-active: var(--batifree-info-110);
    --dxds-color-content-success-default-rest: var(--batifree-success-90);
    --dxds-color-content-success-default-hovered: var(--batifree-success-100);
    --dxds-color-content-success-default-active: var(--batifree-success-110);
    --dxds-color-content-success-compound-rest: var(--batifree-white);
    --dxds-color-content-success-compound-hovered: var(--batifree-white);
    --dxds-color-content-warning-default-rest: var(--batifree-warning-90);
    --dxds-color-content-warning-default-hovered: var(--batifree-warning-100);
    --dxds-color-content-warning-default-active: var(--batifree-warning-110);
    --dxds-color-content-highlight-rest: var(--batifree-primary-100);
    /* ── Border — Neutral ───────────────────────────────────── */
    --dxds-color-border-neutral-default-rest: var(--batifree-neutral-40);
    --dxds-color-border-neutral-default-hovered: var(--batifree-neutral-60);
    --dxds-color-border-neutral-default-active: var(--batifree-neutral-70);
    --dxds-color-border-neutral-default-disabled: var(--batifree-neutral-30);
    --dxds-color-border-neutral-default-inverted-rest: rgba(255, 255, 255, 0.20);
    --dxds-color-border-neutral-accessible-rest: var(--batifree-neutral-70);
    --dxds-color-border-neutral-accessible-hovered: var(--batifree-neutral-90);
    --dxds-color-border-neutral-default-static-light-rest: var(--batifree-neutral-40);
    --dxds-color-border-neutral-default-static-light-hovered: var(--batifree-neutral-60);
    --dxds-color-border-neutral-default-static-light-active: var(--batifree-neutral-70);
    --dxds-color-border-neutral-default-static-light-disabled: var(--batifree-neutral-30);
    --dxds-color-border-neutral-default-static-dark-rest: rgba(255, 255, 255, 0.20);
    --dxds-color-border-neutral-default-static-dark-hovered: rgba(255, 255, 255, 0.30);
    --dxds-color-border-neutral-default-static-dark-active: rgba(255, 255, 255, 0.40);
    --dxds-color-border-neutral-default-static-dark-disabled: rgba(255, 255, 255, 0.10);
    --dxds-color-border-transparent-rest: transparent;
    /* ── Border — Primary ───────────────────────────────────── */
    --dxds-color-border-primary-default-rest: var(--batifree-primary-100);
    --dxds-color-border-primary-compound-rest: var(--batifree-primary-30);
    --dxds-color-border-primary-compound-hovered: var(--batifree-primary-100);
    /* ── Border — Secondary ─────────────────────────────────── */
    --dxds-color-border-secondary-default-rest: var(--batifree-secondary-20);
    /* ── Border — Danger ────────────────────────────────────── */
    --dxds-color-border-danger-compound-rest: var(--batifree-danger-40);
    --dxds-color-border-danger-compound-hovered: var(--batifree-danger-90);
    /* ── Border — Success ───────────────────────────────────── */
    --dxds-color-border-success-compound-rest: var(--batifree-success-60);
    --dxds-color-border-success-compound-hovered: var(--batifree-success-90);
    /* ── Border — Focus ─────────────────────────────────────── */
    --dxds-color-border-focus-default: var(--batifree-primary-100);
    --dxds-color-border-focus-inverted: var(--batifree-white);
    --dxds-color-border-focus-static-dark: var(--batifree-primary-100);
    --dxds-color-border-focus-static-light: var(--batifree-primary-100);
    /* ── Shadows ────────────────────────────────────────────── */
    --dxds-color-shadow-none: transparent;
    --dxds-color-shadow-ambient: rgba(0, 0, 0, 0.04);
    --dxds-color-shadow-key: rgba(0, 0, 0, 0.08);
    --dxds-color-shadow-ambient-darker: rgba(0, 0, 0, 0.08);
    --dxds-color-shadow-key-darker: rgba(0, 0, 0, 0.14);
}


/* ============================================================
   3. BASE TYPOGRAPHY
   ============================================================ */
html,
body,
.dxbl-theme-fluent-mode-light,
.dxbl-theme-batifree-mode-light,
[data-bs-theme=dark],
.dxbl-theme-fluent-mode-dark,
.dxbl-theme-dark {
    font-family: var(--batifree-font);
    font-size: 14px;
    font-weight: 400;
    color: var(--batifree-neutral-100);
}

/* Display-only template (e.g. Type/Ouvrage) — padding + centering */
.main.main-object-model .dxbl-text-edit-template,
.detail-view-content .dxbl-text-edit-template {
    padding: 0 10px !important;
    align-items: center !important;
}

    /* Template with input inside (e.g. Unit) — 0 padding, the input manages its own */
    .main.main-object-model .dxbl-text-edit-template:has(.dxbl-text-edit-input),
    .detail-view-content .dxbl-text-edit-template:has(.dxbl-text-edit-input) {
        padding: 0 !important;
    }

.main.main-object-model .dxbl-text-edit-template,
.detail-view-content .dxbl-text-edit-template {
    padding: 0 10px !important;
    align-items: center !important;
}


/* ============================================================
   4. GLOBAL BUTTON RESET
   Normalises all button variants to the Batifree spec.

   XAF toolbar button HTML structure:
     <button class="dxbl-btn dxbl-btn-secondary dxbl-sm ...">
       <img class="dxbl-image ...">
       <span>Label</span>
     </button>
   There is no .dxbl-btn-content wrapper → flex is set directly
   on the <button> element.

   Specificity note: DevExpress loads its own stylesheet into
   <body> after this file, giving .dxbl-btn.dxbl-sm a specificity
   of (0,2,0). Adding the "button" type selector raises ours to
   (0,2,1) without needing a new !important chain.
   ============================================================ */
/* Brand properties — padding from Figma spec (px-12 py-7), sizing
   (font, line-height, min-height) left to DevExpress native tokens
   so standard/compact modes work correctly out of the box.         */
.btn,
.dxbl-btn,
.dx-button,
.dx-toolbar .dx-button,
.dxbl-toolbar .dxbl-btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: var(--batifree-btn-gap) !important;
    border-radius: var(--batifree-radius-md) !important;
    font-family: var(--batifree-font) !important;
    padding: var(--batifree-btn-padding-y) var(--batifree-btn-padding-x) !important;
    box-shadow: var(--batifree-shadow-sm) !important;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease !important;
}

    /* Focus ring */
    .btn:focus,
    .btn:focus-visible,
    .dxbl-btn:focus,
    .dxbl-btn:focus-visible,
    .dx-button:focus,
    .dx-button:focus-visible {
        outline: none !important;
        /*        box-shadow: var(--batifree-shadow-focus) !important;*/
    }

    /* Inner content wrapper when present */
    .dxbl-btn .dxbl-btn-content,
    .dx-button .dx-button-content,
    .btn .btn-content {
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        gap: var(--batifree-btn-gap) !important;
    }

    /* Icon sizing — <img class="dxbl-image"> inside XAF toolbar buttons */
    .dxbl-btn .dxbl-image,
    .dxbl-btn img.dxbl-image,
    .dx-button .dx-icon,
    .btn i,
    .dxbl-btn i {
        width: 16px !important;
        height: 16px !important;
        object-fit: contain !important;
        flex-shrink: 0 !important;
    }

    /* Disabled state — DevExpress uses .dxbl-disabled class + disabled attribute */
    .btn:disabled,
    .btn.disabled,
    .dxbl-btn:disabled,
    .dxbl-btn.dxbl-disabled,
    .dxbl-btn.dx-state-disabled,
    .dx-button.dx-state-disabled {
        opacity: 1 !important;
        cursor: not-allowed !important;
        box-shadow: none !important;
    }

dxbl-tab-list .dxbl-tabs-scroll-btn-prev[aria-hidden="true"],
dxbl-tab-list .dxbl-tabs-scroll-btn-next[aria-hidden="true"] {
    display: none !important;
}


/* ============================================================
   5. PRIMARY BUTTON
   Figma spec: solid orange background, white text.
   ============================================================ */
.btn-primary,
.dxbl-btn.btn-primary,
.dxbl-btn.dxbl-btn-primary,
.dx-button.dx-button-mode-contained.dx-button-default,
.dxbl-toolbar .dxbl-btn.dxbl-btn-primary {
    background: var(--batifree-primary-100) !important;
    border: 1px solid var(--batifree-primary-100) !important;
    color: var(--batifree-white) !important;
}

    .btn-primary *,
    .dxbl-btn.dxbl-btn-primary *,
    .dx-button.dx-button-mode-contained.dx-button-default * {
        color: inherit !important;
    }

    .btn-primary:hover,
    .dxbl-btn.btn-primary:hover,
    .dxbl-btn.dxbl-btn-primary:hover,
    .dx-button.dx-button-mode-contained.dx-button-default:hover {
        background: var(--batifree-primary-110) !important;
        border-color: var(--batifree-primary-110) !important;
        color: var(--batifree-white) !important;
    }

    .btn-primary:active,
    .btn-primary.active,
    .dxbl-btn.dxbl-btn-primary:active,
    .dxbl-btn.dxbl-btn-primary.dx-state-active,
    .dx-button.dx-button-mode-contained.dx-button-default.dx-state-active {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
        box-shadow: none !important;
    }

    .btn-primary:disabled,
    .btn-primary.disabled,
    .dxbl-btn.dxbl-btn-primary:disabled,
    .dxbl-btn.dxbl-btn-primary.dxbl-disabled,
    .dxbl-btn.dxbl-btn-primary.dx-state-disabled,
    .dx-button.dx-button-mode-contained.dx-button-default.dx-state-disabled {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-primary-40) !important;
        cursor: not-allowed !important;
    }

    /* ── Icon colour per button state ──────────────────────────────
    img.dxbl-image does not respond to color → use filter instead.
    XAF icons are dark PNGs on a transparent background;
    brightness(0) normalises them to black before any colourisation.
──────────────────────────────────────────────────────────────── */

    /* Enable + Hover → white #fffefd */
    .dxbl-btn.dxbl-btn-primary .dxbl-image,
    .dxbl-toolbar :is([data-action-name="New"],[data-action-name="Nouveau"],[data-action-name="Valider"]) .dxbl-image {
        filter: brightness(0) invert(1) !important;
    }

    /* Active / Pressed → dark teal #164147 */
    .dxbl-btn.dxbl-btn-primary:active .dxbl-image,
    .dxbl-btn.dxbl-btn-primary.dx-state-active .dxbl-image,
    .dxbl-toolbar :is([data-action-name="New"],[data-action-name="Nouveau"],[data-action-name="Valider"]):active .dxbl-image,
    .dxbl-toolbar :is([data-action-name="New"],[data-action-name="Nouveau"],[data-action-name="Valider"]).dx-state-active .dxbl-image {
        filter: var(--batifree-filter-ink) !important;
    }

    /* Disabled → peach #ffbb99 */
    .dxbl-btn.dxbl-btn-primary:disabled .dxbl-image,
    .dxbl-btn.dxbl-btn-primary.dxbl-disabled .dxbl-image,
    .dxbl-btn.dxbl-btn-primary.dx-state-disabled .dxbl-image,
    .dxbl-toolbar :is([data-action-name="New"],[data-action-name="Nouveau"],[data-action-name="Valider"]):disabled .dxbl-image,
    .dxbl-toolbar :is([data-action-name="New"],[data-action-name="Nouveau"],[data-action-name="Valider"]).dxbl-disabled .dxbl-image {
        filter: var(--batifree-filter-disabled-primary) !important;
    }


/* ============================================================
   5b. TOOLBAR outline-primary → promoted to filled primary
   XAF may render the NewObject button as dxbl-btn-outline-primary
   inside embedded ListViews. Give it the same look as filled.
   ============================================================ */
.dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary {
    background: var(--batifree-primary-100) !important;
    border: 1px solid var(--batifree-primary-100) !important;
    color: var(--batifree-white) !important;
}

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary * {
        color: inherit !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary .dxbl-image {
        filter: brightness(0) invert(1) !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:hover {
        background: var(--batifree-primary-110) !important;
        border-color: var(--batifree-primary-110) !important;
        color: var(--batifree-white) !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:active,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary.dx-state-active {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
        box-shadow: none !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:active .dxbl-image,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary.dx-state-active .dxbl-image {
        filter: var(--batifree-filter-ink) !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary.dxbl-disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:disabled:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary.dxbl-disabled:hover {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-primary-40) !important;
        cursor: not-allowed !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary:disabled .dxbl-image,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-primary.dxbl-disabled .dxbl-image {
        filter: var(--batifree-filter-disabled-primary) !important;
    }


/* ============================================================
   6. SECONDARY BUTTON
   Figma spec: light orange background, orange border, dark text.
   Hover: solid orange (same as primary).
   ============================================================ */
.btn-secondary,
.dxbl-btn.btn-secondary,
.dxbl-btn.dxbl-btn-secondary {
    background: var(--batifree-primary-10) !important;
    border: 1px solid var(--batifree-primary-20) !important;
    color: var(--batifree-ink-on-tint) !important;
}

    .btn-secondary *,
    .dxbl-btn.dxbl-btn-secondary * {
        color: inherit !important;
    }

    .btn-secondary:hover,
    .dxbl-btn.btn-secondary:hover,
    .dxbl-btn.dxbl-btn-secondary:hover {
        background: var(--batifree-primary-100) !important;
        border-color: var(--batifree-primary-100) !important;
        color: var(--batifree-white) !important;
    }

    .btn-secondary:active,
    .btn-secondary.active,
    .dxbl-btn.dxbl-btn-secondary:active,
    .dxbl-btn.dxbl-btn-secondary.dx-state-active {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
        box-shadow: none !important;
    }

    .btn-secondary:disabled,
    .btn-secondary.disabled,
    .dxbl-btn.dxbl-btn-secondary:disabled,
    .dxbl-btn.dxbl-btn-secondary.dxbl-disabled,
    .dxbl-btn.dxbl-btn-secondary.dx-state-disabled {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-primary-40) !important;
    }

    /* ── Icon colour per button state (img.dxbl-image does not respond to color) ── */

    /* Enable / Focus → dark teal #164147
    :not([data-action-name]) excludes New/Nouveau/Valider handled in section 10 */
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]) .dxbl-image {
        filter: var(--batifree-filter-ink) !important;
    }

    /* Hover → white #fffefd (disabled excluded) */
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(:disabled):not(.dxbl-disabled):not(.dx-state-disabled):hover .dxbl-image {
        filter: brightness(0) invert(1) !important;
    }

    /* Pressed / Active → white #fffefd (same visual state as hover) */
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):active .dxbl-image,
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dx-state-active .dxbl-image {
        filter: brightness(0) invert(1) !important;
    }

    /* Disabled → peach #ffbb99 */
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):disabled .dxbl-image,
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dxbl-disabled .dxbl-image,
    .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dx-state-disabled .dxbl-image {
        filter: var(--batifree-filter-disabled-primary) !important;
    }


/* ============================================================
   7. TERTIARY BUTTON
   Figma spec: light violet background, violet border, dark text.
   Hover: solid violet.
   ============================================================ */
.btn-outline-secondary,
.dxbl-btn.btn-outline-secondary,
.dxbl-btn.dxbl-btn-outline,
.dxbl-btn.dxbl-btn-outline-secondary {
    background: var(--batifree-secondary-10) !important;
    border: 1px solid var(--batifree-secondary-20) !important;
    color: var(--batifree-ink-on-violet) !important;
}

    .btn-outline-secondary *,
    .dxbl-btn.dxbl-btn-outline *,
    .dxbl-btn.dxbl-btn-outline-secondary * {
        color: inherit !important;
    }

    .btn-outline-secondary:hover,
    .dxbl-btn.dxbl-btn-outline:hover,
    .dxbl-btn.dxbl-btn-outline-secondary:hover {
        background: var(--batifree-secondary-100) !important;
        border-color: var(--batifree-secondary-100) !important;
        color: var(--batifree-white) !important;
    }

    .btn-outline-secondary:active,
    .btn-outline-secondary.active,
    .dxbl-btn.dxbl-btn-outline:active,
    .dxbl-btn.dxbl-btn-outline.dx-state-active,
    .dxbl-btn.dxbl-btn-outline-secondary.dx-state-active {
        background: var(--batifree-secondary-10) !important;
        border-color: var(--batifree-secondary-20) !important;
        color: var(--batifree-ink-on-violet) !important;
        box-shadow: none !important;
    }

    .btn-outline-secondary:disabled,
    .btn-outline-secondary.disabled,
    .dxbl-btn.dxbl-btn-outline:disabled,
    .dxbl-btn.dxbl-btn-outline.dxbl-disabled,
    .dxbl-btn.dxbl-btn-outline.dx-state-disabled,
    .dxbl-btn.dxbl-btn-outline-secondary:disabled,
    .dxbl-btn.dxbl-btn-outline-secondary.dxbl-disabled,
    .dxbl-btn.dxbl-btn-outline-secondary.dx-state-disabled {
        background: var(--batifree-secondary-20) !important;
        border-color: var(--batifree-secondary-20) !important;
        color: var(--batifree-secondary-40) !important;
        cursor: not-allowed !important;
    }


/* ============================================================
   8. DANGER BUTTON
   ============================================================ */
.btn-danger,
.dxbl-btn.btn-danger,
.dxbl-btn.dxbl-btn-danger {
    background: var(--batifree-danger-90) !important;
    border: 1px solid var(--batifree-danger-90) !important;
    color: var(--batifree-white) !important;
}

    .btn-danger:hover,
    .dxbl-btn.dxbl-btn-danger:hover {
        background: var(--batifree-danger-110) !important;
        border-color: var(--batifree-danger-110) !important;
        color: var(--batifree-white) !important;
    }

    .btn-danger:active,
    .btn-danger.active,
    .dxbl-btn.dxbl-btn-danger:active,
    .dxbl-btn.dxbl-btn-danger.dx-state-active {
        background: var(--batifree-danger-10) !important;
        border-color: var(--batifree-danger-20) !important;
        color: var(--batifree-danger-130) !important;
        box-shadow: none !important;
    }

    .btn-danger:disabled,
    .btn-danger.disabled,
    .dxbl-btn.dxbl-btn-danger.dx-state-disabled {
        background: var(--batifree-danger-20) !important;
        border-color: var(--batifree-danger-20) !important;
        color: var(--batifree-danger-40) !important;
    }


/* ============================================================
   9. ICON-ONLY BUTTONS
   Figma spec: square 33×33 px.

   Detection strategy: use explicit .dxbl-btn-icon-only class or
   the structural :has() selector limited to .dxbl-btn-content
   children. Avoid :has(.dxbl-image):not(:has(.dxbl-text)) on its
   own — XAF toolbar buttons wrap label text in a raw <span>
   without a .dxbl-text class, which causes false positives.
   ============================================================ */
.dxbl-btn.dxbl-btn-icon-only,
.dxbl-btn.icon-only,
.dx-button.dx-button-has-icon:not(.dx-button-has-text),
.dxbl-toolbar .dxbl-btn:has(.dxbl-btn-content > .dxbl-image):not(:has(.dxbl-btn-content > .dxbl-text)):not(:has(.dxbl-btn-content > span)) {
    width: var(--batifree-btn-icon-only-size) !important;
    min-width: var(--batifree-btn-icon-only-size) !important;
    height: var(--batifree-btn-icon-only-size) !important;
    min-height: var(--batifree-btn-icon-only-size) !important;
    padding: 7px !important;
}

.dxbl-btn.dxbl-btn-sm.dxbl-btn-icon-only,
.dx-button.dx-button-has-icon.dx-button-sm:not(.dx-button-has-text) {
    width: var(--batifree-btn-icon-only-size-sm) !important;
    min-width: var(--batifree-btn-icon-only-size-sm) !important;
    height: var(--batifree-btn-icon-only-size-sm) !important;
    min-height: var(--batifree-btn-icon-only-size-sm) !important;
    padding: 5px !important;
}


/* ============================================================
   10. XAF TOOLBAR
   XAF generates all toolbar buttons as .dxbl-btn-secondary.
   We differentiate the "New" action visually by targeting
   data-action-name. Note: this attribute reflects the localised
   button caption ("New" in EN, "Nouveau" in FR, etc.), so both
   variants must be matched. Hence the use of :is(...) on positive
   selectors and chained :not():not() on negative ones.
   ============================================================ */
.dxbl-toolbar {
    --dxbl-toolbar-font-size: 14px;
    background: transparent !important;
    padding: 4px 0 !important;
    gap: 4px !important;
}

    .dxbl-toolbar .dxbl-btn {
        margin: 0 !important;
    }

    /* "New" action → PRIMARY style (solid orange) */
    .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]) {
        background: var(--batifree-primary-100) !important;
        border: 1px solid var(--batifree-primary-100) !important;
        color: var(--batifree-white) !important;
    }

        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]) * {
            color: var(--batifree-white) !important;
        }

        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]) img.dxbl-image {
            filter: brightness(0) invert(1) !important;
        }

        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):hover {
            background: var(--batifree-primary-110) !important;
            border-color: var(--batifree-primary-110) !important;
            color: var(--batifree-white) !important;
        }

        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):active,
        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dx-state-active {
            background: var(--batifree-primary-20) !important;
            border-color: var(--batifree-primary-20) !important;
            color: var(--batifree-ink-on-tint) !important;
            box-shadow: none !important;
        }

            /* Active children — overrides the white * rule */
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):active *,
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dx-state-active * {
                color: var(--batifree-ink-on-tint) !important;
            }

            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):active img.dxbl-image,
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dx-state-active img.dxbl-image {
                filter: var(--batifree-filter-ink) !important;
            }

        /* Disabled + hover suppressed — same tint as secondary disabled */
        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):disabled,
        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):disabled:hover,
        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dxbl-disabled,
        .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dxbl-disabled:hover {
            background: var(--batifree-primary-20) !important;
            border-color: var(--batifree-primary-20) !important;
            color: var(--batifree-primary-40) !important;
            cursor: not-allowed !important;
            box-shadow: none !important;
        }

            /* Disabled children — force text/icon colour */
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):disabled *,
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dxbl-disabled * {
                color: var(--batifree-primary-40) !important;
            }

            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]):disabled img.dxbl-image,
            .dxbl-toolbar :is([data-action-name="New"], [data-action-name="Nouveau"], [data-action-name="Valider"], [data-action-name="Ajouter"]).dxbl-disabled img.dxbl-image {
                filter: var(--batifree-filter-disabled-primary) !important;
            }

    /* All other toolbar buttons → SECONDARY style (light orange) */
    /* :not(.dxbl-text-edit-btn) exclut le bouton de recherche (Placeholder) */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn),
    .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn) {
        background: var(--batifree-primary-10) !important;
        border: 1px solid var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
    }

        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn) *,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn) * {
            color: var(--batifree-ink-on-tint) !important;
        }

        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):hover,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):hover {
            background: var(--batifree-primary-100) !important;
            border-color: var(--batifree-primary-100) !important;
            color: var(--batifree-white) !important;
        }

            .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):hover *,
            .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):hover * {
                color: var(--batifree-white) !important;
            }

        /* Disabled — (0,5,0) beats the base toolbar rule (0,4,0)
DevExpress uses .dxbl-disabled class + disabled attribute.
:hover variants included so hover effects are suppressed.          */
        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):disabled,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):disabled:hover,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dxbl-disabled,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dxbl-disabled:hover,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):disabled,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):disabled:hover,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn).dxbl-disabled,
        .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn).dxbl-disabled:hover {
            background: var(--batifree-primary-20) !important;
            border-color: var(--batifree-primary-20) !important;
            color: var(--batifree-primary-40) !important;
            cursor: not-allowed !important;
            box-shadow: none !important;
        }

            /* Disabled children — forces text/icon to peach */
            .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dxbl-disabled *,
            .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):disabled *,
            .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dxbl-disabled *,
            .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):disabled * {
                color: var(--batifree-primary-40) !important;
            }

            /* Disabled + hover children — specificity (0,9,0) beats hover * (0,8,0)
    The hover * wins because of the extra :not(.dxbl-text-edit-btn).
    Neutralised by adding :disabled/:dxbl-disabled + :hover.              */
            .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):disabled:hover *,
            .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn).dxbl-disabled:hover *,
            .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn):disabled:hover *,
            .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):not(.dxbl-text-edit-btn).dxbl-disabled:hover * {
                color: var(--batifree-primary-40) !important;
            }

    /* Pressed / active — same high specificity as the toolbar block above */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):active,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary:not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dx-state-active,
    .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]):active,
    .dxbl-toolbar .dxbl-btn:not(.dxbl-btn-danger):not(.dxbl-btn-primary):not([data-action-name="New"]):not([data-action-name="Nouveau"]):not([data-action-name="Valider"]):not([data-action-name="Ajouter"]).dx-state-active {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
        box-shadow: none !important;
    }

    /* ── New/Nouveau/Valider → filled primary (high-specificity override) ───
    Root cause: XAF renders these as dxbl-btn-secondary. The :not() exclusions
    above fail because data-action-name sits on the WRAPPER div, not the button.
    Fix: use wrapper classes+attributes to reach (0,9,0) and beat the competing
    secondary rules declared above. Rules placed AFTER them to win the tie.

    Wrapper HTML classes used: dxbl-toolbar-btn dxbl-toolbar-layout-block-item
    dxbl-toolbar-item  Attributes: data-action-name data-xaf-action data-dxtoolbar-item-id
    Total specificity: 9 × (0,1,0) = (0,9,0) for base; +1 for hover/active = (0,10,0)
    ─────────────────────────────────────────────────────────────────────────── */
    .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary,
    .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary,
    .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary {
        background: var(--batifree-primary-100) !important;
        border-color: var(--batifree-primary-100) !important;
        color: var(--batifree-white) !important;
    }

        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary .dxbl-image,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary .dxbl-image,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary .dxbl-image {
            filter: brightness(0) invert(1) !important;
        }

        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:hover,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:hover,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:hover {
            background: var(--batifree-primary-110) !important;
            border-color: var(--batifree-primary-110) !important;
        }

        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:active,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dx-state-active,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:active,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dx-state-active,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:active,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dx-state-active {
            background: var(--batifree-primary-20) !important;
            border-color: var(--batifree-primary-20) !important;
            color: var(--batifree-ink-on-tint) !important;
        }

        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:disabled,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="New"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dxbl-disabled,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:disabled,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Nouveau"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dxbl-disabled,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary:disabled,
        .dxbl-toolbar .dxbl-toolbar-btn.dxbl-toolbar-layout-block-item[data-action-name="Valider"][data-xaf-action][data-dxtoolbar-item-id].dxbl-toolbar-item .dxbl-btn.dxbl-btn-secondary.dxbl-disabled {
            background: var(--batifree-primary-20) !important;
            border-color: var(--batifree-primary-20) !important;
            color: var(--batifree-primary-40) !important;
        }


    /* ── PRIMARY buttons in toolbar — disabled state ────────────
    The enable rule .dxbl-toolbar .dxbl-btn.dxbl-btn-primary has
    specificity (0,3,0). We need (0,4,0) to override it.        */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-primary:disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-primary:disabled:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-primary.dxbl-disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-primary.dxbl-disabled:hover {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-primary-40) !important;
        cursor: not-allowed !important;
        box-shadow: none !important;
    }

        .dxbl-toolbar .dxbl-btn.dxbl-btn-primary.dxbl-disabled *,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-primary:disabled * {
            color: var(--batifree-primary-40) !important;
        }

    /* ── TERTIARY (outline) buttons in toolbar ──────────────────
    Explicit rules for .dxbl-btn-outline / .dxbl-btn-outline-secondary
    in a toolbar context. Outline buttons are excluded from the
    secondary block above (), so they need
    their own hover / pressed / disabled declarations.            */

    /* Hover */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary:hover {
        background: var(--batifree-secondary-100) !important;
        border-color: var(--batifree-secondary-100) !important;
        color: var(--batifree-white) !important;
    }

    /* Pressed / active */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline:active,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline.dx-state-active,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary:active,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary.dx-state-active {
        background: var(--batifree-secondary-10) !important;
        border-color: var(--batifree-secondary-20) !important;
        color: var(--batifree-ink-on-violet) !important;
        box-shadow: none !important;
    }

    /* Disabled + hover suppressed */
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline:disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline:disabled:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline.dxbl-disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline.dxbl-disabled:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary:disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary:disabled:hover,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary.dxbl-disabled,
    .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary.dxbl-disabled:hover {
        background: var(--batifree-secondary-20) !important;
        border-color: var(--batifree-secondary-20) !important;
        color: var(--batifree-secondary-40) !important;
        cursor: not-allowed !important;
        box-shadow: none !important;
    }

        /* Disabled children */
        .dxbl-toolbar .dxbl-btn.dxbl-btn-outline.dxbl-disabled *,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-outline:disabled *,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary.dxbl-disabled *,
        .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary:disabled * {
            color: var(--batifree-secondary-40) !important;
        }


/* ============================================================
   11. TABS / DETAIL-VIEW NAVIGATION
   ============================================================ */
.card-header > .nav-tabs .nav-item .nav-link {
    font-family: var(--batifree-font) !important;
    font-size: 14px !important;
    font-weight: 400 !important;
    color: var(--batifree-neutral-100) !important;
    background: transparent !important;
    border: none !important;
    padding: 10px 8px !important;
    position: relative !important;
    transition: color 0.15s ease !important;
}

    .card-header > .nav-tabs .nav-item .nav-link:hover {
        color: var(--batifree-primary-100) !important;
    }

    .card-header > .nav-tabs .nav-item .nav-link.active {
        font-weight: 600 !important;
        color: var(--batifree-primary-100) !important;
        background: transparent !important;
        border-color: transparent !important;
    }


/* ============================================================
   12. GRID (DataGrid)

   IMPORTANT — CSS variable override pattern
   ─────────────────────────────────────────
   DevExpress reads row colours from CSS variables, not from
   hard-coded background-color declarations.  !important on
   background-color is silently ignored because the component
   applies colour through --dxbl-grid-selection-bg at the <tr>
   level, which cascades into the <td> cells.

   The correct approach is to override the component variable
   on a scoped ancestor selector (.dxbl-grid).

   Variable chain traced in core.min.css:
     .dxbl-grid-selected-row td
       → reads --dxbl-grid-selection-bg
       → default: var(--dxds-color-surface-primary-deep-rest)
       → which maps to primary-100 (full orange) by default

   Checkbox checked variable chain:
     dxbl-check.dxbl-checkbox-checked
       → --dxbl-checkbox-check-element-bg
       → --dxbl-checkbox-primary-checked-check-element-bg
       → --dxds-color-content-primary-compound-rest
       → neutral-0 (white on white = invisible tick)
     Fix: override the component variables directly.
   ============================================================ */

/* ── Grid variable overrides ─────────────────────────────────
   All overrides on .dxbl-grid so they cascade into the component.

   --dxbl-grid-selection-bg      → selected row (checkbox)
   --dxbl-grid-edit-row-bg       → edit row (inplace cell editing)
   --dxbl-grid-editor-cell-*     → padding around inplace editors:
     set to 0 so the editor fills the full cell height/width,
     matching DevExpress's own Fluent theme behaviour.           */
.dxbl-grid {
    --dxbl-grid-font-size: 14px;
    /*    --dxbl-grid-row-bg: #ffffff;
    --dxbl-grid-alt-row-bg: #ff5a00;*/
    --dxbl-grid-selection-bg: var(--batifree-primary-10);
    --dxbl-grid-selection-color: var(--batifree-neutral-100);
    --dxbl-grid-selection-focus-dark-bg: var(--batifree-primary-20);
    --dxbl-grid-selection-focus-dark-color: var(--batifree-neutral-100);
    --dxbl-grid-edit-row-bg: var(--batifree-primary-20);
    --dxbl-grid-edit-row-color: var(--batifree-neutral-100);
    --dxbl-grid-editor-cell-padding-x: 0;
    --dxbl-grid-editor-cell-padding-y: 0;
    --dxbl-grid-text-cell-padding-x: 0.4375rem;
    --dxbl-grid-text-cell-padding-y: 0;
    --dxbl-grid-border-color: transparent;
}

    /* Odd / even row alternation
   nth-child(of S) ignores virtual spacers and counts only real rows
   :not(.dxbl-grid-selected-row) lets the selection background through   */
    .dxbl-grid .dxbl-grid-table > tbody > tr:nth-child(odd of [data-visible-index]):not(.dxbl-grid-selected-row) > td {
        background-color: var(--batifree-solid-bg);
    }

    .dxbl-grid .dxbl-grid-table > tbody > tr:nth-child(even of [data-visible-index]):not(.dxbl-grid-selected-row) > td {
        background-color: var(--batifree-neutral-10);
    }

/* Checkbox unchecked — orange border 1.5px, transparent background.
   Figma spec: border var(--checkbox/enable/border, #ff5a00) = primary-100,
   border-width 1.5px, border-radius 4px, bg transparent.               */
dxbl-check.dxbl-checkbox-unchecked {
    --dxbl-checkbox-check-element-border: var(--batifree-primary-100) !important;
    --dxbl-checkbox-check-element-bg: transparent !important;
}

    dxbl-check.dxbl-checkbox-unchecked .dxbl-checkbox-check-element,
    dxbl-check.dxbl-checkbox-indeterminate .dxbl-checkbox-check-element {
        border-color: var(--batifree-primary-100) !important;
        border-width: 1.5px !important;
        border-radius: 4px !important;
        background-color: transparent !important;
    }

/* Checkbox checked — orange background with white tick */
dxbl-check.dxbl-checkbox-checked {
    --dxbl-checkbox-check-element-bg: var(--batifree-primary-100) !important;
    --dxbl-checkbox-check-element-border: var(--batifree-primary-100) !important;
    --dxbl-checkbox-primary-checked-check-element-bg: var(--batifree-primary-100) !important;
    --dxbl-checkbox-primary-checked-check-element-border: var(--batifree-primary-100) !important;
}

    dxbl-check.dxbl-checkbox-checked .dxbl-checkbox-check-element {
        background-color: var(--batifree-primary-100) !important;
        border-color: var(--batifree-primary-100) !important;
        border-radius: 4px !important;
    }

        dxbl-check.dxbl-checkbox-checked .dxbl-checkbox-check-element .dxbl-image {
            color: var(--batifree-white) !important;
        }

/* Display-view checkbox (read-only bool in grid cells)
   No .dxbl-checkbox-check-element: the box is reproduced on the inner <div>. */
.dxbl-checkbox.dxbl-checkbox-display-view-checked > div,
.dxbl-checkbox.dxbl-checkbox-display-view-unchecked > div {
    box-sizing: border-box !important;
    width: 20px !important;
    height: 20px !important;
    min-width: 20px !important;
    min-height: 20px !important;
    border-radius: 4px !important;
    border: 1px solid var(--batifree-primary-100) !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
}

.dxbl-checkbox.dxbl-checkbox-display-view-unchecked > div {
    background: transparent !important;
}

.dxbl-checkbox.dxbl-checkbox-display-view-checked > div {
    background-color: var(--batifree-primary-100) !important;
}

.dxbl-checkbox.dxbl-checkbox-display-view-checked .dxbl-image {
    color: var(--batifree-white) !important;
    width: 14px !important;
    height: 14px !important;
}

/* Checkbox size — 20×20 */
dxbl-check .dxbl-checkbox-check-element {
    width: 20px !important;
    height: 20px !important;
    min-width: 20px !important;
    min-height: 20px !important;
}

    dxbl-check .dxbl-checkbox-check-element .dxbl-image {
        width: 14px !important;
        height: 14px !important;
    }

/* Tree expand/collapse button — must NOT inherit the 33px min-height
   from the global button reset (section 4). Its size is set by the
   grid's own icon sizing, not the toolbar button spec.              */
.dxbl-grid .dxbl-grid-tree-node-expand-button.dxbl-btn {
    min-height: unset !important;
    height: 1.25rem !important;
    min-width: unset !important;
    width: 1.25rem !important;
    padding: 0 !important;
    box-shadow: none !important;
}


/* Row min-height */
.dxbl-grid td[role="gridcell"] {
    height: 38px;
    vertical-align: middle !important;
}

/* Row hover */
.dxbl-grid .dxbl-grid-row:hover td {
    background-color: var(--batifree-neutral-20) !important;
}

/* Column headers */
.dxbl-grid .dxbl-grid-header-cell {
    font-family: var(--batifree-font) !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    color: var(--batifree-neutral-100) !important;
    background-color: var(--batifree-neutral-10) !important;
    border-bottom: 1px solid var(--batifree-neutral-40) !important;
}

/* ── Column filter funnel buttons ───────────────────────────────────────────
   In v26, DevExpress applies dxbl-btn-outline-secondary to them.
   The BatiFree theme was giving them a violet background — neutralised here.*/
.dxbl-grid-filter-menu-funnel-btn.dxbl-btn {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: var(--batifree-neutral-50) !important;
}

.dxbl-grid-filter-menu-funnel-btn.dxbl-btn * {
    color: inherit !important;
}

.dxbl-grid-filter-menu-funnel-btn.dxbl-btn:hover {
    background: var(--batifree-neutral-10) !important;
    border: none !important;
    color: var(--batifree-ink) !important;
}

.dxbl-grid-filter-menu-funnel-btn.dxbl-btn.dxbl-active,
.dxbl-grid-filter-menu-funnel-btn.dxbl-btn[aria-pressed="true"] {
    background: transparent !important;
    border: none !important;
    color: var(--batifree-primary-100) !important;
}

/* Filter row — Figma spec: border 1px neutral-30, no radius, no bg */
tr.dxbl-grid-filter-row td {
    border-block-end: 1px solid var(--batifree-neutral-30) !important;
    border-block-start: 1px solid var(--batifree-neutral-30) !important;
    border-right: 1px solid var(--batifree-neutral-30) !important;
    border-radius: 0 !important;
    background: transparent !important;
}

/* Editors inside filter row — Figma spec: no bg, no border, no radius */
tr.dxbl-grid-filter-row .dxbl-text-edit,
tr.dxbl-grid-filter-row dxbl-input-editor,
tr.dxbl-grid-filter-row dxbl-spinedit,
tr.dxbl-grid-filter-row dxbl-date-edit {
    background: transparent !important;
    box-shadow: none !important;
    border: none !important;
    border-radius: 0 !important;
    height: auto !important;
    min-height: unset !important;
}

tr.dxbl-grid-filter-row .dxbl-text-edit-input {
    background: transparent !important;
    color: var(--batifree-neutral-100) !important;
    font-size: 12px !important;
}

tr.dxbl-grid-filter-row .dxbl-text-edit-input::placeholder {
    color: var(--batifree-neutral-80) !important;
    font-size: 12px !important;
    opacity: 1 !important;
}

/* ============================================================
   13b. TREE LIST — Figma node 2308-47972
   ============================================================ */

dxbl-tree-list.dxbl-grid {
    width: 100% !important;
    min-width: 100% !important;
}

    dxbl-tree-list.dxbl-grid .dxbl-scroll-viewer,
    dxbl-tree-list.dxbl-grid .dxbl-scroll-viewer-content,
    dxbl-tree-list.dxbl-grid .dxbl-grid-table {
        width: 100% !important;
        min-width: 100% !important;
    }

    dxbl-tree-list.dxbl-grid .dxbl-grid-table {
        table-layout: fixed !important;
        border-collapse: separate !important;
        border-spacing: 0 2px !important;
    }

    dxbl-tree-list.dxbl-grid .dxbl-grid-header,
    dxbl-tree-list.dxbl-grid td[role="gridcell"] {
        height: 32px !important;
        min-height: 32px !important;
        vertical-align: middle !important;
        font-size: 14px !important;
        line-height: 16px !important;
        font-weight: 400 !important;
        color: var(--batifree-ink) !important;
    }

    dxbl-tree-list.dxbl-grid tbody tr td {
        background-color: var(--batifree-neutral-10) !important;
    }

    dxbl-tree-list.dxbl-grid tbody .dxbl-grid-selected-row td {
        background-color: var(--batifree-primary-10) !important;
    }

    dxbl-tree-list.dxbl-grid tbody tr:hover td {
        background-color: var(--batifree-neutral-20) !important;
    }

    dxbl-tree-list.dxbl-grid tbody tr td:first-child {
        border-radius: 4px 0 0 4px !important;
    }

    dxbl-tree-list.dxbl-grid tbody tr td:nth-last-child(2) {
        border-radius: 0 4px 4px 0 !important;
    }

    dxbl-tree-list.dxbl-grid .dxbl-grid-tree-node-expand-controls-cell {
        display: table-cell !important;
        white-space: nowrap !important;
    }

    dxbl-tree-list.dxbl-grid .dxbl-grid-tree-node-expand-controls-container {
        display: inline-flex !important;
        align-items: center !important;
        vertical-align: middle !important;
        margin-right: 4px !important;
    }

    dxbl-tree-list.dxbl-grid .dxbl-grid-bottom-panel.dxbl-pager-container {
        min-height: 52px !important;
        padding: 8px !important;
        display: flex !important;
        align-items: center !important;
    }

/* ============================================================
   13c. GRID LISTVIEW — row height / checkbox alignment
   Applies only to XAF ListView grid containers.
   Do not merge with section 18: DetailView rules also affect
   form editors, input buttons and checkbox sizing.
   ============================================================ */

.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-grid .dxbl-checkbox,
.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-tree-list .dxbl-checkbox {
    min-height: 36px !important;
    display: inline-flex !important;
    align-items: center !important;
}

.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-grid .dxbl-grid-selection-cell,
.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-tree-list .dxbl-grid-selection-cell {
    vertical-align: middle !important;
}

.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-grid td,
.main-content > .grid-content.grid-virtual-scrolling-mode dxbl-tree-list td {
    vertical-align: middle !important;
}


/* ============================================================
   13. INPUTS / SEARCH / EDITORS
   General editor styles that apply outside of detail views.
   Detail-view-scoped overrides are in section 18.
   ============================================================ */
.dxbl-input-editor,
.dxbl-text-edit,
.dx-texteditor,
.form-control,
input[type="text"],
input[type="search"],
textarea,
select {
    font-family: var(--batifree-font) !important;
    font-size: 14px !important;
    border-radius: var(--batifree-radius-sm) !important;
    border-color: var(--batifree-neutral-40) !important;
    color: var(--batifree-neutral-100) !important;
    background-color: var(--batifree-neutral-0) !important;
}

    .dxbl-input-editor:focus,
    .dxbl-text-edit:focus,
    .dx-texteditor.dx-state-focused,
    .form-control:focus,
    input[type="text"]:focus,
    input[type="search"]:focus,
    textarea:focus,
    select:focus {
        border-color: var(--batifree-primary-100) !important;
        /*        box-shadow: var(--batifree-shadow-focus) !important;*/
        outline: none !important;
    }

/* Toolbar search box height */
.dxbl-toolbar input[type="search"],
.dxbl-toolbar .dxbl-text-edit,
.dxbl-toolbar .dx-texteditor {
    min-height: 33px !important;
}

/* ── Placeholder / Search input (Figma node 26-273) ─────────────
   The XAF search field (.xaf-action-fulltextsearch) must match
   the Figma Placeholder component:
   - Icon embedded inside the field (no separate button)
   - States: enable / hover (field) / focus-within (active)

   HTML:
     dxbl-input-editor.dxbl-text-edit.xaf-action-fulltextsearch
       input.dxbl-text-edit-input
       div.dxbl-btn-group-right
         button.dxbl-btn.dxbl-btn-outline-secondary.dxbl-text-edit-btn
           img.dxbl-image

   Figma tokens:
     enable  : bg neutral-10 (#f9f9f9)   border neutral-30 (#ebebea)
     hover   : bg primary-10 (#fff2eb)   border primary-20 (#ffe4d6)
     active  : bg neutral-10 (#f9f9f9)   border primary-100 (#ff5a00)
     icon enable/hover : neutral-80 (#91918d)
     icon active       : dark-teal (#164147)
   ──────────────────────────────────────────────────────────── */

/* Container — enable */
.xaf-action-fulltextsearch.dxbl-text-edit {
    background-color: var(--placeholder-enable-bg) !important;
    border-color: var(--placeholder-enable-border) !important;
    border-radius: var(--batifree-radius-md) !important;
}

    /* Container — hover */
    .xaf-action-fulltextsearch.dxbl-text-edit:hover {
        background-color: var(--placeholder-hover-bg) !important;
        border-color: var(--placeholder-hover-border) !important;
        box-shadow: none !important;
    }

        /* Input — bg hover (the input has an explicit bg, must follow the container) */
        .xaf-action-fulltextsearch.dxbl-text-edit:hover .dxbl-text-edit-input {
            background-color: var(--placeholder-hover-bg) !important;
        }

    /* Container — active / focus */
    .xaf-action-fulltextsearch.dxbl-text-edit:focus-within,
    .xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused {
        background-color: var(--placeholder-active-bg) !important;
        border-color: var(--placeholder-active-border) !important;
        box-shadow: none !important;
    }

/* Input — bg enable (override also placed after generic blocks, see below) */
.xaf-action-fulltextsearch .dxbl-text-edit-input {
    background-color: var(--placeholder-enable-bg) !important;
}

/* Button — transparent, embedded in the field
   Specificity 0,3,0 to beat .dxbl-toolbar .dxbl-btn.dxbl-btn-outline-secondary */
.xaf-action-fulltextsearch .dxbl-btn.dxbl-text-edit-btn {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 7px 10px !important;
}

    .xaf-action-fulltextsearch .dxbl-btn.dxbl-text-edit-btn:hover,
    .xaf-action-fulltextsearch .dxbl-btn.dxbl-text-edit-btn:active,
    .xaf-action-fulltextsearch .dxbl-btn.dxbl-text-edit-btn.dx-state-active {
        background: transparent !important;
        border: none !important;
        box-shadow: none !important;
    }

/* Icon — enable/hover colour: --placeholder-enable-content (#91918d) */
.xaf-action-fulltextsearch .dxbl-text-edit-btn .dxbl-image {
    width: 14px !important;
    height: 14px !important;
    filter: var(--batifree-filter-placeholder) !important;
}

/* Icon — active colour: --placeholder-active-content (#164147 dark-teal) */
.xaf-action-fulltextsearch.dxbl-text-edit:focus-within .dxbl-text-edit-btn .dxbl-image,
.xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused .dxbl-text-edit-btn .dxbl-image {
    filter: var(--batifree-filter-placeholder-active) !important;
}

/* Container — disabled */
.xaf-action-fulltextsearch.dxbl-disabled.dxbl-text-edit {
    background-color: var(--placeholder-disabled-bg) !important;
    border-color: var(--placeholder-disabled-border) !important;
    box-shadow: none !important;
    cursor: not-allowed !important;
}

/* Input — bg + text disabled */
.xaf-action-fulltextsearch.dxbl-disabled .dxbl-text-edit-input {
    background-color: var(--placeholder-disabled-bg) !important;
    color: var(--placeholder-disabled-content) !important;
    cursor: not-allowed !important;
}

/* Icon — disabled colour: --placeholder-disabled-content (#b9b9b6) */
.xaf-action-fulltextsearch.dxbl-disabled .dxbl-text-edit-btn .dxbl-image {
    filter: var(--batifree-filter-placeholder-disabled) !important;
}


/* ============================================================
   14. PAGE TITLE / TOP BAR
   ============================================================ */
.header,
.app-header,
.dxbl-header {
    font-family: var(--batifree-font) !important;
}

h1, h2, h3, h4, h5, h6 {
    font-family: var(--batifree-font) !important;
}


/* ============================================================
   15. FOCUS RING
   ============================================================ */
:focus-visible {
    outline: 2px solid var(--batifree-primary-90) !important;
    outline-offset: 1px !important;
}


/* ============================================================
   16. MODAL / POPUP
   XAF Blazor uses DevExpress popup components that render as
   .dxbl-modal-* elements.  Layout: backdrop → content →
   header / body / footer.
   ============================================================ */

/* Backdrop */
.dxbl-modal-dialog-backdrop,
.modal-backdrop {
    background-color: rgba(22, 65, 71, 0.40) !important;
    backdrop-filter: blur(2px) !important;
}

/* Outer container */
.dxbl-modal-content {
    font-family: var(--batifree-font) !important;
    background-color: var(--batifree-neutral-10) !important;
    border: 1px solid var(--batifree-neutral-30) !important;
    border-radius: 10px !important;
    box-shadow: none !important;
    overflow: hidden !important;
}

/* Header */
.dxbl-modal-header,
dxbl-popup-header.dxbl-modal-header {
    background-color: var(--batifree-neutral-10) !important;
    border-bottom: 1px solid var(--batifree-neutral-30) !important;
    padding: 15px 20px !important;
    min-height: 56px !important;
    display: flex !important;
    align-items: center !important;
}

.dxbl-modal-header-default {
    display: flex !important;
    align-items: center !important;
    justify-content: space-between !important;
    gap: 8px !important;
    width: 100% !important;
    min-height: 20px !important;
}

/* Title */
.dxbl-modal-header .xaf-object-caption,
dxbl-popup-header .xaf-object-caption {
    font-family: var(--batifree-font) !important;
    font-size: 16px !important;
    font-weight: 600 !important;
    color: var(--batifree-ink) !important;
    line-height: 1.4 !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
}

/* Close button */
button.dxbl-popup-header-button {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: var(--batifree-neutral-80) !important;
    width: 28px !important;
    min-width: 28px !important;
    height: 28px !important;
    min-height: 28px !important;
    padding: 4px !important;
    border-radius: var(--batifree-radius-md) !important;
    flex-shrink: 0 !important;
    transition: background-color 0.15s ease, color 0.15s ease !important;
}

    button.dxbl-popup-header-button:hover {
        background-color: var(--batifree-neutral-20) !important;
        color: var(--batifree-ink) !important;
    }

/* Body */
.dxbl-modal-body {
    padding: 15px 20px !important;
    background-color: var(--batifree-neutral-0) !important;
}

    .dxbl-modal-body .xaf-static-text,
    .dxbl-modal-body label {
        font-family: var(--batifree-font) !important;
        font-size: 14px !important;
        font-weight: 400 !important;
        color: var(--batifree-neutral-100) !important;
        line-height: 1.5 !important;
        white-space: pre-line !important;
    }

    /* Grid inside popup — la table doit prendre toute la largeur pour que dxbl-grid-empty-cell s'étire */
    .dxbl-modal-body table.dxbl-grid-table {
        width: 100% !important;
    }

    /* Inputs inside popup */
    .dxbl-modal-body .dxbl-input-editor,
    .dxbl-modal-body .dxbl-text-edit,
    .dxbl-modal-body .dx-texteditor,
    .dxbl-modal-body .form-control,
    .dxbl-modal-body select {
        min-height: 34px !important;
        border-radius: var(--batifree-radius-md) !important;
    }

/* Cellule en cours d'édition dans popup — fond blanc (override alternance) */
    .dxbl-modal-body .dxbl-grid td[role="gridcell"]:has(.dxbl-text-edit) {
        background-color: var(--batifree-solid-bg) !important;
    }

    /* Texte noir par défaut sur toutes les cellules de grids en popup */
    .dxbl-modal-body .dxbl-grid td[role="gridcell"] {
        color: var(--batifree-neutral-100) !important;
    }
    /* RichTextPopup : div cliquable toujours visible même si le contenu est vide,
       alignée verticalement comme les autres cellules du TreeList */
    .rte-popup-cell,
    .rte-popup-cell--readonly {
        display: flex;
        align-items: center;
        min-height: 22px;
        width: 100%;
    }
    .rte-popup-cell {
        cursor: text;
    }
    /* TreeList : cellule non éditable (classe via CustomizeElement) */
    dxbl-tree-list.dxbl-grid td[role="gridcell"].batifree-treelist-cell-readonly {
        pointer-events: none !important;
        opacity: 0.5 !important;
    }
    /* Modifier PAU : cellules lecture seule (classe via CustomizeElement) */
    .dxbl-modal-body .dxbl-grid td[role="gridcell"].batifree-col-readonly {
        color: var(--batifree-neutral-80) !important;
        pointer-events: none !important;
    }
    /* Modifier PAU : cellule éditable Nouveau PAU */
    .dxbl-modal-body .dxbl-grid td[role="gridcell"].batifree-col-editable {
        color: var(--batifree-neutral-110) !important;
        font-weight: 600 !important;
    }
    .dxbl-modal-body .dxbl-grid td[data-edit-cell] .dxbl-text-edit-input {
        font-weight: 600 !important;
    }

/* Batch edit — même padding que les cellules normales sur toute la ligne en édition */
.dxbl-grid .dxbl-grid-table>tbody>tr.dxbl-grid-edit-row>td:not(.dxbl-grid-indent-cell):not(.dxbl-grid-expand-button-cell):not(.dxbl-grid-row-drag-anchor-cell):not(.dxbl-grid-empty-cell):not(.dxbl-grid-empty-data-area):not(.dxbl-grid-edit-form):not(.dxbl-grid-detail-cell),
.dxbl-grid .dxbl-grid-table>tfoot>tr.dxbl-grid-edit-row>td:not(.dxbl-grid-indent-cell):not(.dxbl-grid-expand-button-cell):not(.dxbl-grid-row-drag-anchor-cell):not(.dxbl-grid-empty-cell):not(.dxbl-grid-empty-data-area):not(.dxbl-grid-edit-form):not(.dxbl-grid-detail-cell),
.dxbl-grid td[data-edit-cell] {
    padding: var(--dxbl-grid-text-cell-padding-y) var(--dxbl-grid-text-cell-padding-x) !important;
}

/* Batch edit — alignement vertical cellule active */
.dxbl-grid td[data-edit-cell] {
    vertical-align: middle !important;
}

/* Batch edit — reset des overrides detail-view sur les éditeurs dans td[data-edit-cell] */
.dxbl-grid td[data-edit-cell] .dxbl-text-edit {
    display: flex !important;
    flex-direction: row !important;
    align-items: center !important;
    height: 38px !important;
    min-height: 0 !important;
    overflow: hidden !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
}
.dxbl-grid td[data-edit-cell] textarea {
    height: 38px !important;
    max-height: 38px !important;
    resize: none !important;
}
.dxbl-grid td[data-edit-cell] .dxbl-text-edit > * {
    min-height: 0 !important;
    flex-shrink: 1 !important;
}

/* Footer */
.dxbl-modal-footer {
    padding: 16px 24px !important;
    min-height: 68px !important;
    border-top: 1px solid var(--batifree-neutral-30) !important;
    background-color: var(--batifree-neutral-10) !important;
    display: flex !important;
    align-items: center !important;
}

    /* Toolbar root inside footer */
    .dxbl-modal-footer .dxbl-toolbar,
    .dxbl-modal-footer dxbl-toolbar {
        width: 100% !important;
        min-width: 100% !important;
        margin: 0 !important;
        padding: 0 !important;
        background: transparent !important;
        height: auto !important;
        min-height: 36px !important;
    }

        /* DevExpress toolbar internal layout */
        .dxbl-modal-footer .dxbl-toolbar .dxbl-toolbar-items-container,
        .dxbl-modal-footer dxbl-toolbar .dxbl-toolbar-items-container {
            width: 100% !important;
            display: flex !important;
            align-items: center !important;
        }

        /* Empty before / center zones */
        .dxbl-modal-footer .dxbl-toolbar .dxbl-toolbar-before,
        .dxbl-modal-footer .dxbl-toolbar .dxbl-toolbar-center,
        .dxbl-modal-footer dxbl-toolbar .dxbl-toolbar-before,
        .dxbl-modal-footer dxbl-toolbar .dxbl-toolbar-center {
            flex: 0 0 auto !important;
            width: auto !important;
            min-width: 0 !important;
            padding: 0 !important;
            margin: 0 !important;
        }

        /* After zone — contains the action buttons, pushed to the right */
        .dxbl-modal-footer .dxbl-toolbar .dxbl-toolbar-after,
        .dxbl-modal-footer dxbl-toolbar .dxbl-toolbar-after {
            margin-left: auto !important;
            display: flex !important;
            align-items: center !important;
            justify-content: flex-end !important;
            gap: 8px !important;
            width: auto !important;
            min-width: 0 !important;
            padding: 0 !important;
        }

            .dxbl-modal-footer .dxbl-toolbar .dxbl-toolbar-after .dxbl-toolbar-item,
            .dxbl-modal-footer dxbl-toolbar .dxbl-toolbar-after .dxbl-toolbar-item {
                display: flex !important;
                align-items: center !important;
                margin: 0 !important;
                padding: 0 !important;
            }

    /* Footer buttons */
    .dxbl-modal-footer .dxbl-btn,
    .dxbl-modal-footer button.dxbl-btn.dxbl-sm {
        min-height: 36px !important;
        height: 36px !important;
        padding: 7px 14px !important;
        line-height: 1 !important;
        border-radius: 4px !important;
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        white-space: nowrap !important;
    }


/* Form layout — token set directly on the element (same pattern as .dxbl-grid) */
.dxbl-fl {
    --dxbl-fl-font-size-m: 14px;
    --dxbl-fl-font-size: 14px;
    --dxbl-fl-caption-font-size-m: 14px;
}

/* ============================================================
   17. DETAIL VIEW — Object forms (XAF FormLayout)
   Scoped to .main.main-object-model and .detail-view-content
   to avoid touching grid cell editors and modal editors.

   Verified DOM structure (provided HTML):
     .dxbl-group
       .dxbl-group-header > .dxbl-text
       .dxbl-group-body.dxbl-fl-group-body
         .dxbl-group-body-content
           .dxbl-fl-item
             .dxbl-fl-cpt          ← field label
             .dxbl-fl-ctrl
               .dxbl-text-edit     ← editor root
                 .dxbl-text-edit-input   ← actual <input>
                 .dxbl-btn-group-right   ← attached buttons (clear/dropdown)

   Colours verified against Figma (node 301-18359):
     Card background:      neutral-0
     Card border:          primary-20
     Card header bg:       primary-10
     Card header text:     neutral-130
     Editor background:    neutral-10
     Editor border:        neutral-30
     Editor text:          dark-teal
     Label colour:         neutral-130
     Disabled background:  neutral-30
   ============================================================ */

/* Card wrapper — padding-inline creates the inter-card gap
   visible gap between 2 adjacent cards = 2 × --batifree-card-gap           */
.main.main-object-model dxbl-form-layout-group.dxbl-fl-gd,
.detail-view-content dxbl-form-layout-group.dxbl-fl-gd {
    padding-inline: var(--batifree-card-gap, 6px) !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    overflow: visible !important;
}

/* Card inner panel — border/radius/shadow sur le panneau interne */
.main.main-object-model .dxbl-group,
.detail-view-content .dxbl-group {
    background: var(--batifree-neutral-0) !important;
    border: 1px solid var(--batifree-primary-20) !important;
    border-radius: 10px !important;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04) !important;
    overflow: hidden !important;
    height: 100% !important;
    box-sizing: border-box !important;
}

    /* Card header */
    .main.main-object-model .dxbl-group > .dxbl-group-header,
    .detail-view-content .dxbl-group > .dxbl-group-header {
        background: var(--batifree-primary-10) !important;
        border-bottom: 1px solid var(--batifree-primary-20) !important;
        border-radius: 0 !important;
        padding: 15px 20px !important;
        min-height: 46px !important;
        display: flex !important;
        align-items: center !important;
    }

        .main.main-object-model .dxbl-group > .dxbl-group-header .dxbl-text,
        .detail-view-content .dxbl-group > .dxbl-group-header .dxbl-text {
            color: var(--batifree-neutral-130) !important;
            font-family: var(--batifree-font) !important;
            font-size: 14px !important;
            font-weight: 500 !important;
            line-height: 1.35 !important;
        }

/* Card body */
.main.main-object-model .dxbl-group-body.dxbl-fl-group-body > .dxbl-group-body-content,
.detail-view-content .dxbl-group-body.dxbl-fl-group-body > .dxbl-group-body-content {
    background: var(--batifree-neutral-0) !important;
    padding: 15px !important;
}


/* Bootstrap row gutters inside groups */
.main.main-object-model .dxbl-group-body .dxbl-row,
.detail-view-content .dxbl-group-body .dxbl-row {
    --bs-gutter-x: 16px;
    --bs-gutter-y: 10px;
}

/* Field item wrapper */
.main.main-object-model .dxbl-fl-item,
.detail-view-content .dxbl-fl-item {
    margin-bottom: 8px !important;
}

/* Field labels */
.main.main-object-model .dxbl-fl-cpt,
.detail-view-content .dxbl-fl-cpt {
    color: var(--batifree-neutral-130) !important;
    font-family: var(--batifree-font) !important;
    font-size: 14px !important;
    font-weight: 400 !important;
    line-height: 1.35 !important;
    margin-bottom: 6px !important;
}

/* In horizontal layout the label sits next to the input — cancel margin-bottom and center vertically */
.main.main-object-model .dxbl-fl-item.dxbl-fl-item-horizontal > .dxbl-fl-cpt,
.detail-view-content .dxbl-fl-item.dxbl-fl-item-horizontal > .dxbl-fl-cpt {
    margin-bottom: 0 !important;
    align-self: center !important;
}

/* Control wrapper — full width */
.main.main-object-model .dxbl-fl-ctrl,
.detail-view-content .dxbl-fl-ctrl {
    width: 100% !important;
}

/* Editor root (.dxbl-text-edit wraps input + button groups) */
.main.main-object-model .dxbl-text-edit,
.main.main-object-model .dxbl-input-editor,
.main.main-object-model dxbl-combo-box.dxbl-text-edit,
.main.main-object-model dxbl-date-edit.dxbl-text-edit,
.detail-view-content .dxbl-text-edit,
.detail-view-content .dxbl-input-editor,
.detail-view-content dxbl-combo-box.dxbl-text-edit,
.detail-view-content dxbl-date-edit.dxbl-text-edit {
    background: var(--batifree-neutral-10) !important;
    border: 1px solid var(--batifree-neutral-30) !important;
    border-radius: var(--batifree-radius-md) !important;
    min-height: 34px !important;
    height: 34px !important;
    box-shadow: none !important;
    display: flex !important;
    align-items: stretch !important;
    overflow: hidden !important;
}

/* Tag box (multi-select lookup) — hauteur auto pour le wrapping des tags */
.main.main-object-model dxbl-tag-box.dxbl-text-edit,
.detail-view-content dxbl-tag-box.dxbl-text-edit {
    height: auto !important;
    min-height: 34px !important;
    overflow: visible !important;
    flex-wrap: wrap !important;
}

/* Memo editor (textarea) — hauteur auto, overflow visible */
.main.main-object-model dxbl-memo-editor.dxbl-text-edit,
.detail-view-content dxbl-memo-editor.dxbl-text-edit {
    height: auto !important;
    min-height: 34px !important;
    overflow: visible !important;
}

    /* Supprime la bordure de focus sur l'input interne du TagBox (doublon visuel) */
    .main.main-object-model dxbl-tag-box.dxbl-text-edit input.dxbl-text-edit-input,
    .detail-view-content dxbl-tag-box.dxbl-text-edit input.dxbl-text-edit-input {
        border: none !important;
        box-shadow: none !important;
        outline: none !important;
    }

/* Editor hover */
.main.main-object-model .dxbl-text-edit:hover,
.main.main-object-model .dxbl-input-editor:hover,
.detail-view-content .dxbl-text-edit:hover,
.detail-view-content .dxbl-input-editor:hover {
    background: var(--batifree-neutral-20) !important;
    border-color: var(--batifree-neutral-40) !important;
}

/* Placeholder — hover/focus override (specificity 0,4,1 > 0,3,1) */
.main.main-object-model .xaf-action-fulltextsearch.dxbl-text-edit:hover,
.detail-view-content .xaf-action-fulltextsearch.dxbl-text-edit:hover {
    background: var(--placeholder-hover-bg) !important;
    border-color: var(--placeholder-hover-border) !important;
    box-shadow: none !important;
}

.main.main-object-model .xaf-action-fulltextsearch.dxbl-text-edit:focus-within,
.main.main-object-model .xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused,
.detail-view-content .xaf-action-fulltextsearch.dxbl-text-edit:focus-within,
.detail-view-content .xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused {
    background: var(--placeholder-active-bg) !important;
    border-color: var(--placeholder-active-border) !important;
    box-shadow: none !important;
}

/* Placeholder — disabled override (specificity 0,4,1 > 0,3,1 of .dxbl-disabled.dxbl-text-edit) */
.main.main-object-model .dxbl-disabled.xaf-action-fulltextsearch.dxbl-text-edit,
.detail-view-content .dxbl-disabled.xaf-action-fulltextsearch.dxbl-text-edit {
    background: var(--placeholder-disabled-bg) !important;
    border-color: var(--placeholder-disabled-border) !important;
    box-shadow: none !important;
}

/* Editor focused */
.main.main-object-model .dxbl-text-edit:focus-within,
.main.main-object-model .dxbl-input-editor:focus-within,
.main.main-object-model .dxbl-text-edit.dx-state-focused,
.main.main-object-model .dxbl-input-editor.dx-state-focused,
.detail-view-content .dxbl-text-edit:focus-within,
.detail-view-content .dxbl-input-editor:focus-within,
.detail-view-content .dxbl-text-edit.dx-state-focused,
.detail-view-content .dxbl-input-editor.dx-state-focused {
    background: var(--batifree-solid-bg) !important;
    border-color: var(--batifree-primary-100) !important;
    /*    box-shadow: 0 0 0 2px rgba(255, 90, 0, 0.12) !important;*/
}

/* Actual <input> element */
.main.main-object-model .dxbl-text-edit-input,
.detail-view-content .dxbl-text-edit-input {
    background: transparent !important;
    border: none !important;
    color: var(--batifree-ink) !important;
    font-family: var(--batifree-font) !important;
    font-size: 14px !important;
    line-height: 1.35 !important;
    min-height: 32px !important;
    height: 32px !important;
    padding: 8px 10px !important;
    box-shadow: none !important;
}

    .main.main-object-model .dxbl-text-edit-input::placeholder,
    .detail-view-content .dxbl-text-edit-input::placeholder {
        color: var(--batifree-neutral-80) !important;
        opacity: 1 !important;
    }

/* Read-only / disabled editors */
.main.main-object-model .dxbl-disabled.dxbl-text-edit,
.main.main-object-model .dxbl-readonly.dxbl-text-edit,
.detail-view-content .dxbl-disabled.dxbl-text-edit,
.detail-view-content .dxbl-readonly.dxbl-text-edit {
    background: var(--batifree-neutral-30) !important;
    border-color: var(--batifree-neutral-30) !important;
    cursor: not-allowed !important;
}

/* Calendar/dropdown button disabled — scoped directly on the button element */
.main.main-object-model .dxbl-edit-btn-dropdown.dxbl-disabled,
.detail-view-content .dxbl-edit-btn-dropdown.dxbl-disabled {
    background: transparent !important;
    border: none !important;
    color: var(--batifree-neutral-70) !important;
    cursor: not-allowed !important;
}

.main.main-object-model .dxbl-disabled .dxbl-text-edit-input,
.main.main-object-model .dxbl-readonly .dxbl-text-edit-input,
.detail-view-content .dxbl-disabled .dxbl-text-edit-input,
.detail-view-content .dxbl-readonly .dxbl-text-edit-input {
    color: var(--batifree-neutral-70) !important;
    cursor: not-allowed !important;
}

    .main.main-object-model .dxbl-disabled .dxbl-text-edit-input::placeholder,
    .main.main-object-model .dxbl-readonly .dxbl-text-edit-input::placeholder,
    .detail-view-content .dxbl-disabled .dxbl-text-edit-input::placeholder,
    .detail-view-content .dxbl-readonly .dxbl-text-edit-input::placeholder {
        color: var(--batifree-neutral-70) !important;
        opacity: 1 !important;
    }

.main.main-object-model .dxbl-disabled .dxbl-edit-btn-clear,
.main.main-object-model .dxbl-disabled .dxbl-edit-btn-dropdown,
.detail-view-content .dxbl-disabled .dxbl-edit-btn-clear,
.detail-view-content .dxbl-disabled .dxbl-edit-btn-dropdown {
    cursor: not-allowed !important;
    pointer-events: none !important;
    color: var(--batifree-neutral-70) !important;
}

/* Lookup AllItemsWithSearch + DxTreeListEditor: active visual (white bg, normal text)           */
/* xaf-lookup-search is placed on dxbl-input-editor itself — 4 classes + 1 element = 0,4,1     */
/* Beats the grey rule above (.main.main-object-model .dxbl-readonly.dxbl-text-edit = 0,4,0)   */
dxbl-input-editor.dxbl-readonly.dxbl-text-edit.xaf-textbox.xaf-lookup-search {
    background: var(--batifree-neutral-0, #ffffff) !important;
    border-color: var(--batifree-neutral-30) !important;
    cursor: default !important;
}

/* Selected value text (.xaf-ellipsis) and placeholder */
dxbl-input-editor.dxbl-readonly.xaf-lookup-search .dxbl-text-edit-template {
    color: var(--batifree-neutral-90, #222) !important;
}

/* Attached button group (clear / dropdown arrow) — transparent bg to blend into the input */
.main.main-object-model .dxbl-btn-group-right,
.detail-view-content .dxbl-btn-group-right {
    display: flex !important;
    align-items: stretch !important;
    gap: 0 !important;
    border-left: none !important;
    background: transparent !important;
}

/* Individual attached buttons — transparent, blended into the input */
.main.main-object-model .dxbl-edit-btn-clear,
.main.main-object-model .dxbl-edit-btn-dropdown,
.main.main-object-model .dxbl-text-edit-btn,
.detail-view-content .dxbl-edit-btn-clear,
.detail-view-content .dxbl-edit-btn-dropdown,
.detail-view-content .dxbl-text-edit-btn {
    padding: 7px 8px !important;
    border: none !important;
    border-left: none !important;
    border-radius: 0 !important;
    background: transparent !important;
    color: var(--batifree-neutral-80) !important;
    box-shadow: none !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    min-width: unset !important;
    width: auto !important;
    height: auto !important;
    min-height: unset !important;
}

/* ── Placeholder / Search override — after the generic rules ─────
   Must be declared AFTER the .dxbl-btn-group-right and
   .dxbl-text-edit-btn blocks above to win at equal specificity.
   Target specificity: 0,3,0 (same as the competing blocks).      */

/* Input — bg per state (enable / hover / active) */
.xaf-action-fulltextsearch.dxbl-text-edit .dxbl-text-edit-input {
    background-color: var(--placeholder-enable-bg) !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:hover .dxbl-text-edit-input {
    background-color: var(--placeholder-hover-bg) !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:focus-within .dxbl-text-edit-input,
.xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused .dxbl-text-edit-input {
    background-color: var(--placeholder-active-bg) !important;
}

/* Button wrapper div — no border, bg follows the container state */
.xaf-action-fulltextsearch.dxbl-text-edit .dxbl-btn-group-right {
    border-left: none !important;
    background: var(--placeholder-enable-bg) !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:hover .dxbl-btn-group-right {
    background: var(--placeholder-hover-bg) !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:focus-within .dxbl-btn-group-right,
.xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused .dxbl-btn-group-right {
    background: var(--placeholder-active-bg) !important;
}

/* Button itself — bg follows the container state, no border */
.xaf-action-fulltextsearch.dxbl-text-edit .dxbl-text-edit-btn {
    background: var(--placeholder-enable-bg) !important;
    border: none !important;
    border-left: none !important;
    box-shadow: none !important;
    min-width: unset !important;
    width: auto !important;
    height: auto !important;
    min-height: unset !important;
    padding: 7px 10px !important;
    border-radius: 0 !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:hover .dxbl-text-edit-btn {
    background: var(--placeholder-hover-bg) !important;
    border: none !important;
    box-shadow: none !important;
}

.xaf-action-fulltextsearch.dxbl-text-edit:focus-within .dxbl-text-edit-btn,
.xaf-action-fulltextsearch.dxbl-text-edit.dx-state-focused .dxbl-text-edit-btn {
    background: var(--placeholder-active-bg) !important;
    border: none !important;
    box-shadow: none !important;
}

/* Input bg — disabled */
.xaf-action-fulltextsearch.dxbl-disabled .dxbl-text-edit-input {
    background-color: var(--placeholder-disabled-bg) !important;
    color: var(--placeholder-disabled-content) !important;
}

/* Div wrapper bouton — disabled */
.xaf-action-fulltextsearch.dxbl-disabled .dxbl-btn-group-right {
    border-left: none !important;
    background: var(--placeholder-disabled-bg) !important;
}

/* Bouton — disabled */
.xaf-action-fulltextsearch.dxbl-disabled .dxbl-text-edit-btn {
    background: var(--placeholder-disabled-bg) !important;
    border: none !important;
    box-shadow: none !important;
    cursor: not-allowed !important;
}

.main.main-object-model .dxbl-edit-btn-clear:hover,
.main.main-object-model .dxbl-edit-btn-dropdown:hover,
.main.main-object-model .dxbl-text-edit-btn:hover,
.detail-view-content .dxbl-edit-btn-clear:hover,
.detail-view-content .dxbl-edit-btn-dropdown:hover,
.detail-view-content .dxbl-text-edit-btn:hover {
    background: transparent !important;
    color: var(--batifree-neutral-100) !important;
}

/* Remove double border on first attached button */
.main.main-object-model .dxbl-btn-group-right > :first-child,
.detail-view-content .dxbl-btn-group-right > :first-child {
    border-left: none !important;
}

/* Icons inside attached buttons */
.main.main-object-model .dxbl-edit-btn-clear .dxbl-image,
.main.main-object-model .dxbl-edit-btn-dropdown .dxbl-image,
.main.main-object-model .dxbl-text-edit-btn .dxbl-image,
.detail-view-content .dxbl-edit-btn-clear .dxbl-image,
.detail-view-content .dxbl-edit-btn-dropdown .dxbl-image,
.detail-view-content .dxbl-text-edit-btn .dxbl-image {
    width: 16px !important;
    height: 16px !important;
}

/* Checkbox vertical alignment */
.main.main-object-model .dxbl-checkbox,
.detail-view-content .dxbl-checkbox {
    min-height: 36px !important;
    display: inline-flex !important;
    align-items: center !important;
}

/* Tab links inside detail view */
.main.main-object-model .card-header > .nav-tabs .nav-item .nav-link,
.detail-view-content .card-header > .nav-tabs .nav-item .nav-link {
    padding-top: 10px !important;
    padding-bottom: 14px !important;
}

/* Detail area background — transparent so the page bg shows through */
.main.main-object-model .main-content,
.detail-view-content {
    background: transparent !important;
}

/* Hide spin buttons on numeric editors (design decision) */
.dxbl-spin-btns,
.dxbl-text-edit > .dxbl-spin-btns,
.dxbl-text-edit > .dxbl-btn-group-vertical.dxbl-spin-btns,
.dxbl-input-editor > .dxbl-spin-btns,
.dxbl-input-editor > .dxbl-btn-group-vertical.dxbl-spin-btns {
    display: none !important;
}


/* ============================================================
   18. PAGER
   Figma nodes 166-1382 (LimitPageNumbers), 166-1984 (Pager),
   166-2022 (PageNumber).

   Page number states :
     default  : bg white, border transparent, text dark-teal
     active   : bg primary-100, border primary-100, text white
     hover    : bg primary-10, border primary-10, text dark-teal
     pressed  : bg primary-20, border primary-20, text dark-teal
   Nav buttons (prev/next/first/last) :
     padding 5px, border-radius 4px
   Gap between items: 2px
   ============================================================ */

/* ── Container ──────────────────────────────────────────────── */
.dxbl-pager {
    display: inline-flex !important;
    align-items: center !important;
    gap: 2px !important;
    font-family: var(--batifree-font) !important;
}

    /* ── Base shared by all pager buttons ───────────────────────── */
    /* All use dxbl-btn dxbl-btn-outline-secondary — scoped to
.dxbl-pager so real secondary buttons are not affected.       */
    .dxbl-pager .dxbl-btn {
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
        border-radius: 4px !important;
        border: 1px solid transparent !important;
        background: var(--batifree-neutral-0) !important;
        color: var(--batifree-ink) !important;
        font-family: var(--batifree-font) !important;
        box-shadow: none !important;
        transition: background 0.15s, border-color 0.15s !important;
    }

        /* ── Page number buttons ───────────────────────────────────── */
        .dxbl-pager .dxbl-btn.dxbl-pager-page-btn {
            min-width: 32px !important;
            height: 32px !important;
            padding: 6px !important;
            font-size: 14px !important;
            font-weight: 400 !important;
            line-height: 20px !important;
        }

        /* Page active */
        .dxbl-pager .dxbl-btn.dxbl-pager-active-page-btn {
            background: var(--batifree-primary-100) !important;
            border-color: var(--batifree-primary-100) !important;
            color: var(--batifree-white) !important;
        }

        /* Text colour — non-active (specificity 0,4,0 to beat global rules) */
        .dxbl-pager .dxbl-btn.dxbl-pager-page-btn:not(.dxbl-pager-active-page-btn) {
            color: var(--batifree-ink) !important;
        }

            /* Hover page non-active */
            .dxbl-pager .dxbl-btn.dxbl-pager-page-btn:not(.dxbl-pager-active-page-btn):hover {
                background: var(--batifree-primary-10) !important;
                border-color: var(--batifree-primary-10) !important;
                color: var(--batifree-ink) !important;
            }

            /* Pressed page non-active */
            .dxbl-pager .dxbl-btn.dxbl-pager-page-btn:not(.dxbl-pager-active-page-btn):active {
                background: var(--batifree-primary-20) !important;
                border-color: var(--batifree-primary-20) !important;
                color: var(--batifree-ink) !important;
            }

        /* ── Navigation buttons (prev / next / first / last) ──────────── */
        .dxbl-pager .dxbl-btn:not(.dxbl-pager-page-btn) {
            width: 30px !important;
            height: 30px !important;
            padding: 5px !important;
            color: var(--batifree-ink) !important;
        }

            .dxbl-pager .dxbl-btn:not(.dxbl-pager-page-btn):hover {
                background: var(--batifree-primary-10) !important;
                border-color: var(--batifree-primary-10) !important;
                color: var(--batifree-ink) !important;
            }

            .dxbl-pager .dxbl-btn:not(.dxbl-pager-page-btn):active {
                background: var(--batifree-primary-20) !important;
                border-color: var(--batifree-primary-20) !important;
                color: var(--batifree-ink) !important;
            }

            .dxbl-pager .dxbl-btn:not(.dxbl-pager-page-btn).dxbl-disabled,
            .dxbl-pager .dxbl-btn:not(.dxbl-pager-page-btn):disabled {
                opacity: 0.35 !important;
                cursor: not-allowed !important;
            }


/* ============================================================
   19. NAV-RIBBON (DxTabs / navigation principale)
   Figma nodes 115-715 (nav-ribbon), 115-277 (ribbon-item),
   115-317 (ribbon-bar).

   HTML vérifié :
     dxbl-tab-item.dxbl-tabs-item          ← onglet
     dxbl-tab-item.dxbl-tabs-item.dxbl-active ← onglet actif
     .dxbl-tabs-text-container > .dxbl-text > .dxbl-tabs-text-overflow

   États Figma :
     active   : SemiBold 600, underline primary-100 (3px pill)
     enable   : Regular 400, pas d'underline
     hover    : bg primary-10, radius 4px, Regular
     pressed  : bg primary-20, radius 4px, Regular
   ============================================================ */

/* ── Full-width light bar via ul::after ─────────────────────── */
/* bottom = same value as DevExpress padding on the ul           */
/* (--dxbl-tabs-tab-focus-outline-size/offset) → alignment       */
/* guaranteed at the bottom of li without an arbitrary fixed px  */
dxbl-scroll-viewer ul[role="tablist"] {
    position: relative !important;
}

    dxbl-scroll-viewer ul[role="tablist"]::after {
        content: '' !important;
        position: absolute !important;
        bottom: calc(var(--dxbl-tabs-tab-focus-outline-size, 0px) + var(--dxbl-tabs-tab-focus-outline-offset, 0px)) !important;
        left: 0 !important;
        right: 0 !important;
        height: 3px !important;
        background: var(--batifree-primary-10) !important;
        pointer-events: none !important;
        z-index: 0 !important;
    }

    /* ── Orange bar on the li containing the active tab ─────────── */
    /* bottom: 0 on li = lines up with ul::after (same bottom)       */
    dxbl-scroll-viewer ul[role="tablist"] > li {
        position: relative !important;
    }

        dxbl-scroll-viewer ul[role="tablist"] > li:has(dxbl-tab-item.dxbl-active)::after {
            content: '' !important;
            position: absolute !important;
            bottom: 0 !important;
            left: 0 !important;
            right: 0 !important;
            height: 3px !important;
            background: var(--batifree-primary-100) !important;
            border-radius: 9999px !important;
            pointer-events: none !important;
            z-index: 2 !important;
        }

/* ── Neutralises the native DevExpress indicator ─────────────── */
/* DevExpress uses dxbl-tab-item::after for its own              */
/* indicator (black hover bar + mispositioned active bar)        */
dxbl-tab-item.dxbl-tabs-item::after {
    display: none !important;
}

/* ── Tab item base ──────────────────────────────────────────── */
dxbl-tab-item.dxbl-tabs-item {
    padding: 10px 7px !important;
    border-radius: 4px !important;
    background: transparent !important;
    cursor: pointer !important;
    transition: background 0.15s !important;
}

    /* ── Text ───────────────────────────────────────────────────── */
    /* Exclude dxbl-tabs-space-reservation: this hidden clone is    */
    /* used to pre-reserve the bold width — applying Manrope widens */
    /* each tab and triggers the scroll viewer arrows               */
    dxbl-tab-item.dxbl-tabs-item .dxbl-tabs-text-overflow {
        font-family: var(--batifree-font) !important;
        font-weight: 400 !important;
        color: var(--batifree-ink) !important;
        line-height: normal !important;
        white-space: nowrap !important;
    }

    /* ── Active — SemiBold text ─────────────────────────────────── */
    dxbl-tab-item.dxbl-tabs-item.dxbl-active .dxbl-tabs-text-overflow {
        font-weight: 600 !important;
    }

    /* ── Hover — background only, bar unchanged ─────────────────── */
    dxbl-tab-item.dxbl-tabs-item:not(.dxbl-active):hover {
        background: var(--batifree-primary-10) !important;
    }

    /* ── Pressed ────────────────────────────────────────────────── */
    dxbl-tab-item.dxbl-tabs-item:not(.dxbl-active):active {
        background: var(--batifree-primary-20) !important;
    }


/* ── Contact / Facturation / Chantier tabs — purple theme ───── */
/* .batifree-cfc-tabs est sur le wrapper parent du dxbl-tabs    */
.batifree-cfc-tabs dxbl-scroll-viewer ul[role="tablist"]::after {
    background: #EAE8EE !important;
}

.batifree-cfc-tabs dxbl-scroll-viewer ul[role="tablist"] > li:has(dxbl-tab-item.dxbl-active)::after {
    background: #73688D !important;
}

.batifree-cfc-tabs dxbl-tab-item.dxbl-tabs-item:not(.dxbl-active):hover {
    background: rgba(115, 104, 141, 0.08) !important;
}

.batifree-cfc-tabs dxbl-tab-item.dxbl-tabs-item:not(.dxbl-active):active {
    background: rgba(115, 104, 141, 0.15) !important;
}


/* ============================================================
   20. ICON OVERRIDES
   Strategy: data-qa-selector identifies the DevExpress component
   reliably. The native .dxbl-image icon is hidden and the SVG
   is injected via ::before + CSS mask (colour controlled via
   background-color, compatible with all modern browsers).
   ============================================================ */

/* ── Popup — close button ─────────────────────────────────────── */
button[data-qa-selector="dx-popup-close-button"] .dxbl-image {
    display: none !important;
}

button[data-qa-selector="dx-popup-close-button"] {
    width: 28px !important;
    height: 28px !important;
    padding: 0 !important;
    background: transparent !important;
}

    button[data-qa-selector="dx-popup-close-button"]::before {
        content: "";
        display: block;
        width: 14px;
        height: 14px;
        margin: auto;
        background-color: var(--batifree-ink);
        -webkit-mask: url("/images/Close.svg") center / contain no-repeat;
        mask: url("/images/Close.svg") center / contain no-repeat;
    }

/* ── TreeList — expand/collapse button ─────────────────────────── */
button.dxbl-grid-tree-node-expand-button svg.dxbl-image use {
    display: none !important;
}

button.dxbl-grid-tree-node-expand-button svg.dxbl-image {
    width: 20px !important;
    height: 20px !important;
    transform: scale(1.5) !important;
    background-repeat: no-repeat !important;
    background-position: center !important;
    background-size: contain !important;
}

button.dxbl-grid-tree-node-expand-button[aria-label="Expand"] svg.dxbl-image,
button.dxbl-grid-tree-node-expand-button[aria-label="Déplier"] svg.dxbl-image {
    background-image: url("/images/family_filter_button_right.svg") !important;
}

button.dxbl-grid-tree-node-expand-button[aria-label="Collapse"] svg.dxbl-image,
button.dxbl-grid-tree-node-expand-button[aria-label="Réduire"] svg.dxbl-image {
    background-image: url("/images/family_filter_button.svg") !important;
}

/* ── Lookup "Famille" (Product.Family, LookupEditorMode="AllItemsWithSearch") ──
   xaf-lookup-search is only used in this project for this field (the only
   AllItemsWithSearch occurrence in the Model) → safe scope without a dedicated class.
   The native icon is not an <img> but a div.xaf-image.dxbl-image whose rendering
   is already an inline CSS mask (background-color: currentColor +
   mask-image: url(IImageService/Action_Search_Lookup...)) — confirmed by DOM
   inspection. No need for the display:none + ::before hack here: we directly
   rewrite mask-image/background-color on the element itself;
   !important beats the (non-!important) inline style set by DevExpress.
   [style*="Action_Search_Lookup"] targets ONLY the "Search" button —
   the "Cancel" (clear) button has a different ImageName and is not affected. */
.xaf-lookup-search .dxbl-image[style*="Action_Search_Lookup"] {
    background-color: var(--batifree-ink) !important;
    -webkit-mask-image: url("/images/famille.svg") !important;
    mask-image: url("/images/famille.svg") !important;
    -webkit-mask-size: contain !important;
    mask-size: contain !important;
}

/* ============================================================
   20b. RICHTEXT POPUP RENDERER — DxWindow with XAF style
   ============================================================ */
.rte-popup-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 0 4px 0 0;
    background-color: var(--batifree-neutral-10);
}

.rte-popup-title {
    font-family: var(--batifree-font);
    font-size: 16px;
    font-weight: 600;
    color: var(--batifree-ink);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.rte-popup-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    min-width: 28px;
    height: 28px;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: var(--batifree-radius-md);
    color: var(--batifree-neutral-80);
    cursor: pointer;
    flex-shrink: 0;
    font-size: 14px;
    transition: background-color 0.15s ease, color 0.15s ease;
}

    .rte-popup-close:hover {
        background-color: var(--batifree-neutral-20);
        color: var(--batifree-ink);
    }

.rte-popup-footer {
    display: flex;
    gap: 8px;
    justify-content: flex-end;
    width: 100%;
}

/* ============================================================
   21. STAT-CARD PROPERTY EDITOR  (StatCardPropertyEditor)
   ============================================================
   Self-contained component: the editor renders its own label + value.
   XAFML usage: PropertyEditorType="StatCardPropertyEditor"
                ShowCaption="False" on the LayoutItem
   ============================================================ */

.batifree-stat-item {
    background: var(--batifree-neutral-10);
    border: 1px solid var(--batifree-neutral-20);
    border-radius: 4px;
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.batifree-stat-label {
    font-size: 12px;
    font-weight: 400;
    color: var(--batifree-neutral-90);
    line-height: 1.3;
}

.batifree-stat-value {
    font-size: 14px;
    font-weight: 500;
    color: var(--batifree-text-strong);
    line-height: 1.35;
}

/* ============================================================
   22b. POPUP FACTURER LE DEVIS (VenteConfirmDvsParameters_DetailView)
   ============================================================
   DOM inspecté (2026-09-14) :
   - Header saumon  : .dxbl-group-header.dxbl-fl-caption-tmpl
                      > .dxbl-text.xaf-item-groupfinale / groupacompte / groupsituation
   - Wrapper groupe : dxbl-group-control (custom element)
   - Bouton finale  : button[data-action-name="Créer facture finale"]
   ============================================================ */

/* 1. Supprimer le fond saumon des 3 headers de section
      La règle générale (ligne 1954) a deux sélecteurs : .main.main-object-model et .detail-view-content.
      En popup XAF, le contenu est dans .detail-view-content (pas dans .main.main-object-model).
      On couvre les deux contextes avec spécificité (0,4,0) + source order pour battre (0,3,0),
      et (0,5,0) pour battre le cas (0,4,0). */
.main.main-object-model .dxbl-group > .dxbl-group-header:has(.xaf-item-groupfinale),
.main.main-object-model .dxbl-group > .dxbl-group-header:has(.xaf-item-groupacompte),
.main.main-object-model .dxbl-group > .dxbl-group-header:has(.xaf-item-groupsituation),
.detail-view-content .dxbl-group > .dxbl-group-header:has(.xaf-item-groupfinale),
.detail-view-content .dxbl-group > .dxbl-group-header:has(.xaf-item-groupacompte),
.detail-view-content .dxbl-group > .dxbl-group-header:has(.xaf-item-groupsituation) {
    --dxbl-group-header-bg: transparent;
    background: transparent !important;
    border-bottom: none !important;
    padding: 10px 10px 0 10px;
    font-size: 14px;
    font-weight: 400;
    color: var(--batifree-text-strong);
}

/* 2. Border neutre + radius autour de chaque section.
      La classe .dxbl-group EST sur dxbl-group-control lui-même (pas dans un shadow root).
      La règle batifree-light.css:1942 applique border: 1px solid var(--batifree-primary-20) !important
      sur .detail-view-content .dxbl-group (0,2,0) et .main.main-object-model .dxbl-group (0,3,0).
      On préfixe les sélecteurs avec le contexte pour atteindre (0,2,1) et (0,3,1). */
.main.main-object-model dxbl-group-control:has(.xaf-item-groupfinale),
.main.main-object-model dxbl-group-control:has(.xaf-item-groupacompte),
.main.main-object-model dxbl-group-control:has(.xaf-item-groupsituation),
.detail-view-content dxbl-group-control:has(.xaf-item-groupfinale),
.detail-view-content dxbl-group-control:has(.xaf-item-groupacompte),
.detail-view-content dxbl-group-control:has(.xaf-item-groupsituation) {
    border: 1px solid var(--batifree-neutral-30) !important;
    border-radius: 4px !important;
    overflow: hidden;
}

/* 3. Bouton Créer facture finale → PRIMARY orange
      (data-action-name est généré par XAF à partir du Caption de l'action) */
[data-action-name="Créer facture finale"] {
    --dxbl-btn-bg: var(--batifree-primary-100);
    --dxbl-btn-color: #fffefd;
    --dxbl-btn-border-color: var(--batifree-primary-100);
}
[data-action-name="Créer facture finale"]:hover {
    --dxbl-btn-bg: var(--batifree-primary-110);
    --dxbl-btn-border-color: var(--batifree-primary-110);
    --dxbl-btn-color: #fffefd;
}

/* ============================================================
   22. IMAGE PROPERTY EDITOR — fill group + center icon
   ============================================================
   dxbl-group-body-content is flex:0 0 auto by default
   so it does not grow inside the group (height:100%).
   Fix: flex:1 on body-content + height:100% cascaded down
   to xaf-image-container. Icon centered with flex.
   Button inset:0 covers the full available area.
   ============================================================ */

.dxbl-group:has(.xaf-image-editor) .dxbl-group-body-content {
    flex: 1 1 auto;
    min-height: 0;
}

.dxbl-group:has(.xaf-image-editor) .dxbl-row,
.dxbl-group:has(.xaf-image-editor) .dxbl-fl-item,
.dxbl-group:has(.xaf-image-editor) .dxbl-fl-ctrl,
.dxbl-group:has(.xaf-image-editor) .xaf-image-editor,
.dxbl-group:has(.xaf-image-editor) .progress-container {
    height: 100% !important;
    min-height: 0;
}

.dxbl-group:has(.xaf-image-editor) .img-thumbnail {
    height: 100% !important;
    width: 100% !important;
}

.dxbl-group:has(.xaf-image-editor) .xaf-image-container {
    position: relative !important;
    width: 100% !important;
    height: 100% !important;
    display: flex !important;
    justify-content: center !important;
    align-items: center !important;
}

.dxbl-group:has(.xaf-image-editor) .xaf-image-clickable-overlay {
    position: absolute !important;
    inset: 0 !important;
    width: 100% !important;
    height: 100% !important;
}

/* ============================================================
   23. CARD STACK — stacked-card navigation for address tabs
   ============================================================ */

/* Nav bar = card header (même style que .dxbl-group-header) */
.cardstack-nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 6px 12px;
    min-height: 46px;
    background: var(--batifree-primary-10);
    border: 1px solid var(--batifree-primary-20);
    border-bottom: 1px solid var(--batifree-primary-20);
    border-radius: 10px 10px 0 0;
}

.cardstack-arrow {
    background: none;
    border: none;
    font-size: 26px;
    line-height: 1;
    padding: 0 6px;
    color: var(--batifree-primary-100);
    cursor: pointer;
    border-radius: var(--batifree-radius-sm);
    transition: background 0.15s;
}

.cardstack-arrow:hover:not(:disabled) {
    background: rgba(255, 90, 0, 0.08);
}

.cardstack-arrow:disabled {
    color: var(--batifree-neutral-40);
    cursor: default;
}

.cardstack-center {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
}

.cardstack-label {
    font-size: 14px;
    font-weight: 500;
    color: var(--batifree-neutral-130);
    font-family: var(--batifree-font);
    text-transform: uppercase;
    letter-spacing: 0.6px;
    line-height: 1.35;
}

.cardstack-dots {
    display: flex;
    gap: 5px;
}

.cardstack-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--batifree-neutral-40);
    transition: background 0.2s;
}

.cardstack-dot.active {
    background: var(--batifree-primary-100);
}

/* Hide native tab headers — replaced by CardStack nav (JS adds cardstack-panel class).
   height:0 + overflow:hidden requis car le shadow DOM de dxbl-tab-list
   peut conserver 3.5px de rendu malgré display:none sur le host. */
dxbl-tabs.cardstack-panel dxbl-tab-list {
    display: none !important;
    height: 0 !important;
    min-height: 0 !important;
    max-height: 0 !important;
    overflow: hidden !important;
    padding: 0 !important;
    margin: 0 !important;
}

/* Masquer le tab-list des dxbl-tabs vides (tab-count=0) : placeholders XAF
   dont les colonnes Bootstrap dépassent 12 et wrappent sous le CardStack. */
dxbl-tabs[tab-count="0"] dxbl-tab-list {
    display: none !important;
    height: 0 !important;
    overflow: hidden !important;
}

/* Supprimer le margin-bottom du LayoutItem CardSlideNav pour coller le nav au panel */
.main.main-object-model dxbl-form-layout-item:has(.cardstack-nav),
.detail-view-content dxbl-form-layout-item:has(.cardstack-nav) {
    margin-bottom: 0 !important;
}

/* Tab panel = card body (même style que .dxbl-group) */
.dxbl-tabs.cardstack-panel {
    background: var(--batifree-neutral-0);
    border: 1px solid var(--batifree-primary-20);
    border-top: none;
    border-radius: 0 0 10px 10px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
    overflow: hidden !important;
}

/* Supprimer la double-carte : inner .dxbl-group dans le tab hérite du card parent.
   Sélecteurs préfixés .main.main-object-model / .detail-view-content pour
   dépasser la spécificité 0,3,0 de la règle card globale. */
.main.main-object-model .dxbl-tabs.cardstack-panel .dxbl-group,
.detail-view-content .dxbl-tabs.cardstack-panel .dxbl-group {
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    overflow: visible !important;
    height: auto !important;
}

.main.main-object-model .dxbl-tabs.cardstack-panel .dxbl-group > .dxbl-group-header,
.detail-view-content .dxbl-tabs.cardstack-panel .dxbl-group > .dxbl-group-header {
    display: none !important;
}

.main.main-object-model .dxbl-tabs.cardstack-panel .dxbl-group-body.dxbl-fl-group-body > .dxbl-group-body-content,
.detail-view-content .dxbl-tabs.cardstack-panel .dxbl-group-body.dxbl-fl-group-body > .dxbl-group-body-content {
    background: var(--batifree-neutral-0) !important;
    padding: 15px !important;
}

/* ============================================================
   24. AUTO-HEIGHT POPUP LISTVIEW
   Le JS DevExpress pose height: 0px en inline style sur dxbl-modal-dialog
   quand IPopupWindowTemplateSize.Height n'est pas fixé.
   overflow: hidden + height: 0px → popup collapsée à min-height: 200px.
   On surcharge avec !important directement sur le dialog.
   Les popups avec une hauteur fixée (vh ou px) ne sont pas affectés
   car leur dialog-css-style contient une valeur différente.
   ============================================================ */

dxbl-modal-dialog[dialog-css-style*="height: 0px"] {
    height: auto !important;
    overflow: auto !important;
}

/* ============================================================
   25. REPORT VIEWER TOOLBAR
   ============================================================ */

/* Gap entre groupes + padding latéral (dxbl-btn-plain-toolbar = flex container réel) */
.dxbrv-toolbar .dxbl-btn-plain-toolbar {
    gap: 10px !important;
    padding-inline: 10px !important;
}

/* Marge à gauche uniquement — évite le doublement du gap entre boutons adjacents */
.dxbrv-toolbar .dxbl-btn-toolbar .dxbl-btn {
    margin-inline-start: 5px !important;
    margin-inline-end: 0 !important;
}

/* Dernier bouton — garde une marge droite pour l'aération en bord */
.dxbrv-toolbar .dxbl-btn-toolbar .dxbl-btn-last {
    margin-inline-end: 5px !important;
}

/* Print + Export To — style primary
   Spécificité (0,10,0) dépasse la règle secondary (0,9,0) → pas de !important conflit
   Les classes sont vérifiées depuis le DOM inspecté (v26.1.3.0) */
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Print"],
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Export To"] {
    background: var(--batifree-primary-100) !important;
    border: 1px solid var(--batifree-primary-100) !important;
    border-radius: var(--batifree-radius-md);
}

.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Print"]:hover,
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Export To"]:hover {
    background: var(--batifree-primary-110) !important;
    border-color: var(--batifree-primary-110) !important;
}

.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Print"] .dxbl-image,
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Export To"] .dxbl-image,
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Export To"] svg,
.dxbrv-toolbar .dxbl-btn-group.dxbl-toolbar-group .dxbl-btn.dxbl-btn-text-secondary.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item[title="Export To"] svg use {
    color: #ffffff !important;
    fill: currentColor !important;
}

/* ============================================================
   26. SITUATIONS — ORIGIN GRID SEARCH BOX
   DxGrid search box of Ventes_Clean_ListView_Situations (left
   master pane), styled like the XAF FullTextSearch field.
   Class batifree-origin-search is added on the SearchBoxContainer
   by VenteSituationsOriginMasterController (CustomizeElement).
   DOM (v26.1.3.0):
     div.dxbl-grid-search-box-container.batifree-origin-search
       dxbl-input-editor.dxbl-grid-search-box.dxbl-text-edit
         button.dxbl-btn.dxbl-btn-outline-secondary.dxbl-btn-icon
           svg.dxbl-image
         input.dxbl-text-edit-input[type="search"]
   ============================================================ */
.batifree-origin-search.dxbl-grid-search-box-container {
    flex: 1 1 auto !important;
    width: 100% !important;
    margin: 0 !important;
    padding: 0 10px 8px 0 !important;
}

.batifree-origin-search .dxbl-grid-search-box.dxbl-text-edit {
    flex: 1 1 auto !important;
    width: 100% !important;
    max-width: none !important;
    height: 34px !important;
    min-height: 34px !important;
    background-color: var(--placeholder-enable-bg) !important;
    border: 1px solid var(--placeholder-enable-border) !important;
    border-radius: var(--batifree-radius-md) !important;
    box-shadow: none !important;
}

    .batifree-origin-search .dxbl-grid-search-box.dxbl-text-edit:hover {
        background-color: var(--placeholder-hover-bg) !important;
        border-color: var(--placeholder-hover-border) !important;
    }

    .batifree-origin-search .dxbl-grid-search-box.dxbl-text-edit:focus-within {
        background-color: var(--placeholder-active-bg) !important;
        border-color: var(--placeholder-active-border) !important;
        box-shadow: none !important;
    }

.batifree-origin-search .dxbl-grid-search-box .dxbl-text-edit-input {
    order: 1 !important;
    background-color: transparent !important;
    height: 32px !important;
    padding: 8px 10px !important;
    color: var(--batifree-ink) !important;
}

.batifree-origin-search .dxbl-grid-search-box .dxbl-btn.dxbl-edit-btn-clear {
    order: 2 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 7px 4px !important;
    color: var(--placeholder-enable-content) !important;
}

.batifree-origin-search .dxbl-grid-search-box .dxbl-btn.dxbl-btn-icon {
    order: 3 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 7px 10px !important;
    color: var(--placeholder-enable-content) !important;
}

.batifree-origin-search .dxbl-grid-search-box.dxbl-text-edit:focus-within .dxbl-btn.dxbl-btn-icon {
    color: var(--placeholder-active-content) !important;
}

.batifree-origin-search .dxbl-grid-search-box .dxbl-btn.dxbl-btn-icon .dxbl-image {
    width: 14px !important;
    height: 14px !important;
}

/* ============================================================
   27. GRID SEARCH BOX — STYLE ONLY (no layout override)
   Same visual as batifree-origin-search but without the
   flex/width overrides — keeps DevExpress default sizing.
   Class batifree-grid-search is added on SearchBoxContainer
   by LibraryPopupProductListController (CustomizeElement).
   ============================================================ */
.batifree-grid-search .dxbl-grid-search-box.dxbl-text-edit {
    height: 34px !important;
    min-height: 34px !important;
    background-color: var(--placeholder-enable-bg) !important;
    border: 1px solid var(--placeholder-enable-border) !important;
    border-radius: var(--batifree-radius-md) !important;
    box-shadow: none !important;
}

    .batifree-grid-search .dxbl-grid-search-box.dxbl-text-edit:hover {
        background-color: var(--placeholder-hover-bg) !important;
        border-color: var(--placeholder-hover-border) !important;
    }

    .batifree-grid-search .dxbl-grid-search-box.dxbl-text-edit:focus-within {
        background-color: var(--placeholder-active-bg) !important;
        border-color: var(--placeholder-active-border) !important;
        box-shadow: none !important;
    }

.batifree-grid-search .dxbl-grid-search-box .dxbl-text-edit-input {
    order: 1 !important;
    background-color: transparent !important;
    height: 32px !important;
    padding: 8px 10px !important;
    color: var(--batifree-ink) !important;
}

.batifree-grid-search .dxbl-grid-search-box .dxbl-btn.dxbl-edit-btn-clear {
    order: 2 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 7px 4px !important;
    color: var(--placeholder-enable-content) !important;
}

.batifree-grid-search .dxbl-grid-search-box .dxbl-btn.dxbl-btn-icon {
    order: 3 !important;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 7px 10px !important;
    color: var(--placeholder-enable-content) !important;
}

.batifree-grid-search .dxbl-grid-search-box.dxbl-text-edit:focus-within .dxbl-btn.dxbl-btn-icon {
    color: var(--placeholder-active-content) !important;
}

.batifree-grid-search .dxbl-grid-search-box .dxbl-btn.dxbl-btn-icon .dxbl-image {
    width: 14px !important;
    height: 14px !important;
}

/* ============================================================
   28. SÉLECTEUR DE MODE Light/Dark (ThemeSwitcher)
   ============================================================ */
.themeswitcher-fluent-mode .dxbl-btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 6px;
}

.themeswitcher-fluent-mode .dxbl-btn .dxbl-btn-icon.dxbl-image {
    flex: 0 0 auto;
    width: 16px !important;
    height: 16px !important;
    margin: 0 !important;
    vertical-align: middle;
}

.themeswitcher-fluent-mode .dxbl-btn .dxbl-btn-caption {
    line-height: 1;
}

/* ============================================================
   29. NOTIFICATIONS XAF (ShowMessage) — affichées en haut
   ============================================================ */
.xaf-alerts-stack > .xaf-alerts-stack-inner {
    justify-content: flex-start;
}

/* ============================================================
   30. NOTIFICATIONS XAF (ShowMessage) — style DS Batifree « alert »
   ============================================================ */
.xaf-alerts-stack .xaf-alert {
    --batifree-alert-surface: #ebf8fe;
    --batifree-alert-border: #005bc280;
    --batifree-alert-ink: #164147;
    --batifree-alert-text: #535350;
    align-items: flex-start;
    gap: 5px;
    padding: 10px 15px;
    margin-bottom: 8px;
    background: var(--batifree-alert-surface) !important;
    border: 1px solid var(--batifree-alert-border) !important;
    border-radius: 10px;
    box-shadow: none;
    color: var(--batifree-alert-ink) !important;
    font-family: var(--batifree-font);
}

.xaf-alerts-stack .xaf-alert.alert-success {
    --batifree-alert-surface: #ecfcea;
    --batifree-alert-border: #08651e;
}

.xaf-alerts-stack .xaf-alert.alert-info,
.xaf-alerts-stack .xaf-alert.alert-warning {
    --batifree-alert-surface: #ebf8fe;
    --batifree-alert-border: #005bc280;
}

.xaf-alerts-stack .xaf-alert.alert-danger {
    --batifree-alert-surface: var(--batifree-danger-10);
    --batifree-alert-border: var(--batifree-danger-90);
}

.xaf-alerts-stack .xaf-alert > .xaf-image {
    flex: 0 0 auto;
    width: 14px !important;
    height: 14px !important;
    margin: 2.5px 0 0 0;
    -webkit-mask-size: 14px !important;
    mask-size: 14px !important;
    background-color: var(--batifree-alert-ink) !important;
}

.xaf-alerts-stack .xaf-alert .xaf-alert-text-container {
    gap: 3px;
    padding: 0;
}

.xaf-alerts-stack .xaf-alert .xaf-alert-header {
    font-size: 14px;
    font-weight: 500;
    line-height: normal;
    color: var(--batifree-alert-ink);
}

.xaf-alerts-stack .xaf-alert .xaf-alert-header:empty {
    display: none;
}

.xaf-alerts-stack .xaf-alert .xaf-alert-message {
    font-size: 12px;
    font-weight: 400;
    line-height: normal;
    color: var(--batifree-alert-text);
}

.xaf-alerts-stack .xaf-alert .xaf-alert-header:empty + .xaf-alert-message {
    font-size: 14px;
    font-weight: 500;
    color: var(--batifree-alert-ink);
}

.xaf-alerts-stack .xaf-alert .xaf-alert-action-container {
    align-self: flex-start;
    margin-top: 2.5px;
}

.xaf-alerts-stack .xaf-alert .xaf-alert-button {
    padding: 0;
    color: var(--batifree-alert-ink) !important;
}

.xaf-alerts-stack .xaf-alert .xaf-alert-close .xaf-image {
    width: 14px !important;
    height: 14px !important;
    background-color: var(--batifree-alert-ink) !important;
    -webkit-mask-image: url("/images/Close.svg") !important;
    mask-image: url("/images/Close.svg") !important;
    -webkit-mask-size: contain !important;
    mask-size: contain !important;
    -webkit-mask-repeat: no-repeat !important;
    mask-repeat: no-repeat !important;
    -webkit-mask-position: center !important;
    mask-position: center !important;
}

/* ============================================================
   31. LISTES IMBRIQUÉES — toolbar qui suit le défilement
   ============================================================ */
dxbl-group-control.dxbl-group:has(.nested-frame > .nested-toolbar) {
    overflow: clip !important;
}

.nested-frame > .nested-toolbar {
    position: sticky !important;
    top: 0;
    z-index: 5;
    background: var(--batifree-neutral-0);
    box-shadow: 0 -7px 0 0 var(--batifree-neutral-0);
}

/* ============================================================
   32. DESCRIPTION — édition dans la cellule (DescriptionInlinePropertyEditor)
   ============================================================ */
.desc-inline-cell {
    cursor: text;
}

.desc-inline-input {
    width: 100%;
    margin: 0;
    padding: 0;
    border: 0;
    outline: none;
    background: transparent;
    color: inherit;
    line-height: inherit;
    resize: none;
    overflow: hidden;
}

.dxbl-grid td[data-edit-cell] textarea.desc-inline-input {
    max-height: none !important;
    line-height: 16px;
}

/* ============================================================
   33. DRAG-AND-DROP DES LIGNES D'ÉTUDE — repère de destination
   ============================================================ */
body.bf-drop-guide-on dxbl-tree-list dxbl-grid-drop-target-indicator.dxbl-active {
    box-shadow: none !important;
}

.bf-drop-guide {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 19998;
    pointer-events: none;
}

.bf-drop-guide-line {
    position: fixed;
    height: 3px;
    border-radius: 2px;
    background: var(--batifree-primary-100);
}

.bf-drop-guide-dot {
    position: absolute;
    left: -5px;
    top: -4px;
    width: 11px;
    height: 11px;
    border-radius: 50%;
    border: 2px solid var(--batifree-primary-100);
    background: var(--batifree-neutral-0);
}

.bf-drop-guide-box {
    position: fixed;
    border: 2px solid var(--batifree-primary-100);
    border-radius: var(--batifree-radius-md);
    background: rgba(255, 90, 0, 0.10);
}

.bf-drop-guide-label {
    position: fixed;
    padding: 2px 8px;
    border-radius: 10px;
    background: var(--batifree-primary-100);
    color: #ffffff;
    font-size: 12px;
    font-weight: 500;
    line-height: 18px;
    white-space: nowrap;
}

body.bf-drop-guide-on.bf-drop-forbidden dxbl-tree-list dxbl-grid-drop-target-indicator {
    visibility: hidden !important;
}

body.bf-drop-guide-on.bf-drop-forbidden,
body.bf-drop-guide-on.bf-drop-forbidden * {
    cursor: not-allowed !important;
}

/* ============================================================
   34. BOUTON D'ACTION PRINCIPAL DANS UNE BARRE D'OUTILS
   Une action XAF avec CustomCSSClassName="btn-primary" garde aussi
   dxbl-btn-secondary et tombe sous la règle « All other toolbar buttons »
   de la section 10 (spécificité 0,9,0 ; 0,10,0 au survol). Ce sélecteur
   (0,11,0 ; 0,12,0 au survol) rétablit la couleur principale.
   L'état désactivé reste géré par la section 10.
   ============================================================ */
.dxbl-toolbar .dxbl-btn.dxbl-btn-secondary.btn-primary.xaf-action.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item:not(.dxbl-text-edit-btn):not(.dxbl-disabled):not(:disabled) {
    background: var(--batifree-primary-100) !important;
    border: 1px solid var(--batifree-primary-100) !important;
    color: var(--batifree-white) !important;
}

    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary.btn-primary.xaf-action.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item:not(.dxbl-text-edit-btn):not(.dxbl-disabled):not(:disabled) * {
        color: var(--batifree-white) !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary.btn-primary.xaf-action.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item:not(.dxbl-text-edit-btn):not(.dxbl-disabled):not(:disabled):hover {
        background: var(--batifree-primary-110) !important;
        border-color: var(--batifree-primary-110) !important;
        color: var(--batifree-white) !important;
    }

    .dxbl-toolbar .dxbl-btn.dxbl-btn-secondary.btn-primary.xaf-action.dxbl-toolbar-btn.dxbl-toolbar-item.dxbl-toolbar-layout-block-item:not(.dxbl-text-edit-btn):not(.dxbl-disabled):not(:disabled):active {
        background: var(--batifree-primary-20) !important;
        border-color: var(--batifree-primary-20) !important;
        color: var(--batifree-ink-on-tint) !important;
        box-shadow: none !important;
    }


/* ============================================================
   35. ENCART D'AVERTISSEMENT (WarningNoticePropertyEditor)
   Utilisé dans la confirmation « Adresse de facturation incomplète ».
   ============================================================ */
.batifree-warning-notice {
    margin: 12px 0 0 0;
    padding: 10px 12px;
    background: var(--batifree-warning-20);
    border: 1px solid var(--batifree-warning-40);
    border-left: 4px solid var(--batifree-warning-90);
    border-radius: 4px;
    font-family: var(--batifree-font, 'Manrope', sans-serif);
    font-size: 14px;
    font-weight: 500;
    line-height: 1.4;
    color: var(--batifree-warning-110);
    white-space: pre-line;
    word-break: break-word;
}


/* ============================================================
   END OF BATIFREE LIGHT THEME
   ============================================================
*/
