/* ==========================================================================
   TravelLab — Design system v5 ("Marine KYAD", thèmes clair & sombre)
   --------------------------------------------------------------------------
   Style SaaS sobre et raffiné : neutres bleu-gris doux + une seule teinte
   d'accent (bleu marine KYAD), cartes arrondies aux ombres douces, typographie
   Plus Jakarta Sans, sur-titres en capitales espacées.

   THÈMES — toutes les couleurs passent par des jetons sémantiques :
     :root                      → thème clair (défaut)
     html[data-theme="dark"]    → thème sombre (+ data-bs-theme="dark" pour Bootstrap)
   Le thème est posé sur <html> par le serveur (préférence du compte) ou par
   partials/theme_head.php (auto = prefers-color-scheme, localStorage).
   RÈGLE : ne jamais écrire de couleur en dur dans une vue / un composant ;
   utiliser var(--tl-…). Guide : docs/DESIGN_SYSTEM.md § Thèmes.

   Organisation :
     1. Jetons (couleurs sémantiques des 2 thèmes, rayons, ombres, typo…)
     2. Surcharge des jetons Bootstrap 5.3.3 (couleur, rgb, color mode)
     3. Base & typographie
     4. Composants Bootstrap restylés (btn, card, form, table, badge, alert,
        modal, nav, pagination, dropdown, progress, list-group, toast)
     5. Coquille applicative (sidebar, topbar, footer, sélecteur de thème)
     6. Composants applicatifs (page head, stat cards, panels, tables,
        empty states, tags, filtres, formulaires…)
     7. Authentification
     8. Site public
     9. Utilitaires, responsive (mobile-first), impression
   ========================================================================== */

/* 1. Jetons ---------------------------------------------------------------- */

/* 1a. Thème clair (défaut) : bleu-gris doux + bleu marine KYAD */
:root {
    color-scheme: light;

    /* Marine KYAD (primaire) — 700 = primaire, 800 = foncé.
       Échelle « sémantique » : 50-200 = fonds/bordures teintés, 600 = icônes,
       700 = primaire, 800-900 = texte / survol. Inversée en thème sombre. */
    --tl-primary-950: #0F1D45;
    --tl-primary-900: #13265C;
    --tl-primary-800: #172E6E;   /* texte accentué, survol */
    --tl-primary-700: #1E3A8A;   /* primaire : boutons, liens, nav active */
    --tl-primary-600: #1E40AF;   /* icônes, pastilles (pas pour du petit texte) */
    --tl-primary-500: #4A6BC4;
    --tl-primary-400: #8099D9;
    --tl-primary-300: #B3C3EA;
    --tl-primary-200: #D5DEF3;   /* bordure teintée */
    --tl-primary-100: #EEF2FB;   /* teinte douce : fonds actifs, badges */
    --tl-primary-50:  #F5F7FD;
    --tl-primary-rgb: 30, 58, 138;
    --tl-primary: var(--tl-primary-700);
    --tl-primary-hover: var(--tl-primary-800);
    --tl-primary-active: var(--tl-primary-900);
    --tl-primary-dark: var(--tl-primary-800);
    --tl-primary-soft: var(--tl-primary-100);
    --tl-primary-subtle: var(--tl-primary-50);
    --tl-primary-border: var(--tl-primary-200);
    --tl-on-primary: #FFFFFF;    /* texte / icône sur fond primaire plein */
    --tl-on-solid: #FFFFFF;      /* texte sur fond de statut plein (succès, danger, info) */
    --tl-link: var(--tl-primary-700);
    --tl-link-hover: var(--tl-primary-800);
    /* Dégradés « marque » : restent bleu marine profond dans les 2 thèmes (texte blanc) */
    --tl-gradient: linear-gradient(135deg, #172E6E 0%, #1B347E 50%, #1E3A8A 100%);
    --tl-gradient-btn: linear-gradient(180deg, #24439A 0%, #1E3A8A 100%);
    --tl-gradient-side: linear-gradient(175deg, #13265C 0%, #152A66 55%, #172E6E 100%);
    --tl-on-gradient: #FFFFFF;
    --tl-brand-ink: #172E6E;     /* marine profond constant : texte sur pastille blanche posée sur un dégradé */
    /* Aplats profonds constants (texte blanc) : barres d'alerte / chrono d'examen */
    --tl-solid-deep: #0F1D45;
    --tl-solid-warning: #7A5714;
    --tl-solid-danger: #8C3A27;

    /* Accent : alias de la teinte primaire (thème mono-teinte) */
    --tl-accent: var(--tl-primary-600);
    --tl-accent-dark: var(--tl-primary-800);

    /* Statuts (atténués). -dark = texte, -soft = fond, -border = bordure */
    --tl-success: #3E7F5A;
    --tl-success-dark: #2B5E42;
    --tl-success-soft: #E8F2EC;
    --tl-success-border: #C5DDCD;
    --tl-success-rgb: 62, 127, 90;
    --tl-warning: #B7862B;
    --tl-warning-dark: #7A5714;
    --tl-warning-soft: #FAF3E3;
    --tl-warning-border: #EBD7AE;
    --tl-warning-ink: #2B1D05;   /* texte sur fond ocre plein */
    --tl-warning-rgb: 183, 134, 43;
    --tl-danger: #B5523B;
    --tl-danger-dark: #8C3A27;
    --tl-danger-soft: #F9ECE8;
    --tl-danger-border: #EBC6BB;
    --tl-danger-rgb: 181, 82, 59;
    --tl-info: #4F6B85;
    --tl-info-dark: #34506B;
    --tl-info-soft: #EAF0F6;
    --tl-info-border: #CAD7E4;
    --tl-info-rgb: 79, 107, 133;

    /* Neutres bleu-gris (jamais de blanc « pur » en fond d'application) */
    --tl-bg: #F2F5F9;            /* fond de l'application */
    --tl-bg-rgb: 242, 245, 249;
    --tl-bg-alt: #E8EDF3;        /* fond secondaire : pistes, puces, bouton secondaire */
    --tl-surface: #FFFFFF;       /* cartes, panneaux, tableaux */
    --tl-surface-rgb: 255, 255, 255;
    --tl-surface-2: #F6F8FB;     /* en-têtes de tableau, pieds de formulaire, zones secondaires */
    --tl-surface-raised: #FFFFFF;/* menus déroulants, modales, toasts */
    --tl-surface-hover: #F1F5F9;
    --tl-border: #DFE6EE;
    --tl-border-strong: #CBD5E0;
    --tl-border-hover: #AEBBCA;
    --tl-text-strong: #16202B;   /* titres, valeurs */
    --tl-text-strong-rgb: 22, 32, 43;
    --tl-text: #3C4957;          /* texte courant */
    --tl-text-rgb: 60, 73, 87;
    --tl-text-muted: #56636F;    /* texte secondaire (AA sur tous les fonds) */
    --tl-text-subtle: #636F7C;   /* méta, pieds (AA sur --tl-bg) */

    /* Champs de formulaire (bordure ≥ 3:1 : WCAG 1.4.11) */
    --tl-input-bg: #FFFFFF;
    --tl-input-border: #8391A0;
    --tl-input-border-hover: #6F7D8C;
    --tl-input-disabled-bg: #EEF2F6;
    --tl-input-placeholder: #6B7885;

    /* Barre latérale (teinte froide claire) */
    --tl-sidebar-bg: linear-gradient(180deg, #EDF2F7 0%, #E7EDF4 100%);
    --tl-sidebar-glow: radial-gradient(360px 260px at -20% 105%, rgba(30, 58, 138, 0.07), transparent 60%);
    --tl-sidebar-border: #DCE3EB;
    --tl-sidebar-text: #3C4957;
    --tl-sidebar-text-muted: #5B6875;
    --tl-sidebar-brand: #16202B;
    --tl-sidebar-hover-bg: rgba(22, 32, 43, 0.05);
    --tl-sidebar-hover-text: #16202B;
    --tl-sidebar-active-bg: #FFFFFF;
    --tl-sidebar-active-text: var(--tl-primary-800);
    --tl-sidebar-active-icon: var(--tl-primary-700);
    --tl-sidebar-active-shadow: 0 1px 2px rgba(22, 32, 43, 0.06), 0 6px 14px -8px rgba(22, 32, 43, 0.18);
    --tl-sidebar-user-bg: rgba(255, 255, 255, 0.65);
    --tl-sidebar-user-hover-bg: #FFFFFF;
    --tl-sidebar-scrollbar: rgba(22, 32, 43, 0.18);
    --tl-topbar-bg: #F2F5F9;     /* opaque : le contenu défile dessous (lisibilité sans backdrop-filter) */
    --tl-auth-bg:
        radial-gradient(900px 600px at 95% 110%, rgba(30, 58, 138, 0.12), transparent 60%),
        radial-gradient(700px 500px at 40% -10%, rgba(255, 255, 255, 0.9), transparent 60%),
        linear-gradient(160deg, #F4F7FA 0%, #ECF1F6 55%, #E4EBF2 100%);

    /* Code, sélection, défilement, superpositions */
    --tl-code-bg: var(--tl-primary-50);
    --tl-code-text: var(--tl-primary-800);
    --tl-pre-bg: #F4F7FA;
    --tl-pre-text: #2A3642;
    --tl-selection-bg: var(--tl-primary-700);
    --tl-selection-text: #FFFFFF;
    --tl-scrollbar-thumb: #C3CDD8;
    --tl-scrollbar-thumb-hover: #A9B5C2;
    --tl-scrollbar-track: transparent;
    --tl-overlay: rgba(15, 23, 32, 0.45);
    --tl-backdrop: #0F1720;
    --tl-backdrop-opacity: 0.4;
    --tl-tooltip-bg: #16202B;
    --tl-tooltip-text: #FFFFFF;
    --tl-highlight-bg: #FAF3E3;
    --tl-logo-bg: transparent;   /* support du logo KYAD (fond clair en thème sombre) */

    /* Graphiques (lus par JS au rendu, cf. TravelLab.cssVar) */
    --tl-chart-grid: #DFE6EE;
    --tl-chart-label: #56636F;
    --tl-chart-fill: rgba(30, 58, 138, 0.14);

    /* Ombres (teintées bleu-gris, larges et douces) */
    --tl-shadow-rgb: 22, 32, 43;
    --tl-shadow-xs: 0 1px 2px rgba(22, 32, 43, 0.05);
    --tl-shadow-sm: 0 2px 8px -2px rgba(22, 32, 43, 0.07), 0 1px 2px rgba(22, 32, 43, 0.04);
    --tl-shadow: 0 10px 30px -12px rgba(22, 32, 43, 0.16), 0 2px 6px -2px rgba(22, 32, 43, 0.05);
    --tl-shadow-lg: 0 28px 70px -20px rgba(22, 32, 43, 0.24), 0 8px 20px -10px rgba(22, 32, 43, 0.10);
    --tl-shadow-primary: 0 8px 18px -10px rgba(23, 46, 110, 0.55);
    --tl-shadow-primary-hover: 0 10px 22px -10px rgba(23, 46, 110, 0.6);
    --tl-ring: 0 0 0 4px rgba(30, 58, 138, 0.25);
    --tl-focus-ring: var(--tl-ring);
    --tl-focus-outline: var(--tl-primary-600);

    /* Compat (anciens noms — préférer les jetons sémantiques ci-dessus) */
    --tl-ink: var(--tl-text-strong);
    --tl-body: var(--tl-text);
    --tl-muted: var(--tl-text-muted);
    --tl-subtle: var(--tl-text-subtle);
    --tl-surface-sub: var(--tl-surface-2);
    --tl-white: #FFFFFF;         /* blanc littéral : uniquement sur fonds pleins colorés */
    --tl-navy-950: var(--tl-primary-950);
    --tl-navy-900: var(--tl-primary-900);
    --tl-navy-800: var(--tl-primary-800);
    --tl-navy-700: var(--tl-primary-700);
    --tl-navy-600: var(--tl-primary-600);
    --tl-navy: var(--tl-primary-700);
    --tl-gold: var(--tl-warning-dark);
    --tl-magenta: var(--tl-danger);

    /* Rayons */
    --tl-radius-xs: 6px;
    --tl-radius-sm: 8px;
    --tl-radius: 12px;
    --tl-radius-lg: 16px;
    --tl-radius-xl: 22px;
    --tl-radius-pill: 999px;

    /* Typographie */
    --tl-font-sans: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
    --tl-font-serif: var(--tl-font-sans); /* compat : anciens styles inline */
    --tl-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    --tl-fs-app: 0.9375rem;
    --tl-fs-table: 0.875rem;
    --tl-fs-meta: 0.8125rem;
    --tl-fs-label: 0.6875rem;
    --tl-tracking-eyebrow: 0.08em;
    --tl-tracking-title: -0.01em;

    /* Espacements */
    --tl-space-1: 0.25rem;
    --tl-space-2: 0.5rem;
    --tl-space-3: 0.75rem;
    --tl-space-4: 1rem;
    --tl-space-5: 1.5rem;
    --tl-space-6: 2rem;
    --tl-space-7: 3rem;

    /* Coquille */
    --tl-sidebar-w: 272px;
    --tl-sidebar-w-collapsed: 84px;
    --tl-topbar-h: 72px;
    --tl-tap: 44px;              /* cible tactile minimale */
    --tl-safe-bottom: env(safe-area-inset-bottom, 0px);
}

/* 1b. Thème sombre : ardoise bleu profond + bleu éclairci */
html[data-theme="dark"] {
    color-scheme: dark;

    /* Échelle primaire inversée : 50-200 = teintes sombres, 700-900 = bleus clairs */
    --tl-primary-950: #0A1430;
    --tl-primary-900: #C3D3FA;
    --tl-primary-800: #A9C1F7;   /* survol, texte accentué */
    --tl-primary-700: #93B4F5;   /* primaire */
    --tl-primary-600: #7EA2F0;
    --tl-primary-500: #5A7FD0;
    --tl-primary-400: #40599A;
    --tl-primary-300: #34497F;
    --tl-primary-200: #2A3B66;
    --tl-primary-100: #212F50;
    --tl-primary-50:  #1B2742;
    --tl-primary-rgb: 147, 180, 245;
    --tl-on-primary: #0B1530;
    --tl-on-solid: #0F1720;
    --tl-gradient: linear-gradient(135deg, #1A3170 0%, #1E3A86 50%, #23449A 100%);
    --tl-gradient-btn: linear-gradient(180deg, #A0BDF6 0%, #93B4F5 100%);

    --tl-success: #4FA57A;
    --tl-success-dark: #7CCB9F;
    --tl-success-soft: #1F3638;
    --tl-success-border: #294E47;
    --tl-success-rgb: 79, 165, 122;
    --tl-warning: #D6A64C;
    --tl-warning-dark: #E8C27A;
    --tl-warning-soft: #353631;
    --tl-warning-border: #574E37;
    --tl-warning-ink: #1E1603;
    --tl-warning-rgb: 214, 166, 76;
    --tl-danger: #E07A62;
    --tl-danger-dark: #F2A08C;
    --tl-danger-soft: #362F35;
    --tl-danger-border: #5B3F3E;
    --tl-danger-rgb: 224, 122, 98;
    --tl-info: #7F9DBA;
    --tl-info-dark: #A9C2DA;
    --tl-info-soft: #273543;
    --tl-info-border: #3A4B5C;
    --tl-info-rgb: 127, 157, 186;

    --tl-bg: #0F1720;
    --tl-bg-rgb: 15, 23, 32;
    --tl-bg-alt: #1E2B38;
    --tl-surface: #16212C;
    --tl-surface-rgb: 22, 33, 44;
    --tl-surface-2: #1B2835;
    --tl-surface-raised: #1B2835;
    --tl-surface-hover: #1F2D3B;
    --tl-border: #263545;
    --tl-border-strong: #31445A;
    --tl-border-hover: #43596F;
    --tl-text-strong: #E6EDF3;
    --tl-text-strong-rgb: 230, 237, 243;
    --tl-text: #C9D3DD;
    --tl-text-rgb: 201, 211, 221;
    --tl-text-muted: #9AA8B6;
    --tl-text-subtle: #8594A3;

    --tl-input-bg: #111B25;
    --tl-input-border: #5A6E83;
    --tl-input-border-hover: #71869B;
    --tl-input-disabled-bg: #1B2835;
    --tl-input-placeholder: #8594A3;

    --tl-sidebar-bg: linear-gradient(180deg, #131D27 0%, #111A23 100%);
    --tl-sidebar-glow: radial-gradient(360px 260px at -20% 105%, rgba(147, 180, 245, 0.08), transparent 60%);
    --tl-sidebar-border: #1F2C39;
    --tl-sidebar-text: #C9D3DD;
    --tl-sidebar-text-muted: #8594A3;
    --tl-sidebar-brand: #E6EDF3;
    --tl-sidebar-hover-bg: rgba(255, 255, 255, 0.05);
    --tl-sidebar-hover-text: #E6EDF3;
    --tl-sidebar-active-bg: rgba(147, 180, 245, 0.14);
    --tl-sidebar-active-text: #B4CBF8;
    --tl-sidebar-active-icon: #93B4F5;
    --tl-sidebar-active-shadow: inset 0 0 0 1px rgba(147, 180, 245, 0.22);
    --tl-sidebar-user-bg: rgba(255, 255, 255, 0.04);
    --tl-sidebar-user-hover-bg: rgba(255, 255, 255, 0.08);
    --tl-sidebar-scrollbar: rgba(255, 255, 255, 0.16);
    --tl-topbar-bg: #0F1720;
    --tl-auth-bg:
        radial-gradient(900px 600px at 95% 110%, rgba(147, 180, 245, 0.10), transparent 60%),
        radial-gradient(700px 500px at 40% -10%, rgba(127, 157, 186, 0.08), transparent 60%),
        linear-gradient(160deg, #111A24 0%, #0F1720 55%, #0C131A 100%);

    --tl-code-bg: #1B2742;
    --tl-code-text: #B4CBF8;
    --tl-pre-bg: #0C131A;
    --tl-pre-text: #C9D3DD;
    --tl-selection-bg: #34497F;
    --tl-selection-text: #FFFFFF;
    --tl-scrollbar-thumb: #33475B;
    --tl-scrollbar-thumb-hover: #445B72;
    --tl-overlay: rgba(4, 8, 12, 0.62);
    --tl-backdrop: #04080C;
    --tl-backdrop-opacity: 0.6;
    --tl-tooltip-bg: #E6EDF3;
    --tl-tooltip-text: #0F1720;
    --tl-highlight-bg: #4A3F22;
    --tl-logo-bg: #F2F5F9;

    --tl-chart-grid: #2A3A4B;
    --tl-chart-label: #9AA8B6;
    --tl-chart-fill: rgba(147, 180, 245, 0.18);

    --tl-shadow-rgb: 0, 0, 0;
    --tl-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
    --tl-shadow-sm: 0 2px 8px -2px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.25);
    --tl-shadow: 0 12px 30px -12px rgba(0, 0, 0, 0.55), 0 2px 6px -2px rgba(0, 0, 0, 0.3);
    --tl-shadow-lg: 0 28px 70px -20px rgba(0, 0, 0, 0.7), 0 8px 20px -10px rgba(0, 0, 0, 0.45);
    --tl-shadow-primary: 0 8px 18px -10px rgba(0, 0, 0, 0.6);
    --tl-shadow-primary-hover: 0 10px 22px -10px rgba(0, 0, 0, 0.7);
    --tl-ring: 0 0 0 4px rgba(147, 180, 245, 0.3);
    --tl-focus-outline: #A9C1F7;
}

/* 2. Surcharge Bootstrap (thème clair ; le sombre ne change que les triplets rgb
      et quelques couleurs pleines — le reste suit les jetons --tl-*) ------------ */
:root, html[data-theme="dark"] {
    --bs-body-font-family: var(--tl-font-sans);
    --bs-body-font-size: 0.9375rem;
    --bs-body-font-weight: 400;
    --bs-body-line-height: 1.6;
    --bs-body-color: var(--tl-text);
    --bs-body-color-rgb: var(--tl-text-rgb);
    --bs-body-bg: var(--tl-surface);           /* fond des composants Bootstrap (modales, menus…) */
    --bs-body-bg-rgb: var(--tl-surface-rgb);
    --bs-heading-color: var(--tl-text-strong);
    --bs-emphasis-color: var(--tl-text-strong);
    --bs-emphasis-color-rgb: var(--tl-text-strong-rgb);
    --bs-secondary-color: var(--tl-text-muted);
    --bs-secondary-color-rgb: var(--tl-text-rgb);
    --bs-secondary-bg: var(--tl-bg-alt);
    --bs-secondary-bg-rgb: var(--tl-bg-rgb);
    --bs-tertiary-bg: var(--tl-surface-2);
    --bs-tertiary-bg-rgb: var(--tl-bg-rgb);
    --bs-tertiary-color: var(--tl-text-subtle);
    --bs-tertiary-color-rgb: var(--tl-text-rgb);
    --bs-code-color: var(--tl-code-text);
    --bs-highlight-color: var(--tl-text-strong);
    --bs-highlight-bg: var(--tl-highlight-bg);

    --bs-primary: var(--tl-primary-700);
    --bs-primary-rgb: var(--tl-primary-rgb);
    --bs-primary-text-emphasis: var(--tl-primary-800);
    --bs-primary-bg-subtle: var(--tl-primary-100);
    --bs-primary-border-subtle: var(--tl-primary-200);

    --bs-secondary: var(--tl-text-muted);
    --bs-secondary-rgb: var(--tl-text-rgb);
    --bs-secondary-text-emphasis: var(--tl-text);
    --bs-secondary-bg-subtle: var(--tl-bg-alt);
    --bs-secondary-border-subtle: var(--tl-border-strong);

    --bs-success: var(--tl-success);
    --bs-success-rgb: var(--tl-success-rgb);
    --bs-success-text-emphasis: var(--tl-success-dark);
    --bs-success-bg-subtle: var(--tl-success-soft);
    --bs-success-border-subtle: var(--tl-success-border);

    --bs-danger: var(--tl-danger);
    --bs-danger-rgb: var(--tl-danger-rgb);
    --bs-danger-text-emphasis: var(--tl-danger-dark);
    --bs-danger-bg-subtle: var(--tl-danger-soft);
    --bs-danger-border-subtle: var(--tl-danger-border);

    --bs-warning: var(--tl-warning);
    --bs-warning-rgb: var(--tl-warning-rgb);
    --bs-warning-text-emphasis: var(--tl-warning-dark);
    --bs-warning-bg-subtle: var(--tl-warning-soft);
    --bs-warning-border-subtle: var(--tl-warning-border);

    --bs-info: var(--tl-info);
    --bs-info-rgb: var(--tl-info-rgb);
    --bs-info-text-emphasis: var(--tl-info-dark);
    --bs-info-bg-subtle: var(--tl-info-soft);
    --bs-info-border-subtle: var(--tl-info-border);

    /* « light » / « dark » Bootstrap = surface claire / encre, selon le thème */
    --bs-light: var(--tl-surface-2);
    --bs-light-rgb: var(--tl-bg-rgb);
    --bs-light-text-emphasis: var(--tl-text);
    --bs-light-bg-subtle: var(--tl-surface-2);
    --bs-light-border-subtle: var(--tl-border);
    --bs-dark: var(--tl-text-strong);
    --bs-dark-rgb: var(--tl-text-strong-rgb);
    --bs-dark-text-emphasis: var(--tl-text-strong);
    --bs-dark-bg-subtle: var(--tl-border-strong);
    --bs-dark-border-subtle: var(--tl-text-subtle);

    --bs-link-color: var(--tl-link);
    --bs-link-color-rgb: var(--tl-primary-rgb);
    --bs-link-hover-color: var(--tl-link-hover);
    --bs-link-hover-color-rgb: var(--tl-primary-rgb);
    --bs-link-decoration: none;

    --bs-border-color: var(--tl-border);
    --bs-border-color-translucent: rgba(var(--tl-shadow-rgb), 0.08);

    --bs-border-radius: 12px;
    --bs-border-radius-sm: 8px;
    --bs-border-radius-lg: 16px;
    --bs-border-radius-xl: 22px;
    --bs-border-radius-xxl: 28px;
    --bs-border-radius-pill: 999px;

    --bs-box-shadow: var(--tl-shadow);
    --bs-box-shadow-sm: var(--tl-shadow-sm);
    --bs-box-shadow-lg: var(--tl-shadow-lg);
    --bs-box-shadow-inset: inset 0 1px 2px rgba(var(--tl-shadow-rgb), 0.06);

    --bs-focus-ring-color: rgba(var(--tl-primary-rgb), 0.3);
    --bs-focus-ring-width: 4px;
    --bs-form-valid-color: var(--tl-success-dark);
    --bs-form-valid-border-color: var(--tl-success);
    --bs-form-invalid-color: var(--tl-danger-dark);
    --bs-form-invalid-border-color: var(--tl-danger);
}
html[data-theme="dark"] { --bs-border-color-translucent: rgba(255, 255, 255, 0.08); }

/* 3. Base ------------------------------------------------------------------ */
html { scroll-behavior: smooth; }
body {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--tl-bg);
    color: var(--tl-body);
    font-family: var(--tl-font-sans);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
}
main { flex: 1; }

h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--tl-font-sans);
    font-weight: 700;
    letter-spacing: var(--tl-tracking-title);
    line-height: 1.25;
    color: var(--tl-ink);
}
.display-1, .display-2, .display-3, .display-4, .display-5, .display-6 { font-weight: 700; letter-spacing: -0.02em; }
.tl-serif { font-family: var(--tl-font-sans); font-weight: 700; letter-spacing: var(--tl-tracking-title); }
strong, b { font-weight: 700; }
.fw-semibold { font-weight: 600 !important; }
.fw-bold { font-weight: 700 !important; }
small, .small { font-size: 0.8125em; }
.text-muted { color: var(--tl-muted) !important; }
a { transition: color .15s ease; }
hr { border-color: var(--tl-border); opacity: 1; }
code { color: var(--tl-code-text); background: var(--tl-code-bg); padding: 0.1em 0.35em; border-radius: 6px; font-size: 0.85em; }
pre { color: var(--tl-pre-text); background: var(--tl-pre-bg); border: 1px solid var(--tl-border); border-radius: var(--tl-radius-sm); padding: 0.85rem 1rem; font-size: 0.8125rem; }
pre code { color: inherit; background: none; padding: 0; }
::selection { background: var(--tl-selection-bg); color: var(--tl-selection-text); }

:focus-visible { outline: 2px solid var(--tl-focus-outline); outline-offset: 2px; }

/* Barres de défilement (suivent le thème) */
html { scrollbar-color: var(--tl-scrollbar-thumb) var(--tl-scrollbar-track); }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--tl-scrollbar-track); }
::-webkit-scrollbar-thumb { background: var(--tl-scrollbar-thumb); border-radius: 999px; border: 2px solid transparent; background-clip: padding-box; }
::-webkit-scrollbar-thumb:hover { background-color: var(--tl-scrollbar-thumb-hover); }

/* Bascule de thème instantanée (pas de transitions de couleur décalées) */
.tl-theme-switching *, .tl-theme-switching *::before, .tl-theme-switching *::after { transition: none !important; }

/* 4. Composants Bootstrap -------------------------------------------------- */

/* Boutons */
.btn {
    --bs-btn-font-weight: 600;
    --bs-btn-padding-x: 1.1rem;
    --bs-btn-padding-y: 0.55rem;
    --bs-btn-font-size: 0.875rem;
    --bs-btn-border-radius: var(--tl-radius);
    --bs-btn-focus-box-shadow: var(--tl-ring);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    letter-spacing: 0;
    transition: background-color .15s ease, border-color .15s ease, color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.btn.w-100, .btn.d-block { display: flex; }
.btn-sm { --bs-btn-padding-x: 0.75rem; --bs-btn-padding-y: 0.35rem; --bs-btn-font-size: 0.8125rem; --bs-btn-border-radius: var(--tl-radius-sm); gap: 0.35rem; }
.btn-lg { --bs-btn-padding-x: 1.5rem; --bs-btn-padding-y: 0.85rem; --bs-btn-font-size: 1rem; --bs-btn-border-radius: var(--tl-radius); }
.btn:active { transform: translateY(1px); }

.btn-primary {
    --bs-btn-color: var(--tl-on-primary);
    --bs-btn-bg: var(--tl-primary-700);
    --bs-btn-border-color: transparent;
    --bs-btn-hover-color: var(--tl-on-primary);
    --bs-btn-hover-bg: var(--tl-primary-800);
    --bs-btn-hover-border-color: transparent;
    --bs-btn-active-color: var(--tl-on-primary);
    --bs-btn-active-bg: var(--tl-primary-900);
    --bs-btn-active-border-color: transparent;
    --bs-btn-disabled-color: var(--tl-on-primary);
    --bs-btn-disabled-bg: var(--tl-primary-300);
    --bs-btn-disabled-border-color: transparent;
    background-image: var(--tl-gradient-btn);
    box-shadow: var(--tl-shadow-primary);
}
.btn-primary:hover { background-image: none; box-shadow: var(--tl-shadow-primary-hover); }
.btn-primary:disabled, .btn-primary.disabled { background-image: none; box-shadow: none; }

.btn-secondary {
    --bs-btn-color: var(--tl-ink);
    --bs-btn-bg: var(--tl-bg-alt);
    --bs-btn-border-color: var(--tl-bg-alt);
    --bs-btn-hover-color: var(--tl-ink);
    --bs-btn-hover-bg: var(--tl-border);
    --bs-btn-hover-border-color: var(--tl-border);
    --bs-btn-active-color: var(--tl-ink);
    --bs-btn-active-bg: var(--tl-border-strong);
    --bs-btn-active-border-color: var(--tl-border-strong);
    --bs-btn-disabled-color: var(--tl-muted);
    --bs-btn-disabled-bg: var(--tl-bg-alt);
    --bs-btn-disabled-border-color: var(--tl-bg-alt);
}
.btn-light {
    --bs-btn-color: var(--tl-ink);
    --bs-btn-bg: var(--tl-surface);
    --bs-btn-border-color: var(--tl-border-strong);
    --bs-btn-hover-color: var(--tl-primary-700);
    --bs-btn-hover-bg: var(--tl-primary-50);
    --bs-btn-hover-border-color: var(--tl-primary-200);
    --bs-btn-active-color: var(--tl-primary-800);
    --bs-btn-active-bg: var(--tl-primary-100);
    --bs-btn-active-border-color: var(--tl-primary-200);
    box-shadow: var(--tl-shadow-xs);
}
.btn-success {
    --bs-btn-color: var(--tl-on-solid); --bs-btn-bg: var(--tl-success); --bs-btn-border-color: var(--tl-success);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-success-dark); --bs-btn-hover-border-color: var(--tl-success-dark);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-success-dark); --bs-btn-active-border-color: var(--tl-success-dark);
    --bs-btn-disabled-color: var(--tl-on-solid); --bs-btn-disabled-bg: var(--tl-success); --bs-btn-disabled-border-color: var(--tl-success);
    box-shadow: 0 8px 18px -10px rgba(var(--tl-success-rgb), 0.5);
}
.btn-danger {
    --bs-btn-color: var(--tl-on-solid); --bs-btn-bg: var(--tl-danger); --bs-btn-border-color: var(--tl-danger);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-danger-dark); --bs-btn-hover-border-color: var(--tl-danger-dark);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-danger-dark); --bs-btn-active-border-color: var(--tl-danger-dark);
    --bs-btn-disabled-color: var(--tl-on-solid); --bs-btn-disabled-bg: var(--tl-danger); --bs-btn-disabled-border-color: var(--tl-danger);
    box-shadow: 0 8px 18px -10px rgba(var(--tl-danger-rgb), 0.5);
}
.btn-warning {
    --bs-btn-color: var(--tl-warning-ink); --bs-btn-bg: var(--tl-warning); --bs-btn-border-color: var(--tl-warning);
    --bs-btn-hover-color: var(--tl-warning-ink); --bs-btn-hover-bg: color-mix(in srgb, var(--tl-warning) 88%, #000); --bs-btn-hover-border-color: color-mix(in srgb, var(--tl-warning) 88%, #000);
    --bs-btn-active-color: var(--tl-warning-ink); --bs-btn-active-bg: color-mix(in srgb, var(--tl-warning) 78%, #000); --bs-btn-active-border-color: color-mix(in srgb, var(--tl-warning) 78%, #000);
}
.btn-info {
    --bs-btn-color: var(--tl-on-solid); --bs-btn-bg: var(--tl-info); --bs-btn-border-color: var(--tl-info);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-info-dark); --bs-btn-hover-border-color: var(--tl-info-dark);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-info-dark); --bs-btn-active-border-color: var(--tl-info-dark);
}
.btn-dark {
    --bs-btn-color: var(--tl-surface); --bs-btn-bg: var(--tl-ink); --bs-btn-border-color: var(--tl-ink);
    --bs-btn-hover-color: var(--tl-surface); --bs-btn-hover-bg: var(--tl-body); --bs-btn-hover-border-color: var(--tl-body);
}

