/* =========================================================================
   clean.css — couche de design partagée du thème « clean ».
   Élève les primitifs Bootstrap 4 / Froala à l'identité du Pilotage
   (encre prune, accent teal, neutres clairs). CSS uniquement : aucun markup
   ni logique modifiés. Chargée APRÈS bootstrap/froala pour gagner la cascade.
   ========================================================================= */

:root {
  /* Identité ASVE (asve-vaureal.fr) : crème + prune + sarcelle. */
  --ink:        #312F36;   /* titres, texte fort (quasi-noir prune) */
  --ink-body:   #44404D;   /* corps — prune, ~9:1 sur crème */
  --ink-muted:  #6b6672;   /* secondaire — ~4.7:1 sur crème (AA) */
  --ink-faint:  #938d97;   /* méta uniquement */
  --line:       #efe4da;   /* bordures calmes (crème-tintées) */
  --line-strong:#ddcfc1;
  --surf:       #ffffff;
  --bg:         #FFF6EF;   /* fond de page — crème chaud ASVE */
  --surf-2:     #f7ece2;   /* en-têtes de table, zones calmes */

  --teal:       #0396A6;   /* accent / primaire (sarcelle ASVE) */
  --teal-dk:    #03707d;   /* liens, hover (AA sur crème/blanc) */
  --teal-50:    #e6f4f5;
  --teal-100:   #c9e7ea;

  --ok:    #2f8f63; --ok-bg:  #e7f4ec; --ok-ink:  #1f6b48; --ok-bd:  #c5e6d3;
  --warn:  #a9760f; --warn-bg:#faf0d6; --warn-ink:#7a5510; --warn-bd:#ecd9a6;
  --dang:  #cf4655; --dang-bg:#fbe9eb; --dang-ink:#9a2f3b; --dang-bd:#f0c4ca;
  --info:  #0396A6; --info-bg:#e6f4f5; --info-ink:#03707d; --info-bd:#bfe2e6;

  --radius:    14px;
  --radius-sm: 10px;
  --radius-pill: 999px;
  --shadow-sm: 0 1px 2px rgba(40,36,50,.05);
  --shadow:    0 1px 2px rgba(40,36,50,.05), 0 12px 30px -16px rgba(40,36,50,.18);
  --shadow-lg: 0 18px 50px -20px rgba(40,36,50,.28);
  --ease: cubic-bezier(.22,1,.36,1);
}

/* ----------------------------------------------------------------- base */
body {
  background: var(--bg);
  color: var(--ink-body);
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-size: 16px;
  line-height: 1.55;
  /* Tracking positif léger au corps (lisibilité petites tailles) — leçon Google Education. */
  letter-spacing: .01em;
  /* Sticky footer : body en colonne flex + wrapper .app-main qui pousse le footer en bas
     quand le contenu est court. Les barres/overlays en position:fixed sont hors flux flex
     -> non affectés (l'ancien essai cassait car le contenu n'avait pas de wrapper flexible). */
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
/* Wrapper du bloc content (inséré dans base.twig) : occupe l'espace restant. */
.app-main { flex: 1 0 auto; }

/* IA désactivée (aucune clé configurée) : on masque tous les déclencheurs IA -> aucune
   réponse "mock" exposée à l'utilisateur. Le serveur refuse aussi enqueue (double garde). */
body.ai-off [data-exam-ai],
body.ai-off [data-hw-translate],
body.ai-off [data-hw-translate-btn],
body.ai-off #aibrief,
body.ai-off #aibrief-btn,
body.ai-off #execDigestBtn,
body.ai-off #execDigest,
body.ai-off [data-ai-student],
body.ai-off [data-ai-group],
body.ai-off [data-ai-mount-all] { display: none !important; }
/* Inter : activer les vraies fractions/ligatures + chiffres lisibles. */
body { font-feature-settings: "cv05" 1, "ss01" 1; }

::selection { background: var(--teal-100); color: var(--ink); }

/* --------------------------------------------------------- typographie */
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
  color: var(--ink);
  font-weight: 700;
  letter-spacing: -.014em;
  line-height: 1.2;
  text-wrap: balance;
}
h1, .h1 { font-size: clamp(1.7rem, 1.2rem + 1.6vw, 2.35rem); letter-spacing: -.02em; }
h2, .h2 { font-size: clamp(1.35rem, 1.1rem + 1vw, 1.75rem); }
h3, .h3 { font-weight: 600; }
p { line-height: 1.6; }
small, .text-sm, .small { letter-spacing: .015em; }
a { color: var(--teal-dk); transition: color .15s var(--ease); }
a:hover { color: var(--teal); text-decoration: none; }
.text-muted { color: var(--ink-muted) !important; }
.text-dark  { color: var(--ink) !important; }
hr { border-top-color: var(--line); }