.btn-outline-primary, .btn-outline-navy {
    --bs-btn-color: var(--tl-primary-700);
    --bs-btn-bg: var(--tl-surface);
    --bs-btn-border-color: var(--tl-primary-400);
    --bs-btn-hover-color: var(--tl-primary-800);
    --bs-btn-hover-bg: var(--tl-primary-50);
    --bs-btn-hover-border-color: var(--tl-primary-400);
    --bs-btn-active-color: var(--tl-primary-900);
    --bs-btn-active-bg: var(--tl-primary-100);
    --bs-btn-active-border-color: var(--tl-primary-400);
    --bs-btn-disabled-color: var(--tl-primary-400);
    --bs-btn-disabled-bg: var(--tl-surface);
    --bs-btn-disabled-border-color: var(--tl-primary-100);
}
.btn-outline-secondary {
    --bs-btn-color: var(--tl-body);
    --bs-btn-bg: var(--tl-surface);
    --bs-btn-border-color: var(--tl-border-strong);
    --bs-btn-hover-color: var(--tl-ink);
    --bs-btn-hover-bg: var(--tl-surface-sub);
    --bs-btn-hover-border-color: var(--tl-border-hover);
    --bs-btn-active-color: var(--tl-ink);
    --bs-btn-active-bg: var(--tl-bg-alt);
    --bs-btn-active-border-color: var(--tl-border-hover);
    --bs-btn-disabled-color: var(--tl-subtle);
    --bs-btn-disabled-bg: var(--tl-surface);
    --bs-btn-disabled-border-color: var(--tl-border);
}
.btn-outline-success {
    --bs-btn-color: var(--tl-success-dark); --bs-btn-bg: var(--tl-surface); --bs-btn-border-color: var(--tl-success-border);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-success); --bs-btn-hover-border-color: var(--tl-success);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-success-dark); --bs-btn-active-border-color: var(--tl-success-dark);
}
.btn-outline-danger {
    --bs-btn-color: var(--tl-danger-dark); --bs-btn-bg: var(--tl-surface); --bs-btn-border-color: var(--tl-danger-border);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-danger); --bs-btn-hover-border-color: var(--tl-danger);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-danger-dark); --bs-btn-active-border-color: var(--tl-danger-dark);
}
.btn-outline-warning {
    --bs-btn-color: var(--tl-warning-dark); --bs-btn-bg: var(--tl-surface); --bs-btn-border-color: var(--tl-warning-border);
    --bs-btn-hover-color: var(--tl-warning-ink); --bs-btn-hover-bg: var(--tl-warning); --bs-btn-hover-border-color: var(--tl-warning);
    --bs-btn-active-color: var(--tl-warning-ink); --bs-btn-active-bg: var(--tl-warning); --bs-btn-active-border-color: var(--tl-warning);
}
.btn-outline-info {
    --bs-btn-color: var(--tl-info-dark); --bs-btn-bg: var(--tl-surface); --bs-btn-border-color: var(--tl-info-border);
    --bs-btn-hover-color: var(--tl-on-solid); --bs-btn-hover-bg: var(--tl-info); --bs-btn-hover-border-color: var(--tl-info);
    --bs-btn-active-color: var(--tl-on-solid); --bs-btn-active-bg: var(--tl-info-dark); --bs-btn-active-border-color: var(--tl-info-dark);
}
.btn-outline-dark {
    --bs-btn-color: var(--tl-ink); --bs-btn-bg: var(--tl-surface); --bs-btn-border-color: var(--tl-border-strong);
    --bs-btn-hover-color: var(--tl-surface); --bs-btn-hover-bg: var(--tl-ink); --bs-btn-hover-border-color: var(--tl-ink);
}
.btn-outline-light {
    /* réservé aux fonds dégradés « marque » (marine profond dans les 2 thèmes) */
    --bs-btn-color: var(--tl-on-gradient); --bs-btn-border-color: rgba(255, 255, 255, 0.35);
    --bs-btn-hover-color: var(--tl-brand-ink); --bs-btn-hover-bg: #FFFFFF; --bs-btn-hover-border-color: #FFFFFF;
}
.btn-link {
    --bs-btn-color: var(--tl-primary-700);
    --bs-btn-hover-color: var(--tl-primary-900);
    --bs-btn-active-color: var(--tl-primary-900);
    text-decoration: none;
    font-weight: 600;
}
.btn-close:focus { box-shadow: var(--tl-ring); }
.btn-group > .btn { box-shadow: none; }
.btn-check:checked + .btn-outline-primary, .btn-check:checked + .btn-outline-secondary {
    color: var(--tl-on-primary); background: var(--tl-primary-700); border-color: var(--tl-primary-700);
}

/* Cartes */
.card {
    --bs-card-border-color: var(--tl-border);
    --bs-card-border-radius: var(--tl-radius-lg);
    --bs-card-inner-border-radius: calc(var(--tl-radius-lg) - 1px);
    --bs-card-cap-bg: var(--tl-surface);
    --bs-card-cap-padding-y: 1rem;
    --bs-card-cap-padding-x: 1.25rem;
    --bs-card-spacer-y: 1.25rem;
    --bs-card-spacer-x: 1.25rem;
    --bs-card-bg: var(--tl-surface);
    --bs-card-color: var(--tl-body);
    --bs-card-title-color: var(--tl-ink);
    background: var(--tl-surface);
    box-shadow: var(--tl-shadow-sm);
}
.card.border-0 { box-shadow: var(--tl-shadow); }
.card-header { font-weight: 700; color: var(--tl-ink); border-bottom-color: var(--tl-border); }
.card-header.bg-white, .card-footer.bg-white { background: var(--tl-surface) !important; }
.card-footer { background: var(--tl-surface-sub); border-top-color: var(--tl-border); }
.card-title { font-weight: 700; color: var(--tl-ink); }
.card-subtitle { color: var(--tl-muted); }
a.card, .card-hover { transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease; }
a.card:hover, .card-hover:hover { transform: translateY(-2px); box-shadow: var(--tl-shadow); border-color: var(--tl-primary-200); }

/* Ombres utilitaires */
.shadow-sm { box-shadow: var(--tl-shadow-sm) !important; }
.shadow { box-shadow: var(--tl-shadow) !important; }
.shadow-lg { box-shadow: var(--tl-shadow-lg) !important; }
.rounded { border-radius: var(--tl-radius) !important; }
.rounded-3 { border-radius: var(--tl-radius-lg) !important; }
.rounded-4 { border-radius: var(--tl-radius-xl) !important; }

/* Formulaires */
.form-label { font-weight: 600; font-size: 0.8125rem; color: var(--tl-ink); margin-bottom: 0.4rem; }
.form-text { color: var(--tl-muted); font-size: 0.78rem; }
.form-control, .form-select {
    border: 1px solid var(--tl-input-border);
    border-radius: var(--tl-radius);
    background-color: var(--tl-input-bg);
    color: var(--tl-ink);
    font-weight: 400;
    padding: 0.6rem 0.9rem;
    font-size: 0.9rem;
    transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
.form-control::placeholder { color: var(--tl-input-placeholder); opacity: 1; }
.form-control:hover, .form-select:hover { border-color: var(--tl-input-border-hover); }
.form-control:focus, .form-select:focus {
    border-color: var(--tl-primary-500);
    box-shadow: var(--tl-ring);
    background-color: var(--tl-input-bg);
    color: var(--tl-ink);
}
.form-control:disabled, .form-select:disabled, .form-control[readonly] { background-color: var(--tl-input-disabled-bg); color: var(--tl-muted); }
.form-select option, .form-select optgroup { background-color: var(--tl-surface-raised); color: var(--tl-ink); }
.form-control::file-selector-button { background: var(--tl-surface-2); color: var(--tl-ink); }
.form-control:hover:not(:disabled):not([readonly])::file-selector-button { background: var(--tl-bg-alt); }
.form-control-lg, .form-select-lg { padding: 0.8rem 1rem; font-size: 1rem; border-radius: var(--tl-radius); min-height: 3.25rem; }
.form-control-sm, .form-select-sm { padding: 0.35rem 0.65rem; font-size: 0.8125rem; border-radius: var(--tl-radius-sm); }
.form-select { padding-right: 2.4rem; background-position: right 0.85rem center; }
.input-group-text { background: var(--tl-surface-sub); border-color: var(--tl-input-border); color: var(--tl-muted); border-radius: var(--tl-radius); font-weight: 600; }
.input-group > .form-control:focus, .input-group > .form-select:focus { z-index: 5; }
.form-check-input { background-color: var(--tl-input-bg); border-color: var(--tl-input-border); width: 1.1em; height: 1.1em; margin-top: 0.2em; }
.form-check-input:checked, .form-check-input[type=checkbox]:indeterminate { background-color: var(--tl-primary-700); border-color: var(--tl-primary-700); }
/* Thème sombre : coche / puce foncées sur le bleu éclairci (contraste ≥ 3:1) */
html[data-theme="dark"] .form-check-input:checked[type=checkbox] { --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230B1530' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); }
html[data-theme="dark"] .form-check-input:checked[type=radio] { --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230B1530'/%3e%3c/svg%3e"); }
html[data-theme="dark"] .form-switch .form-check-input:checked { --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%230B1530'/%3e%3c/svg%3e"); }
html[data-theme="dark"] .form-check-input[type=checkbox]:indeterminate { --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230B1530' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); }
.form-check-input:focus { border-color: var(--tl-primary-400); box-shadow: var(--tl-ring); }
.form-check-input[type=checkbox] { border-radius: 0.35em; }
.form-switch .form-check-input { width: 2.2em; border-radius: 2em; }
.form-switch .form-check-input:focus { --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393BBA7'/%3e%3c/svg%3e"); }
.form-range::-webkit-slider-thumb { background: var(--tl-primary-700); }
.form-range::-moz-range-thumb { background: var(--tl-primary-700); }
.form-range:focus::-webkit-slider-thumb { box-shadow: var(--tl-ring); }
.was-validated .form-control:invalid, .form-control.is-invalid { border-color: var(--tl-danger); }
.was-validated .form-control:valid, .form-control.is-valid { border-color: var(--tl-success); }

/* Champ avec icône à gauche : <div class="tl-input-icon"><i class="bi bi-…"></i><input class="form-control"></div> */
.tl-input-icon { position: relative; }
.tl-input-icon > i {
    position: absolute; left: 1rem; top: 50%; transform: translateY(-50%);
    color: var(--tl-subtle); font-size: 1rem; pointer-events: none; transition: color .15s ease;
}
.tl-input-icon > .form-control, .tl-input-icon > .form-select { padding-left: 2.75rem; }
.tl-input-icon:focus-within > i { color: var(--tl-primary-600); }

/* Tableaux Bootstrap */
.table {
    --bs-table-bg: transparent;
    --bs-table-color: var(--tl-body);
    --bs-table-border-color: var(--tl-border);
    --bs-table-striped-bg: rgba(var(--tl-primary-rgb), 0.04);
    --bs-table-striped-color: var(--tl-body);
    --bs-table-active-color: var(--tl-ink);
    --bs-table-hover-bg: var(--tl-primary-50);
    --bs-table-hover-color: var(--tl-ink);
    --bs-table-active-bg: var(--tl-primary-100);
    font-size: var(--tl-fs-table);
    margin-bottom: 0;
}
.table > :not(caption) > * > * { padding: 0.8rem 1rem; }
.table > thead th, .table > thead td {
    background: var(--tl-surface-sub);
    color: var(--tl-muted);
    font-size: 0.6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--tl-tracking-eyebrow);
    white-space: nowrap;
    border-bottom: 1px solid var(--tl-border);
}
.table > tbody > tr:last-child > * { border-bottom: 0; }
.table-light { --bs-table-bg: var(--tl-surface-sub); --bs-table-color: var(--tl-muted); --bs-table-border-color: var(--tl-border); }
.table-sm > :not(caption) > * > * { padding: 0.5rem 0.75rem; }
.table-bordered > :not(caption) > * > * { border-color: var(--tl-border); }
.table-responsive { border-radius: inherit; }
.card > .table-responsive:first-child, .card > .table:first-child { border-top-left-radius: var(--bs-card-inner-border-radius); border-top-right-radius: var(--bs-card-inner-border-radius); }
.card > .table-responsive > .table > thead:first-child th:first-child { border-top-left-radius: var(--bs-card-inner-border-radius); }
.card > .table-responsive > .table > thead:first-child th:last-child { border-top-right-radius: var(--bs-card-inner-border-radius); }

/* Badges (pilules) */
.badge {
    --bs-badge-padding-x: 0.65em;
    --bs-badge-padding-y: 0.38em;
    --bs-badge-font-size: 0.72em;
    --bs-badge-font-weight: 600;
    --bs-badge-border-radius: 999px;
    letter-spacing: 0.02em;
}
.badge.bg-primary, .text-bg-primary { background: var(--tl-primary-100) !important; color: var(--tl-primary-800) !important; }
.badge.bg-secondary, .text-bg-secondary { background: var(--tl-bg-alt) !important; color: var(--tl-body) !important; }
.badge.bg-success, .text-bg-success { background: var(--tl-success-soft) !important; color: var(--tl-success-dark) !important; }
.badge.bg-danger, .text-bg-danger { background: var(--tl-danger-soft) !important; color: var(--tl-danger-dark) !important; }
.badge.bg-warning, .text-bg-warning { background: var(--tl-warning-soft) !important; color: var(--tl-warning-dark) !important; }
.badge.bg-info, .text-bg-info { background: var(--tl-info-soft) !important; color: var(--tl-info-dark) !important; }
.badge.bg-light, .text-bg-light { background: var(--tl-surface) !important; color: var(--tl-body) !important; box-shadow: inset 0 0 0 1px var(--tl-border); }
.badge.bg-dark, .text-bg-dark { background: var(--tl-ink) !important; color: var(--tl-surface) !important; }
.badge.bg-white { color: var(--tl-primary-700); }
/* Badge plein (quand un badge doit ressortir fortement) */
.badge.tl-badge-solid.bg-primary { background: var(--tl-primary-700) !important; color: var(--tl-on-primary) !important; }
.badge.tl-badge-solid.bg-success { background: var(--tl-success) !important; color: var(--tl-on-solid) !important; }
.badge.tl-badge-solid.bg-danger { background: var(--tl-danger) !important; color: var(--tl-on-solid) !important; }
.badge.tl-badge-solid.bg-warning { background: var(--tl-warning) !important; color: var(--tl-warning-ink) !important; }

/* Alertes */
.alert {
    --bs-alert-border-radius: var(--tl-radius);
    --bs-alert-padding-x: 1.1rem;
    --bs-alert-padding-y: 0.85rem;
    border-width: 1px;
    font-weight: 500;
    font-size: 0.9rem;
    box-shadow: var(--tl-shadow-xs);
    overflow-wrap: anywhere; /* liens longs (lien d'activation affiché sans envoi d'e-mails) */
}
.alert > .bi:first-child, .alert > i.bi { margin-right: 0.35rem; }
.alert-primary { --bs-alert-color: var(--tl-primary-800); --bs-alert-bg: var(--tl-primary-50); --bs-alert-border-color: var(--tl-primary-200); }
.alert-secondary, .alert-light { --bs-alert-color: var(--tl-body); --bs-alert-bg: var(--tl-surface); --bs-alert-border-color: var(--tl-border); }
.alert-success { --bs-alert-color: var(--tl-success-dark); --bs-alert-bg: var(--tl-success-soft); --bs-alert-border-color: var(--tl-success-border); }
.alert-danger { --bs-alert-color: var(--tl-danger-dark); --bs-alert-bg: var(--tl-danger-soft); --bs-alert-border-color: var(--tl-danger-border); }
.alert-warning { --bs-alert-color: var(--tl-warning-dark); --bs-alert-bg: var(--tl-warning-soft); --bs-alert-border-color: var(--tl-warning-border); }
.alert-info { --bs-alert-color: var(--tl-info-dark); --bs-alert-bg: var(--tl-info-soft); --bs-alert-border-color: var(--tl-info-border); }
.alert-link { font-weight: 700; }
.alert-dismissible .btn-close { padding: 1.05rem 1rem; }

/* Modales */
.modal {
    --bs-modal-border-radius: var(--tl-radius-xl);
    --bs-modal-inner-border-radius: calc(var(--tl-radius-xl) - 1px);
    --bs-modal-border-color: transparent;
    --bs-modal-box-shadow: var(--tl-shadow-lg);
    --bs-modal-header-padding: 1.25rem 1.5rem;
    --bs-modal-padding: 1.5rem;
    --bs-modal-footer-gap: 0.5rem;
    --bs-modal-header-border-color: var(--tl-border);
    --bs-modal-footer-border-color: var(--tl-border);
    --bs-modal-bg: var(--tl-surface-raised);
    --bs-modal-color: var(--tl-body);
}
.modal-content { box-shadow: var(--tl-shadow-lg); }
.modal-title { font-weight: 700; font-size: 1.125rem; }
.modal-footer { background: var(--tl-surface-sub); border-bottom-left-radius: var(--bs-modal-inner-border-radius); border-bottom-right-radius: var(--bs-modal-inner-border-radius); }
.modal-backdrop { --bs-backdrop-bg: var(--tl-backdrop); --bs-backdrop-opacity: var(--tl-backdrop-opacity); }
.offcanvas-backdrop { --bs-backdrop-bg: var(--tl-backdrop); --bs-backdrop-opacity: var(--tl-backdrop-opacity); }

/* Onglets & pilules */
.nav-tabs {
    --bs-nav-tabs-border-color: var(--tl-border);
    --bs-nav-tabs-link-active-color: var(--tl-primary-700);
    --bs-nav-tabs-link-active-bg: transparent;
    --bs-nav-tabs-link-active-border-color: transparent;
    --bs-nav-tabs-link-hover-border-color: transparent;
    gap: 0.25rem;
}
.nav-tabs .nav-link {
    border: 0;
    border-bottom: 2px solid transparent;
    color: var(--tl-muted);
    font-weight: 600;
    padding: 0.65rem 1rem;
    border-radius: 0;
    margin-bottom: -1px;
}
.nav-tabs .nav-link:hover { color: var(--tl-ink); border-bottom-color: var(--tl-border-strong); }
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { color: var(--tl-primary-700); border-bottom-color: var(--tl-primary-700); background: transparent; }
.nav-pills {
    --bs-nav-pills-border-radius: var(--tl-radius-pill);
    --bs-nav-pills-link-active-color: var(--tl-on-primary);
    --bs-nav-pills-link-active-bg: var(--tl-primary-700);
    gap: 0.25rem;
}
.nav-pills .nav-link { color: var(--tl-muted); font-weight: 600; padding: 0.45rem 1rem; }
.nav-pills .nav-link:hover { color: var(--tl-primary-700); background: var(--tl-primary-50); }
.nav-pills .nav-link.active { box-shadow: var(--tl-shadow-primary); }
.nav-link { color: var(--tl-primary-700); }

/* Pagination */
.pagination {
    --bs-pagination-color: var(--tl-body);
    --bs-pagination-bg: var(--tl-surface);
    --bs-pagination-border-color: var(--tl-border);
    --bs-pagination-border-radius: var(--tl-radius-sm);
    --bs-pagination-hover-color: var(--tl-primary-700);
    --bs-pagination-hover-bg: var(--tl-primary-50);
    --bs-pagination-hover-border-color: var(--tl-primary-200);
    --bs-pagination-focus-color: var(--tl-primary-700);
    --bs-pagination-focus-bg: var(--tl-primary-50);
    --bs-pagination-focus-box-shadow: var(--tl-ring);
    --bs-pagination-active-color: var(--tl-on-primary);
    --bs-pagination-active-bg: var(--tl-primary-700);
    --bs-pagination-active-border-color: var(--tl-primary-700);
    --bs-pagination-disabled-color: var(--tl-subtle);
    --bs-pagination-disabled-bg: var(--tl-surface);
    --bs-pagination-disabled-border-color: var(--tl-border);
    gap: 0.3rem;
    font-weight: 600;
}
.pagination .page-link { border-radius: var(--tl-radius-sm) !important; min-width: 2.25rem; text-align: center; }
.pagination .page-item.active .page-link { box-shadow: var(--tl-shadow-primary); }

/* Menus déroulants */
.dropdown-menu {
    --bs-dropdown-border-color: var(--tl-border);
    --bs-dropdown-border-radius: var(--tl-radius);
    --bs-dropdown-inner-border-radius: calc(var(--tl-radius) - 1px);
    --bs-dropdown-box-shadow: var(--tl-shadow-lg);
    --bs-dropdown-link-color: var(--tl-body);
    --bs-dropdown-link-hover-color: var(--tl-primary-800);
    --bs-dropdown-link-hover-bg: var(--tl-primary-50);
    --bs-dropdown-link-active-color: var(--tl-on-primary);
    --bs-dropdown-bg: var(--tl-surface-raised);
    --bs-dropdown-color: var(--tl-body);
    --bs-dropdown-header-color: var(--tl-subtle);
    --bs-dropdown-link-disabled-color: var(--tl-subtle);
    --bs-dropdown-link-active-bg: var(--tl-primary-700);
    --bs-dropdown-item-padding-x: 0.75rem;
    --bs-dropdown-item-padding-y: 0.5rem;
    --bs-dropdown-padding-x: 0.4rem;
    --bs-dropdown-padding-y: 0.4rem;
    --bs-dropdown-divider-bg: var(--tl-border);
    --bs-dropdown-font-size: 0.875rem;
    box-shadow: var(--tl-shadow-lg);
    font-weight: 500;
}
.dropdown-item { border-radius: var(--tl-radius-sm); display: flex; align-items: center; gap: 0.55rem; }
.dropdown-item i { font-size: 1rem; opacity: 0.8; }
.dropdown-header { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); font-weight: 600; color: var(--tl-subtle); }

/* Barres de progression (pilule) */
.progress, .progress-stacked {
    --bs-progress-height: 0.5rem;
    --bs-progress-bg: var(--tl-bg-alt);
    --bs-progress-border-radius: 999px;
    --bs-progress-bar-bg: var(--tl-primary-700);
    --bs-progress-font-size: 0.7rem;
    font-weight: 700;
}
.progress-bar { background-image: linear-gradient(90deg, var(--tl-primary-700), var(--tl-primary-500)); border-radius: 999px; }
.progress-bar.bg-success { background-image: none; }
.progress-bar.bg-warning { background-image: none; }
.progress-bar.bg-danger { background-image: none; }
.progress-bar.bg-info { background-image: none; }

/* Barre de progression segmentée (étapes) :
   <div class="tl-steps"><span class="is-active"></span><span></span><span></span></div> */
.tl-steps { display: flex; gap: 0.5rem; }
.tl-steps > span { flex: 1; height: 5px; border-radius: 999px; background: var(--tl-bg-alt); transition: background .2s ease; }
.tl-steps > span.is-active { background: var(--tl-primary-700); }
.tl-steps > span.is-done { background: var(--tl-primary-300); }

/* List group */
.list-group {
    --bs-list-group-border-color: var(--tl-border);
    --bs-list-group-border-radius: var(--tl-radius-lg);
    --bs-list-group-item-padding-x: 1.1rem;
    --bs-list-group-item-padding-y: 0.8rem;
    --bs-list-group-action-hover-bg: var(--tl-primary-50);
    --bs-list-group-action-hover-color: var(--tl-ink);
    --bs-list-group-active-bg: var(--tl-primary-700);
    --bs-list-group-active-border-color: var(--tl-primary-700);
    --bs-list-group-color: var(--tl-body);
    --bs-list-group-bg: var(--tl-surface);
    --bs-list-group-active-color: var(--tl-on-primary);
    --bs-list-group-action-color: var(--tl-body);
    --bs-list-group-action-active-bg: var(--tl-primary-100);
    --bs-list-group-disabled-color: var(--tl-subtle);
    --bs-list-group-disabled-bg: var(--tl-surface);
}
.list-group-flush { --bs-list-group-border-radius: 0; }

/* Accordéon */
.accordion {
    --bs-accordion-border-color: var(--tl-border);
    --bs-accordion-border-radius: var(--tl-radius-lg);
    --bs-accordion-inner-border-radius: calc(var(--tl-radius-lg) - 1px);
    --bs-accordion-active-color: var(--tl-primary-800);
    --bs-accordion-active-bg: var(--tl-primary-50);
    --bs-accordion-btn-focus-box-shadow: var(--tl-ring);
    --bs-accordion-btn-padding-y: 0.95rem;
    --bs-accordion-bg: var(--tl-surface);
    --bs-accordion-color: var(--tl-body);
    --bs-accordion-btn-color: var(--tl-ink);
    --bs-accordion-btn-bg: var(--tl-surface);
}
.accordion-button { font-weight: 700; color: var(--tl-ink); }

/* Toasts */
.toast {
    --bs-toast-border-radius: var(--tl-radius);
    --bs-toast-border-color: var(--tl-border);
    --bs-toast-box-shadow: var(--tl-shadow-lg);
    --bs-toast-bg: var(--tl-surface-raised);
    --bs-toast-color: var(--tl-body);
    --bs-toast-header-bg: var(--tl-surface-2);
    --bs-toast-header-color: var(--tl-ink);
    --bs-toast-max-width: 380px;
    font-weight: 600;
}
.tl-toasts { z-index: 1090; }
/* Toasts teintés (.text-bg-*) : fond doux → croix foncée en clair, claire en sombre */
html:not([data-theme="dark"]) .toast[class*="text-bg-"] .btn-close-white { filter: none; }
.tl-toast { display: flex; align-items: flex-start; gap: 0.75rem; padding: 0.85rem 1rem; border-left: 4px solid var(--tl-primary-700); }
.tl-toast-icon { font-size: 1.15rem; line-height: 1.2; color: var(--tl-primary-700); }
.tl-toast-body { flex: 1; color: var(--tl-ink); font-size: 0.875rem; }
.tl-toast--success { border-left-color: var(--tl-success); } .tl-toast--success .tl-toast-icon { color: var(--tl-success); }
.tl-toast--error { border-left-color: var(--tl-danger); } .tl-toast--error .tl-toast-icon { color: var(--tl-danger); }
.tl-toast--warning { border-left-color: var(--tl-warning); } .tl-toast--warning .tl-toast-icon { color: var(--tl-warning-dark); }
.tl-toast--info { border-left-color: var(--tl-info); } .tl-toast--info .tl-toast-icon { color: var(--tl-info-dark); }

/* Divers Bootstrap */
.bg-light { background-color: var(--tl-surface-sub) !important; }
.bg-white, .bg-body { background-color: var(--tl-surface) !important; }
.bg-body-tertiary, .bg-light-subtle { background-color: var(--tl-surface-2) !important; }
.bg-body-secondary { background-color: var(--tl-bg-alt) !important; }
.text-dark, .text-black, .text-body-emphasis { color: var(--tl-ink) !important; }
.text-body { color: var(--tl-body) !important; }
.text-body-secondary { color: var(--tl-muted) !important; }
.text-success { color: var(--tl-success-dark) !important; }
.text-danger { color: var(--tl-danger-dark) !important; }
.text-warning { color: var(--tl-warning-dark) !important; }
.text-info { color: var(--tl-info-dark) !important; }
.text-secondary { color: var(--tl-muted) !important; }
.border-white { border-color: var(--tl-surface) !important; }
.table-light { --bs-table-color: var(--tl-muted); }
.bg-primary { background-color: var(--tl-primary-700) !important; }
.text-primary { color: var(--tl-primary-700) !important; }
.border { border-color: var(--tl-border) !important; }
.tooltip { --bs-tooltip-bg: var(--tl-tooltip-bg); --bs-tooltip-color: var(--tl-tooltip-text); --bs-tooltip-border-radius: var(--tl-radius-sm); --bs-tooltip-font-size: 0.78rem; font-weight: 600; }
.popover { --bs-popover-bg: var(--tl-surface-raised); --bs-popover-body-color: var(--tl-body); --bs-popover-header-bg: var(--tl-surface-2); --bs-popover-header-color: var(--tl-ink); --bs-popover-border-color: var(--tl-border); --bs-popover-border-radius: var(--tl-radius); --bs-popover-box-shadow: var(--tl-shadow-lg); }
.offcanvas { --bs-offcanvas-bg: var(--tl-surface-raised); --bs-offcanvas-color: var(--tl-body); --bs-offcanvas-border-color: var(--tl-border); box-shadow: var(--tl-shadow-lg); }
.breadcrumb { --bs-breadcrumb-divider-color: var(--tl-subtle); --bs-breadcrumb-item-active-color: var(--tl-muted); font-size: 0.8125rem; font-weight: 600; }
.spinner-border { --bs-spinner-border-width: 0.2em; }

/* 5. Coquille applicative -------------------------------------------------- */

/* Marque */
.tl-brand-mark {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 12px;
    background: var(--tl-gradient);
    color: var(--tl-on-gradient);
    font-size: 1.2rem;
    box-shadow: var(--tl-shadow-primary);
}
.tl-brand-mark--light {
    background: rgba(255, 255, 255, 0.12);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18);
    backdrop-filter: blur(6px);
}
/* Logo officiel KYAD CENTER (bordeaux + marine) : toujours posé sur une pastille blanche
   hors fond clair (thème sombre, panneaux marine, pied de page) pour rester lisible. */
.tl-brand-logo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    height: 2.5rem;
    padding: 0.15rem 0.35rem;
    border-radius: 10px;
    background: #FFFFFF;
    box-shadow: 0 0 0 1px var(--tl-border), var(--tl-shadow-xs);
}
.tl-brand-logo img { display: block; height: 100%; width: auto; }
.tl-brand-logo--on-dark { box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.35), 0 4px 14px -6px rgba(0, 0, 0, 0.35); }
.tl-mark-logo { height: 2.75rem; width: auto; display: block; flex: none; }
.navbar-dark .tl-mark-logo, .tl-footer .tl-mark-logo, html[data-theme="dark"] .tl-mark-logo {
    background: #FFFFFF; border-radius: 10px; padding: 0.2rem 0.45rem; box-sizing: content-box;
}
.tl-brand { display: inline-flex; align-items: center; gap: 0.7rem; text-decoration: none !important; }
.tl-brand-text { display: flex; flex-direction: column; line-height: 1.1; }
.tl-brand-name { font-weight: 800; font-size: 1.15rem; color: var(--tl-ink); letter-spacing: -0.02em; }
.tl-brand-tag { font-size: 0.65rem; color: var(--tl-muted); text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); font-weight: 600; }
.navbar-dark .tl-brand-name { color: #fff; }
.navbar-dark .tl-brand-tag { color: rgba(255, 255, 255, 0.65); }

.tl-shell { display: flex; min-height: 100vh; }

/* Sidebar — couleurs : jetons --tl-sidebar-* (teinte froide claire / ardoise sombre) */
.tl-sidebar {
    width: var(--tl-sidebar-w);
    flex: none;
    background: var(--tl-sidebar-bg);
    border-right: 1px solid var(--tl-sidebar-border);
    color: var(--tl-sidebar-text);
    display: flex;
    flex-direction: column;
    position: sticky;
    top: 0;
    height: 100vh;
    transition: width .2s ease, transform .22s ease;
    z-index: 1030;
    overflow: hidden;
    isolation: isolate;
}
.tl-sidebar::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background: var(--tl-sidebar-glow);
    pointer-events: none;
}
.tl-sidebar.is-collapsed { width: var(--tl-sidebar-w-collapsed); }