/* --------------------------------------------------------------- navbar */
header .navbar { padding-top: .6rem; padding-bottom: .6rem; }
.navbar-brand img { transition: transform .2s var(--ease); }
.navbar-brand:hover img { transform: translateY(-1px); }
.navbar .nav-link {
  color: var(--ink-body) !important;
  font-weight: 600;
  border-radius: var(--radius-sm);
  transition: background .15s var(--ease), color .15s var(--ease);
}
.navbar .nav-link:hover { color: var(--teal-dk) !important; background: var(--teal-50); }
.navbar .nav-item.active .nav-link,
.navbar .nav-item.active > .nav-link {
  color: var(--teal-dk) !important;
  background: var(--teal-50);
}
.dropdown-menu {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow);
  padding: .4rem;
}
.dropdown-item { border-radius: 8px; padding: .5rem .75rem; font-weight: 500; }
.dropdown-item:hover { background: var(--teal-50); color: var(--teal-dk); }
.dropdown-divider { border-top-color: var(--line); }

/* --------------------------------------------------------------- boutons */
.btn {
  border-radius: var(--radius-sm);
  font-weight: 600;
  letter-spacing: .005em;
  transition: background .15s var(--ease), border-color .15s var(--ease),
              color .15s var(--ease), box-shadow .15s var(--ease), transform .08s var(--ease);
}
.btn:active { transform: translateY(1px); }
.btn:focus, .btn.focus { box-shadow: 0 0 0 3px rgba(10,138,153,.28); }

/* NB : on ne stylise QUE les variantes Bootstrap standard + .btn-default.
   Les classes maison (btn-blue/btn-cyan/btn-pri/btn-ok/btn-list) sont
   appliquées de façon imprévisible (ex. btn-blue sur un <nav> barre d'icônes)
   et conservent leurs définitions inline existantes — on n'y touche pas. */