.tl-sidebar-brand {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 1.35rem 1.35rem 1.1rem;
    color: var(--tl-sidebar-brand);
    text-decoration: none !important;
    flex: none;
    overflow: hidden;
    white-space: nowrap;
}
.tl-sidebar-brand:hover { color: var(--tl-sidebar-brand); }
.tl-sidebar-brand-text { display: flex; flex-direction: column; line-height: 1.1; }
.tl-sidebar-brand-name { font-size: 1.2rem; font-weight: 800; letter-spacing: -0.02em; color: var(--tl-sidebar-brand); }
.tl-sidebar-brand-tag { font-size: 0.62rem; font-weight: 600; letter-spacing: 0.12em; color: var(--tl-sidebar-text-muted); text-transform: uppercase; }
.tl-sidebar.is-collapsed .tl-sidebar-brand { padding: 1.35rem 0 1.1rem; justify-content: center; }

.tl-sidebar-nav {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
    padding: 0.5rem 0.9rem 1rem;
    scrollbar-width: thin;
    scrollbar-color: var(--tl-sidebar-scrollbar) transparent;
}
.tl-nav-group + .tl-nav-group { margin-top: 1.1rem; }
.tl-sidebar-section {
    padding: 0 0.75rem 0.45rem;
    font-size: 0.65rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--tl-tracking-eyebrow);
    color: var(--tl-sidebar-text-muted);
    white-space: nowrap;
}
.tl-sidebar.is-collapsed .tl-sidebar-section { visibility: hidden; height: 0.5rem; padding: 0; }
.tl-sidebar-divider { height: 1px; background: var(--tl-sidebar-border); margin: 0.75rem 0.6rem; }

.tl-sidebar-nav .nav-link {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.8rem;
    padding: 0.62rem 0.8rem;
    margin-bottom: 0.15rem;
    border-radius: 12px;
    color: var(--tl-sidebar-text);
    font-size: 0.9rem;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    transition: background-color .15s ease, color .15s ease;
}
.tl-sidebar-nav .nav-link i { width: 1.25rem; text-align: center; font-size: 1.1rem; flex: none; color: var(--tl-sidebar-text-muted); transition: color .15s ease; }
.tl-sidebar-nav .nav-link:hover { background: var(--tl-sidebar-hover-bg); color: var(--tl-sidebar-hover-text); }
.tl-sidebar-nav .nav-link:hover i { color: var(--tl-sidebar-hover-text); }
.tl-sidebar-nav .nav-link.active {
    background: var(--tl-sidebar-active-bg);
    color: var(--tl-sidebar-active-text);
    font-weight: 600;
    box-shadow: var(--tl-sidebar-active-shadow);
}
.tl-sidebar-nav .nav-link.active i { color: var(--tl-sidebar-active-icon); }
.tl-sidebar-nav .nav-link.active::before {
    content: ""; position: absolute; left: 0; top: 22%; bottom: 22%;
    width: 3px; border-radius: 0 3px 3px 0; background: var(--tl-primary-700);
}
.tl-sidebar-nav .nav-link .badge { margin-left: auto; }
.tl-sidebar.is-collapsed .tl-sidebar-nav { padding-left: 0.75rem; padding-right: 0.75rem; }
.tl-sidebar.is-collapsed .tl-sidebar-nav .nav-link { justify-content: center; padding: 0.7rem 0; }
.tl-sidebar.is-collapsed .tl-nav-label { display: none; }

.tl-sidebar-exam {
    display: flex; align-items: center; gap: 0.6rem;
    margin-top: 1rem; padding: 0.65rem 0.8rem;
    border-radius: 12px; background: var(--tl-warning-soft); border: 1px solid var(--tl-warning-border);
    color: var(--tl-warning-dark); font-size: 0.8125rem; font-weight: 700;
}

.tl-sidebar-footer { padding: 0.9rem; flex: none; border-top: 1px solid var(--tl-sidebar-border); }
.tl-sidebar-user {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    padding: 0.55rem;
    overflow: hidden;
    text-decoration: none !important;
    color: inherit;
    border-radius: 14px;
    background: var(--tl-sidebar-user-bg);
    border: 1px solid var(--tl-sidebar-border);
    transition: background-color .15s ease;
}
.tl-sidebar-user:hover { background: var(--tl-sidebar-user-hover-bg); color: inherit; }
.tl-sidebar-user .tl-avatar-sm { width: 2.25rem; height: 2.25rem; font-size: 0.9rem; }
.tl-sidebar-user-info { min-width: 0; overflow: hidden; }
.tl-sidebar-user-info .name { font-size: 0.85rem; font-weight: 700; color: var(--tl-sidebar-brand); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tl-sidebar-user-info .role { font-size: 0.65rem; color: var(--tl-sidebar-text-muted); text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); font-weight: 600; }
.tl-sidebar.is-collapsed .tl-sidebar-user { justify-content: center; background: transparent; border-color: transparent; padding: 0.3rem 0; }
.tl-sidebar.is-collapsed .tl-sidebar-user-info,
.tl-sidebar.is-collapsed .tl-lang-switch,
.tl-sidebar.is-collapsed .tl-sidebar-link-text { display: none; }

.tl-sidebar-link-btn {
    width: 100%; display: flex; align-items: center; gap: 0.6rem;
    padding: 0.5rem 0.75rem; font-size: 0.8125rem; font-weight: 600;
    color: var(--tl-sidebar-text); border: none; background: transparent;
    border-radius: 10px; text-decoration: none !important;
}
.tl-sidebar-link-btn:hover { background: var(--tl-sidebar-hover-bg); color: var(--tl-sidebar-hover-text); }
.tl-sidebar.is-collapsed .tl-sidebar-link-btn { justify-content: center; }

.tl-sidebar-collapse-btn {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    justify-content: center;
    padding: 0.45rem;
    margin-top: 0.6rem;
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--tl-sidebar-text-muted);
    border: 0;
    background: transparent;
    border-radius: 10px;
}
.tl-sidebar-collapse-btn:hover { background: var(--tl-sidebar-hover-bg); color: var(--tl-sidebar-hover-text); }
.tl-sidebar.is-collapsed .tl-sidebar-collapse-btn i { transform: rotate(180deg); }
.tl-sidebar.is-collapsed .tl-sidebar-collapse-btn .tl-nav-label { display: none; }


/* Zone de contenu */
.tl-content { flex: 1; min-width: 0; display: flex; flex-direction: column; }