.btn-primary {
  background: var(--teal); border-color: var(--teal); color: #fff;
}
.btn-primary:hover, .btn-primary:focus {
  background: var(--teal-dk); border-color: var(--teal-dk); color: #fff;
}
.btn-outline-primary, .btn-outline-info {
  color: var(--teal-dk); border-color: var(--teal); background: transparent;
}
.btn-outline-primary:hover, .btn-outline-info:hover {
  background: var(--teal); border-color: var(--teal); color: #fff;
}
.btn-info { background: var(--teal); border-color: var(--teal); color: #fff; }
.btn-info:hover { background: var(--teal-dk); border-color: var(--teal-dk); color: #fff; }

/* btn-default : classe Bootstrap 3 (non stylée en BS4) → bouton neutre propre */
.btn-default {
  background: var(--surf);
  border: 1px solid var(--line-strong);
  color: var(--ink-body);
}
.btn-default:hover {
  background: var(--surf-2); border-color: var(--ink-muted); color: var(--ink);
}
.btn-secondary, .btn-outline-secondary {
  border-radius: var(--radius-sm);
}
/* btn-secondary : neutralise le corail saturé hérité de Froala (anti-ref ASVE).
   Action secondaire = bouton neutre net, jamais une couleur d'alerte. */
.btn-secondary {
  background: var(--surf);
  border: 1px solid var(--line-strong);
  color: var(--ink-body);
}
.btn-secondary:hover, .btn-secondary:focus {
  background: var(--surf-2); border-color: var(--ink-muted); color: var(--ink);
}
.btn-outline-secondary { color: var(--ink-body); border-color: var(--line-strong); }
.btn-outline-secondary:hover { background: var(--ink); border-color: var(--ink); color: #fff; }

.btn-success { background: var(--ok); border-color: var(--ok); color: #fff; }
.btn-success:hover { background: var(--ok-ink); border-color: var(--ok-ink); color: #fff; }
.btn-outline-success { color: var(--ok-ink); border-color: var(--ok); }
.btn-outline-success:hover { background: var(--ok); border-color: var(--ok); color: #fff; }

.btn-danger { background: var(--dang); border-color: var(--dang); }
.btn-danger:hover { background: var(--dang-ink); border-color: var(--dang-ink); }
.btn-outline-danger { color: var(--dang-ink); border-color: var(--dang); }
.btn-outline-danger:hover { background: var(--dang); border-color: var(--dang); color: #fff; }

.btn-warning { background: var(--warn); border-color: var(--warn); color: #fff; }
.btn-warning:hover { background: var(--warn-ink); border-color: var(--warn-ink); color: #fff; }
.btn-light { background: var(--surf); border-color: var(--line); color: var(--ink-body); }

/* ----------------------------------------------- listes de supervision (.suplist) */
.suplist { max-width: 980px; margin: 0 auto; padding: 8px 16px 64px; color: var(--ink-body); }
.suplist .sl-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
.suplist .sl-head h1 { font-size: 1.7rem; font-weight: 800; letter-spacing: -.02em; margin: 0; color: var(--ink); }
.suplist .sl-new { display: inline-flex; align-items: center; gap: 7px; background: var(--teal); color: #fff; border: 0; border-radius: var(--radius-sm); padding: .6rem 1rem; font-weight: 700; text-decoration: none; white-space: nowrap; }
.suplist .sl-new:hover { background: var(--teal-dk); color: #fff; text-decoration: none; }
.suplist .sl-search { position: relative; margin-bottom: 14px; }
.suplist .sl-search input { width: 100%; border: 1px solid var(--line-strong); border-radius: var(--radius-sm); padding: .62rem .9rem .62rem 2.4rem; font-size: 1rem; font-family: inherit; color: var(--ink); }
.suplist .sl-search input:focus { outline: 0; border-color: var(--teal); box-shadow: 0 0 0 3px rgba(3,150,166,.16); }
.suplist .sl-search .ic { position: absolute; left: .9rem; top: 50%; transform: translateY(-50%); color: var(--teal-dk); }
.suplist .sl-list { background: var(--surf); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.suplist .sl-row { display: flex; align-items: center; gap: 14px; padding: 12px 16px; border-bottom: 1px solid var(--line); }
.suplist .sl-row:last-child { border-bottom: 0; }
.suplist .sl-row:hover { background: var(--surf-2); }
.suplist .sl-row.hide { display: none; }
.suplist .sl-main { min-width: 0; flex: 1; }
.suplist .sl-nm { font-weight: 700; color: var(--ink); }
.suplist .sl-nm a { color: var(--ink); text-decoration: none; }
.suplist .sl-nm a:hover { color: var(--teal-dk); }
.suplist .sl-sub { display: block; color: var(--ink-muted); font-size: .86rem; margin-top: 2px; line-height: 1.5; }
.suplist .sl-sub a { color: var(--teal-dk); text-decoration: none; }
.suplist .sl-sub a:hover { text-decoration: underline; }
.suplist .sl-right { flex: 0 0 auto; display: flex; align-items: center; gap: 12px; }
.suplist .sl-email { color: var(--ink-muted); font-size: .85rem; white-space: nowrap; }
.suplist .sl-logas { color: var(--ink-muted); width: 36px; height: 36px; border-radius: 9px; display: grid; place-items: center; text-decoration: none; flex: 0 0 auto; }
.suplist .sl-logas:hover { background: var(--teal-50); color: var(--teal-dk); }
.suplist .sl-empty { padding: 34px; text-align: center; color: var(--ink-muted); }
@media (max-width: 575.98px) { .suplist .sl-email { display: none; } }

/* ----------------------------------- barre d'actions groupées (réutilisable, collante en bas) */
.bulkbar { position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%); z-index: 1500;
  display: flex; align-items: center; gap: 14px; background: var(--ink); color: #fff; border-radius: 13px;
  padding: 10px 14px; box-shadow: 0 12px 32px -8px rgba(40,36,50,.5); max-width: 94vw; flex-wrap: wrap; }
.bulkbar .cnt { font-weight: 600; font-size: .9rem; white-space: nowrap; }
.bulkbar .cnt b { font-size: 1.05rem; }
.bulkbar .bbtn { border: 1px solid rgba(255,255,255,.22); background: rgba(255,255,255,.08); color: #fff;
  border-radius: 8px; padding: .5rem .9rem; font-family: inherit; font-size: .86rem; font-weight: 600; cursor: pointer; white-space: nowrap; }
.bulkbar .bbtn:hover { background: rgba(255,255,255,.18); }
.bulkbar .bbtn.primary { background: var(--teal); border-color: var(--teal); }
.bulkbar .bbtn.primary:hover { background: var(--teal-dk); }
.bulkbar .bx { border: 0; background: transparent; color: #cfc9d6; cursor: pointer; font-size: .84rem; text-decoration: underline; }
tr.is-sel, .sl-row.is-sel { background: var(--teal-50) !important; }
@media (max-width: 575.98px) { .bulkbar { left: 8px; right: 8px; transform: none; max-width: none; justify-content: center; } }

/* ----------------------------------------------------------- formulaires */
.form-control, .custom-select {
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  color: var(--ink-body);
  transition: border-color .15s var(--ease), box-shadow .15s var(--ease);
}
.form-control:focus, .custom-select:focus {
  border-color: var(--teal);
  box-shadow: 0 0 0 3px rgba(10,138,153,.18);
}
.form-control::placeholder { color: var(--ink-faint); }
label, .form-group > label { color: var(--ink); font-weight: 600; font-size: .92rem; }
.input-group-text { background: var(--surf-2); border-color: var(--line-strong); color: var(--ink-muted); }

/* ---------------------------------------------------------------- cartes */
.card {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  background: var(--surf);
  transition: box-shadow .2s var(--ease), transform .2s var(--ease);
}
.card-header { background: var(--surf); border-bottom-color: var(--line); font-weight: 700; color: var(--ink); }
.card-footer { background: var(--surf); border-top-color: var(--line); }
.card-title { color: var(--ink); font-weight: 700; }

/* --------------------------------------------------------------- tables */
.table { color: var(--ink-body); }
.table thead th {
  border-top: 0;
  border-bottom: 1px solid var(--line-strong);
  color: var(--ink-muted);
  font-size: .78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
}
.table td, .table th { border-top-color: var(--line); vertical-align: middle; }
.table-hover tbody tr { transition: background .12s var(--ease); }
.table-hover tbody tr:hover { background: var(--teal-50); }

/* --------------------------------------------------------------- badges */
.badge { font-weight: 600; border-radius: var(--radius-pill); padding: .35em .7em; }
.badge-info, .badge-primary { background: var(--teal); color: #fff; }
.badge-success { background: var(--ok); color: #fff; }
.badge-warning { background: var(--warn); color: #fff; }
.badge-danger  { background: var(--dang); color: #fff; }
.badge-secondary { background: #6b6577; color: #fff; }

/* --------------------------------------------------------------- alertes */
.alert { border-radius: var(--radius-sm); border-width: 1px; }
.alert-success { background: var(--ok-bg);  border-color: var(--ok-bd);  color: var(--ok-ink); }
.alert-warning { background: var(--warn-bg);border-color: var(--warn-bd);color: var(--warn-ink); }
.alert-danger  { background: var(--dang-bg);border-color: var(--dang-bd);color: var(--dang-ink); }
.alert-info    { background: var(--info-bg);border-color: var(--info-bd);color: var(--info-ink); }

/* Bandeau flash : rendu en flux (cf. base.twig) — ne recouvre plus la navbar. */
#welcomeMessageContainer .alert {
  border-radius: 0;
  border-left: 0; border-right: 0; border-top: 0;
  margin-bottom: 0;
  box-shadow: var(--shadow-sm);
}

/* ---------------------------------------------------------------- footer */
footer.fdb-block { background: var(--surf); border-top: 1px solid var(--line); margin-top: 3rem; flex-shrink: 0; }
footer .nav-item .btn { color: var(--ink-muted); }
footer small { color: var(--ink-faint) !important; }

/* ----------------------------------------------------- froala / divers */
.fdb-block { background: transparent; }
.modal-content { border: 0; border-radius: var(--radius); box-shadow: var(--shadow-lg); }
.modal-header { border-bottom-color: var(--line); }
.list-group-item { border-color: var(--line); }
.list-group-item.active { background: var(--teal); border-color: var(--teal); }
.page-link { color: var(--teal-dk); }
.page-item.active .page-link { background: var(--teal); border-color: var(--teal); }

/* ===== clean-table : composant de liste homogène (table + filtres + bulk + drawer) ===== */
.ctable { max-width: 1080px; margin: 0 auto; }
.ctable .ct-toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 14px; }
.ctable .ct-search { flex: 1; min-width: 220px; position: relative; }
.ctable .ct-search input { width: 100%; border: 1px solid var(--line-strong); border-radius: 11px; padding: .6rem .9rem .6rem 2.3rem; font-size: 1rem; font-family: inherit; color: var(--ink); }
.ctable .ct-search input:focus { outline: 0; border-color: var(--teal); box-shadow: 0 0 0 3px rgba(3,150,166,.16); }
.ctable .ct-search .ic { position: absolute; left: .85rem; top: 50%; transform: translateY(-50%); color: var(--teal-dk); }
.ctable .ct-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.ctable .ct-chip { border: 1px solid var(--line-strong); background: var(--surf); border-radius: var(--radius-pill); padding: .42rem .8rem; font-size: .86rem; font-weight: 600; color: var(--ink-body); cursor: pointer; white-space: nowrap; }
.ctable .ct-chip:hover { border-color: var(--teal); }
.ctable .ct-chip.active { background: var(--teal); border-color: var(--teal); color: #fff; }
.ctable .ct-filtergrp { display: inline-flex; gap: 4px; background: var(--surf-2); border: 1px solid var(--line); border-radius: 11px; padding: 4px; flex-wrap: wrap; }
.ctable table { width: 100%; background: var(--surf); border: 1px solid var(--line); border-radius: var(--radius); border-collapse: separate; border-spacing: 0; overflow: hidden; }
.ctable thead th { background: var(--surf-2); color: var(--ink-muted); font-size: .76rem; text-transform: uppercase; letter-spacing: .04em; font-weight: 700; text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--line); }
.ctable th.ct-sortable { cursor: pointer; user-select: none; white-space: nowrap; }
.ctable th.ct-sortable:hover { color: var(--ink); }
.ctable th.ct-sortable:after { content: "\2195"; opacity: .35; margin-left: 5px; font-size: .9em; }
.ctable th.ct-sortable[data-ct-dir="asc"]:after { content: "\2191"; opacity: 1; }
.ctable th.ct-sortable[data-ct-dir="desc"]:after { content: "\2193"; opacity: 1; }
.ctable tbody td { padding: 11px 14px; border-bottom: 1px solid var(--line); vertical-align: middle; color: var(--ink-body); }
.ctable tbody tr:last-child td { border-bottom: 0; }
.ctable tbody [data-ct-row] { cursor: pointer; }
.ctable tbody [data-ct-row]:hover { background: var(--teal-50); }
.ctable tbody [data-ct-row]:focus-visible { outline: 2px solid var(--teal); outline-offset: -2px; background: var(--teal-50); }
.ctable tbody [data-ct-row].is-sel { background: var(--teal-50); }
.ctable .ct-empty { padding: 38px; text-align: center; color: var(--ink-muted); background: var(--surf); border: 1px solid var(--line); border-radius: var(--radius); }
.ctable .ct-pager { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-top: 12px; color: var(--ink-muted); font-size: .85rem; flex-wrap: wrap; }
.ctable .ct-pnav { display: inline-flex; align-items: center; gap: 8px; }
.ctable .ct-pbtn { border: 1px solid var(--line-strong); background: var(--surf); color: var(--ink-body); width: 32px; height: 32px; border-radius: 9px; cursor: pointer; font-size: 1.1rem; line-height: 1; }
.ctable .ct-pbtn:hover:not([disabled]) { border-color: var(--teal); color: var(--teal-dk); }
.ctable .ct-pbtn[disabled] { opacity: .4; cursor: default; }
.ctable .ct-sel, .ctable .ct-all { width: 17px; height: 17px; accent-color: var(--teal); cursor: pointer; margin: 0; }
.bulkbar .bbtn.ok { background: var(--ok); border-color: var(--ok); }
.bulkbar .bbtn.danger { background: var(--dang); border-color: var(--dang); }

/* tags/pills réutilisables dans les cellules */
.ct-pill { display: inline-block; font-size: .74rem; font-weight: 700; border-radius: var(--radius-pill); padding: 2px 9px; white-space: nowrap; background: var(--teal-50); color: var(--teal-dk); }
.ct-pill.muted { background: var(--surf-2); color: var(--ink-muted); }

/* ===== Drawer latéral droit (partagé : annuaire + clean-table) ===== */
.adrw-ov { position: fixed; inset: 0; z-index: 2000; opacity: 0; pointer-events: none; transition: opacity .18s ease; }
.adrw-ov.open { opacity: 1; pointer-events: auto; }
.adrw-ov .bd { position: absolute; inset: 0; background: rgba(40,36,50,.42); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.adrw { position: absolute; top: 0; right: 0; height: 100%; width: 430px; max-width: 94vw; background: var(--surf);
  box-shadow: -12px 0 40px -12px rgba(40,36,50,.35); display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform .26s cubic-bezier(.22,1,.36,1); }
.adrw-ov.open .adrw { transform: none; }
.adrw .dh { padding: 18px 20px; border-bottom: 1px solid var(--line); display: flex; align-items: flex-start; gap: 10px; }
.adrw .dh .nm { font-size: 1.2rem; font-weight: 800; color: var(--ink); line-height: 1.2; }
.adrw .dh .mt { color: var(--ink-muted); font-size: .85rem; margin-top: 3px; }
.adrw .x { border: 0; background: var(--surf-2); color: var(--ink-body); width: 34px; height: 34px; border-radius: 9px; cursor: pointer; font-size: 1.1rem; flex: 0 0 auto; }
.adrw .x:hover { background: var(--line); }
.adrw .db { overflow-y: auto; padding: 16px 20px; flex: 1; }
.adrw .sec { margin-bottom: 18px; }
.adrw .sec h3 { font-size: .74rem; text-transform: uppercase; letter-spacing: .05em; color: var(--ink-muted); margin: 0 0 8px; font-weight: 700; }
.adrw .kv { font-size: .92rem; margin: 3px 0; color: var(--ink-body); }
.adrw .kv a { color: var(--teal-dk); text-decoration: none; } .adrw .kv a:hover { text-decoration: underline; }
.adrw .chips { display: flex; flex-wrap: wrap; gap: 6px; }
.adrw .chip { display: inline-block; background: var(--teal-50); color: var(--teal-dk); border-radius: var(--radius-pill); padding: 3px 10px; font-size: .84rem; text-decoration: none; }
.adrw .chip:hover { background: var(--teal-100); text-decoration: none; }
.adrw .acts { display: flex; flex-direction: column; gap: 8px; }
.adrw .acts form { margin: 0; }
.adrw .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; border: 1px solid var(--line-strong); background: var(--surf); color: var(--ink-body); border-radius: 9px; padding: .6rem .8rem; font-weight: 600; font-family: inherit; font-size: .9rem; cursor: pointer; text-decoration: none; }
.adrw .btn:hover { border-color: var(--teal); color: var(--ink); text-decoration: none; }
.adrw .btn.primary { background: var(--teal); border-color: var(--teal); color: #fff; } .adrw .btn.primary:hover { background: var(--teal-dk); color: #fff; }
.adrw .btn.ok { background: var(--ok); border-color: var(--ok); color: #fff; }
.adrw .btn.danger { color: var(--dang); border-color: #e7c9cd; } .adrw .btn.danger:hover { background: #fbeef0; }

/* ===== Responsive : la table devient des cartes empilées sur mobile ===== */
@media (max-width: 700px) {
  .ctable table, .ctable thead, .ctable tbody, .ctable th, .ctable td, .ctable tr { display: block; }
  .ctable thead { position: absolute; left: -9999px; }
  .ctable tbody [data-ct-row] { border: 1px solid var(--line); border-radius: var(--radius-sm); margin-bottom: 10px; padding: 6px 4px; background: var(--surf); }
  .ctable tbody td { border: 0; padding: 5px 12px; }
  .ctable tbody td[data-ct-label]:before { content: attr(data-ct-label); display: block; font-size: .68rem; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-muted); font-weight: 700; margin-bottom: 1px; }
  .adrw { width: 100%; max-width: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; }
}

/* ============================================================
   SHELL LATÉRAL — menu en panneau gauche rétractable + topbar
   (épuré : contenu d'abord, navigation calme à gauche). 2026-06
   ============================================================ */
:root { --sb-w: 248px; --sb-w-mini: 68px; --topbar-h: 60px; }

body.has-sidebar { background: var(--bg); }

/* --- Panneau latéral --- */
.app-sidebar{
  position: fixed; inset: 0 auto 0 0; width: var(--sb-w);
  display: flex; flex-direction: column; gap: 2px;
  background: var(--surf); border-right: 1px solid var(--line);
  z-index: 1040; padding: 14px 12px 12px;
  transition: width .28s var(--ease), transform .28s var(--ease);
  overflow: hidden;
}
.asb-brand{ display:flex; align-items:center; gap:10px; padding: 4px 8px 14px; min-height: 56px; }
.asb-brand img{ height: 40px; width:auto; }
.asb-brand .asb-brand-txt{ font-weight:700; color:var(--ink); font-size:.98rem; white-space:nowrap; }
.asb-scroll{ flex:1 1 auto; overflow-y:auto; overflow-x:hidden; margin: 0 -4px; padding: 0 4px; }
.asb-sec{ font-size:.68rem; letter-spacing:.04em; text-transform:uppercase; color:var(--ink-faint);
  padding: 12px 12px 6px; white-space:nowrap; }
.asb-link{
  display:flex; align-items:center; gap:12px; padding: 9px 12px; border-radius: var(--radius-sm);
  color: var(--ink-body); text-decoration:none; white-space:nowrap; font-size:.92rem; line-height:1.2;
  transition: background .15s var(--ease), color .15s var(--ease);
}
.asb-link:hover{ background: var(--surf-2); color: var(--ink); text-decoration:none; }
.asb-link.active{ background: var(--teal-50); color: var(--teal-dk); font-weight:600; }
.asb-link .asb-ic{ flex: 0 0 22px; width:22px; text-align:center; font-size:1rem; color: var(--ink-muted); }
.asb-link.active .asb-ic{ color: var(--teal-dk); }
.asb-link .asb-lbl{ flex:1 1 auto; overflow:hidden; text-overflow:ellipsis; }
.asb-foot{ border-top:1px solid var(--line); margin: 6px -12px 0; padding: 8px 12px 0; }

/* --- Cadre principal (à droite du panneau) --- */
/* Marge gauche UNIQUEMENT s'il y a une sidebar : sinon (login, pages publiques) le cadre
   occupe toute la largeur — pas de gutter vide réservé à un panneau absent. */
.app-frame{ margin-left: 0; min-height:100vh; display:flex; flex-direction:column;
  transition: margin-left .28s var(--ease); }
body.has-sidebar .app-frame{ margin-left: var(--sb-w); }
.app-frame > .app-main{ flex:1 1 auto; }

/* --- Topbar mince --- */
.app-topbar{
  position: sticky; top:0; z-index: 1030; height: var(--topbar-h);
  display:flex; align-items:center; gap:10px; padding: 0 18px;
  background: rgba(255,255,255,.82); backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--line);
}
.tb-toggle{ flex:0 0 auto; border:1px solid var(--line); background:var(--surf); color:var(--ink-body);
  width:38px; height:38px; border-radius:10px; cursor:pointer; align-items:center;
  justify-content:center; transition: background .15s var(--ease); }
.tb-toggle:hover{ background: var(--surf-2); }
.tb-spacer{ flex:1 1 auto; }
.app-topbar .cs-trigger{ margin:0; }
.app-topbar .notif-bell{ margin:0; }

/* --- Avatar (initiales) — remplace le nom complet --- */
.tb-avatar{ display:inline-flex; align-items:center; justify-content:center; width:38px; height:38px;
  border-radius:50%; background: var(--teal); color:#fff; font-weight:700; font-size:.86rem;
  border:none; cursor:pointer; letter-spacing:.02em; text-decoration:none; }
.tb-avatar:hover{ background: var(--teal-dk); color:#fff; }
.tb-avatar img{ width:38px; height:38px; border-radius:50%; object-fit:cover; }
.tb-userwrap .dropdown-menu{ margin-top:8px; }

/* --- Mode rétracté (mini, icônes seules) — desktop --- */
body.sb-collapsed .app-sidebar{ width: var(--sb-w-mini); }
body.sb-collapsed .app-frame{ margin-left: var(--sb-w-mini); }
body.sb-collapsed .asb-lbl,
body.sb-collapsed .asb-brand-txt,
body.sb-collapsed .asb-sec{ display:none; }
body.sb-collapsed .asb-link{ justify-content:center; padding:9px; }
body.sb-collapsed .asb-link .asb-ic{ flex-basis:auto; }
body.sb-collapsed .asb-brand{ justify-content:center; padding:4px 0 14px; }

/* --- Backdrop (mobile overlay) --- */
.app-backdrop{ position:fixed; inset:0; background:rgba(40,36,50,.42); z-index:1035;
  opacity:0; visibility:hidden; transition:opacity .2s var(--ease); }

/* --- Mobile : panneau en overlay off-canvas --- */
@media (max-width: 991.98px){
  .app-sidebar{ transform: translateX(-100%); width: var(--sb-w); box-shadow: var(--shadow-lg); }
  /* Reset spécificité-égale à `body.has-sidebar .app-frame` pour gagner en mobile (sinon
     le contenu reste poussé de 248px et déborde à droite). */
  body.has-sidebar .app-frame{ margin-left: 0; }
  body.sb-open .app-sidebar{ transform: none; }
  body.sb-open .app-backdrop{ opacity:1; visibility:visible; }
  body.sb-collapsed .app-sidebar{ width: var(--sb-w); } /* pas de mini sur mobile */
  body.sb-collapsed .asb-lbl, body.sb-collapsed .asb-brand-txt, body.sb-collapsed .asb-sec{ display:revert; }
}
@media (prefers-reduced-motion: reduce){
  .app-sidebar,.app-frame,.app-backdrop{ transition:none; }
}

/* Contenu calé contre le panneau (corrige le grand vide : le .container BS se
   centrait dans l'espace restant). Aligné à gauche, marge confortable, cap lisible. */
body.has-sidebar .app-main{ padding-top: 22px; padding-bottom: 48px; }
body.has-sidebar .app-main > .container,
body.has-sidebar .app-main .container{
  max-width: none; margin-left: 0; margin-right: 0;
  padding-left: 40px; padding-right: 40px;
}
@media (max-width: 991.98px){
  body.has-sidebar .app-main .container{ padding-left: 16px; padding-right: 16px; }
}
/* Logo du panneau un peu plus présent + aligné */
.app-sidebar .asb-brand{ padding: 6px 10px 16px; }
.app-sidebar .asb-brand img{ height: 46px; }

/* Hamburger = MOBILE uniquement ; sur desktop le collapse se fait via le chevron du panneau. */
.tb-toggle{ display: none; }
.asb-collapse{ display:flex; align-items:center; gap:12px; width:100%; border:0; background:transparent;
  color:var(--ink-muted); padding:11px 12px; margin-top:auto; border-top:1px solid var(--line);
  cursor:pointer; font-size:.86rem; transition: background .15s var(--ease), color .15s var(--ease); }
.asb-collapse:hover{ background:var(--surf-2); color:var(--ink); }
.asb-collapse .asb-ic{ flex:0 0 22px; width:22px; text-align:center; font-size:1rem; }
.asb-collapse i{ transition: transform .25s var(--ease); }
body.sb-collapsed .asb-collapse{ justify-content:center; padding:11px; }
body.sb-collapsed .asb-collapse .asb-lbl{ display:none; }
body.sb-collapsed .asb-collapse i{ transform: rotate(180deg); }
@media (max-width: 991.98px){
  .tb-toggle{ display:inline-flex; }   /* hamburger visible sur mobile (ouvre l'overlay) */
  .asb-collapse{ display:none; }        /* pas de rail réduit sur mobile */
  body.has-sidebar .app-main .container{ padding-left: 14px; padding-right: 14px; }
}

/* ==================================================================
   COUCHE RESPONSIVE GLOBALE  (ajout — n'écrase rien au-dessus)
   Objectifs : desktop = tables/listes pleine largeur ; mobile = zéro
   débordement horizontal (tables défilables, grilles empilées, pills
   qui passent à la ligne, paddings réduits). Garde le thème épuré.
   ================================================================== */

/* --- 1. Garde-fou anti-scroll latéral global ----------------------
   La sidebar (.app-sidebar) est position:fixed + translateX, donc hors
   flux : masquer l'overflow-x du body ne la rogne pas. Le topbar est
   position:sticky : le conteneur de défilement reste le viewport, donc
   sticky continue de fonctionner (on n'introduit aucun overflow sur un
   ancêtre du sticky autre que body). */
html, body { max-width: 100%; overflow-x: hidden; }

/* --- 2. DESKTOP : tables de contenu en pleine largeur -------------
   Les listes/tableaux dans la zone de contenu prennent toute la place
   disponible (corrige le "riquiqui à gauche + vide à droite"). Limité
   à .app-main pour ne pas toucher les tables d'e-mail (role=presentation,
   largeur fixe) ni des composants à largeur intentionnelle. */
.app-main .table,
.app-main .ctable table,
.app-main .table-responsive > table { width: 100%; }
.app-main .table-responsive { width: 100%; }
/* Les wrappers de table connus s'étirent (pas de cap centré). */
.app-main .ctable { max-width: none; }

/* --- 3. MOBILE (<= 768px) ---------------------------------------- */
@media (max-width: 768px){

  /* (a) Anti-débordement des tables larges : rendre défilables sans
     casser la page. On NE touche PAS .ctable (déjà transformé en cartes
     sous 700px par le bloc plus haut) ni les tables d'e-mail. */
  .app-main .table-responsive {
    display: block;
    width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  /* Tables BS ou nues (en dernier recours) : on les rend elles-mêmes
     défilables. white-space:nowrap évite l'écrasement illisible des
     colonnes. NB : :not() ne peut contenir qu'un sélecteur simple, donc
     on cible largement puis on RÉTABLIT le rendu tabulaire pour les deux
     cas à préserver (ctable carté + table dans un wrapper scroll). */
  .app-main table:not([role="presentation"]):not(.pt) {
    display: block;
    width: 100%;
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    white-space: nowrap;
  }
  /* Une table déjà dans .table-responsive : c'est le WRAPPER qui défile
     (overflow-x:auto ci-dessus). On rétablit donc le rendu tabulaire
     (display:table) pour que la table garde sa largeur naturelle et
     déborde DANS le wrapper (barre de défilement) plutôt que de s'écraser.
     On laisse white-space:nowrap (hérité) : il maintient la largeur des
     colonnes et donc le scroll. Spécificité renforcée (:not()) pour battre
     la règle générique des tables nues ci-dessus. */
  .app-main .table-responsive > table:not(.pt):not([hidden]) {
    display: table;
    width: 100%;
  }
  /* .ctable : entre 701 et 768px il défile horizontalement (rendu par la
     règle générique ci-dessus) ; <=700px il est déjà empilé en cartes par
     le bloc plus haut (règles .ctable td/th/thead plus spécifiques).
     Le white-space:nowrap posé sur <table> hériterait aux cellules et
     empêcherait le texte de revenir à la ligne dans les cartes : on le
     rétablit pour les cellules ctable (texte lisible, multi-lignes). */
  .app-main .ctable td, .app-main .ctable th { white-space: normal; }

  /* (b) Empiler les grilles multi-colonnes Bootstrap en une colonne. */
  .app-main .row > [class*="col-"] { flex: 0 0 100%; max-width: 100%; }

  /* (c) Réduire les paddings des cartes / surfaces. */
  .app-main .card-body { padding: 14px; }
  .app-main .card-header,
  .app-main .card-footer { padding: 12px 14px; }

  /* (d) Grands titres : casser les mots longs / URLs pour ne jamais
     pousser la largeur de page. */
  .app-main h1, .app-main h2, .app-main h3 {
    overflow-wrap: anywhere;
    word-break: break-word;
  }
  /* Pills/badges : autoriser le retour à la ligne (sans casser un mot
     court au milieu) plutôt que de forcer une ligne unique qui élargit. */
  .app-main .pill, .app-main .ct-pill,
  .app-main .fiche-pill, .app-main .badge,
  .app-main .ct-chip { white-space: normal; }
}

/* family/payment/list.twig empile son échéancier en cartes sous 560px (cf. son
   <style> interne), mais hérite le white-space:nowrap de la règle générique
   '.app-main table:not([role="presentation"]):not(.pt)' ci-dessus (@768px), plus
   spécifique que '.pay table' seul (0,3,1 > 0,1,1) : on cible donc aussi les
   cellules pour neutraliser l'héritage, scopé à .pay uniquement. */
@media (max-width: 560px){
  .pay table{ white-space: normal; }
  .pay table td, .pay table th{ white-space: normal; }
}