.tl-content-topbar {
    display: flex;
    align-items: center;
    gap: 1rem;
    min-height: var(--tl-topbar-h);
    padding: 0.75rem 2rem;
    background: var(--tl-topbar-bg);
    backdrop-filter: saturate(160%) blur(12px);
    -webkit-backdrop-filter: saturate(160%) blur(12px);
    border-bottom: 1px solid var(--tl-border);
    position: sticky;
    top: 0;
    z-index: 1020;
}
.tl-mobile-toggle {
    display: none;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border: 1px solid var(--tl-border);
    background: var(--tl-surface);
    color: var(--tl-ink);
    border-radius: 12px;
    font-size: 1.3rem;
    box-shadow: var(--tl-shadow-xs);
    flex: none;
}
.tl-topbar-title { min-width: 0; flex: 1; }
.tl-breadcrumb {
    display: flex; align-items: center; gap: 0.4rem;
    font-size: 0.65rem; font-weight: 600; text-transform: uppercase;
    letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-muted);
    white-space: nowrap; overflow: hidden;
}
.tl-breadcrumb i { font-size: 0.6rem; }
.tl-breadcrumb span:last-child { color: var(--tl-primary-700); }
.tl-topbar-heading {
    font-size: 1.05rem; font-weight: 700; color: var(--tl-ink); letter-spacing: var(--tl-tracking-title);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tl-topbar-actions { display: flex; align-items: center; gap: 0.6rem; flex: none; }
.tl-topbar-exam {
    display: inline-flex; align-items: center; gap: 0.3rem;
    padding: 0.35rem 0.75rem; border-radius: 999px;
    background: var(--tl-warning-soft); color: var(--tl-warning-dark);
    font-size: 0.78rem; font-weight: 700;
}
.tl-icon-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 12px;
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    color: var(--tl-body);
    font-size: 1.1rem;
    box-shadow: var(--tl-shadow-xs);
    transition: color .15s ease, border-color .15s ease;
}
.tl-icon-btn:hover { color: var(--tl-primary-700); border-color: var(--tl-primary-200); }
.tl-icon-btn-badge {
    position: absolute; top: -5px; right: -5px;
    min-width: 1.15rem; height: 1.15rem; padding: 0 0.3rem;
    border-radius: 999px; background: var(--tl-danger); color: var(--tl-on-solid);
    font-size: 0.65rem; font-weight: 700; line-height: 1.15rem; text-align: center;
    box-shadow: 0 0 0 2px var(--tl-bg);
}
.tl-user-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.3rem 0.65rem 0.3rem 0.3rem;
    border: 1px solid var(--tl-border);
    background: var(--tl-surface);
    color: var(--tl-ink);
    border-radius: 999px;
    font-size: 0.8125rem;
    box-shadow: var(--tl-shadow-xs);
    text-decoration: none;
    transition: border-color .15s ease;
}
.tl-user-chip:hover { border-color: var(--tl-primary-200); color: var(--tl-ink); }
.tl-user-chip .tl-avatar-sm { width: 1.9rem; height: 1.9rem; font-size: 0.78rem; border-radius: 999px; }
.tl-user-chip-text { flex-direction: column; line-height: 1.15; text-align: left; }
.tl-user-chip-name { font-weight: 700; max-width: 11rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tl-user-chip-role { font-size: 0.62rem; font-weight: 600; color: var(--tl-muted); text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); }
.tl-user-chip-caret { font-size: 0.7rem; color: var(--tl-subtle); }
.tl-role-tag {
    text-transform: uppercase; font-size: 0.62rem; letter-spacing: var(--tl-tracking-eyebrow); font-weight: 600;
    background: var(--tl-primary-100); color: var(--tl-primary-800);
    padding: 0.15rem 0.5rem; border-radius: 999px;
}

.tl-sidebar-backdrop {
    display: none; position: fixed; inset: 0;
    background: var(--tl-overlay); backdrop-filter: blur(2px);
    z-index: 1025; border: none; padding: 0;
}

.tl-main { padding: 2rem 2rem 2.5rem; width: 100%; max-width: 1600px; margin: 0 auto; }
.tl-app-footer {
    display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
    padding: 1.1rem 2rem; font-size: 0.78rem; font-weight: 600; color: var(--tl-subtle);
    border-top: 1px solid var(--tl-border); margin-top: auto;
}

/* Barre de navigation hors coquille (pages sans sidebar) */
.tl-app-nav { background: var(--tl-surface); border-bottom: 1px solid var(--tl-border); padding: 0.75rem 1rem; box-shadow: var(--tl-shadow-xs); }

/* Typographie applicative (zone de contenu) */
.tl-content main, .tl-app .tl-main { font-size: var(--tl-fs-app); }
.tl-main h1, .tl-main .h1 { font-size: 1.75rem; }
.tl-main h2, .tl-main .h2 { font-size: 1.375rem; }
.tl-main h3, .tl-main .h3 { font-size: 1.2rem; }
.tl-main h4, .tl-main .h4 { font-size: 1.075rem; }
.tl-main h5, .tl-main .h5 { font-size: 1rem; }
.tl-main h6, .tl-main .h6 { font-size: 0.875rem; }

/* Sélecteur d'apparence (partials/theme_menu.php) */
.tl-theme-dropdown { min-width: 12.5rem; }
.tl-theme-item { width: 100%; }
.tl-theme-item .tl-theme-check { margin-left: auto; opacity: 0; color: var(--tl-primary-700); }
.tl-theme-item[aria-checked="true"] { color: var(--tl-primary-800); font-weight: 600; background: var(--tl-primary-50); }
.tl-theme-item[aria-checked="true"] .tl-theme-check { opacity: 1; }

/* Cartes d'apparence (page profil) :
   <div class="tl-theme-options" role="radiogroup"><button class="tl-theme-option" role="radio" data-theme-set="clair">… */
.tl-theme-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.85rem; }
.tl-theme-option {
    position: relative; display: flex; flex-direction: column; gap: 0.6rem;
    padding: 0.6rem 0.6rem 0.85rem; text-align: left;
    background: var(--tl-surface); color: var(--tl-body);
    border: 1px solid var(--tl-border-strong); border-radius: var(--tl-radius-lg);
    transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.tl-theme-option:hover { border-color: var(--tl-primary-400); transform: translateY(-1px); }
.tl-theme-option[aria-checked="true"] { border-color: var(--tl-primary-700); box-shadow: 0 0 0 3px rgba(var(--tl-primary-rgb), 0.22); }
.tl-theme-option-label { display: flex; align-items: center; gap: 0.45rem; padding: 0 0.25rem; font-size: 0.875rem; font-weight: 700; color: var(--tl-ink); }
.tl-theme-option-label .bi-check-circle-fill { margin-left: auto; color: var(--tl-primary-700); opacity: 0; }
.tl-theme-option[aria-checked="true"] .tl-theme-option-label .bi-check-circle-fill { opacity: 1; }
.tl-theme-option-text { display: block; }
.tl-theme-option-desc { padding: 0 0.25rem; font-size: 0.75rem; line-height: 1.4; color: var(--tl-muted); }
/* Aperçu miniature : couleurs littérales volontaires (montre chaque thème quel que soit le thème actif) */
.tl-theme-preview { display: flex; height: 5.25rem; overflow: hidden; border-radius: 10px; border: 1px solid rgba(127, 140, 155, 0.35); }
.tl-theme-preview > span { display: block; }
.tl-theme-preview-side { width: 26%; }
.tl-theme-preview-main { flex: 1; padding: 0.55rem; display: flex; flex-direction: column; gap: 0.35rem; }
.tl-theme-preview-main i { display: block; height: 0.4rem; border-radius: 99px; font-style: normal; }
.tl-theme-preview-main b { display: block; flex: 1; border-radius: 6px; }
.tl-theme-preview--light .tl-theme-preview-side { background: #E7EDF4; }
.tl-theme-preview--light .tl-theme-preview-main { background: #F2F5F9; }
.tl-theme-preview--light .tl-theme-preview-main i { background: #CBD5E0; width: 60%; }
.tl-theme-preview--light .tl-theme-preview-main i + i { background: #1E3A8A; width: 32%; }
.tl-theme-preview--light .tl-theme-preview-main b { background: #FFFFFF; border: 1px solid #DFE6EE; }
.tl-theme-preview--dark .tl-theme-preview-side { background: #121B25; }
.tl-theme-preview--dark .tl-theme-preview-main { background: #0F1720; }
.tl-theme-preview--dark .tl-theme-preview-main i { background: #31445A; width: 60%; }
.tl-theme-preview--dark .tl-theme-preview-main i + i { background: #93B4F5; width: 32%; }
.tl-theme-preview--dark .tl-theme-preview-main b { background: #16212C; border: 1px solid #263545; }
.tl-theme-preview--auto { position: relative; }
.tl-theme-preview--auto > .tl-theme-preview { position: absolute; inset: 0; border: 0; border-radius: 0; }
.tl-theme-preview--auto > .tl-theme-preview--dark { clip-path: polygon(100% 0, 100% 100%, 0 100%); }
@media (max-width: 575.98px) {
    .tl-theme-options { grid-template-columns: 1fr; }
    .tl-theme-option { flex-direction: row; align-items: center; padding: 0.6rem; }
    .tl-theme-preview { width: 5.5rem; height: 3.75rem; flex: none; }
    .tl-theme-option-text { min-width: 0; flex: 1; }
}

/* 6. Composants applicatifs ------------------------------------------------ */

/* Sur-titre (eyebrow) générique */
.eyebrow, .tl-eyebrow {
    display: inline-block;
    text-transform: uppercase;
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: var(--tl-tracking-eyebrow);
    color: var(--tl-primary-700);
}

/* En-tête de page */
.tl-page-head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem 2rem;
    margin-bottom: 1.75rem;
}
.tl-page-head--bare { margin-bottom: 1.25rem; }
.tl-page-kicker {
    display: block;
    margin-bottom: 0.4rem;
    font-size: 0.6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--tl-tracking-eyebrow);
    color: var(--tl-primary-700);
}
.tl-page-title {
    margin: 0;
    font-size: clamp(1.5rem, 2.2vw, 2rem) !important;
    font-weight: 700;
    line-height: 1.2;
    letter-spacing: var(--tl-tracking-title);
    color: var(--tl-ink);
}
.tl-page-lead { margin: 0.5rem 0 0; max-width: 70ch; font-size: 0.95rem; color: var(--tl-muted); font-weight: 400; }
.tl-page-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.tl-page-actions .mb-3, .tl-filters .mb-3 { margin-bottom: 0 !important; }
.tl-page-actions small { max-width: 22rem; font-size: 0.72rem; line-height: 1.45; }

.tl-back {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-bottom: 1rem;
    padding: 0.3rem 0.7rem 0.3rem 0.5rem;
    border-radius: 999px;
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--tl-muted);
    text-decoration: none;
    box-shadow: var(--tl-shadow-xs);
}
.tl-back:hover { color: var(--tl-primary-700); border-color: var(--tl-primary-200); text-decoration: none; }

/* Chiffres clés : grille de cartes (markup existant .tl-metrics > .tl-metric) */
.tl-metrics {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: 1rem;
    margin-bottom: 1.75rem;
}
.tl-metric {
    position: relative;
    padding: 1.15rem 1.25rem;
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    overflow: hidden;
}
.tl-metric::after {
    content: ""; position: absolute; left: 1.25rem; top: 0; width: 2rem; height: 3px;
    border-radius: 0 0 3px 3px; background: var(--tl-primary-700);
}
.tl-metric-label { font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-muted); }
.tl-metric-value {
    margin-top: 0.35rem;
    font-size: 1.85rem;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -0.02em;
    color: var(--tl-ink);
    font-variant-numeric: tabular-nums;
}
.tl-metric-value--text { font-size: 1rem; font-weight: 700; line-height: 1.45; padding-top: 0.2rem; letter-spacing: 0; }
.tl-metric--alert::after { background: var(--tl-danger); }
.tl-metric--alert .tl-metric-value { color: var(--tl-danger-dark); }
.tl-metric--warn::after { background: var(--tl-warning); }
.tl-metric--warn .tl-metric-value { color: var(--tl-warning-dark); }
.tl-metric--ok::after { background: var(--tl-success); }

/* Carte statistique riche (nouveau composant) :
   <div class="tl-stat-grid">
     <div class="tl-stat tl-stat--violet">
       <div class="tl-stat-icon"><i class="bi bi-briefcase"></i></div>
       <div><div class="tl-stat-label">Situations</div><div class="tl-stat-value">12</div>
       <div class="tl-stat-meta">+3 cette semaine</div></div>
     </div>
   </div> */
.tl-stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: 1rem; margin-bottom: 1.75rem; }
.tl-stat {
    --tl-stat-c: var(--tl-primary-700);
    --tl-stat-bg: var(--tl-primary-100);
    display: flex; align-items: flex-start; gap: 1rem;
    padding: 1.25rem;
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    color: inherit;
    text-decoration: none;
    transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
a.tl-stat:hover { transform: translateY(-2px); box-shadow: var(--tl-shadow); border-color: var(--tl-primary-200); color: inherit; }
.tl-stat-icon {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 2.75rem; height: 2.75rem; border-radius: 12px;
    background: var(--tl-stat-bg); color: var(--tl-stat-c); font-size: 1.25rem;
}
.tl-stat-label { font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-muted); }
.tl-stat-value { font-size: 1.85rem; font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; color: var(--tl-ink); font-variant-numeric: tabular-nums; margin-top: 0.2rem; }
.tl-stat-meta { font-size: 0.78rem; font-weight: 500; color: var(--tl-muted); margin-top: 0.25rem; }
.tl-stat--violet { --tl-stat-c: var(--tl-primary-700); --tl-stat-bg: var(--tl-primary-100); }  /* nom historique : primaire (marine) */
.tl-stat--cyan { --tl-stat-c: var(--tl-info-dark); --tl-stat-bg: var(--tl-info-soft); }  /* nom historique : ardoise-vert */
.tl-stat--green { --tl-stat-c: var(--tl-success-dark); --tl-stat-bg: var(--tl-success-soft); }
.tl-stat--amber { --tl-stat-c: var(--tl-warning-dark); --tl-stat-bg: var(--tl-warning-soft); }
.tl-stat--red { --tl-stat-c: var(--tl-danger-dark); --tl-stat-bg: var(--tl-danger-soft); }
.tl-stat--hero {
    background: var(--tl-gradient); border-color: transparent; color: var(--tl-on-gradient); box-shadow: var(--tl-shadow-primary);
    --tl-stat-c: var(--tl-on-gradient); --tl-stat-bg: rgba(255, 255, 255, 0.16);
}
.tl-stat--hero .tl-stat-label, .tl-stat--hero .tl-stat-meta { color: rgba(255, 255, 255, 0.75); }
.tl-stat--hero .tl-stat-value { color: var(--tl-on-gradient); }

/* Panneau / carte de section */
.tl-panel {
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    margin-bottom: 1.5rem;
    overflow: hidden;
}
.tl-panel:last-child, .tl-panel.h-100 { margin-bottom: 0; }
.tl-panel-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem 0.75rem;
    padding: 1rem 1.25rem;
    border-bottom: 1px solid var(--tl-border);
}
.tl-panel-title {
    display: flex; align-items: center; gap: 0.5rem;
    margin: 0;
    font-size: 0.95rem !important;
    font-weight: 700;
    letter-spacing: -0.005em;
    color: var(--tl-ink);
}
.tl-panel-title > i { color: var(--tl-primary-600); }
.tl-panel-count {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 1.5rem; padding: 0.05rem 0.45rem; border-radius: 999px;
    background: var(--tl-primary-100); color: var(--tl-primary-800);
    font-size: 0.7rem; font-weight: 700;
}
.tl-panel-body { padding: 1.25rem; }
.tl-panel-body > :last-child { margin-bottom: 0; }
.tl-panel-foot { padding: 0.85rem 1.25rem; border-top: 1px solid var(--tl-border); background: var(--tl-surface-sub); }
.tl-panel > .tl-table-scroll, .tl-panel > .table-responsive { margin: 0; }

/* Tableaux de gestion */
.tl-table-wrap {
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    margin-bottom: 1.5rem;
    overflow: hidden;
}
.tl-table-scroll { overflow-x: auto; }
table.tl-table { width: 100%; margin: 0; border-collapse: collapse; font-size: var(--tl-fs-table); }
.tl-table th {
    padding: 0.75rem 1rem;
    background: var(--tl-surface-sub);
    border-bottom: 1px solid var(--tl-border);
    font-size: 0.6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--tl-tracking-eyebrow);
    color: var(--tl-muted);
    text-align: left;
    white-space: nowrap;
}
.tl-table td { padding: 0.85rem 1rem; border-top: 1px solid var(--tl-border); color: var(--tl-body); vertical-align: middle; font-weight: 400; }
.tl-table tbody tr:first-child td { border-top: none; }
.tl-table tbody tr { transition: background-color .12s ease; }
.tl-table tbody tr:hover td { background: var(--tl-primary-50); }
.tl-table a { text-decoration: none; font-weight: 600; }
.tl-table a:hover { text-decoration: underline; }
.tl-strong { color: var(--tl-ink); font-weight: 700; }
.tl-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.tl-nowrap { white-space: nowrap; }
.tl-table th.tl-col-act, .tl-table td.tl-col-act { width: 1%; text-align: right; white-space: nowrap; padding-left: 0.4rem; }
.tl-table td.tl-empty-cell { padding: 2.5rem 1rem; text-align: center; color: var(--tl-muted); }
.tl-table-foot { padding: 0.75rem 1rem; border-top: 1px solid var(--tl-border); font-size: var(--tl-fs-meta); color: var(--tl-muted); background: var(--tl-surface-sub); }

/* Actions de ligne */
.tl-act {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.3rem 0.6rem;
    border: 1px solid transparent;
    border-radius: 8px;
    background: none;
    font-size: var(--tl-fs-meta);
    font-weight: 600;
    color: var(--tl-primary-700);
    text-decoration: none !important;
    line-height: 1.4;
    transition: background-color .15s ease, color .15s ease;
}
.tl-act:hover { background: var(--tl-primary-50); border-color: var(--tl-primary-100); color: var(--tl-primary-900); }
.tl-act--danger { color: var(--tl-danger-dark); }
.tl-act--danger:hover { background: var(--tl-danger-soft); border-color: var(--tl-danger-border); color: var(--tl-danger-dark); }
.tl-act--muted { color: var(--tl-muted); }
.tl-act--muted:hover { color: var(--tl-ink); background: var(--tl-bg-alt); border-color: var(--tl-border); }

/* Statut : pastille + texte, en pilule douce */
.tl-status {
    display: inline-flex; align-items: center; gap: 0.4rem;
    padding: 0.2rem 0.6rem 0.2rem 0.5rem; border-radius: 999px;
    background: var(--tl-bg-alt);
    font-size: 0.75rem; font-weight: 600; color: var(--tl-body); white-space: nowrap;
}
.tl-status::before { content: ""; flex: none; width: 0.45rem; height: 0.45rem; border-radius: 50%; background: var(--tl-subtle); }
.tl-status--ok { background: var(--tl-success-soft); color: var(--tl-success-dark); }
.tl-status--ok::before { background: var(--tl-success); }
.tl-status--wait { background: var(--tl-warning-soft); color: var(--tl-warning-dark); }
.tl-status--wait::before { background: var(--tl-warning); }
.tl-status--alert { background: var(--tl-danger-soft); color: var(--tl-danger-dark); }
.tl-status--alert::before { background: var(--tl-danger); }
.tl-status--info { background: var(--tl-info-soft); color: var(--tl-info-dark); }
.tl-status--info::before { background: var(--tl-info); }
.tl-status--off { color: var(--tl-muted); }

/* Étiquette factuelle */
.tl-tag {
    display: inline-block;
    padding: 0.12rem 0.5rem;
    border: 1px solid var(--tl-border);
    border-radius: 6px;
    background: var(--tl-surface);
    font-size: 0.66rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--tl-muted);
    vertical-align: 0.05em;
}
.tl-tag--accent { color: var(--tl-danger-dark); background: var(--tl-danger-soft); border-color: transparent; }
.tl-tag--code { text-transform: none; letter-spacing: 0; color: var(--tl-primary-700); background: var(--tl-primary-50); border-color: var(--tl-primary-100); font-variant-numeric: tabular-nums; }

/* Onglets segmentés */
.tl-tabs {
    display: inline-flex; flex-wrap: wrap; gap: 0.25rem;
    margin: 0 0 1.5rem; padding: 0.3rem; list-style: none;
    background: var(--tl-surface); border: 1px solid var(--tl-border); border-radius: 14px;
    box-shadow: var(--tl-shadow-xs);
}
.tl-tabs a {
    display: block;
    padding: 0.45rem 0.95rem;
    border-radius: 10px;
    font-size: var(--tl-fs-table);
    font-weight: 600;
    color: var(--tl-muted);
    text-decoration: none;
    transition: background-color .15s ease, color .15s ease;
}
.tl-tabs a:hover { color: var(--tl-ink); background: var(--tl-surface-sub); text-decoration: none; }
.tl-tabs a.is-active, .tl-tabs a.active { color: var(--tl-on-primary); background: var(--tl-primary-700); box-shadow: var(--tl-shadow-primary); }

/* Accès rapides */
.tl-quicklinks { display: flex; flex-wrap: wrap; gap: 0.6rem; margin: 0 0 1.75rem; padding: 0; list-style: none; }
.tl-quicklink {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.55rem 0.95rem;
    border: 1px solid var(--tl-border);
    border-radius: 12px;
    background: var(--tl-surface);
    font-size: var(--tl-fs-table);
    font-weight: 600;
    color: var(--tl-ink);
    text-decoration: none;
    box-shadow: var(--tl-shadow-xs);
    transition: border-color .15s ease, color .15s ease, transform .15s ease;
}
.tl-quicklink i { font-size: 1rem; color: var(--tl-primary-600); }
.tl-quicklink:hover { border-color: var(--tl-primary-200); color: var(--tl-primary-700); transform: translateY(-1px); text-decoration: none; }

/* Listes de lignes */
.tl-rows { margin: 0; padding: 0; list-style: none; }
.tl-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.8rem 0;
    border-bottom: 1px solid var(--tl-border);
}
.tl-row:last-child { border-bottom: none; padding-bottom: 0; }
.tl-row:first-child { padding-top: 0; }
.tl-row-main { min-width: 0; }
.tl-row-title { font-size: 0.9rem; font-weight: 700; color: var(--tl-ink); }
.tl-row-meta { margin-top: 0.15rem; font-size: var(--tl-fs-meta); color: var(--tl-muted); }
.tl-row-value { font-size: 0.9rem; font-weight: 700; color: var(--tl-ink); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Liste de liens empilés */
.tl-linklist { margin: 0; padding: 0; list-style: none; }
.tl-linklist a {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.7rem 0.75rem;
    margin: 0 -0.75rem;
    border-radius: 10px;
    font-size: var(--tl-fs-table);
    font-weight: 600;
    color: var(--tl-ink);
    text-decoration: none;
}
.tl-linklist a:hover { background: var(--tl-primary-50); color: var(--tl-primary-700); }
.tl-linklist a::after { content: "\F285"; font-family: "bootstrap-icons"; font-size: 0.7rem; color: var(--tl-subtle); }
.tl-linklist a:hover::after { color: var(--tl-primary-700); }

/* Cartes d'export */
.tl-export-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; }
.tl-export-card {
    display: flex;
    align-items: flex-start;
    gap: 0.85rem;
    padding: 1rem 1.1rem;
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    background: var(--tl-surface);
    color: inherit;
    text-decoration: none;
    transition: transform .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.tl-export-card:hover { border-color: var(--tl-primary-200); box-shadow: var(--tl-shadow); transform: translateY(-2px); color: inherit; text-decoration: none; }
.tl-export-card-icon {
    display: flex; align-items: center; justify-content: center; flex: none;
    width: 2.5rem; height: 2.5rem; border-radius: 12px;
    background: var(--tl-primary-100); color: var(--tl-primary-700); font-size: 1.1rem;
}
.tl-export-card-text { display: block; min-width: 0; }
.tl-export-card-title { display: block; font-size: 0.9rem; font-weight: 700; color: var(--tl-ink); }
.tl-export-card-desc { display: block; margin-top: 0.15rem; font-size: var(--tl-fs-meta); color: var(--tl-muted); }

/* Détail d'alerte */
.tl-alert-detail { margin-top: 1rem; padding-top: 0.85rem; border-top: 1px solid var(--tl-border); }
.tl-alert-detail-title { font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-muted); margin-bottom: 0.4rem; }
.tl-alert-detail ul { margin: 0; padding: 0; list-style: none; }
.tl-alert-detail li { padding: 0.4rem 0; border-bottom: 1px solid var(--tl-border); font-size: var(--tl-fs-table); }
.tl-alert-detail li:last-child { border-bottom: none; }
.tl-alert-detail li.tl-mono { font-family: var(--tl-font-mono); font-size: 0.75rem; color: var(--tl-muted); word-break: break-word; }
.tl-alert-note { margin: 0.85rem 0 0; font-size: var(--tl-fs-meta); color: var(--tl-muted); }

/* Formulaires en sections */
.tl-form {
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    margin-bottom: 1.5rem;
    overflow: hidden;
}
.tl-fieldset { padding: 1.4rem 1.5rem; border-top: 1px solid var(--tl-border); }
.tl-fieldset:first-child { border-top: none; }
.tl-fieldset--sub { background: var(--tl-surface-sub); }
.tl-main .tl-fieldset-title, .tl-fieldset-title { margin: 0; font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-primary-700); }
.tl-fieldset-hint { margin: 0.35rem 0 0; max-width: 72ch; font-size: var(--tl-fs-meta); color: var(--tl-muted); }
.tl-fieldset-title + .row, .tl-fieldset-hint + .row, .tl-fieldset-title + .tl-check-grid, .tl-fieldset-hint + .tl-check-grid { margin-top: 1rem; }
.tl-form-foot {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem;
    padding: 1rem 1.5rem;
    border-top: 1px solid var(--tl-border);
    background: var(--tl-surface-sub);
}
.tl-form-foot .tl-cancel { font-size: var(--tl-fs-meta); font-weight: 600; color: var(--tl-muted); text-decoration: none; }
.tl-form-foot .tl-cancel:hover { color: var(--tl-ink); }

.tl-check-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); gap: 0.35rem 1rem; }
.tl-check-grid .form-check { margin: 0; padding: 0.2rem 0 0.2rem 1.6em; }

.tl-inline-form {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 0.75rem;
    padding: 1rem 1.25rem;
    background: var(--tl-surface-sub);
    border-bottom: 1px solid var(--tl-border);
}
.tl-field { display: flex; flex-direction: column; gap: 0.25rem; flex: 1 1 9rem; min-width: 8rem; }
.tl-field--wide { flex: 2 1 15rem; }
.tl-inline-form .form-label { margin-bottom: 0; }

/* Bloc dépliable */
.tl-disclosure {
    background: var(--tl-surface);
    border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm);
    margin-bottom: 1.5rem;
    overflow: hidden;
}
.tl-disclosure > summary {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.9rem 1.25rem;
    cursor: pointer;
    list-style: none;
    font-size: 0.9rem;
    font-weight: 700;
    color: var(--tl-primary-700);
}
.tl-disclosure > summary::-webkit-details-marker { display: none; }
.tl-disclosure > summary::before {
    content: "\F64D"; font-family: "bootstrap-icons"; font-size: 0.8rem;
    display: inline-flex; align-items: center; justify-content: center;
    width: 1.5rem; height: 1.5rem; border-radius: 8px; background: var(--tl-primary-100);
}
.tl-disclosure[open] > summary { border-bottom: 1px solid var(--tl-border); }
.tl-disclosure[open] > summary::before { content: "\F63B"; }
.tl-disclosure > summary:hover { background: var(--tl-surface-sub); }
.tl-disclosure-body { padding: 1.25rem 1.5rem; }

/* Barre de filtres */
.tl-filters {
    display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem;
    padding: 0.75rem; background: var(--tl-surface); border: 1px solid var(--tl-border);
    border-radius: var(--tl-radius-lg); box-shadow: var(--tl-shadow-sm); margin-bottom: 1.5rem;
}
.tl-filters .form-control, .tl-filters .form-select { width: auto; min-width: 9rem; flex: 1 1 9rem; max-width: 18rem; }
/* Filtres repliables sur mobile (< 768px) :
   <button class="btn btn-outline-secondary tl-filters-toggle" data-bs-toggle="collapse" data-bs-target="#f">Filtres</button>
   <form id="f" class="tl-filters tl-filters--collapsible collapse">…</form>  (toujours visibles à partir de 768px) */
.tl-filters-toggle { display: none; }
@media (min-width: 768px) {
    .tl-filters--collapsible.collapse:not(.show), .tl-filters--collapsible.collapsing { display: flex; height: auto !important; }
}
@media (max-width: 767.98px) {
    .tl-filters-toggle { display: inline-flex; width: 100%; justify-content: center; min-height: 44px; margin-bottom: 0.75rem; }
    .tl-filters--collapsible.show, .tl-filters--collapsible.collapsing { display: flex; }
    .tl-filters .form-control, .tl-filters .form-select, .tl-filters .tl-input-icon { flex: 1 1 100%; min-width: 0; max-width: none; min-height: 44px; }
    .tl-filters .tl-filters-half { flex: 1 1 calc(50% - 0.3rem); }
    .tl-filters .btn { flex: 1 1 auto; min-height: 44px; justify-content: center; }
}

/* Liste en cartes sur mobile (< 768px), mise en page libre par cellule (≠ .tl-table--stack, qui affiche « libellé : valeur ») : ajouter .tl-table--cards à table.tl-table.
   Cellules : .tl-stack-first (haut gauche), .tl-stack-aside (haut droite), .tl-stack-hide (masquée), les autres pleine largeur. */
@media (max-width: 767.98px) {
    .tl-table--cards thead { display: none; }
    .tl-table--cards, .tl-table--cards tbody { display: block; width: 100%; }
    .tl-table--cards tr {
        display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem 0.75rem;
        padding: 0.9rem 1rem; border-top: 1px solid var(--tl-border);
    }
    .tl-table--cards tbody tr:first-child { border-top: none; }
    .tl-table--cards td { grid-column: 1 / -1; min-width: 0; padding: 0; border: 0; overflow-wrap: anywhere; }
    .tl-table--cards td.tl-stack-first { grid-column: 1; grid-row: 1; align-self: center; }
    .tl-table--cards td.tl-stack-aside { grid-column: 2; grid-row: 1; justify-self: end; align-self: center; }
    .tl-table--cards td.tl-stack-hide { display: none; }
    .tl-table--cards td.tl-num { text-align: left; }
    .tl-table--cards tbody tr:hover td { background: transparent; }
}

/* Pagination tactile : .tl-pager (précédent / page x sur y / suivant), pour les petits écrans */
.tl-pager { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; width: 100%; }
.tl-pager .btn { min-height: 44px; min-width: 44px; justify-content: center; white-space: nowrap; }
.tl-pager .btn.disabled { opacity: 0.45; }
.tl-pager-status { font-size: var(--tl-fs-meta); font-weight: 700; color: var(--tl-body); text-align: center; white-space: nowrap; }
/* Cartes statistiques sur téléphone (grille 2 colonnes) : icône au-dessus du texte, libellés sécables */
@media (max-width: 575.98px) {
    .tl-stat { flex-direction: column; gap: 0.6rem; padding: 1rem; min-width: 0; }
    .tl-stat > div { min-width: 0; }
    .tl-stat-label { overflow-wrap: anywhere; letter-spacing: 0.08em; }
}

/* Grille de notation */
.tl-grade-row { padding: 0.7rem 0; border-top: 1px solid var(--tl-border); }
.tl-grade-row:first-child { border-top: none; padding-top: 0; }
.tl-grade-row:last-child { padding-bottom: 0; }
.tl-grade-label { display: block; margin-bottom: 0.35rem; font-size: var(--tl-fs-meta); font-weight: 600; color: var(--tl-body); }
.tl-grade-label .tl-tag { margin-right: 0.35rem; }

@media (min-width: 992px) {
    .tl-sticky { position: sticky; top: calc(var(--tl-topbar-h) + 1rem); }
}

.tl-prose { font-size: 0.975rem; line-height: 1.75; color: var(--tl-body); max-width: 74ch; }
.tl-prose > :last-child { margin-bottom: 0; }
.tl-prose h2, .tl-prose h3 { margin-top: 1.75rem; }

/* Définitions clé / valeur */
.tl-def { margin: 0; }
.tl-def > div { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding: 0.5rem 0; border-top: 1px solid var(--tl-border); font-size: var(--tl-fs-table); }
.tl-def > div:first-child { border-top: none; padding-top: 0; }
.tl-def > div:last-child { padding-bottom: 0; }
.tl-def dt { margin: 0; font-weight: 600; color: var(--tl-muted); white-space: nowrap; }
.tl-def dd { margin: 0; text-align: right; color: var(--tl-ink); font-weight: 700; }
.tl-def .tl-def-total { border-top: 1px dashed var(--tl-border-strong); margin-top: 0.3rem; padding-top: 0.7rem; }
.tl-def .tl-def-total dt { color: var(--tl-ink); font-weight: 700; }
.tl-def .tl-def-total dd { font-size: 1.2rem; font-weight: 800; color: var(--tl-primary-700); font-variant-numeric: tabular-nums; }

/* Programme jour par jour */
.tl-day { display: flex; gap: 1.25rem; padding: 1rem 0; border-top: 1px solid var(--tl-border); }
.tl-day:first-child { border-top: none; padding-top: 0; }
.tl-day:last-child { padding-bottom: 0; }
.tl-day-num {
    flex: none; align-self: flex-start;
    width: 4.75rem; padding: 0.35rem 0; text-align: center;
    border-radius: 10px; background: var(--tl-primary-100);
    font-size: 0.66rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-primary-800);
}
.tl-day-body { min-width: 0; }
.tl-day-title { margin-bottom: 0.35rem; font-size: 0.975rem; font-weight: 700; color: var(--tl-ink); }
.tl-day-acts { margin: 0; padding: 0; list-style: none; }
.tl-day-acts li { position: relative; padding: 0.2rem 0 0.2rem 1.1rem; font-size: var(--tl-fs-table); color: var(--tl-body); }
.tl-day-acts li::before { content: ""; position: absolute; left: 0; top: 0.72rem; width: 0.4rem; height: 0.4rem; border-radius: 50%; background: var(--tl-primary-300); }

/* Frise chronologique (parcours utilisateur, journaux) :
   <ol class="tl-timeline"><li class="tl-timeline-item tl-timeline-item--ok">
     <time class="tl-timeline-time">14:02:11</time>
     <div class="tl-timeline-body">… <div class="tl-timeline-meta">…</div></div>
     <span class="tl-timeline-aside">2 min 10 s</span></li></ol>
   Variantes de pastille : --ok | --info | --wait | --alert | --muted */
.tl-timeline { position: relative; margin: 0; padding: 0; list-style: none; }
.tl-timeline::before {
    content: ""; position: absolute; left: 0.3rem; top: 0.9rem; bottom: 0.9rem;
    width: 2px; border-radius: 2px; background: var(--tl-border);
}
.tl-timeline-item {
    position: relative; display: flex; align-items: baseline; gap: 0.85rem;
    padding: 0.55rem 0 0.55rem 1.5rem; border-bottom: 1px dashed var(--tl-border);
}
.tl-timeline-item:last-child { border-bottom: none; }
.tl-timeline-item::before {
    content: ""; position: absolute; left: 0; top: 0.95rem;
    width: 0.65rem; height: 0.65rem; border-radius: 50%;
    background: var(--tl-primary-300); box-shadow: 0 0 0 3px var(--tl-surface);
}
.tl-timeline-item--ok::before { background: var(--tl-success); }
.tl-timeline-item--info::before { background: var(--tl-info); }
.tl-timeline-item--wait::before { background: var(--tl-warning); }
.tl-timeline-item--alert::before { background: var(--tl-danger); }
.tl-timeline-item--muted::before { background: var(--tl-subtle); }
.tl-timeline-time {
    flex: none; min-width: 4.6rem; font-size: var(--tl-fs-meta); font-weight: 600;
    color: var(--tl-muted); font-variant-numeric: tabular-nums;
}
.tl-timeline-body { flex: 1; min-width: 0; font-size: var(--tl-fs-table); color: var(--tl-body); overflow-wrap: anywhere; }
.tl-timeline-meta { margin-top: 0.15rem; font-size: var(--tl-fs-meta); color: var(--tl-subtle); }
.tl-timeline-aside { flex: none; font-size: var(--tl-fs-meta); color: var(--tl-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
@media (max-width: 575.98px) {
    .tl-timeline-item { flex-wrap: wrap; gap: 0.25rem 0.75rem; }
    .tl-timeline-body { flex-basis: 100%; order: 3; }
}

/* États vides */
.tl-empty { margin: 0; padding: 0.75rem 0; font-size: var(--tl-fs-table); color: var(--tl-muted); }
/* Grand état vide :
   <div class="tl-empty-state"><div class="tl-empty-state-icon"><i class="bi bi-inbox"></i></div>
   <h3 class="tl-empty-state-title">Aucune situation</h3><p class="tl-empty-state-text">…</p>
   <a class="btn btn-primary" href="…">Créer</a></div> */
.tl-empty-state {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    padding: 3rem 1.5rem;
    background: var(--tl-surface); border: 1px dashed var(--tl-border-strong); border-radius: var(--tl-radius-lg);
}
.tl-panel .tl-empty-state, .tl-table-wrap .tl-empty-state { border: 0; border-radius: 0; background: transparent; }
.tl-empty-state-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 4rem; height: 4rem; margin-bottom: 1rem; border-radius: 20px;
    background: var(--tl-primary-100); color: var(--tl-primary-700); font-size: 1.75rem;
    box-shadow: 0 0 0 8px var(--tl-primary-50);
}
.tl-empty-state-title { margin: 0 0 0.35rem; font-size: 1.1rem !important; font-weight: 700; color: var(--tl-ink); }
.tl-empty-state-text { margin: 0 0 1.25rem; max-width: 42ch; font-size: 0.9rem; color: var(--tl-muted); }
.tl-empty-state-text:last-child { margin-bottom: 0; }

/* Encadré d'information */
.tl-note {
    padding: 0.85rem 1rem; border-radius: var(--tl-radius);
    background: var(--tl-primary-50); border: 1px solid var(--tl-primary-100);
    font-size: var(--tl-fs-meta); color: var(--tl-body); font-weight: 500;
}
.tl-note strong { color: var(--tl-primary-800); }

/* Entraînement oral E4 */
.tl-e4-phase-name { margin-bottom: 0.2rem; font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); color: var(--tl-muted); text-align: center; }
.tl-e4-clock {
    font-size: 3rem; font-weight: 700; line-height: 1.1; letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums; color: var(--tl-primary-700); text-align: center; padding: 0.1rem 0 0.6rem;
}
.tl-e4-clock--warn { color: var(--tl-warning-dark); }
.tl-e4-clock--over { color: var(--tl-danger); }
.tl-e4-bar { height: 0.55rem; background: var(--tl-bg-alt); border-radius: 999px; overflow: hidden; margin-bottom: 0.5rem; }
.tl-e4-bar-fill { height: 100%; width: 0; background: linear-gradient(90deg, var(--tl-primary-700), var(--tl-primary-500)); border-radius: 999px; transition: width .6s linear; }
.tl-e4-bar-fill--over { background: var(--tl-danger); }
.tl-e4-alert { min-height: 1.3em; margin: 0 0 0.85rem; font-size: var(--tl-fs-meta); font-weight: 700; color: var(--tl-danger-dark); text-align: center; }
.tl-e4-phases { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 1rem; }
.tl-e4-phase-row {
    display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
    padding: 0.65rem 0.9rem; border: 1px solid var(--tl-border); border-radius: 12px; background: var(--tl-surface-sub);
    transition: border-color .15s ease, background-color .15s ease;
}
.tl-e4-phase-row.is-active { border-color: var(--tl-primary-400); background: var(--tl-surface); box-shadow: var(--tl-ring); }
.tl-e4-phase-row.is-done { opacity: 0.6; }
.tl-e4-phase-duration { font-size: var(--tl-fs-meta); font-weight: 700; color: var(--tl-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tl-e4-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.tl-e4-summary { margin-top: 1rem; padding: 0.9rem 1rem; border: 1px solid var(--tl-success-soft); border-radius: 12px; background: var(--tl-success-soft); font-size: var(--tl-fs-table); }
.tl-e4-summary ul { margin: 0.4rem 0 0; padding-left: 1.1rem; }
.tl-e4-summary li { padding: 0.1rem 0; color: var(--tl-body); }

/* Bandeau d'examen */
.exam-banner { z-index: 1020; margin-bottom: 1.5rem; border-left: 4px solid var(--tl-danger); border-radius: var(--tl-radius); }

/* Avatars */
.tl-avatar-img, .tl-avatar-initial {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 12px;
    flex: none;
    object-fit: cover;
    font-weight: 700;
    color: #fff;
    line-height: 1;
}
.tl-avatar-sm { width: 1.9rem; height: 1.9rem; font-size: 0.78rem; border-radius: 10px; }
.tl-avatar-md { width: 2.75rem; height: 2.75rem; font-size: 1.05rem; }
.tl-avatar-lg { width: 4.75rem; height: 4.75rem; font-size: 1.85rem; border-radius: 20px; }
/* Avatars : déclinaisons douces de la même famille (marine, sauge, ardoise, ocre, terre cuite) */
.tl-avatar-color-0 { background: linear-gradient(135deg, #1E40AF, #1E3A8A); }
.tl-avatar-color-1 { background: linear-gradient(135deg, #24439A, #172E6E); }
.tl-avatar-color-2 { background: linear-gradient(135deg, #C06A55, #A24A35); }
.tl-avatar-color-3 { background: linear-gradient(135deg, #B8903F, #9A6F1F); }
.tl-avatar-color-4 { background: linear-gradient(135deg, #6D8480, #4E6561); }
.tl-avatar-color-5 { background: linear-gradient(135deg, #7E9A7A, #5E7A5B); }
.tl-avatar-uploader { display: flex; align-items: center; gap: 1.25rem; }
.tl-avatar-uploader .tl-avatar-img,
.tl-avatar-uploader .tl-avatar-initial { width: 5.5rem; height: 5.5rem; font-size: 2rem; border-radius: 22px; }

/* Sélecteur de langue (segmenté) */
/* Sélecteur de langue : bouton « globe FR ▾ » + menu déroulant (partials/lang_switch.php, docs/I18N.md) */
.tl-lang-menu { display: inline-block; }
.tl-lang-btn {
    display: inline-flex; align-items: center; gap: 0.35rem;
    height: 2.5rem; padding: 0 0.7rem;
    border-radius: 12px; border: 1px solid var(--tl-border);
    background: var(--tl-surface); color: var(--tl-body); box-shadow: var(--tl-shadow-xs);
    font-size: 0.78rem; font-weight: 700; letter-spacing: 0.04em; line-height: 1; white-space: nowrap;
}
.tl-lang-btn .bi-globe2 { font-size: 1.05rem; }
.tl-lang-btn .tl-lang-caret { font-size: 0.7rem; opacity: 0.7; transition: transform 0.15s ease; }
.tl-lang-btn:hover { color: var(--tl-primary-700); border-color: var(--tl-primary-200); }
.tl-lang-btn:focus-visible { outline: 2px solid var(--tl-primary-500, var(--tl-primary-700)); outline-offset: 2px; }
.tl-lang-btn[aria-expanded="true"] .tl-lang-caret { transform: rotate(180deg); }
/* variante sur fond marine profond (panneau d'auth, bandeau public) */
.tl-lang-menu--on-dark .tl-lang-btn { height: 2.25rem; background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.24); color: #FFFFFF; box-shadow: none; }
.tl-lang-menu--on-dark .tl-lang-btn:hover { background: rgba(255, 255, 255, 0.2); color: #FFFFFF; border-color: rgba(255, 255, 255, 0.4); }
.tl-lang-menu--on-dark .tl-lang-btn:focus-visible { outline-color: #FFFFFF; }
.tl-lang-dropdown { min-width: 12.5rem; }
.tl-lang-item { width: 100%; }
.tl-lang-item-code {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 1.9rem; height: 1.35rem; padding: 0 0.3rem; border-radius: 6px;
    background: var(--tl-bg-alt); color: var(--tl-muted);
    font-size: 0.66rem; font-weight: 700; letter-spacing: 0.05em;
}
.tl-lang-item .tl-lang-check { margin-left: auto; opacity: 0; color: var(--tl-primary-700); }
.tl-lang-item[aria-current="true"] { color: var(--tl-primary-800); font-weight: 600; background: var(--tl-primary-50); }
.tl-lang-item[aria-current="true"] .tl-lang-item-code { background: var(--tl-primary-700); color: var(--tl-on-primary); }
.tl-lang-item[aria-current="true"] .tl-lang-check { opacity: 1; }
@media (max-width: 575.98px) {
    /* Feuille pleine largeur ancrée en bas (cibles ≥ 44px) */
    .tl-lang-menu .tl-lang-dropdown.dropdown-menu {
        position: fixed !important;
        inset: auto 0.5rem calc(0.5rem + var(--tl-safe-bottom, 0px)) 0.5rem !important;
        transform: none !important;
        width: auto; min-width: 0; padding: 0.5rem;
        border-radius: var(--tl-radius-lg); box-shadow: var(--tl-shadow-lg, var(--tl-shadow));
        z-index: 1080;
    }
    .tl-lang-menu .tl-lang-item { min-height: var(--tl-tap); }
}

/* 7. Authentification ------------------------------------------------------ */
.auth-page {
    min-height: 100vh;
    display: flex;
    flex-direction: row;
    background-color: var(--tl-bg);
    background-image: var(--tl-auth-bg);
    background-attachment: fixed;
}
.auth-side {
    position: relative;
    display: none;
    flex-direction: column;
    justify-content: space-between;
    width: 52%;
    min-height: 100vh;
    padding: 2.5rem 9% 2.5rem 4.5rem;
    color: #fff;
    background: var(--tl-gradient);
    clip-path: polygon(0 0, 100% 0, 91% 100%, 0 100%);
    overflow: hidden;
    isolation: isolate;
}
.auth-side::before {
    content: ""; position: absolute; inset: 0; z-index: -1;
    background:
        radial-gradient(600px 420px at 0% 100%, rgba(19, 42, 32, 0.45), transparent 60%),
        radial-gradient(520px 360px at 100% 0%, rgba(147, 187, 167, 0.22), transparent 60%),
        repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.025) 0 1px, transparent 1px 22px);
}
@media (min-width: 992px) { .auth-side { display: flex; } }
.auth-side-top { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.auth-side-brand { display: inline-flex; align-items: center; gap: 0.7rem; color: #fff; font-weight: 800; font-size: 1.2rem; letter-spacing: -0.02em; text-decoration: none; }
.auth-side-brand:hover { color: #fff; }
.auth-side-brand--dark { color: var(--tl-ink); }
.auth-side-brand--dark:hover { color: var(--tl-ink); }
.auth-side-lang .tl-lang-menu { margin: 0; }
.auth-side-inner { max-width: 34rem; }
.auth-eyebrow {
    display: block; margin-bottom: 1.1rem;
    font-size: 0.75rem; font-weight: 600; text-transform: uppercase;
    letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.75);
}
.auth-page .auth-title {
    margin: 0 0 1.25rem;
    font-size: clamp(2.25rem, 3.6vw, 3.4rem);
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -0.02em;
    color: #fff;
}
.auth-lead { max-width: 30rem; margin: 0 0 2rem; font-size: 1.05rem; line-height: 1.75; color: rgba(255, 255, 255, 0.86); font-weight: 400; }
.auth-trust { display: flex; align-items: center; gap: 0.55rem; margin: 0; font-size: 0.85rem; font-weight: 600; color: rgba(255, 255, 255, 0.85); }
.auth-trust i { font-size: 1rem; }
.auth-side-back { align-self: flex-start; font-size: 0.8rem; font-weight: 600; color: rgba(255, 255, 255, 0.7); text-decoration: none; }
.auth-side-back:hover { color: #fff; }

.auth-form-side { display: flex; align-items: center; justify-content: center; flex: 1; padding: 2.5rem 1.25rem; }
.auth-container { width: 100%; max-width: 32rem; }
.auth-mobile-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1.5rem; }
.auth-card {
    position: relative;
    border: 1px solid var(--tl-border);
    border-radius: 18px;
    background: var(--tl-surface);
    box-shadow: var(--tl-shadow-lg);
    overflow: hidden;
}
.auth-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--tl-gradient); }
.auth-card .card-body { padding: 2.25rem 2.5rem 2.5rem; }
.auth-card-head { display: flex; align-items: center; gap: 0.9rem; margin-bottom: 1.75rem; }
.auth-card-logo { height: 3rem; width: auto; border-radius: 10px; flex: none; }
.auth-card-title { font-size: 1rem; font-weight: 700; color: var(--tl-ink); line-height: 1.2; }
.auth-card-subtitle { font-size: 0.8rem; font-weight: 500; color: var(--tl-muted); }
.auth-page .auth-form-title { margin: 0.35rem 0 1.5rem; font-size: 1.6rem; font-weight: 700; letter-spacing: var(--tl-tracking-title); color: var(--tl-ink); }
.auth-form-hint { margin: -0.75rem 0 1.5rem; font-size: 0.875rem; color: var(--tl-muted); }
.auth-page .form-control { background: var(--tl-input-bg); }
.auth-card-logo { background: var(--tl-logo-bg); padding: 0; }
html[data-theme="dark"] .auth-card-logo { background: #FFFFFF; padding: 0.2rem 0.4rem; box-sizing: content-box; }
.auth-help { margin: 1.25rem 0 0; text-align: center; font-size: 0.8125rem; color: var(--tl-muted); }
.auth-help a { display: inline-flex; align-items: center; gap: 0.3rem; margin-left: 0.25rem; font-weight: 700; color: var(--tl-primary-700); text-decoration: none; white-space: nowrap; }
.auth-help a:hover { text-decoration: underline; }
.auth-footnote { margin: 1.25rem 0 0; text-align: center; font-size: 0.75rem; font-weight: 600; color: var(--tl-muted); }
@media (max-width: 575.98px) {
    .auth-card .card-body { padding: 1.75rem 1.4rem 2rem; }
}

/* 8. Site public ----------------------------------------------------------- */
.tl-topbar { background: var(--tl-primary-950); color: rgba(255, 255, 255, 0.75); font-size: 0.8125rem; font-weight: 500; }
.tl-topbar a { color: rgba(255, 255, 255, 0.85); text-decoration: none; }
.tl-topbar a:hover { color: #fff; }

.tl-navbar { background: rgba(var(--tl-surface-rgb), 0.9); backdrop-filter: saturate(160%) blur(12px); border-bottom: 1px solid var(--tl-border); }
.tl-navbar .nav-link { color: var(--tl-body); font-weight: 600; font-size: 0.9rem; padding: 0.6rem 0.9rem !important; border-radius: 10px; }
.tl-navbar .nav-link:hover, .tl-navbar .nav-link.active { color: var(--tl-primary-700); background: var(--tl-primary-50); }

.public-page section[id] { scroll-margin-top: 5rem; }
.public-page h1, .public-page h2, .public-page h3 { font-weight: 700; letter-spacing: -0.015em; }

.hero-section { position: relative; background: var(--tl-gradient); overflow: hidden; isolation: isolate; }
.hero-section::before {
    content: ""; position: absolute; inset: 0; z-index: -1;
    background:
        radial-gradient(700px 500px at 100% 0%, rgba(147, 187, 167, 0.22), transparent 60%),
        radial-gradient(700px 500px at 0% 100%, rgba(19, 42, 32, 0.45), transparent 60%);
}
.hero-section h1, .hero-card h2, .bloc-card-head h3, .cta-section h2 { color: #fff; }
.hero-eyebrow {
    display: inline-flex; align-items: center; gap: 0.5rem;
    color: rgba(255, 255, 255, 0.85); text-transform: uppercase;
    font-size: 0.72rem; letter-spacing: var(--tl-tracking-eyebrow); font-weight: 600;
    background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2);
    padding: 0.45rem 0.95rem; border-radius: 999px;
}
.text-white-75 { color: rgba(255, 255, 255, 0.82) !important; }
.hero-card { background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: var(--tl-radius-xl); backdrop-filter: blur(8px); }
.hero-cycle li { display: flex; align-items: center; gap: 0.85rem; padding: 0.65rem 0; border-bottom: 1px solid rgba(255, 255, 255, 0.12); color: rgba(255, 255, 255, 0.9); font-weight: 600; }
.hero-cycle li:last-child { border-bottom: none; }
.hero-cycle span {
    flex: 0 0 2rem; height: 2rem; border-radius: 10px; background: rgba(255, 255, 255, 0.16);
    color: #fff; font-weight: 700; font-size: 0.85rem; display: flex; align-items: center; justify-content: center;
}
.stat-number { font-size: clamp(1.6rem, 4vw, 2.4rem); font-weight: 700; letter-spacing: -0.02em; color: var(--tl-primary-700); line-height: 1.1; }
.stat-label { font-size: 0.72rem; font-weight: 600; color: var(--tl-muted); text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); }

.feature-card, .profil-card, .mode-card, .contact-card {
    background: var(--tl-surface); border: 1px solid var(--tl-border); border-radius: var(--tl-radius-lg);
    box-shadow: var(--tl-shadow-sm); transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.feature-card:hover, .profil-card:hover, .mode-card:hover { transform: translateY(-3px); box-shadow: var(--tl-shadow); border-color: var(--tl-primary-200); }
.feature-icon {
    width: 3rem; height: 3rem; border-radius: 14px;
    background: var(--tl-primary-100); color: var(--tl-primary-700); font-size: 1.3rem;
    display: flex; align-items: center; justify-content: center;
}
.bloc-card { background: var(--tl-surface); border: 1px solid var(--tl-border); border-radius: var(--tl-radius-lg); box-shadow: var(--tl-shadow-sm); overflow: hidden; }
.bloc-card-head { padding: 1.5rem; color: #fff; }
.bloc-card-head.bloc-1 { background: var(--tl-gradient); }
.bloc-card-head.bloc-2 { background: linear-gradient(135deg, #2F5BC7, #1E40AF); }
.bloc-card-head.bloc-3 { background: linear-gradient(135deg, #5B7470, #3E524F); }
.bloc-tag { font-size: 0.7rem; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); opacity: 0.85; font-weight: 600; }
.bloc-list { list-style: none; margin: 0; padding: 1.25rem 1.5rem; }
.bloc-list li { position: relative; padding: 0.4rem 0 0.4rem 1.5rem; font-size: 0.925rem; color: var(--tl-body); }
.bloc-list li::before { content: "\F26E"; font-family: "bootstrap-icons"; position: absolute; left: 0; color: var(--tl-primary-600); font-size: 0.8rem; }
.profil-icon.bg-primary { background: var(--tl-gradient) !important; }
.profil-icon.bg-success { background: linear-gradient(135deg, #3A6B55, #22473A) !important; }
.profil-icon.bg-dark { background: linear-gradient(135deg, #4F6B85, #2C4257) !important; }
.profil-icon { width: 3rem; height: 3rem; border-radius: 14px; color: #fff; font-size: 1.25rem; display: flex; align-items: center; justify-content: center; }
.check-list { list-style: none; margin: 0; padding: 0; }
.check-list li { position: relative; padding: 0.4rem 0 0.4rem 1.7rem; font-size: 0.925rem; color: var(--tl-body); }
.check-list li::before { content: "\F26B"; font-family: "bootstrap-icons"; position: absolute; left: 0; top: 0.4rem; color: var(--tl-success); }
.mode-card-exam { border-color: var(--tl-danger-border); }
.value-item { display: flex; align-items: flex-start; gap: 0.75rem; }
.value-item i { font-size: 1.25rem; line-height: 1.3; color: var(--tl-primary-600); }
.cta-section { background: var(--tl-gradient); }
/* Boutons clairs posés sur un dégradé « marque » : restent blancs dans les 2 thèmes */
.hero-section .btn-light, .cta-section .btn-light, .tl-on-gradient .btn-light, .tl-stu-hero .btn-light, .tl-sit-bulk-inner .btn-light {
    --bs-btn-color: var(--tl-brand-ink); --bs-btn-bg: #FFFFFF; --bs-btn-border-color: #FFFFFF;
    --bs-btn-hover-color: var(--tl-brand-ink); --bs-btn-hover-bg: #EEF2FB; --bs-btn-hover-border-color: #EEF2FB;
    --bs-btn-active-color: var(--tl-brand-ink); --bs-btn-active-bg: #DCE4F7; --bs-btn-active-border-color: #DCE4F7;
}
.section-divider { border-top: 1px solid var(--tl-border); }

.tl-footer { background: var(--tl-primary-950); color: rgba(255, 255, 255, 0.68); }
.tl-footer h6 { color: #fff; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow); font-size: 0.72rem; font-weight: 600; }
.tl-footer a { color: rgba(255, 255, 255, 0.75); text-decoration: none; }
.tl-footer a:hover { color: #fff; }
.tl-footer hr { border-color: rgba(255, 255, 255, 0.12); }

/* 9. Responsive (mobile-first) & impression -------------------------------- */
/* Points de contrôle : 360 / 390 (téléphones), 576 (sm), 768 (tablette), 992 (lg : sidebar fixe).
   Voir docs/DESIGN_SYSTEM.md § Responsive. */

/* Garde-fous anti-débordement horizontal (toutes tailles) */
html, body { overflow-x: clip; max-width: 100%; }
body { overflow-wrap: break-word; }
.tl-content, .tl-main, .tl-main > *, .tl-panel, .tl-panel-body, .card-body, .tl-form, .row > * { min-width: 0; }
img, video, iframe, canvas, svg { max-width: 100%; }
img, video { height: auto; }
.tl-main pre { max-width: 100%; overflow-x: auto; }
.tl-main a[href^="http"], .tl-main .text-break, .tl-mono, .tl-main code { overflow-wrap: anywhere; }
.tl-table-scroll, .table-responsive { -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain; }
.tl-main textarea { max-width: 100%; }

/* Défilement bloqué quand le menu mobile ou une modale est ouvert */
body:has(.tl-sidebar.is-mobile-open) { overflow: hidden; }

/* Barres collantes en bas : respectent la zone sûre (iPhone à encoche) */
.sticky-bottom, .fixed-bottom, .tl-sticky-bar,
.tl-main .tl-stu-devis-mobilebar, .tl-main .tl-stu-submitbar {
    padding-bottom: calc(0.75rem + var(--tl-safe-bottom));
}

/* Tableau empilé en cartes (< 576px), opt-in :
   <table class="tl-table tl-table--stack"> … <td data-label="Nom">…</td>
   Les data-label sont complétés automatiquement depuis <thead> par le layout. */
@media (max-width: 575.98px) {
    .tl-table--stack thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
    .tl-table--stack, .tl-table--stack tbody, .tl-table--stack tr, .tl-table--stack td { display: block; width: 100%; }
    .tl-table--stack tbody tr { padding: 0.75rem 1rem; border-top: 1px solid var(--tl-border); }
    .tl-table--stack tbody tr:first-child { border-top: none; }
    .tl-table--stack tbody tr:hover td { background: transparent; }
    .tl-table.tl-table--stack td, .table.tl-table--stack > tbody > tr > td {
        display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem;
        padding: 0.3rem 0; border: none; text-align: right; white-space: normal;
    }
    .tl-table--stack td::before {
        content: attr(data-label); flex: none; max-width: 45%;
        font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: var(--tl-tracking-eyebrow);
        color: var(--tl-muted); text-align: left;
    }
    .tl-table--stack td:not([data-label])::before, .tl-table--stack td[data-label=""]::before { content: none; }
    .tl-table--stack td:not([data-label]), .tl-table--stack td[data-label=""] { justify-content: flex-start; text-align: left; }
    .tl-table--stack td.tl-col-act { width: 100%; justify-content: flex-end; padding-top: 0.5rem; }
    .tl-table--stack td.tl-col-act::before { content: none; }
    .tl-table--stack td.tl-empty-cell { display: block; text-align: center; }
    .tl-table--stack td.tl-empty-cell::before { content: none; }
    .tl-table--stack .tl-num { text-align: right; }
}

/* Tablette et en dessous : sidebar hors-champ */
@media (max-width: 991.98px) {
    .tl-sidebar {
        position: fixed;
        top: 0;
        left: 0;
        height: 100vh;
        height: 100dvh;
        width: min(var(--tl-sidebar-w), 86vw);
        transform: translateX(-100%);
        box-shadow: var(--tl-shadow-lg);
        padding-left: env(safe-area-inset-left, 0px);
        padding-bottom: var(--tl-safe-bottom);
        visibility: hidden;
        transition: transform .22s ease, visibility 0s linear .22s;
    }
    .tl-sidebar.is-mobile-open { transform: translateX(0); visibility: visible; transition: transform .22s ease, visibility 0s; }
    .tl-sidebar.is-collapsed { width: min(var(--tl-sidebar-w), 86vw); }
    .tl-sidebar.is-collapsed .tl-sidebar-section { visibility: visible; height: auto; padding: 0 0.75rem 0.45rem; }
    .tl-sidebar.is-collapsed .tl-nav-label,
    .tl-sidebar.is-collapsed .tl-sidebar-user-info,
    .tl-sidebar.is-collapsed .tl-lang-switch,
    .tl-sidebar.is-collapsed .tl-sidebar-link-text { display: revert; }
    .tl-sidebar.is-collapsed .tl-sidebar-brand { padding: 1.35rem 1.35rem 1.1rem; justify-content: flex-start; }
    .tl-sidebar.is-collapsed .tl-sidebar-nav .nav-link { justify-content: flex-start; padding: 0.62rem 0.8rem; }
    .tl-sidebar.is-collapsed .tl-sidebar-user { justify-content: flex-start; background: var(--tl-sidebar-user-bg); border-color: var(--tl-sidebar-border); padding: 0.55rem; }
    .tl-sidebar-nav .nav-link { min-height: var(--tl-tap); }
    .tl-sidebar-link-btn { min-height: var(--tl-tap); }
    .tl-sidebar-collapse-btn { display: none; }
    .tl-mobile-toggle { display: inline-flex; width: var(--tl-tap); height: var(--tl-tap); }
    .tl-sidebar-backdrop.is-visible { display: block; }
    .tl-content-topbar { padding: 0.6rem 1rem; gap: 0.75rem; min-height: 64px; padding-right: max(1rem, env(safe-area-inset-right, 0px)); }
    .tl-main { padding: 1.25rem 1rem 2rem; }
    .tl-app-footer { padding: 1rem 1rem calc(1rem + var(--tl-safe-bottom)); }
    .tl-page-head { margin-bottom: 1.25rem; gap: 0.75rem 1rem; }
}

/* Tablette : grilles de chiffres sur 2 colonnes */
@media (max-width: 767.98px) {
    .tl-metrics, .tl-stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem; margin-bottom: 1.25rem; }
    /* Évite le zoom automatique d'iOS : champs ≥ 16px */
    .form-control, .form-select, .form-control-sm, .form-select-sm, .input-group-text, .tl-main textarea, .tl-main select, .tl-main input:not([type=checkbox]):not([type=radio]):not([type=range]) { font-size: 16px; }
    .tl-topbar-heading { font-size: 1rem; }
    .tl-user-chip { padding: 0.25rem; }
    .tl-filters .form-control, .tl-filters .form-select { max-width: none; }
    .tl-export-grid { grid-template-columns: 1fr; }
    .tl-toasts { left: 0; right: 0; width: 100%; padding: 0.75rem !important; }
    .tl-toasts .toast { width: 100%; max-width: none; }
}

/* Téléphones */
@media (max-width: 575.98px) {
    .tl-main { padding: 1rem 1rem calc(1.75rem + var(--tl-safe-bottom)); }
    .tl-content-topbar { padding: 0.5rem 0.875rem; gap: 0.5rem; }
    .tl-topbar-actions { gap: 0.4rem; }
    .tl-user-chip-caret { display: none; }
    .tl-breadcrumb { display: none; }
    .tl-metric { padding: 0.9rem 1rem; }
    .tl-metric-value, .tl-stat-value { font-size: 1.4rem; }
    .tl-stat { flex-direction: column; gap: 0.6rem; padding: 0.95rem; }
    .tl-stat-icon { width: 2.25rem; height: 2.25rem; font-size: 1.05rem; border-radius: 10px; }
    .tl-page-head { align-items: stretch; flex-direction: column; }
    .tl-page-title { font-size: 1.4rem !important; }
    .tl-page-actions { width: 100%; }
    .tl-page-actions > .btn, .tl-page-actions > form, .tl-page-actions > .dropdown, .tl-page-actions > a.btn { flex: 1 1 auto; }
    .tl-page-actions > form > .btn, .tl-page-actions > .dropdown > .btn { width: 100%; }
    .tl-panel-head, .tl-panel-body { padding-left: 1rem; padding-right: 1rem; }
    .tl-fieldset, .tl-form-foot { padding-left: 1rem; padding-right: 1rem; }
    .tl-form-foot > .btn { flex: 1 1 auto; }
    .tl-filters { padding: 0.6rem; }
    .tl-filters .form-control, .tl-filters .form-select, .tl-filters .btn { flex: 1 1 100%; min-width: 0; }
    .tl-tabs { display: flex; flex-wrap: nowrap; overflow-x: auto; max-width: 100%; scrollbar-width: none; }
    .tl-tabs::-webkit-scrollbar { display: none; }
    .tl-tabs a { white-space: nowrap; }
    .nav-tabs { flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; }
    .nav-tabs .nav-link { white-space: nowrap; }
    .tl-def > div { flex-wrap: wrap; }
    .tl-def dt { white-space: normal; }
    .tl-day { gap: 0.75rem; flex-direction: column; }
    .tl-empty-state { padding: 2rem 1rem; }

    /* Modales plein écran (comportement .modal-fullscreen-sm-down pour toutes) */
    .modal-dialog { width: 100vw; max-width: none; height: 100%; margin: 0; }
    .modal-content { height: 100%; border: 0; border-radius: 0; }
    .modal-header, .modal-footer { border-radius: 0 !important; }
    .modal-body { overflow-y: auto; }
    .modal-footer { padding-bottom: calc(0.75rem + var(--tl-safe-bottom)); }
    .modal-footer > .btn { flex: 1 1 auto; }

    /* Menus de la barre supérieure : feuilles pleine largeur */
    .tl-content-topbar .dropdown-menu,
    .tl-app-nav .dropdown-menu {
        position: fixed !important;
        inset: calc(64px + 0.25rem) 0.5rem auto 0.5rem !important;
        transform: none !important;
        width: auto; min-width: 0; max-height: calc(100dvh - 64px - 1rem); overflow-y: auto;
        border-radius: var(--tl-radius-lg);
        padding: 0.5rem;
    }
    .tl-content-topbar .dropdown-item { min-height: var(--tl-tap); }

    /* Gouttières Bootstrap larges : ne pas dépasser le padding du conteneur */
    .row.g-5, .row.gx-5, .row.g-4, .row.gx-4 { --bs-gutter-x: 1.5rem; }

    /* Site public */
    .tl-topbar .container { flex-wrap: wrap; gap: 0.25rem 0.75rem; }
    .tl-topbar .container > span { flex: 1 1 100%; font-size: 0.75rem; }
    .tl-navbar .navbar-toggler { min-width: var(--tl-tap); min-height: var(--tl-tap); }
    .tl-navbar .navbar-collapse .btn { width: 100%; margin-top: 0.5rem; }
    .tl-brand-tag { display: none; }

    .auth-form-side { padding: 1.25rem 0.875rem calc(1.5rem + var(--tl-safe-bottom)); align-items: flex-start; }
    .auth-card .card-body { padding: 1.75rem 1.25rem 2rem; }
}

/* Très petits écrans (< 360px) : une seule colonne */
@media (max-width: 359.98px) {
    .tl-metrics, .tl-stat-grid { grid-template-columns: 1fr; }
    .tl-stat { flex-direction: row; }
}

/* Cibles tactiles ≥ 44px sur écrans tactiles */
@media (pointer: coarse) {
    .btn { min-height: var(--tl-tap); }
    .btn-sm { min-height: 2.5rem; }
    .tl-icon-btn { width: var(--tl-tap); height: var(--tl-tap); }
    .tl-user-chip { min-height: var(--tl-tap); }
    .tl-act { min-height: 2.5rem; padding-left: 0.7rem; padding-right: 0.7rem; }
    .dropdown-item, .list-group-item-action, .tl-linklist a { min-height: var(--tl-tap); }
    .page-link { min-width: var(--tl-tap); min-height: var(--tl-tap); display: flex; align-items: center; justify-content: center; }
    .nav-link, .tl-tabs a, .tl-quicklink { min-height: var(--tl-tap); display: flex; align-items: center; }
    .tl-lang-btn { min-height: var(--tl-tap); }
    .form-check-input { width: 1.3em; height: 1.3em; }
    .form-check { min-height: 2rem; padding-top: 0.25rem; padding-bottom: 0.25rem; }
    .form-check-label { cursor: pointer; }
    .btn-close { width: var(--tl-tap); height: var(--tl-tap); padding: 0; background-size: 0.9em; }
    .form-control, .form-select { min-height: var(--tl-tap); }
}

/* Bascule « Vue étudiant | Vue administrateur » de la base touristique (partials/bt_view_switch, admins seulement) */
.bt-viewswitch {
    display: flex; width: fit-content; max-width: 100%; margin: 0 0 var(--tl-space-3) auto; padding: 0.2rem; gap: 0.2rem;
    background: var(--tl-surface-sub); border: 1px solid var(--tl-border); border-radius: var(--tl-radius-pill);
}
.bt-viewswitch-opt {
    display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; min-height: var(--tl-tap); padding: 0 1rem;
    border-radius: var(--tl-radius-pill); font-size: var(--tl-fs-table); font-weight: 600; color: var(--tl-muted); text-decoration: none; white-space: nowrap;
}
.bt-viewswitch-opt:hover { color: var(--tl-ink); background: var(--tl-surface); text-decoration: none; }
.bt-viewswitch-opt:focus-visible { outline: 2px solid var(--tl-primary); outline-offset: 2px; }
.bt-viewswitch-opt.is-active { color: var(--tl-on-primary); background: var(--tl-primary-700); box-shadow: var(--tl-shadow-xs); }
@media (max-width: 575.98px) {
    .bt-viewswitch { width: 100%; }
    .bt-viewswitch-opt { flex: 1 1 0; padding: 0 0.5rem; }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; }
}

@media print {
    .navbar, .tl-topbar, footer, .no-print, .tl-sidebar, .tl-content-topbar, .tl-sidebar-backdrop, .tl-toasts { display: none !important; }
    body { background: #fff; }
    .tl-main { padding: 0; max-width: none; }
    .card, .tl-panel, .tl-table-wrap, .tl-metric, .tl-stat, .tl-form { box-shadow: none !important; }
}
