/* ================================================================
   KBINE PLUS | Feuille de styles globale
   Couleurs : Orange CI #FF6200 | Vert CI #009A44 | Blanc #FFFFFF
   ================================================================ */

/* La police Roboto est chargée en <link> dans le <head> de chaque page
   (client.html/cabine.html/admin.html), pas via @import ici : un @import
   dans une feuille de style bloque le parsing du reste du fichier tant
   qu'il n'est pas résolu, alors qu'un <link> se charge en parallèle.
   Choisie sur capture de référence (demande explicite : "utilise ce
   modèle de police pour tous le site" — menu système Android) pour tout
   le site, y compris l'espace client qui gardait Nunito en surcharge
   locale (voir index.html, ancienne demande scopée là, remplacée). */

/* â”€â”€ Variables â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
:root {
  --primary:        #FF6200;
  --primary-light:  #FF8533;
  --primary-dark:   #CC4E00;
  --secondary:      #009A44;
  --secondary-light:#00C457;
  --secondary-dark: #007833;
  --white:          #FFFFFF;
  --light-bg:       #FFFFFF;
  --section-tint:   #FFF6EE;
  --frame-green:    rgba(255,98,0,.28);
  --gray-100:       #F8F9FC;
  --gray-200:       #E8ECF4;
  --gray-300:       #CBD5E0;
  --gray-400:       #A0AEC0;
  --gray-500:       #718096;
  --gray-600:       #4A5568;
  --gray-700:       #2D3748;
  --gray-800:       #1A202C;
  --gray-900:       #0F1117;


  --shadow-sm:      0 1px 3px rgba(0,0,0,.08),0 1px 2px rgba(0,0,0,.06);
  --shadow:         0 4px 16px rgba(0,0,0,.08);
  --shadow-lg:      0 10px 40px rgba(0,0,0,.12);
  --shadow-orange:  0 4px 20px rgba(255,98,0,.35);
  --shadow-green:   0 4px 20px rgba(0,154,68,.35);

  --radius-sm:  8px;
  --radius:     16px;
  --radius-lg:  26px;
  --radius-xl:  36px;
  --transition: all .3s ease;
  --font:       'Roboto', -apple-system, sans-serif;
  --sidebar-w:  260px;
  --header-h:   64px;
}

/* â”€â”€ Reset â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  font-family: var(--font);
  background: var(--light-bg);
  color: var(--gray-800);
  line-height: 1.6;
  min-height: 100vh;
  transition: background .3s, color .3s;
}
a { text-decoration: none; color: inherit; }
ul { list-style: none; }
img { max-width: 100%; }
button, input, select, textarea { font-family: var(--font); }

/* â”€â”€ Typography â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
h1 { font-size: 2rem; font-weight: 800; }
h2 { font-size: 1.5rem; font-weight: 700; }
h3 { font-size: 1.25rem; font-weight: 600; }
h4 { font-size: 1rem; font-weight: 600; }
p  { color: var(--gray-600); }

/* â”€â”€ Scrollbar â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
* { scrollbar-width: none; -ms-overflow-style: none; }
::-webkit-scrollbar { display: none; width: 0; height: 0; }

/* ================================================================
   APP LAYOUT
   ================================================================ */
.app-wrapper { display: flex; min-height: 100vh; }

/* â”€â”€ Sidebar â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.sidebar {
  position: fixed;
  left: 0; top: 0;
  width: var(--sidebar-w);
  height: 100vh;
  background: linear-gradient(175deg, #FF6200 0%, #E05500 45%, #006B2F 100%);
  display: flex;
  flex-direction: column;
  z-index: 1000;
  transition: transform .3s ease;
  overflow-y: auto;
  overflow-x: hidden;
}
.sidebar-logo {
  padding: 18px 20px 14px;
  border-bottom: 1px solid rgba(255,255,255,.15);
  display: flex; align-items: center; justify-content: center;
}
.sidebar-logo-img {
  width: 90px; height: 90px; object-fit: contain;
  filter: drop-shadow(0 4px 12px rgba(0,0,0,.3));
}
.sidebar-user {
  padding: 16px 20px;
  display: flex; align-items: center; gap: 12px;
  border-bottom: 1px solid rgba(255,255,255,.1);
}
.sidebar-user .user-avatar {
  width: 40px; height: 40px;
  background: rgba(255,255,255,.25);
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: .9rem; font-weight: 700; color: #fff;
  flex-shrink: 0;
}
.sidebar-user .user-info { overflow: hidden; }
.sidebar-user .user-name {
  font-size: .85rem; font-weight: 600; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sidebar-user .user-role {
  font-size: .7rem; color: rgba(255,255,255,.7);
  text-transform: uppercase; letter-spacing: .5px;
}

.sidebar-nav { flex: 1; padding: 12px 0; }
.nav-section-label {
  font-size: .65rem; color: rgba(255,255,255,.5);
  text-transform: uppercase; letter-spacing: 1px;
  padding: 12px 20px 4px; font-weight: 600;
}
.nav-item {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 20px;
  color: rgba(255,255,255,.8);
  cursor: pointer;
  border-radius: 0;
  transition: var(--transition);
  font-size: .88rem; font-weight: 500;
  margin: 2px 10px;
  border-radius: var(--radius-sm);
  position: relative;
}
.nav-item:hover { background: rgba(255,255,255,.15); color: #fff; }
.nav-item.active {
  background: rgba(255,255,255,.22);
  color: #fff; font-weight: 600;
}
.nav-item.active::before {
  content: '';
  position: absolute; left: 0; top: 20%; bottom: 20%;
  width: 3px; background: #FFD700; border-radius: 99px;
  left: -10px;
}
.nav-item i { width: 20px; text-align: center; font-size: .9rem; }
/* Recherche d'onglets (sidebar) — voir filterAdminNav() dans js/admin.js,
   distincte de style.display géré par applyAdminPermissionGating(). */
.nav-item--search-hidden { display: none !important; }
.nav-badge {
  margin-left: auto;
  background: #FFD700; color: #000;
  font-size: .65rem; font-weight: 700;
  padding: 2px 7px; border-radius: 99px;
}

.sidebar-footer {
  padding: 16px 20px;
  border-top: 1px solid rgba(255,255,255,.15);
}
.btn-logout {
  display: flex; align-items: center; gap: 10px;
  color: rgba(255,255,255,.8);
  font-size: .85rem; cursor: pointer;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  transition: var(--transition);
  background: none; border: none; width: 100%;
}
.btn-logout:hover { background: rgba(255,255,255,.15); color: #fff; }

/* â”€â”€ Main Content â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.main-content {
  margin-left: var(--sidebar-w);
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  transition: margin .3s ease;
}

/* â”€â”€ Top Header â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.topbar {
  height: var(--header-h);
  background: var(--white);
  border-bottom: 1px solid var(--gray-200);
  display: flex; align-items: center;
  padding: 0 24px;
  gap: 16px;
  position: sticky; top: 0; z-index: 100;
  transition: background .3s;
}

.topbar-menu-btn {
  display: none;
  background: none; border: none;
  font-size: 1.2rem; color: var(--gray-600);
  cursor: pointer; padding: 4px;
}
.topbar-title { font-size: 1.1rem; font-weight: 700; flex: 1; }
.topbar-actions { display: flex; align-items: center; gap: 8px; }
.topbar-btn {
  width: 38px; height: 38px;
  border-radius: var(--radius);
  border: none;
  background: var(--gray-100);
  color: var(--gray-600);
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  font-size: .95rem;
  transition: var(--transition);
  position: relative;
}
.topbar-btn:hover { background: var(--gray-200); color: var(--primary); }
.notif-dot {
  position: absolute; top: 6px; right: 6px;
  width: 8px; height: 8px;
  background: var(--primary); border-radius: 50%;
  border: 2px solid var(--white);
}

/* â”€â”€ Page Content â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.page-content { padding: 24px; flex: 1; }
.page-header { margin-bottom: 24px; }
.page-header h2 { font-size: 1.4rem; font-weight: 700; margin-bottom: 4px; }
.page-header p { font-size: .85rem; }
.breadcrumb { font-size: .8rem; color: var(--gray-500); margin-bottom: 8px; }
.breadcrumb span { color: var(--primary); font-weight: 500; }

/* â”€â”€ View Sections â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.view { display: none; }
.view.active { display: block; }

/* â”€â”€ Stat Cards â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.stats-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 20px;
  margin-bottom: 24px;
}
/* Titre de section au-dessus d'une rangée de stat-cards, avec filet
   horizontal pour séparer visuellement les groupes du dashboard admin. */
.dash-section-title {
  display: flex; align-items: center; gap: 10px;
  font-size: .7rem; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--gray-500);
  margin: 24px 0 12px;
}
.dash-section-title::after { content: ''; flex: 1; height: 1px; background: var(--gray-200); }
.dash-section-title:first-of-type { margin-top: 4px; }
.stat-card {
  background: var(--white);
  border-radius: var(--radius-lg);
  padding: 22px;
  display: flex; align-items: flex-start; justify-content: space-between;
  box-shadow: var(--shadow-sm);
  transition: transform .2s, box-shadow .2s;
  overflow: hidden;
  position: relative;
}
.stat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
.stat-card::after {
  content: '';
  position: absolute; top: -30px; right: -30px;
  width: 100px; height: 100px;
  border-radius: 50%;
  opacity: .06;
}
.stat-card.orange::after { background: var(--primary); }
.stat-card.green::after  { background: var(--secondary); }
.stat-card.blue::after   { background: #3B82F6; }
.stat-card.purple::after { background: #8B5CF6; }

.stat-info { flex: 1; }
.stat-label { font-size: .75rem; color: var(--gray-500); font-weight: 500; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 6px; }
.stat-value { font-size: 1.6rem; font-weight: 800; color: var(--gray-800); line-height: 1.2; }
.stat-sub  { font-size: .75rem; color: var(--gray-500); margin-top: 4px; }
.stat-trend { font-size: .75rem; margin-top: 6px; }
.stat-trend.up   { color: var(--secondary); }
.stat-trend.down { color: #EF4444; }
.stat-icon {
  width: 48px; height: 48px;
  border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.2rem; flex-shrink: 0;
}
.stat-icon.orange { background: rgba(255,98,0,.12); color: var(--primary); }
.stat-icon.green  { background: rgba(0,154,68,.12); color: var(--secondary); }
.stat-icon.blue   { background: rgba(59,130,246,.12); color: #3B82F6; }
.stat-icon.purple { background: rgba(139,92,246,.12); color: #8B5CF6; }
.stat-icon.gold   { background: rgba(234,179,8,.12); color: #CA8A04; }
.stat-icon.red    { background: rgba(239,68,68,.12); color: #EF4444; }

/* â”€â”€ Cards â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.card {
  background: var(--white);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  transition: background .3s;
}
.card-header {
  padding: 18px 22px 14px;
  border-bottom: 1px solid var(--gray-200);
  display: flex; align-items: center; justify-content: space-between;
}
.card-title { font-size: .95rem; font-weight: 700; }
.card-body { padding: 22px; }

.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; }

/* â”€â”€ Buttons â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 10px 20px;
  border-radius: var(--radius);
  border: none; cursor: pointer;
  font-size: .875rem; font-weight: 600;
  transition: var(--transition);
  white-space: nowrap;
}
.btn:disabled { opacity: .5; pointer-events: none; }
.btn-primary {
  background: var(--primary); color: #fff;
  box-shadow: var(--shadow-orange);
}
.btn-primary:hover { background: var(--primary-dark); transform: translateY(-1px); }
.btn-secondary {
  background: var(--secondary); color: #fff;
  box-shadow: var(--shadow-green);
}
.btn-secondary:hover { background: var(--secondary-dark); transform: translateY(-1px); }
.btn-outline {
  background: transparent; color: var(--primary);
  border: 2px solid var(--primary);
}
.btn-outline:hover { background: var(--primary); color: #fff; }
.btn-ghost {
  background: var(--gray-100); color: var(--gray-700);
}
.btn-ghost:hover { background: var(--gray-200); }
.btn-danger { background: #EF4444; color: #fff; }
.btn-danger:hover { background: #DC2626; }
.btn-sm { padding: 6px 14px; font-size: .8rem; }
.btn-lg { padding: 14px 28px; font-size: 1rem; }
.btn-full { width: 100%; justify-content: center; }
.btn-icon { padding: 8px; width: 36px; height: 36px; justify-content: center; }

/* ── Onglet Admin "Forfaits" ──────────────────────────────────── */
.frf-op-btn.active { background: var(--primary) !important; color: #fff !important; }
.frf-cat-group { margin-bottom: 18px; }
.frf-cat-group:last-child { margin-bottom: 0; }
.frf-cat-title {
  font-size: .72rem; font-weight: 800; color: var(--gray-500);
  text-transform: uppercase; letter-spacing: .04em;
  margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--gray-200);
}
.frf-subcat-title {
  font-size: .64rem; font-weight: 700; color: var(--gray-400);
  text-transform: uppercase; letter-spacing: .03em;
  margin: 10px 0 4px; padding-left: 2px;
}
.frf-subcat-title:first-child { margin-top: 0; }
.frf-row {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 0; border-bottom: 1px solid var(--gray-100);
}
.frf-row:last-child { border-bottom: none; }
.frf-row-nom { font-weight: 700; font-size: .85rem; color: var(--gray-800); }
.frf-row-meta { font-size: .72rem; color: var(--gray-500); margin-top: 2px; }
.frf-row-ussd { font-size: .65rem; color: var(--gray-400); margin-top: 2px; font-family: monospace; word-break: break-all; }
.frf-row-prix { font-weight: 800; color: var(--primary); font-size: .85rem; white-space: nowrap; flex-shrink: 0; }
.frf-row-edit {
  background: none; border: none; color: var(--gray-500); cursor: pointer;
  font-size: .9rem; padding: 6px; flex-shrink: 0;
}
.frf-row-edit:hover { color: var(--primary); }
.frf-row-del {
  background: none; border: none; color: #EF4444; cursor: pointer;
  font-size: .9rem; padding: 6px; flex-shrink: 0;
}
.frf-row-del:hover { color: #DC2626; }

/* ── Forms ──────────────────────────────────────────────────────── */
.form-group { margin-bottom: 18px; }
.form-label {
  display: block; margin-bottom: 6px;
  font-size: .85rem; font-weight: 600; color: var(--gray-700);
}
.form-control {
  width: 100%;
  padding: 11px 16px;
  border: 1.5px solid var(--gray-300);
  border-radius: var(--radius);
  font-size: .9rem;
  background: var(--white);
  color: var(--gray-800);
  transition: border-color .2s, box-shadow .2s;
  outline: none;
}
.form-control:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(255,98,0,.12);
}
.form-control.green:focus {
  border-color: var(--secondary);
  box-shadow: 0 0 0 3px rgba(0,154,68,.12);
}
.input-group { position: relative; }
.input-icon {
  position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
  color: var(--gray-400); font-size: .9rem; pointer-events: none;
}
.input-group .form-control { padding-left: 42px; }
.input-suffix {
  position: absolute; right: 14px; top: 50%; transform: translateY(-50%);
  color: var(--gray-500); font-size: .85rem; font-weight: 600;
}
.form-hint { font-size: .75rem; color: var(--gray-500); margin-top: 4px; }
.form-error { font-size: .75rem; color: #EF4444; margin-top: 4px; }

/* â”€â”€ Operator Cards â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.operator-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 12px; margin-bottom: 4px; }
.operator-card {
  border: 2px solid var(--gray-200);
  border-radius: var(--radius);
  padding: 14px 10px;
  cursor: pointer;
  text-align: center;
  transition: var(--transition);
  background: var(--white);
}
.operator-card:hover { border-color: var(--primary); }
.operator-card.selected { border-color: var(--primary); background: rgba(255,98,0,.05); }
.operator-card img { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; margin-bottom: 6px; }
.operator-icon { font-size: 1.8rem; margin-bottom: 6px; }
.operator-name { font-size: .78rem; font-weight: 600; color: var(--gray-700); }

/* â”€â”€ Amount Presets â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.amount-presets { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.preset-btn {
  padding: 6px 14px;
  border: 1.5px solid var(--gray-200);
  border-radius: 99px;
  font-size: .8rem; font-weight: 600;
  cursor: pointer; background: var(--white);
  color: var(--gray-600);
  transition: var(--transition);
}
.preset-btn:hover { border-color: var(--primary); color: var(--primary); }
.preset-btn.active { background: var(--primary); border-color: var(--primary); color: #fff; }

/* â”€â”€ Tables â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.table-wrapper { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: .875rem; }
thead { background: var(--gray-100); }
th {
  text-align: left; padding: 12px 16px;
  font-size: .75rem; font-weight: 700;
  color: var(--gray-500); text-transform: uppercase; letter-spacing: .5px;
}
td { padding: 14px 16px; border-bottom: 1px solid var(--gray-200); color: var(--gray-700); vertical-align: middle; }
tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--gray-100); }

/* â”€â”€ Badges â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.badge {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 10px; border-radius: 99px;
  font-size: .72rem; font-weight: 700;
}
.badge-pending  { background: rgba(234,179,8,.12); color: #92400E; }
.badge-success  { background: rgba(0,154,68,.12);  color: #065F46; }
.badge-failed   { background: rgba(239,68,68,.12); color: #991B1B; }
.badge-info     { background: rgba(59,130,246,.12); color: #1E40AF; }
.badge-orange   { background: rgba(255,98,0,.12); color: var(--primary-dark); }
.badge::before  { content: ''; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }

/* â”€â”€ Modals â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.modal-overlay {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  backdrop-filter: blur(4px);
  z-index: 2000;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  opacity: 0; visibility: hidden;
  transition: opacity .2s ease, visibility .2s ease;
}
.modal-overlay.open { opacity: 1; visibility: visible; }
.modal {
  background: var(--white);
  border-radius: var(--radius-xl);
  width: 100%; max-width: 500px;
  max-height: 90vh; overflow-y: auto;
  transform: translateY(20px) scale(.97);
  transition: var(--transition);
  box-shadow: var(--shadow-lg);
}
.modal-overlay.open .modal { transform: translateY(0) scale(1); }
.modal-header {
  padding: 22px 24px 16px;
  border-bottom: 1px solid var(--gray-200);
  display: flex; align-items: center; justify-content: space-between;
}
.modal-title { font-size: 1.05rem; font-weight: 700; }
.modal-close {
  width: 32px; height: 32px; border-radius: var(--radius-sm);
  border: none; background: var(--gray-100); cursor: pointer;
  color: var(--gray-600); font-size: .9rem;
  display: flex; align-items: center; justify-content: center;
  transition: var(--transition);
}
.modal-close:hover { background: #FEE2E2; color: #EF4444; }
/* Poignée "bottom-sheet" (ni flèche ni croix, demande explicite) — même
   patron que .qrs-handle/.cadeau-handle : on tape ou on glisse vers le
   bas dessus pour fermer (voir _bindSwipeDownToClose(), js/client.js).
   Utilisée uniquement sur les modales qui l'ont explicitement demandée
   (Notifications/Changer le PIN/Appareils connectés) — .modal-close
   reste la norme partout ailleurs. */
.modal-handle {
  display: block; width: 38px; height: 5px; border-radius: 3px;
  border: none; padding: 0; margin: 12px auto 0;
  background: rgba(0,0,0,.15); cursor: pointer; transition: background .15s;
}
.modal-handle:hover, .modal-handle:active { background: rgba(0,0,0,.28); }
.modal-header--noline { border-bottom: none; justify-content: center; }
.modal-body { padding: 22px 24px; }
.modal-footer {
  padding: 16px 24px 22px;
  border-top: 1px solid var(--gray-200);
  display: flex; gap: 12px; justify-content: flex-end;
}

/* ── Écran d'amorçage des notifications push (#modal-push-priming) — voir
   PushNotif dans js/push-notifications.js ── */
.push-prime { text-align: center; padding-top: 8px; }
.push-prime-ico {
  width: 60px; height: 60px; margin: 0 auto 14px; border-radius: 18px;
  background: rgba(15,10,46,.06); color: #0F0A2E;
  display: flex; align-items: center; justify-content: center; font-size: 1.4rem;
}
.push-prime-title { font-size: 1.05rem; font-weight: 800; color: #16121F; margin: 0 0 6px; }
.push-prime-text { font-size: .82rem; color: var(--gray-600); margin: 0 0 14px; }
.push-prime-list {
  list-style: none; margin: 0 0 20px; padding: 0;
  text-align: left; display: flex; flex-direction: column; gap: 10px;
}
.push-prime-list li {
  display: flex; align-items: flex-start; gap: 10px;
  font-size: .8rem; color: #16121F;
}
.push-prime-list li i { color: #16a34a; margin-top: 2px; flex-shrink: 0; }
.push-prime-cta { width: 100%; margin: 0 0 8px; }
.push-prime-skip {
  width: 100%; background: none; border: none; cursor: pointer;
  font-family: var(--font); font-size: .8rem; font-weight: 600;
  color: var(--gray-500); padding: 10px;
}
.push-prime-skip:hover { color: #374151; }

/* ── Menu d'aide (bouton "Aide", bottom-nav) — voir openHelpMenu(),
   js/client.js ── */
/* Réduit pour bien tenir sur un écran de téléphone (demande explicite). */
/* Liste unifiée en un seul cadre, filet entre les lignes (direction B
   choisie via canvas de design le 25/08), plutôt que des cartes
   séparées — même langage que la liste de #modal-contact. Icônes en
   bleu marine (famille unique), sauf WhatsApp qui garde sa couleur de
   marque pour rester identifiable. */
.help-menu-body { border: 1px solid var(--gray-200); border-radius: 14px; overflow: hidden; }
.help-menu-item {
  display: flex; align-items: center; gap: 12px;
  width: 100%; background: #fff; border: none; border-bottom: 1px solid var(--gray-200);
  border-radius: 0; padding: 13px 14px; cursor: pointer;
  font-family: var(--font); text-align: left;
  transition: background .15s;
}
.help-menu-item:last-child { border-bottom: none; }
.help-menu-item:hover { background: var(--gray-100); }
.help-menu-ico {
  width: 36px; height: 36px; border-radius: 10px; flex-shrink: 0;
  background: rgba(15,10,46,.06); color: #0F0A2E;
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem;
}
.help-menu-ico--green { background: rgba(37,211,102,.1); color: #25D366; }
.help-menu-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.help-menu-title { font-size: .76rem; font-weight: 800; color: #16121F; }
.help-menu-sub { font-size: .64rem; color: var(--gray-500); }
.help-menu-chev { font-size: .6rem; color: #0F0A2E; opacity: .3; flex-shrink: 0; }
.help-menu-heading { font-size: .86rem; font-weight: 800; color: #16121F; text-align: center; }
#modal-help-menu .modal-header {
  border-bottom: none; flex-direction: column; align-items: center; gap: 14px;
  padding: 16px 20px 4px;
}
#modal-help-menu .modal-body { padding-top: 6px; }
/* Barre de glissement façon feuille mobile (bottom sheet), remplace la
   croix (demande explicite) — reste cliquable pour fermer. */
#modal-help-menu .help-menu-drag-handle {
  width: 40px; height: 5px; border-radius: 99px;
  background: var(--gray-300); border: none; padding: 0; cursor: pointer;
}
#modal-help-menu .help-menu-drag-handle:hover { background: var(--gray-400); }

/* ── Modale "Perturbation réseau" (maintenance réseau globale) ───────────
   Voir warnNetworkMaintenance() dans js/db.js — réutilise .modal-overlay
   (fond + transition open/close déjà défini ci-dessus). Fond blanc avec
   halo orange clair (--primary), badge toujours teinté par le réseau
   bloqué (--netm-clr). */
.netm-overlay { z-index: 3000; }
.netm-card {
  --netm-clr: #FF6200; --netm-txt: #ffffff;
  position: relative;
  width: 100%; max-width: 340px;
  border-radius: 26px; overflow: hidden;
  background: #ffffff;
  border: 1.5px solid rgba(255,98,0,.15);
  box-shadow: var(--shadow-lg);
  padding: 30px 24px 26px; text-align: center;
  transform: translateY(20px) scale(.97);
  transition: transform .25s cubic-bezier(.34,1.46,.64,1);
}
.netm-overlay.open .netm-card { transform: translateY(0) scale(1); }
.netm-close {
  position: absolute; top: 12px; right: 12px; z-index: 2;
  width: 28px; height: 28px; border-radius: 50%; border: none;
  background: rgba(0,0,0,.06); color: rgba(0,0,0,.5);
  display: flex; align-items: center; justify-content: center;
  font-size: .75rem; cursor: pointer; transition: background .15s;
}
.netm-close:hover { background: rgba(0,0,0,.12); }
.netm-icon {
  width: 92px; height: 92px; border-radius: 22px; margin: 0 auto 18px;
  overflow: hidden; position: relative;
  box-shadow: 0 6px 18px rgba(0,0,0,.15);
}
.netm-icon-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.netm-title { color: #1a1a2e; font-weight: 900; font-size: 1.05rem; margin-bottom: 6px; }
.netm-sub { color: rgba(0,0,0,.45); font-size: .75rem; margin-bottom: 18px; }
#global-maintenance-message { color: #DC2626; font-weight: 800; }
.netm-badge {
  display: inline-flex; align-items: center; gap: 10px;
  background: none; color: rgba(22,18,31,.75);
  padding: 0; border-radius: 0;
  font-weight: 800; font-size: .85rem; margin-bottom: 16px;
}
.netm-badge-icon { position: relative; display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center; font-size: 1.05rem; }
.netm-badge-slash {
  position: absolute; width: 145%; height: 2.5px; background: currentColor;
  transform: rotate(-45deg);
}
.netm-badge-logo { height: 28px; width: auto; max-width: 120px; object-fit: contain; display: block; border-radius: 3px; }

/* ── Toast Notifications ──────────────────────────────────────── */
#toast-container {
  position: fixed; top: 20px; left: 50%; transform: translateX(-50%);
  z-index: 9999; display: flex; flex-direction: column; gap: 8px;
  pointer-events: none; align-items: center; width: 100%; max-width: 340px;
  padding: 0 16px; box-sizing: border-box;
}
/* "Carte signal" — fond clair + rail de couleur en bordure gauche
   (plutôt qu'un dégradé sombre plein), plus lisible en plein soleil
   (usage cabiniste en boutique) ; volontairement indépendant du thème
   clair/sombre du site, comme l'était déjà l'ancien modèle. */
.toast {
  pointer-events: all; width: 100%;
  border-radius: 14px; overflow: hidden; position: relative;
  animation: toastIn .4s cubic-bezier(.34,1.28,.64,1);
  box-shadow: 0 12px 32px rgba(36,28,18,.22);
  background: #FBF6EE;
  border: 1px solid rgba(36,28,18,.08);
}
.toast::before {
  content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
}
.toast.success::before { background: #16A34A; }
.toast.error::before   { background: #EF4444; }
.toast.info::before    { background: #3B82F6; }
.toast.warning::before { background: #F59E0B; }
@keyframes toastIn {
  from { transform: translateY(-14px) scale(.92); opacity: 0; }
  to   { transform: translateY(0)     scale(1);   opacity: 1; }
}
.toast-inner {
  display: flex; align-items: center; gap: 11px;
  padding: 12px 12px 12px 18px;
}
.toast-logo-badge {
  position: relative; width: 38px; height: 38px; flex-shrink: 0;
  border-radius: 50%; background: rgba(36,28,18,.05);
  display: flex; align-items: center; justify-content: center;
}
.toast-logo-img { width: 25px; height: 25px; object-fit: contain; }
.toast-content { flex: 1; min-width: 0; }
.toast-type {
  display: flex; align-items: center; gap: 6px;
  font-size: .5rem; font-weight: 800; text-transform: uppercase;
  letter-spacing: .1em; margin-bottom: 3px;
}
.toast-type::before {
  content: ''; width: 5px; height: 5px; border-radius: 50%;
  background: currentColor; flex-shrink: 0;
}
.toast.success .toast-type { color: #16A34A; }
.toast.error   .toast-type { color: #EF4444; }
.toast.info    .toast-type { color: #3B82F6; }
.toast.warning .toast-type { color: #B45309; }
.toast-msg {
  font-size: .72rem; font-weight: 600;
  color: #241C12; line-height: 1.42;
}
.toast-close {
  cursor: pointer; flex-shrink: 0; align-self: center;
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(36,28,18,.05);
  display: flex; align-items: center; justify-content: center;
  color: rgba(36,28,18,.4); font-size: .5rem; transition: all .2s;
  border: none;
}
.toast-close:hover { background: rgba(36,28,18,.1); color: #241C12; }

.toast-progress {
  position: absolute; bottom: 0; left: 0; right: 0; height: 2px;
  animation: toastProgress linear forwards;
}
.toast.success .toast-progress { background: rgba(22,163,74,.35); }
.toast.error   .toast-progress { background: rgba(239,68,68,.35); }
.toast.info    .toast-progress { background: rgba(59,130,246,.35); }
.toast.warning .toast-progress { background: rgba(245,158,11,.35); }
@keyframes toastProgress {
  from { width: 100%; }
  to   { width: 0; }
}

/* ── Notification Panel ───────────────────────────────────────── */
.notif-list { display: flex; flex-direction: column; gap: 0; }
.notif-item {
  display: flex; gap: 12px; padding: 14px 16px;
  border-bottom: 1px solid rgba(255,255,255,.05);
  cursor: pointer; transition: background .2s; position: relative;
}
.notif-item:last-child { border-bottom: none; }
.notif-item:hover { background: rgba(255,255,255,.03); }
.notif-item.unread { background: rgba(255,98,0,.04); }
.notif-icon {
  width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem;
  background: rgba(255,98,0,.12); color: var(--primary);
  border: 1px solid rgba(255,98,0,.2);
}
.notif-content { flex: 1; min-width: 0; }
.notif-msg  { font-size: .75rem; font-weight: 600; margin-bottom: 4px; color: var(--text); line-height: 1.4; }
.notif-time { font-size: .62rem; color: var(--text-muted); display: flex; align-items: center; gap: 4px; }
.notif-unread-dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--primary); margin-top: 4px; flex-shrink: 0;
  box-shadow: 0 0 6px rgba(255,98,0,.6);
}
.notif-delete-btn {
  flex-shrink: 0; align-self: center;
  width: 28px; height: 28px; border-radius: 50%; border: none;
  background: rgba(255,255,255,.05); color: var(--text-muted);
  display: flex; align-items: center; justify-content: center;
  font-size: .68rem; cursor: pointer; transition: background .15s, color .15s;
}
.notif-delete-btn:hover { background: rgba(239,68,68,.15); color: #ef4444; }

/* â”€â”€ Search & Filters â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.filter-bar {
  display: flex; gap: 12px; flex-wrap: wrap;
  margin-bottom: 20px; align-items: center;
}
.search-box {
  flex: 1; min-width: 220px; max-width: 340px;
}
.filter-select {
  padding: 10px 14px;
  border: 1.5px solid var(--gray-300);
  border-radius: var(--radius);
  background: var(--white);
  color: var(--gray-700);
  font-size: .875rem;
  cursor: pointer; outline: none;
}

/* â”€â”€ Timeline / Activity â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.timeline { display: flex; flex-direction: column; gap: 0; }
.timeline-item {
  display: flex; gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid var(--gray-200);
  position: relative;
}
.timeline-item:last-child { border-bottom: none; }
.timeline-dot {
  width: 38px; height: 38px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; flex-shrink: 0;
}
.timeline-dot.send    { background: rgba(255,98,0,.12); color: var(--primary); }
.timeline-dot.receive { background: rgba(0,154,68,.12); color: var(--secondary); }
.timeline-dot.wallet  { background: rgba(59,130,246,.12); color: #3B82F6; }
.timeline-info { flex: 1; }
.timeline-title { font-size: .88rem; font-weight: 600; margin-bottom: 2px; }
.timeline-sub   { font-size: .78rem; color: var(--gray-500); }
.timeline-amount { font-size: .9rem; font-weight: 700; }
.timeline-amount.debit  { color: #EF4444; }
.timeline-amount.credit { color: var(--secondary); }
.timeline-time { font-size: .72rem; color: var(--gray-400); }

/* â”€â”€ Notification Panel â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.notif-list { display: flex; flex-direction: column; gap: 0; }
.notif-item {
  display: flex; gap: 14px; padding: 14px;
  border-bottom: 1px solid var(--gray-200);
  cursor: pointer; transition: background .2s;
  border-radius: var(--radius);
}
.notif-item:hover { background: var(--gray-100); }
.notif-item.unread { background: rgba(255,98,0,.04); }
.notif-icon {
  width: 40px; height: 40px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: .9rem; flex-shrink: 0;
  background: rgba(255,98,0,.1); color: var(--primary);
}
.notif-content { flex: 1; }
.notif-msg { font-size: .85rem; font-weight: 500; margin-bottom: 3px; }
.notif-time { font-size: .75rem; color: var(--gray-400); }
.notif-unread-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--primary); margin-top: 6px; flex-shrink: 0;
}

/* â”€â”€ Wallet / Balance Card â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.wallet-card {
  background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 50%, #8B1A00 100%);
  border-radius: var(--radius-xl);
  padding: 28px;
  color: #fff;
  position: relative; overflow: hidden;
  box-shadow: var(--shadow-orange);
}
.wallet-card::before {
  content: '';
  position: absolute; top: -40px; right: -40px;
  width: 160px; height: 160px;
  border-radius: 50%; background: rgba(255,255,255,.08);
}
.wallet-card::after {
  content: '';
  position: absolute; bottom: -60px; left: 20px;
  width: 200px; height: 200px;
  border-radius: 50%; background: rgba(255,255,255,.05);
}
.wallet-label { font-size: .78rem; opacity: .8; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 8px; }
.wallet-amount { font-size: 2.4rem; font-weight: 800; margin-bottom: 4px; position: relative; z-index: 1; }
.wallet-sub { font-size: .8rem; opacity: .7; position: relative; z-index: 1; }
.wallet-chip {
  display: inline-flex; align-items: center; gap: 6px;
  background: rgba(255,255,255,.2); padding: 6px 14px;
  border-radius: 99px; font-size: .78rem; font-weight: 600;
  margin-top: 16px; position: relative; z-index: 1;
}

/* â”€â”€ Progress / Steps â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.steps { display: flex; align-items: center; margin-bottom: 28px; }
.step {
  flex: 1; display: flex; flex-direction: column; align-items: center;
  position: relative;
}
.step:not(:last-child)::after {
  content: '';
  position: absolute; top: 16px; left: 50%; width: 100%;
  height: 2px; background: var(--gray-200);
}
.step.done:not(:last-child)::after { background: var(--secondary); }
.step-circle {
  width: 32px; height: 32px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: .75rem; font-weight: 700; border: 2px solid var(--gray-200);
  background: var(--white); color: var(--gray-500); z-index: 1; margin-bottom: 6px;
}
.step.active .step-circle { border-color: var(--primary); color: var(--primary); background: rgba(255,98,0,.08); }
.step.done   .step-circle { border-color: var(--secondary); background: var(--secondary); color: #fff; }
.step-label { font-size: .7rem; color: var(--gray-500); font-weight: 500; }
.step.active .step-label { color: var(--primary); font-weight: 600; }
.step.done   .step-label { color: var(--secondary); }

/* â”€â”€ Charts Container â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.chart-container { position: relative; height: 240px; }
.chart-container-sm { position: relative; height: 180px; }

/* â”€â”€ Empty State â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.empty-state {
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; padding: 48px 24px; text-align: center;
}
.empty-icon { font-size: 3rem; color: var(--gray-300); margin-bottom: 16px; }
.empty-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 8px; }
.empty-text { font-size: .88rem; color: var(--gray-500); max-width: 320px; }

/* â”€â”€ Receipt â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.receipt {
  border: 2px dashed var(--gray-200);
  border-radius: var(--radius-lg);
  padding: 24px;
}
.receipt-header { text-align: center; padding-bottom: 16px; border-bottom: 1px solid var(--gray-200); margin-bottom: 16px; }
.receipt-logo { font-size: 1.4rem; font-weight: 800; color: var(--primary); margin-bottom: 4px; }
.receipt-row { display: flex; justify-content: space-between; padding: 8px 0; font-size: .875rem; }
.receipt-row:not(:last-child) { border-bottom: 1px solid var(--gray-100); }
.receipt-row .label { color: var(--gray-500); }
.receipt-row .value { font-weight: 600; }
.receipt-total { background: var(--gray-100); border-radius: var(--radius); padding: 12px 16px; margin-top: 12px; }

/* â”€â”€ Request Cards (Cabine) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.request-card {
  background: var(--white);
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--gray-200);
  padding: 18px;
  transition: var(--transition);
}
.request-card:hover { box-shadow: var(--shadow); border-color: var(--primary); }
.request-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.request-id { font-size: .75rem; color: var(--gray-400); }
.request-body { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 14px; }
.request-field { font-size: .82rem; }
.request-field .field-label { color: var(--gray-500); margin-bottom: 2px; }
.request-field .field-value { font-weight: 600; }
.request-actions { display: flex; gap: 10px; }

/* â”€â”€ Sidebar Mobile Overlay â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.sidebar-overlay {
  display: none;
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  z-index: 999;
}

/* â”€â”€ Avatar group â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.user-chip {
  display: inline-flex; align-items: center; gap: 8px;
}
.user-chip .avatar {
  width: 30px; height: 30px; border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--secondary));
  display: flex; align-items: center; justify-content: center;
  font-size: .7rem; font-weight: 700; color: #fff; flex-shrink: 0;
}
.user-chip .name { font-size: .85rem; font-weight: 600; }

/* â”€â”€ Switch toggle â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.switch { position: relative; display: inline-block; width: 44px; height: 24px; }
.switch input { opacity: 0; width: 0; height: 0; }
.slider {
  position: absolute; cursor: pointer;
  top: 0; left: 0; right: 0; bottom: 0;
  background: var(--gray-300); border-radius: 99px;
  transition: .3s;
}
.slider::before {
  content: '';
  position: absolute; height: 18px; width: 18px;
  left: 3px; bottom: 3px;
  background: #fff; border-radius: 50%; transition: .3s;
}
input:checked + .slider { background: var(--secondary); }
input:checked + .slider::before { transform: translateX(20px); }

/* Notifications sonores (admin — Paramètres) */
.admin-notif-toggle-row {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--gray-200);
}
.admin-notif-toggle-title { font-size: .86rem; font-weight: 700; color: var(--gray-800); }
.admin-notif-toggle-sub { font-size: .74rem; color: var(--gray-500); margin-top: 4px; max-width: 380px; line-height: 1.5; }

.admin-sound-picker { display: flex; flex-direction: column; gap: 8px; }
.admin-sound-option {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; border-radius: var(--radius);
  border: 1.5px solid var(--gray-200); background: var(--gray-100);
  cursor: pointer; transition: border-color .15s, background .15s;
}
.admin-sound-option:hover { border-color: rgba(255,98,0,.35); }
.admin-sound-option--active { border-color: var(--primary); background: rgba(255,98,0,.05); }
.admin-sound-option-radio {
  width: 20px; height: 20px; border-radius: 50%; flex-shrink: 0;
  border: 1.5px solid var(--gray-300); background: #fff;
  display: flex; align-items: center; justify-content: center;
  color: transparent; font-size: .58rem; transition: border-color .15s, background .15s, color .15s;
}
.admin-sound-option--active .admin-sound-option-radio { border-color: var(--primary); background: var(--primary); color: #fff; }
.admin-sound-option-label { flex: 1; min-width: 0; font-size: .82rem; font-weight: 600; color: var(--gray-700); }
.admin-sound-preview-btn {
  flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%;
  border: 1px solid var(--gray-300); background: #fff; color: var(--gray-600);
  cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: .66rem;
  transition: background .15s, color .15s, border-color .15s;
}
.admin-sound-preview-btn:hover { background: var(--primary); border-color: var(--primary); color: #fff; }

/* â”€â”€ Pagination â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.pagination { display: flex; align-items: center; gap: 6px; margin-top: 20px; justify-content: center; }
.page-btn {
  width: 36px; height: 36px; border-radius: var(--radius);
  border: 1.5px solid var(--gray-200);
  background: var(--white); color: var(--gray-600);
  cursor: pointer; font-size: .875rem; font-weight: 600;
  display: flex; align-items: center; justify-content: center;
  transition: var(--transition);
}
.page-btn:hover, .page-btn.active { background: var(--primary); border-color: var(--primary); color: #fff; }

/* â”€â”€ Commission badge â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.commission-pill {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(0,154,68,.12); color: var(--secondary-dark);
  padding: 3px 10px; border-radius: 99px;
  font-size: .75rem; font-weight: 700;
}

/* â”€â”€ Profile â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.profile-banner {
  height: 120px;
  background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  position: relative;
}
.profile-avatar-wrap {
  position: absolute; bottom: -30px; left: 28px;
}
.profile-avatar {
  width: 70px; height: 70px; border-radius: 50%;
  background: var(--white);
  border: 4px solid var(--white);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.6rem; font-weight: 800;
  color: var(--primary);
  box-shadow: var(--shadow);
}
.profile-info-section { padding: 42px 28px 22px; }
.profile-name { font-size: 1.2rem; font-weight: 700; }
.profile-role {
  display: inline-flex; align-items: center; gap: 6px;
  background: rgba(255,98,0,.1); color: var(--primary);
  padding: 4px 12px; border-radius: 99px;
  font-size: .75rem; font-weight: 700; margin-top: 6px;
}

/* â”€â”€ Stat Mini â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.stat-mini {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 0; border-bottom: 1px solid var(--gray-200);
}
.stat-mini:last-child { border-bottom: none; }
.stat-mini-label { font-size: .82rem; color: var(--gray-500); }
.stat-mini-val { font-size: .9rem; font-weight: 700; }

/* â”€â”€ Top Export bar â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.export-bar {
  display: flex; gap: 10px; margin-bottom: 16px;
}

/* â”€â”€ Responsive â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
@media (max-width: 1024px) {
  .grid-3 { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
  :root { --sidebar-w: 260px; }
  .sidebar { transform: translateX(-100%); }
  .sidebar.open { transform: translateX(0); }
  .sidebar-overlay { display: block; opacity: 0; visibility: hidden; transition: var(--transition); }
  .sidebar-overlay.open { opacity: 1; visibility: visible; }
  .main-content { margin-left: 0; }
  .topbar-menu-btn { display: flex; }
  .grid-2 { grid-template-columns: 1fr; }
  .grid-3 { grid-template-columns: 1fr; }
  .stats-grid { grid-template-columns: 1fr 1fr; }
  .page-content { padding: 16px; }
  .operator-grid { grid-template-columns: 1fr 1fr 1fr; }
  .request-body { grid-template-columns: 1fr; }
  .filter-bar { flex-direction: column; align-items: stretch; }
  .search-box { max-width: 100%; }
}
@media (max-width: 480px) {
  .stats-grid { grid-template-columns: 1fr; }
  .modal { border-radius: var(--radius-lg); }
  .wallet-amount { font-size: 1.8rem; }
}

/* ── Espace administrateur (espace-gestion.html) sur smartphone : sidebar
   déjà en tiroir dès 768px ci-dessus ; ici on resserre les marges, on
   empile les grilles et on rend les tableaux défilables pour que tout
   reste lisible et utilisable sur un écran de téléphone. ── */
@media (max-width: 640px) {
  .main-content { max-width: 100vw; overflow-x: hidden; }
  .topbar { padding: 0 12px; gap: 10px; }
  .topbar-title { font-size: .98rem; }
  .topbar-btn { width: 34px; height: 34px; }
  .page-content { padding: 14px 12px 90px; }
  .page-header { margin-bottom: 16px; }
  .page-header h2 { font-size: 1.15rem; }
  .card-header { padding: 14px 14px 12px; flex-wrap: wrap; row-gap: 8px; }
  .card-body { padding: 14px; }
  .grid-2, .grid-3 { grid-template-columns: 1fr; gap: 14px; }
  .stats-grid { grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
  .operator-grid { grid-template-columns: 1fr 1fr; }
  .filter-bar { flex-direction: column; align-items: stretch; width: 100%; }
  .filter-bar .search-box,
  .card-header .filter-bar .search-box { max-width: 100%; }
  .card-header .filter-bar { margin: 0; width: 100%; }
  /* Tableaux : défilement horizontal dans leur conteneur plutôt que de
     pousser toute la page en largeur. */
  .table-wrapper { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .table-wrapper table { min-width: 560px; font-size: .8rem; }
  .table-wrapper th, .table-wrapper td { white-space: nowrap; }
}
@media (max-width: 400px) {
  .stats-grid { grid-template-columns: 1fr; }
  .page-content { padding: 12px 10px 90px; }
  .card-body { padding: 12px 10px; }
}

/* â”€â”€ Print (Receipt) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
@media print {
  .sidebar, .topbar, .no-print { display: none !important; }
  .main-content { margin-left: 0 !important; }
  .receipt { border: 1px solid #ccc; }
}

/* â”€â”€ Animations â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
@keyframes pulse  { 0%, 100% { opacity: 1; } 50% { opacity: .5; } }
@keyframes spin   { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

.fade-in { animation: fadeIn .4s ease; }
.pulse   { animation: pulse 2s infinite; }
.spin    { animation: spin .8s linear infinite; }

.loading-spinner {
  width: 20px; height: 20px;
  border: 2px solid rgba(255,255,255,.3);
  border-top-color: #fff;
  border-radius: 50%;
  animation: spin .7s linear infinite;
  display: inline-block;
}

/* â”€â”€ Auth Page (login) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.auth-page {
  min-height: 100vh;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #FF6200 0%, #CC4E00 35%, #1A6E35 70%, #009A44 100%);
  padding: 20px;
  position: relative; overflow: hidden;
}
.auth-page::before {
  content: '';
  position: absolute; inset: 0;
  background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Ccircle cx='30' cy='30' r='20'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
}
.auth-card {
  background: var(--white);
  border-radius: var(--radius-xl);
  width: 100%; max-width: 440px;
  padding: 36px;
  box-shadow: var(--shadow-lg);
  position: relative; z-index: 1;
  animation: fadeIn .5s ease;
}
.auth-logo { text-align: center; margin-bottom: 28px; }

.auth-logo-img {
  width: 130px; height: 130px; object-fit: contain;
  display: block; margin: 0 auto 6px;
  filter: drop-shadow(0 6px 20px rgba(255,98,0,.35));
}

.auth-logo-sub { font-size: .8rem; color: var(--gray-500); margin-top: 4px; }
.auth-tabs {
  display: flex; border-bottom: 2px solid var(--gray-200);
  margin-bottom: 24px;
}
.auth-tab {
  flex: 1; padding: 10px;
  text-align: center; font-size: .88rem; font-weight: 600;
  color: var(--gray-500); cursor: pointer;
  border-bottom: 2px solid transparent; margin-bottom: -2px;
  transition: var(--transition);
}
.auth-tab.active { color: var(--primary); border-color: var(--primary); }
.demo-access {
  margin-top: 24px; padding-top: 20px;
  border-top: 1px solid var(--gray-200);
}
.demo-title { text-align: center; font-size: .78rem; color: var(--gray-400); margin-bottom: 12px; }
.demo-btns { display: flex; gap: 8px; }
.demo-btn {
  flex: 1; padding: 9px 8px;
  border-radius: var(--radius);
  border: 1.5px solid var(--gray-200);
  background: var(--white);
  font-size: .75rem; font-weight: 700;
  cursor: pointer; transition: var(--transition);
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  color: var(--gray-700);
}
.demo-btn:hover { border-color: var(--primary); color: var(--primary); }
.demo-btn i { font-size: 1rem; }

/* ================================================================
   NOUVEAU FLUX TRANSFERT GUIDÉ
   ================================================================ */

/* â”€â”€ Balance Strip â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.balance-strip {
  background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
  border-radius: var(--radius-lg);
  padding: 18px 22px;
  display: flex; align-items: center; gap: 16px;
  color: #fff; margin-bottom: 24px;
  border: 1px solid rgba(255,98,0,.25);
  box-shadow: 0 4px 20px rgba(0,0,0,.2);
}
.bs-icon {
  width: 48px; height: 48px;
  background: rgba(255,98,0,.18);
  border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.3rem; color: var(--primary-light); flex-shrink: 0;
}
.bs-label { font-size: .7rem; opacity: .65; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 2px; }
.bs-amount { font-size: 1.5rem; font-weight: 800; letter-spacing: -.5px; }
.bs-sub { font-size: .72rem; opacity: .6; margin-top: 2px; }
.bs-recharge {
  margin-left: auto; flex-shrink: 0;
  background: rgba(255,98,0,.18); color: var(--primary-light);
  border: 1.5px solid rgba(255,98,0,.35);
  border-radius: var(--radius); padding: 9px 18px;
  font-size: .8rem; font-weight: 700; cursor: pointer;
  transition: var(--transition); white-space: nowrap;
}
.bs-recharge:hover { background: var(--primary); color: #fff; border-color: var(--primary); }

/* â”€â”€ Transfer Layout (wizard, full-width) ─────────────────────── */
.tf-layout {
  display: block;
  margin-top: 8px;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border-radius: var(--radius-lg);
  padding: 12px 12px;
}

/* ── Stepper — en-tête "page" : flèche retour + titre + sous-titre,
   aligné à gauche, fond blanc plein largeur. Remplace l'ancien badge
   centré (modèle de référence fourni par le client). Inséré normalement
   dans le padding de .tf-layout, pas de marges négatives. ───────── */
.tf-stepper-card {
  background: #fff;
  border: none;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  box-shadow: none;
  outline: none;
  margin: -12px -12px 0 -12px;
  padding: 14px 18px 44px;
}

/* Barre de progression fine (demande explicite du 27/08 : "un autre
   modèle complètement différent" des cercles reliés au trait). Largeur/
   texte mis à jour par syncWizardBar()/schedSyncStepper() (js/client.js) —
   plus aucune étape cliquable individuellement (seul le bouton retour
   permet de reculer, un cran à la fois), donc plus de wz-ind-N/wz-line-N
   dans le DOM. */
.tf-stepper-card { position: relative; }

.wz-progress-head { display: flex; align-items: center; gap: 8px; margin-bottom: 2px; }
.wz-progress-head:has(.wzc-back-hidden) { margin-bottom: 0; }

.wz-progress-label {
  font-size: .68rem; font-weight: 800; color: #4A4E6B;
  text-transform: uppercase; letter-spacing: .04em;
}

/* Modèle "segmenté" (demande explicite : "propose un autre modèle") —
   4 blocs séparés par de fins interstices plutôt qu'un trait continu ;
   le mécanisme JS (largeur en % sur .wz-progress-fill, voir
   syncWizardBar()/schedSyncStepper()) reste inchangé, les interstices
   sont posés en surcouche décorative (::after) par-dessus le
   remplissage. */
.wz-progress-track {
  position: relative;
  width: 100%; height: 7px; border-radius: 4px; overflow: hidden;
  background: #EEF0F4;
  margin-bottom: 16px;
}
.wz-progress-track::after {
  content: '';
  position: absolute; inset: 0; z-index: 1;
  background-image: repeating-linear-gradient(90deg,
    transparent 0, transparent calc(25% - 3px),
    var(--white, #fff) calc(25% - 3px), var(--white, #fff) 25%);
  pointer-events: none;
}
.wz-progress-fill {
  height: 100%; border-radius: 4px;
  background: linear-gradient(90deg, #2A3363, #0F0A2E);
  transition: width .35s cubic-bezier(.4,0,.2,1);
}

/* Modèle "points numérotés" propre au tunnel "Maintenant" (demande
   explicite) — remplace la barre ci-dessus pour #tf-order-now (voir
   #wz-dots, index.html) ; le tunnel "Plus tard" garde la barre
   segmentée (#sched-wz-progress-track/-fill) pour son nombre d'étapes
   variable (4 ou 5). États posés par syncWizardBar() (js/client.js). */
.wz-dots { display: flex; align-items: flex-start; justify-content: space-between; margin-top: 8px; margin-bottom: 16px; }
.wz-dot-step { display: flex; flex-direction: column; align-items: center; gap: 6px; flex: 1; min-width: 0; }
.wz-dot {
  width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .7rem; font-weight: 800; color: var(--gray-400);
  background: #EEF0F4; border: 1.5px solid transparent;
  transition: background .25s ease, border-color .25s ease, color .25s ease, box-shadow .25s ease;
}
.wz-dot.active {
  background: #0F0A2E; color: #fff;
  box-shadow: 0 0 0 4px rgba(15,10,46,.15);
}
.wz-dot.done { background: #fff; border-color: #0F0A2E; color: #0F0A2E; }
.wz-dot-line { display: none; }
.wz-dot-lbl {
  font-size: .58rem; font-weight: 700; color: var(--gray-400);
  text-align: center; line-height: 1.2;
  transition: color .25s ease;
}
.wz-dot.active + .wz-dot-lbl,
.wz-dot.done + .wz-dot-lbl { color: #0F0A2E; }

.wzc-shared-back {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; flex-shrink: 0;
  background: none; border: none;
  color: #0F0A2E; font-size: 1.1rem;
  cursor: pointer; font-family: inherit;
  transition: opacity .15s;
}
.wzc-shared-back:hover { opacity: .6; }
/* Rien à quitter depuis la 1re étape — masqué tant qu'elle est active.
   display (pas visibility) : le libellé qui justifiait de réserver
   l'espace a été supprimé (demande explicite : "rapproche les etapes du
   bouton"), donc l'en-tête peut s'effacer complètement à l'étape 1.
   Posé directement en JS (syncWizardBar()/schedSyncStepper()). */
.wzc-shared-back.wzc-back-hidden { display: none; }

/* Consigne de l'étape en cours — agrandie, gras (demande explicite du
   27/08, revenue sur "enlève le gras" : "je veux qu'ils soit en gras"),
   en casse de phrase normale plutôt qu'en majuscules ("respecte le
   principe d'une phrase" — une seule majuscule initiale, comme le texte
   source wzc.sub.* lui-même). Texte mis à jour par syncWizardBar()/
   schedSyncStepper() (js/client.js) à chaque changement d'étape. */
.wzc-active-sub {
  font-size: .98rem; font-weight: 800; color: #0F0A2E;
  text-align: left; letter-spacing: normal;
}

/* ── Slider horizontal des étapes ─────────────────────────────── */
/* Simple bloc de contenu, sans fond/border-radius propre : il montre le
   fond bleu marine natif de .tf-layout/#sched-section en transparence, y
   compris les vrais coins arrondis du haut de la carte (redevenus visibles
   tout seuls maintenant que .tf-stepper-card, juste au-dessus, est un
   badge inséré normalement et non plus un bandeau plein largeur). */
.tf-slider-wrap {
  overflow: hidden;
  margin-bottom: 10px;
  transition: height .38s cubic-bezier(.4, 0, .2, 1);
}
/* Bandeau marine "encoché" sous l'en-tête blanc, pour #tf-order-now
   (Maintenant) ET #sched-section (Plus tard) — même fond marine restant
   visible dans les deux tunnels tant que le fond blanc de #tf-order-now
   n'est pas encore déployé partout. Le chevauchement de -14px fait
   remonter ce bandeau SOUS le blanc (qui garde exprès un padding-bottom
   suffisant pour rester visible derrière) — les coins arrondis de CE
   bandeau découpent alors deux encoches qui révèlent le blanc en
   dessous, au lieu d'un arrondi invisible marine-sur-marine (le fond de
   .tf-layout est le même marine). Peint après le header dans le flux
   normal, donc par-dessus lui dans la zone de chevauchement.
   Rayon volontairement réduit (14px au lieu de --radius-lg/26px) : un
   arrondi plus large donnait l'impression d'une bordure épaisse autour
   de la zone marine. */
#tf-order-now .tf-slider-wrap,
#sched-section .tf-slider-wrap {
  margin: -14px -12px 10px -12px;
  border-radius: 14px 14px 0 0;
  /* Blanc plein (modèle de référence du 27/08) — remplace l'ancien
     bandeau marine : #tf-order-now/#sched-section sont maintenant blancs
     de bout en bout (voir plus bas), donc rien à "encocher" en dessous. */
  background: #fff;
}
/* Réduit la hauteur du bandeau blanc "Réseau / Sélectionnez votre
   opérateur" : padding-bottom aligné sur le nouveau rayon (14px) pour
   que l'encoche marine ci-dessus reste visible sans mordre sur le texte.
   Les deux tunnels (Maintenant/Plus tard) partagent le même réglage. */
#tf-order-now .tf-stepper-card,
#sched-section .tf-stepper-card { padding: 2px 18px 14px; }
.tf-slider-track {
  display: flex;
  width: 400%;
  transition: transform .42s cubic-bezier(.4, 0, .2, 1);
  will-change: transform;
  align-items: flex-start;
}
.tf-slide {
  width: 25%;
  padding: 10px 10px 16px;
  box-sizing: border-box;
}
/* Barre d'accent à gauche + badge icône rond (plutôt qu'un pavé plein
   orange) : c'est un simple titre de section, jamais cliquable — l'ancien
   rendu "bouton plein" prêtait à confusion avec les vrais CTA (Continuer,
   Payer maintenant...) de la même couleur. */
.tf-slide-hd {
  display: flex; align-items: center; gap: 10px;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-left: 3px solid var(--primary);
  border-radius: 12px;
  padding: 10px 14px;
  margin-bottom: 24px;
  font-size: .68rem; font-weight: 900; color: #fff; line-height: 1;
  text-transform: uppercase; letter-spacing: .5px;
}
.tf-slide-hd i {
  background: var(--primary);
  color: #fff; font-size: .62rem; line-height: 1;
  width: 22px; height: 22px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  box-shadow: 0 2px 8px rgba(255,98,0,.4);
}

/* Bouton Retour */
.tf-svc-row {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  margin-bottom: 10px;
}
.tf-svc-row .service-toggle { max-width: 260px; width: 100%; margin-bottom: 0; }
.tf-svc-row .svc-tab { padding: 12px 10px; gap: 3px; }
.tf-svc-row .svc-tab-title { font-size: .85rem; }
.tf-svc-row .svc-tab-sub { font-size: .64rem; }

/* Retour = action secondaire discrète (contour translucide) plutôt qu'un
   cercle vert plein — le vert n'existe nulle part ailleurs dans la charte
   et rivalisait visuellement avec le "Continuer" orange, la vraie action
   principale. Modèle plus simple/sobre, cohérent avec le reste. */
.wz-back-btn {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 32px; height: 32px;
  background: rgba(255,255,255,.06);
  border: 1.5px solid rgba(255,255,255,.18);
  border-radius: 50%; padding: 0;
  color: rgba(255,255,255,.75); font-size: .78rem;
  cursor: pointer; font-family: inherit;
  margin-bottom: 12px;
  transition: background .18s, border-color .18s, transform .15s;
}
.tf-svc-row .wz-back-btn,
.tf-dest-row .wz-back-btn { margin-bottom: 0; }
.wz-back-btn:hover {
  background: rgba(255,255,255,.12);
  border-color: rgba(255,255,255,.3);
  color: #fff;
  transform: translateX(-2px);
}
.wz-back-btn:active { transform: scale(.95); }

/* Bouton Continuer — même gabarit que .wz-back-btn, teinte opérateur,
   flèche vers la droite, posé de l'autre côté de la ligne. */
.wz-next-btn {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 32px; height: 32px;
  background: var(--op-clr, var(--primary));
  border: 1.5px solid var(--op-clr, var(--primary));
  border-radius: 50%; padding: 0;
  color: var(--op-clr-text, #fff); font-size: .78rem;
  cursor: pointer; font-family: inherit;
  box-shadow: 0 3px 12px rgba(255,98,0,.35);
  transition: background .18s, box-shadow .18s, transform .15s;
}
.tf-svc-row .wz-next-btn,
.tf-dest-row .wz-next-btn { margin-bottom: 0; }
.wz-next-btn:hover { box-shadow: 0 0 0 3px rgba(255,98,0,.25); transform: translateX(2px); }
.wz-next-btn:active { transform: scale(.95); }
.tf-pay-nav-row { display: flex; align-items: center; justify-content: flex-end; margin-bottom: 12px; }
.tf-pay-nav-row .wz-back-btn { margin-bottom: 0; }

/* Les slides sont toujours visibles — on neutralise l'accordéon */
.tf-slide.tf-step { background: transparent; border: none; border-radius: 0; box-shadow: none; margin: 0; overflow: visible; }
.tf-slide.tf-step.active,
.tf-slide.tf-step.complete,
.tf-slide.tf-step.locked   { opacity: 1; pointer-events: auto; border: none; box-shadow: none; }

/* â”€â”€ Navigation wizard ─────────────────────────────────────────── */
.tf-wz-nav {
  display: flex; gap: 10px; margin-bottom: 14px;
}
.tf-wz-back {
  padding: 12px 20px; border-radius: var(--radius); border: 1.5px solid var(--gray-200);
  background: var(--white); color: var(--gray-600);
  font-size: .85rem; font-weight: 700; cursor: pointer;
  display: flex; align-items: center; gap: 7px;
  transition: background .18s, border-color .18s;
}
.tf-wz-back:hover { background: var(--gray-100); }
.tf-wz-next {
  flex: 1; padding: 13px 20px; border-radius: var(--radius); border: none;
  background: var(--primary); color: #fff;
  font-size: .9rem; font-weight: 800; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 4px 16px rgba(255,98,0,.35);
  transition: background .18s, box-shadow .18s, transform .15s;
}
.tf-wz-next:hover { background: var(--primary-dark); transform: translateY(-1px); }
.tf-wz-next:active { transform: translateY(0); }

/* â”€â”€ Récapitulatif inline (étape 4) ──────────────────────────── */
.tf-inline-summary {
  background: rgba(255,98,0,.04); border: 1.5px solid rgba(255,98,0,.15);
  border-radius: var(--radius-lg); padding: 16px 18px; margin-bottom: 14px;
}
.tis-head {
  font-size: .82rem; font-weight: 800; color: var(--primary);
  margin-bottom: 12px; display: flex; align-items: center; gap: 7px;
}
.tis-grid { display: flex; flex-direction: column; gap: 0; }
.tis-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 8px 0; border-bottom: 1px solid rgba(255,98,0,.08);
  font-size: .82rem;
}
.tis-row:last-child { border-bottom: none; }
.tis-label { color: var(--gray-500); font-weight: 500; }
.tis-val { font-weight: 700; color: var(--gray-800); }
.tis-amount { color: var(--primary); font-size: .95rem; }
.tis-total {
  display: flex; justify-content: space-between; align-items: center;
  margin-top: 12px; padding-top: 12px; border-top: 2px solid rgba(255,98,0,.2);
  font-size: .82rem; font-weight: 700; color: var(--gray-700);
}
.tis-total-amt { font-size: 1.15rem; font-weight: 900; color: var(--primary); }

/* ── Step card : en-tête pilule-bulle ────────────────────────── */
.tf-step-head {
  padding: 11px 14px;
  display: flex; align-items: center; gap: 10px;
  cursor: default; transition: background .15s;
}
.tf-step.active   .tf-step-head { background: rgba(255,98,0,.03); }
.tf-step.complete .tf-step-head { background: rgba(34,197,94,.03); cursor: pointer; }

/* Pilule-bulle */
.tf-step-pill {
  display: inline-flex; align-items: center; gap: 8px;
  border-radius: 30px; padding: 5px 14px 5px 6px; flex-shrink: 0;
  background: #f0f0f0; border: 2px solid #e5e7eb;
  transition: all .25s;
}
.tf-sp-dot {
  width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: #ddd; transition: all .25s;
}
.tf-sp-num   { font-size: .8rem; font-weight: 900; color: #aaa; }
.tf-sp-check { display: none; font-size: .75rem; }
.tf-sp-lbl   { font-size: .78rem; font-weight: 800; color: #aaa; white-space: nowrap; }

/* Pilule active */
.tf-step.active .tf-step-pill {
  background: rgba(255,98,0,.07); border-color: var(--primary);
  box-shadow: 0 2px 10px rgba(255,98,0,.15);
}
.tf-step.active .tf-sp-dot {
  background: radial-gradient(circle at 38% 32%, #ffb36e 0%, #FF6200 60%, #c44800 100%);
  box-shadow: 0 3px 10px rgba(255,98,0,.4), inset 0 1px 3px rgba(255,200,100,.4);
}
.tf-step.active .tf-sp-num { color: #fff; }
.tf-step.active .tf-sp-lbl { color: var(--primary); }

/* Pilule complète */
.tf-step.complete .tf-step-pill {
  background: rgba(34,197,94,.07); border-color: #22c55e;
}
.tf-step.complete .tf-sp-dot {
  background: radial-gradient(circle at 38% 32%, #7eeda0 0%, #22c55e 60%, #148038 100%);
  box-shadow: 0 3px 8px rgba(34,197,94,.35);
}
.tf-step.complete .tf-sp-num   { display: none; }
.tf-step.complete .tf-sp-check { display: block; color: #fff; }
.tf-step.complete .tf-sp-lbl   { color: #16a34a; }

/* Pilule verrouillée */
.tf-step.locked .tf-step-pill { opacity: .5; }

/* Preview + flèche */
.tf-step-preview {
  flex: 1; font-size: .72rem; color: #bbb; font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tf-step.active   .tf-step-preview { color: var(--primary); font-weight: 600; }
.tf-step.complete .tf-step-preview { color: #16a34a; font-weight: 700; }
.tf-step-arrow { font-size: .7rem; color: #ddd; transition: transform .25s, color .2s; flex-shrink: 0; }
.tf-step.active   .tf-step-arrow { color: var(--primary); transform: rotate(90deg); }
.tf-step.complete .tf-step-arrow { color: #22c55e; }
.tf-step-body { padding: 18px 20px; border-top: 1px solid var(--gray-200); }

/* ── Operator Cards (New) ──────────────────────────────────────── */
.op-row { display: flex; justify-content: center; align-items: stretch; width: 100%; gap: 10px; margin-top: 4px; }

/* Carte = colonne pastel teintée par réseau (logo carré + pilule nom),
   inspirée d'un modèle de référence à cartes hautes arrondies. */
.op-card {
  position: relative; overflow: hidden;
  display: flex; flex-direction: column; align-items: center; justify-content: space-between;
  gap: 14px;
  cursor: pointer; flex: 1; padding: 16px 10px;
  border-radius: 22px; border: 1.5px solid transparent;
  transition: all .3s cubic-bezier(.34,1.46,.64,1);
}
/* Léger reflet en haut de carte, façon verre — touche "premium" discrète,
   sans changer les couleurs propres à chaque réseau. */
.op-card::before {
  content: ''; position: absolute; inset: 0 0 auto 0; height: 50%;
  background: linear-gradient(180deg, rgba(255,255,255,.08), transparent);
  pointer-events: none;
}
/* translateY/scale au survol réservés à la souris réelle : sur tactile, le
   :hover reste "collé" après le tap qui sélectionne la carte, ce qui donne
   l'impression que la carte choisie grossit toute seule et reste agrandie. */
@media (hover: hover) and (pointer: fine) {
  .op-card:hover { transform: translateY(-3px); }
  .op-card:hover .op-logo-sq { transform: scale(1.05); }
}

.op-card--orange { background: linear-gradient(165deg, rgba(255,130,40,.18), rgba(255,130,40,.04)); border-color: rgba(255,130,40,.3); }
/* Fond neutre "verre" (pas de teinte jaune pleine) : mélangé au fond très
   sombre de la carte, le jaune MTN vire au brun-olive terne plutôt que de
   rester lisible comme sa couleur de marque — l'identité MTN reste portée
   par le logo, la pastille du nom et la bordure/lueur jaune (.active
   plus bas), pas par un remplissage. */
.op-card--mtn    { background: linear-gradient(165deg, rgba(255,255,255,.07), rgba(255,255,255,.02)); border-color: rgba(255,204,0,.35); }
.op-card--moov   { background: linear-gradient(165deg, rgba(29,122,224,.18), rgba(29,122,224,.04)); border-color: rgba(29,122,224,.3); }

/* Logo carré (garde le fond de marque déjà présent dans les PNG) */
.op-logo-sq {
  width: 64px; height: 64px; border-radius: 14px;
  overflow: hidden; flex-shrink: 0; margin: 0 auto;
  border: 1px solid rgba(255,255,255,.12);
  box-shadow: 0 4px 14px rgba(0,0,0,.25), 0 0 0 1px rgba(255,255,255,.03) inset;
  transition: transform .3s cubic-bezier(.34,1.46,.64,1), box-shadow .3s ease;
}
.op-card.active .op-logo-sq { box-shadow: 0 6px 16px rgba(0,0,0,.35), 0 0 0 1px rgba(255,255,255,.08) inset; }
.op-logo-img { width: 100%; height: 100%; object-fit: cover; border-radius: 0; }
/* Le PNG Orange a une large marge blanche autour du logo (contrairement
   aux visuels MTN/Moov qui remplissent déjà tout le cadre) — on zoome
   uniquement celui-ci pour qu'il occupe la vignette au même titre que
   les autres réseaux. */
.op-card--orange .op-logo-img { transform: scale(1.7); }
.op-emoji-fb { font-size: 2.2rem; line-height: 1; }

/* Pilule nom */
.op-name-pill {
  background: #fff; color: #1a1a2e;
  font-size: .72rem; font-weight: 800; letter-spacing: .02em;
  padding: 8px 16px; border-radius: 999px;
  white-space: nowrap;
  box-shadow: 0 3px 10px rgba(0,0,0,.2);
  transition: color .2s;
}

/* Badge check */
.op-check {
  position: absolute; top: 10px; right: 10px;
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(255,255,255,.12);
  border: 1.5px solid rgba(255,255,255,.35);
  box-shadow: 0 2px 6px rgba(0,0,0,.2);
  color: transparent;
  z-index: 10;
  display: flex; align-items: center; justify-content: center;
  font-size: .62rem; transition: var(--transition);
}

/* États actifs — léger effet "carte soulevée" en plus de la lueur
   colorée déjà en place, pour une sélection plus nette. */
.op-card.active { transform: translateY(-2px); }
@media (hover: hover) and (pointer: fine) {
  .op-card.active:hover { transform: translateY(-4px); }
}
.op-card--orange.active { border-color: #FF6200; box-shadow: 0 8px 26px rgba(255,98,0,.35); }
.op-card--mtn.active    { border-color: #E6B800; box-shadow: 0 8px 26px rgba(230,184,0,.35); }
.op-card--moov.active   { border-color: #0066CC; box-shadow: 0 8px 26px rgba(0,102,204,.35); }
.op-card--orange.active .op-check { background: #FF6200; color: #fff; }
.op-card--mtn.active    .op-check { background: #E6B800; color: #fff; }
.op-card--moov.active   .op-check { background: #0066CC; color: #fff; }
.op-card--orange.active .op-name-pill { color: #FF6200; }
.op-card--mtn.active    .op-name-pill { color: #CA8A04; }
.op-card--moov.active   .op-name-pill { color: #0066CC; }

/* Cartes réseau plus compactes dans le tunnel de commande (étape 1) et
   la commande programmée : réduit la hauteur de cette étape pour éviter
   que le fond du .tf-layout ne s'agrandisse visiblement par rapport aux
   autres étapes (voir _tfSyncSlideHeight(), js/client.js). */
/* Descend le logo dans les cartes réseau de l'étape 1 "Transférer" sans
   agrandir la carte : on retire au gap logo/pilule ce qu'on ajoute en
   marge au-dessus du logo, la hauteur totale de la carte ne bouge pas. */
#step-op .op-card, #sched-step-op .op-card { gap: 4px; }
#step-op .op-logo-sq, #sched-step-op .op-logo-sq { margin-top: 10px; }

#tf-order-now .op-card, #sched-section .op-card { padding: 6px 8px; gap: 5px; }
#tf-order-now .op-logo-sq, #sched-section .op-logo-sq { width: 46px; height: 46px; border-radius: 12px; }
#tf-order-now .op-name-pill, #sched-section .op-name-pill { padding: 5px 12px; font-size: .66rem; }

/* Cartes "Chap Chap" (renderChapChap(), js/client.js) — même carte réseau
   (.op-card--orange/mtn/moov, couleur/fond/rayon inchangés) mais avec le
   numéro du destinataire et le type d'opération affichés directement
   dessus (pas seulement au survol, invisible au toucher sur téléphone). */
.ccp-card { justify-content: flex-start; gap: 6px; }
.ccp-type {
  font-size: .54rem; font-weight: 800; color: rgba(255,255,255,.6);
  text-transform: uppercase; letter-spacing: .04em;
}
.ccp-num {
  font-size: .7rem; font-weight: 700; color: #fff;
  font-variant-numeric: tabular-nums;
}

/* Section "Chap Chap" en version très compacte — bandeau/carte/cartes
   réduits, à la demande explicite (moins d'espace pris que le tunnel de
   commande juste au-dessus, qui lui garde sa taille normale). */
#chapchap-section { padding: 0 10px 10px; margin-top: -42px; }
#chapchap-section .tf-slide-hd { padding: 6px 10px; margin-bottom: 10px; font-size: .58rem; gap: 6px; }
/* Agrandi (demande explicite : "augmente la taille des sections") — sans
   revenir à la taille pleine .op-card d'origine, la version compacte
   d'origine (30px/.46rem/.58rem) restait lisible mais tassée. */
#chapchap-section .op-logo-sq { width: 38px; height: 38px; border-radius: 10px; }
#chapchap-section .ccp-type { font-size: .56rem; }
#chapchap-section .ccp-num { font-size: .72rem; }

/* Liste de lignes horizontales (demande explicite) à la place des cartes
   verticales côte à côte : .op-row empile les lignes, chaque .ccp-card
   redevient une rangée flex (logo à gauche, texte au centre via .ccp-info,
   montant à droite) au lieu de la colonne centrée héritée de .op-card. */
#chapchap-section .op-row { flex-direction: column; gap: 6px; }
#chapchap-section .ccp-card {
  flex-direction: row; align-items: center; justify-content: flex-start;
  width: 100%; padding: 11px 12px; gap: 12px; border-radius: 12px;
}
#chapchap-section .ccp-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
#chapchap-section .op-name-pill {
  flex-shrink: 0; font-size: .74rem; padding: 4px 9px;
  background: none; box-shadow: none; color: #dc2626;
}
/* Fond gris neutre pour chaque ligne, peu importe le réseau (demande
   explicite) — remplace les teintes orange/jaune/bleu par réseau
   héritées de .op-card--orange/mtn/moov, qui n'ont plus lieu d'être une
   fois cette section sans fond navy derrière. */
#chapchap-section .op-card--orange,
#chapchap-section .op-card--mtn,
#chapchap-section .op-card--moov {
  background: #F1F3F8; border-color: #E8ECF4;
}

/* Sans fond (demande explicite) — plus de carte navy ni blanche, le
   bloc devient transparent et se fond dans la page ; le libellé
   "Reprendre rapidement" passe en noir/gras pour rester lisible sans
   fond sombre derrière lui. Chaque ligne garde sa teinte réseau
   (.op-card--orange/mtn/moov) pour rester identifiable, texte recoloré
   en noir/gris pour la même raison. */
#chapchap-section {
  background: none; border: none; box-shadow: none;
}
#chapchap-section .tf-slide-hd {
  background: none; border: none;
  border-radius: 0; color: #000; font-size: .82rem;
}
#chapchap-section .ccp-type { color: #000 !important; }
#chapchap-section .ccp-num  { color: #000 !important; }
#chapchap-section .tf-slide-hd i {
  background: none; box-shadow: none; color: #000;
  width: 30px; height: 30px; font-size: 1rem;
}
/* Soulignement "trait curviligne" bleu marine sous « Reprendre rapidement »
   (demande explicite) — vaguelette SVG en fond, répétée sous le libellé. */
#chapchap-section .tf-slide-hd span { position: relative; }
#chapchap-section .tf-slide-hd span::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -8px; height: 7px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='7' viewBox='0 0 36 7'%3E%3Cpath d='M1 4 Q 6 0.5 10 4 T 19 4 T 28 4 T 36 4' fill='none' stroke='%230F0A2E' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;
  background-size: auto 7px;
}

/* Carrousel de cartes promo, juste au-dessus de #order-mode-section (voir
   index.html) — .promo-carousel-track glisse en transform:translateX() via
   _promoCarouselInit() (js/client.js), une carte = 100% de la largeur du
   wrap, alternées automatiquement. */
.promo-carousel-wrap {
  /* .promo-carousel-wrap est un enfant direct de .cs-section.active
     (display:flex, gap:20px, voir plus bas) — margin-top négatif pour
     réduire l'écart avec la grille d'actions juste au-dessus, même
     technique que .pgc-panel un peu plus bas dans ce fichier. */
  overflow: hidden; border-radius: 14px; margin-top: -14px;
}
.promo-carousel-track {
  display: flex;
  transition: transform .5s cubic-bezier(.4,0,.2,1);
}
.promo-carousel-track .promo-recruit {
  flex: 0 0 100%; min-width: 0; margin-top: 0;
}
.promo-carousel-dots {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  /* Négatif : réduit l'espace blanc visible autour des points, qui
     s'ajoute sinon au gap:20px de #cs-transfer.active (voir plus bas dans
     ce fichier) des deux côtés (carrousel au-dessus, "Je passe ma
     commande" en dessous) — même mécanisme que la jointure order-mode
     déjà annulée plus bas. */
  margin: -10px 0;
}
/* Modèle "segments" (demande explicite : "propose un autre modèle des
   points") — petits traits arrondis plutôt que des pastilles rondes, en
   bleu marine (au lieu de l'orange) : inactif = trait court estompé,
   actif = trait long plein, effet barre de progression. */
.promo-carousel-dot {
  width: 14px; height: 3px; border-radius: 2px;
  background: rgba(15,10,46,.22);
  transition: background .25s, width .25s;
}
.promo-carousel-dot.active {
  width: 28px; background: #0F0A2E;
}

/* Carte "devenir promoteur"/"bonus réseaux" — fond blanc, sans bordure
   (demande explicite), relief porté uniquement par l'ombre. Texte en noir
   et orange uniquement (aucun gris intermédiaire). */
.promo-recruit {
  cursor: pointer; text-align: center;
  border-radius: 14px;
  padding: 20px 18px 22px;
  background: #fff;
  box-shadow: 0 6px 14px -10px rgba(0,0,0,.2);
  /* Affiches réduites (demande explicite du 28/08) — min-height
     partagé par les 3 cartes du carrousel, align-items:stretch
     (.promo-carousel-track) synchronise leur hauteur sur la plus
     grande des trois. */
  min-height: 150px;
}
.promo-recruit-eyebrow {
  display: flex; align-items: center; justify-content: center; gap: 5px;
  font-size: .64rem; font-weight: 800; letter-spacing: .08em;
  color: var(--primary-dark); margin-bottom: 4px;
}
.promo-recruit-dot {
  width: 5px; height: 5px; border-radius: 50%; background: var(--primary);
  box-shadow: 0 0 5px 1px rgba(255,98,0,.7);
}
.promo-recruit-title {
  font-size: .94rem; font-weight: 900; color: #000000; text-transform: uppercase;
  line-height: 1.25; margin-bottom: 4px;
}
.promo-recruit-title em {
  font-style: italic; color: var(--primary-dark);
}
.promo-recruit-sub {
  font-size: .74rem; line-height: 1.35; color: #000000;
  max-width: 260px; margin: 0 auto 8px;
}
.promo-recruit-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border: none; border-radius: 99px; padding: 7px 18px;
  background: linear-gradient(135deg, var(--primary-light), var(--primary));
  color: #fff; font-size: .62rem; font-weight: 800; letter-spacing: .03em;
  cursor: pointer; box-shadow: 0 5px 11px -6px rgba(255,98,0,.6);
}
.promo-recruit-eyebrow-ico { font-size: .72rem; }

/* Cartes "bonus"/"assistance" — nouveau modèle (demande explicite du
   28/08 : "propose un autre modèle") : texte ancré en bas à gauche
   façon légende, accroche en badge pilule plutôt qu'en ligne centrée,
   au lieu de l'ancien bloc centré verticalement. */
.promo-recruit--photo {
  display: flex; flex-direction: column; justify-content: flex-end;
  text-align: left; align-items: flex-start;
  padding: 16px 16px 18px;
  background-size: cover; background-position: center 15%;
}
.promo-recruit--photo .promo-recruit-eyebrow {
  display: inline-flex; justify-content: flex-start;
  background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.3);
  border-radius: 99px; padding: 3px 10px; margin-bottom: 8px;
  color: #fff;
}
.promo-recruit--photo .promo-recruit-title,
.promo-recruit--photo .promo-recruit-sub { color: #fff; }
.promo-recruit--photo .promo-recruit-title em { color: var(--primary-light); }
.promo-recruit--photo .promo-recruit-sub { margin: 0 0 10px; max-width: 100%; }
.promo-recruit--photo .promo-bonus-logos,
.promo-recruit--photo .promo-recruit-btn { align-self: flex-start; }

/* Carte "pharmacies de garde" — bandeaux HTML façon affiche (titre en
   deux rubans, ligne repère, bandeau "offert par") posés sur la photo
   du pharmacien (img/garde garde.png), plutôt que de dépendre du texte
   déjà incrusté dans l'image. .promo-recruit.promo-pharma-... :
   double-classe pour passer devant .promo-recruit de base (padding,
   text-align) sans dépendre de l'ordre des règles dans ce fichier. */
.promo-recruit.promo-recruit--pharma {
  position: relative; overflow: hidden; padding: 0; text-align: left;
  display: flex; flex-direction: column;
  /* Affiche réduite (demande explicite) — plus besoin de la hauteur
     généreuse qui garantissait de voir un visage en entier : img/pati.jfif
     est un plan sans visage (blouse, presse-papier, plaquettes de
     médicaments), pas de cadrage vertical délicat à préserver ici. */
  min-height: 130px;
}
.promo-pharma-bg {
  position: absolute; inset: 0;
  background-image: url('../img/pati.jfif');
  background-size: cover; background-position: center;
}
.promo-pharma-bg::after {
  /* Fondu resserré tout contre le bord gauche — le visage du pharmacien
     est cadré à droite (background-position ci-dessus), les rubans/la
     pastille repère ont chacun déjà leur propre fond opaque (voir
     .promo-pharma-title-l1/l2, .promo-pharma-loc plus bas). */
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, #fff 0%, rgba(255,255,255,.5) 10%, rgba(255,255,255,0) 22%);
}
.promo-pharma-title {
  position: relative; z-index: 1;
  display: flex; flex-direction: column; align-items: flex-start;
  margin: 10px 0 0 10px;
}
.promo-pharma-title-l1, .promo-pharma-title-l2 {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 1.05rem; font-weight: 900; letter-spacing: .01em;
  color: #fff; text-transform: uppercase; line-height: 1.3;
  padding: 4px 14px 4px 10px;
  clip-path: polygon(0 0, 100% 0, 92% 100%, 0% 100%);
}
.promo-pharma-title-l1 { background: #0F0A2E; }
.promo-pharma-title-l2 { background: linear-gradient(135deg,#22B366,#0E7C3F); margin-top: 3px; }
.promo-pharma-badge {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; border-radius: 50%; background: #fff;
  color: #0E7C3F; font-size: .76rem; font-weight: 900; flex: none;
}
.promo-pharma-loc {
  position: relative; z-index: 1;
  display: flex; align-items: flex-start; gap: 6px;
  margin: 10px 10px 10px 10px; max-width: 62%;
  background: #EAF9EF; border: 1px solid #B8E8C4; border-radius: 10px;
  padding: 7px 10px;
  font-size: .68rem; line-height: 1.32; font-weight: 700; color: #0F0A2E;
}
.promo-pharma-loc-ico { font-size: .78rem; flex: none; margin-top: 1px; }
.promo-pharma-loc-em { color: #0E7C3F; }
/* Logos réseau (carte "bonus mardi/vendredi") — agrandis, sans bordure. */
.promo-bonus-logos {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin-bottom: 8px;
}
.promo-bonus-logo {
  width: 38px; height: 38px; border-radius: 11px; overflow: hidden; flex-shrink: 0;
  background: #fff; display: flex; align-items: center; justify-content: center;
  box-shadow: 0 3px 8px rgba(0,0,0,.15);
}
.promo-bonus-logo img { width: 100%; height: 100%; object-fit: cover; }

/* "Me recharger" — en-tête (icône + titre + sous-titre) au-dessus des
   deux cartes Maintenant/Plus tard, modèle adapté d'une référence
   fournie par l'utilisateur (25/08), recoloré bleu marine/blanc pour
   rester cohérent avec le reste du site (au lieu du violet d'origine
   de la référence). */
.wz-order-head {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 4px;
  /* Le parent flex (.cs-section.active, gap:20px) impose déjà 20px avec
     #order-mode-section juste en dessous — réduit ici par une marge
     négative (demande explicite du 25/08 : "diminue la taille de
     l'espace blanc"). */
  margin-bottom: -12px;
  /* Espace avec le carrousel promo juste au-dessus, augmenté (demande
     explicite du 25/08 : "augmente la taille de l'espace blanc"). */
  margin-top: 16px;
}
.wz-order-head-ico {
  width: 52px; height: 52px; border-radius: 50%;
  background: rgba(15,10,46,.07); color: #0F0A2E;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.15rem; margin-bottom: 6px;
}
.wz-order-head-title { font-size: 1rem; font-weight: 900; color: #16121F; letter-spacing: .01em; }
.wz-order-head-sub { font-size: .72rem; color: var(--gray-500); }

/* #order-mode-section n'est plus qu'un conteneur fonctionnel (affichage
   Maintenant/Plus tard, voir setOrderMode()) — les deux cartes portent
   maintenant elles-mêmes tout le style visuel, comme sur la référence,
   plutôt qu'un cadre englobant blanc/sombre. */
#order-mode-section {
  background: none; border: none; padding: 0; margin: 0; box-shadow: none;
}
.wz-mode-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 0 10px; }
.wz-mode-card {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  background: #fff; border: 1.5px solid var(--gray-200); border-radius: 16px;
  padding: 10px 12px; cursor: pointer; font-family: var(--font); text-align: center;
  transition: background .2s, border-color .2s;
}
.wz-mode-card.active { background: linear-gradient(135deg, #1B234F, #0F0A2E); border-color: #0F0A2E; }
.wz-mode-card-ico {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  background: rgba(15,10,46,.07); color: #0F0A2E;
  display: flex; align-items: center; justify-content: center; font-size: .8rem;
  transition: background .2s, color .2s;
}
.wz-mode-card.active .wz-mode-card-ico { background: rgba(255,255,255,.15); color: #fff; }
.wz-mode-card-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 1px; }
.wz-mode-card-title { font-size: .74rem; font-weight: 800; color: #16121F; }
.wz-mode-card-sub { font-size: .58rem; color: var(--gray-500); }
.wz-mode-card.active .wz-mode-card-title,
.wz-mode-card.active .wz-mode-card-sub { color: #fff; }
.wz-mode-card.active .wz-mode-card-sub { opacity: .75; }
.wz-mode-card-chev { font-size: .56rem; color: var(--gray-400); flex-shrink: 0; }
.wz-mode-card.active .wz-mode-card-chev { color: rgba(255,255,255,.6); }

/* "Passez votre commande" (#tf-order-now) et "Commande automatique"
   (#sched-section) — cartes autonomes (#order-mode-section ne portant
   plus de style visuel, plus rien à raccorder ici), teintes d'origine. */
#tf-order-now,
#sched-section {
  padding: 12px 12px 10px;
  /* Un peu d'air entre les cartes Maintenant/Plus tard et le tunnel en
     dessous (demande explicite : "plus espacé" — le collé total d'avant
     paraissait trop serré), réduit depuis (demande explicite du 27/08 :
     "trop d'espace blanc" une fois le stepper numéroté en place). */
  margin-top: 4px;
  /* Découpe tout enfant (notamment .tf-stepper-card, flush contre ces
     bords) exactement sur le rayon arrondi de CETTE carte — sans ça, deux
     coins arrondis superposés (celui de la carte, celui du badge blanc)
     peuvent laisser un liseré d'1px de la couleur de fond entre les deux
     (anti-aliasing), perceptible comme une fine bordure marine résiduelle
     dans le coin. */
  overflow: hidden;
}
/* #sched-section a désormais un bandeau d'intro en premier enfant
   (.tf-order-intro) — moins de padding en haut que #tf-order-now pour
   compenser (demande explicite du 27/08 : "diminue l'espace blanc du
   haut"), le bandeau porte déjà son propre espacement. */
#sched-section { padding-top: 4px; }

/* #order-mode-section (bascule Maintenant/Plus tard) + #tf-order-now
   (Maintenant) + #sched-section (Plus tard) : fond blanc/écritures
   noires sur toute la zone (demande explicite : "crée une section
   blanche uniquement pour le tunnel maintenant et plus tard") — sans
   ça, la bascule restait sur le fond marine sombre par défaut de
   .tf-layout (visible juste au-dessus des deux tunnels, déjà blancs
   depuis le 27/08) et créait un bandeau sombre entre le carrousel promo
   et les tunnels. Scopé pour ne pas toucher .tf-layout/.wzc-.../
   .op-card ailleurs (Chap Chap notamment — jamais demandé là). */
#order-mode-section,
#tf-order-now,
#sched-section {
  background: #fff;
  border: none;
  box-shadow: none;
}
/* "Choisissez votre réseau" : fond sombre remis tel quel (demande
   explicite du 25/08 : "remets la couleur précédente" / "fais
   pareil"). */
#tf-order-now .tf-slide-hd {
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border-color: rgba(255,255,255,.08); color: #fff;
}
/* MTN : léger dégradé jaune de marque (comme Orange/Moov ont chacun le
   leur) au lieu du blanc translucide devenu invisible sur fond blanc
   (demande explicite du 25/08 : "remets sa couleur précédente"). */
#tf-order-now .op-card--mtn { background: linear-gradient(165deg, rgba(255,204,0,.16), rgba(255,204,0,.03)); }
#tf-order-now .op-card:not(.active) .op-check { background: rgba(15,10,46,.08); }
#tf-order-now .tf-slide-hd,
#sched-section .tf-slide-hd { padding: 7px 11px; margin-bottom: 34px; font-size: .6rem; gap: 6px; }
/* Étape paiement uniquement : rapproche la grille des moyens de paiement
   du bandeau titre juste au-dessus (le grand espacement générique
   ci-dessus était pensé pour les autres étapes, pas celle-ci). */
#step-pay > .tf-slide-hd { margin-bottom: 10px; }
#tf-order-now .tf-slide-hd i,
#sched-section .tf-slide-hd i { font-size: .68rem; }
#tf-order-now .op-row,
#sched-section .op-row { gap: 8px; }
#tf-order-now .op-logo-sq,
#sched-section .op-logo-sq { width: 44px; height: 44px; }
#tf-order-now .op-name-pill,
#sched-section .op-name-pill { font-size: .68rem; padding: 5px 12px; }
#tf-order-now .op-check,
#sched-section .op-check { top: 16px; right: 16px; }

/* Réduction supplémentaire, sur les DEUX tunnels (#step-op ET
   #sched-step-op) — la zone marine paraissait encore trop haute avec la
   taille de carte "normale" (gros logos), ce qui laissait un grand vide
   sous les cartes une fois la hauteur synchronisée sur ce contenu (voir
   _tfSyncSlideHeight()/_schedSyncSlideHeight(), js/client.js).
   VOLONTAIREMENT placé ici, après TOUTES les règles #tf-order-now/
   #sched-section ci-dessus qui ciblent aussi .op-card/.op-logo-sq/
   .op-name-pill avec la même spécificité (un ID + une classe) : à
   spécificité égale, c'est la règle la PLUS BASSE dans le fichier qui
   l'emporte — un bug réel corrigé ici (cette réduction était placée plus
   haut avant, et se faisait donc silencieusement écraser par les règles
   génériques #tf-order-now/#sched-section qui la suivaient). */
#step-op .op-card, #sched-step-op .op-card { padding: 10px 8px; gap: 6px; }
#step-op .op-logo-sq, #sched-step-op .op-logo-sq { width: 44px; height: 44px; margin-top: 10px; }
#step-op .op-name-pill, #sched-step-op .op-name-pill { padding: 5px 12px; font-size: .64rem; }

/* Cartes réseau pastel par opérateur (modèle de référence fourni par
   l'utilisateur le 27/08) — remplace les teintes très translucides pensées
   pour le fond marine (.op-card--orange/mtn/moov ci-dessus, quasi
   invisibles sur blanc) par un pastel plein/lisible, bordure assortie plus
   soutenue. VOLONTAIREMENT après TOUTES les règles .op-card--orange/mtn/
   moov (même logique de spécificité égale/ordre de source que le
   commentaire juste au-dessus). */
#tf-order-now .op-card--orange, #sched-section .op-card--orange { background: #FFF3EA; border-color: #FFD9BA; }
#tf-order-now .op-card--mtn,    #sched-section .op-card--mtn    { background: #FFFBE0; border-color: #FFEDA3; }
#tf-order-now .op-card--moov,   #sched-section .op-card--moov   { background: #EAF2FE; border-color: #BFDBFE; }
/* box-shadow:none annule le reflet coloré hérité de .op-card--*.active
   (demande explicite : "annule le reflèt de la couleurs") — halo flou
   autour de la carte, visible sur le fond clair de ce tunnel. */
#tf-order-now .op-card--orange.active, #sched-section .op-card--orange.active { border-color: #FF6200; box-shadow: none; }
#tf-order-now .op-card--mtn.active,    #sched-section .op-card--mtn.active    { border-color: #E6B800; box-shadow: none; }
#tf-order-now .op-card--moov.active,   #sched-section .op-card--moov.active   { border-color: #0066CC; box-shadow: none; }
/* Reflet "verre" invisible de toute façon sur pastel clair — retiré
   proprement. */
#tf-order-now .op-card::before, #sched-section .op-card::before { display: none; }
/* Pastille de nom : blanche pleine, comme dans le modèle de référence —
   ressort bien sur le fond pastel de la carte (contrairement à un fond
   blanc uni de carte, où elle deviendrait redondante). Couleur (grise par
   défaut, teinte de marque une fois .active) inchangée, héritée des règles
   .op-name-pill/.op-card--*.active .op-name-pill existantes. */
/* Coche : invisible tant que la carte n'est pas sélectionnée (aucun rond
   visible sur les cartes inactives dans le modèle de référence), apparaît
   en fondu à la sélection — même transition que .op-check déjà en place. */
#tf-order-now .op-check, #sched-section .op-check { opacity: 0; }
#tf-order-now .op-card.active .op-check, #sched-section .op-card.active .op-check { opacity: 1; }

/* Section "Commande automatique" (client, index.html #sched-section) —
   même identité visuelle ET même taille que "Passez votre commande" du
   tunnel principal : chaque slide porte désormais AUSSI la classe .tf-slide
   (en plus de .sched-slide, qui ne fixe que la géométrie 25%/padding,
   identique) pour hériter de toutes les surcharges "fond sombre" déjà
   écrites pour le tunnel principal (.recipient-wrap/.amount-custom-wrap/
   .amount-tile/.svc-tab/.forfait-cats .fcat-btn — voir plus bas dans ce
   fichier) plutôt que de les dupliquer ici. Seule exception : #sched-date/
   #sched-time (voir plus bas) n'ont pas d'icône en overlay contrairement
   aux champs du tunnel principal, donc pas le padding-left 38px que
   `.tf-slide .form-control` suppose. */
/* 5 slides désormais (Réseau/Type/Date/Numéro/Paiement) — #sched-slider-track
   doit donc faire 500% (5 × 100% de la largeur visible) et non les 400%
   génériques de .tf-slider-track (qui reste, lui, à 4 slides pour le
   tunnel principal) ; chaque .sched-slide occupe 1/5e de ce track, soit
   20%, pas 25%. Sans cette correction, flex-shrink réduisait toutes les
   slides pour les faire tenir dans un track resté à 400%, laissant la
   slide suivante déborder visiblement dans le cadre. */
#sched-slider-track { width: 500%; }
.sched-slide { width: 20%; padding: 14px 14px 28px; box-sizing: border-box; flex-shrink: 0; }
.sched-field { margin-top: 14px; }
.sched-label {
  display: flex; align-items: center; gap: 6px;
  font-size: .68rem; font-weight: 700; color: var(--gray-500);
  text-transform: uppercase; letter-spacing: .03em;
  margin-bottom: 6px;
}
.sched-row2 { display: flex; gap: 10px; }
.sched-row2 .sched-field { flex: 1; margin-top: 14px; }
/* Fond blanc/écritures noires (demande explicite du 27/08), même raison
   que .sched-date-tile ci-dessous. */
.sched-hint {
  display: flex; align-items: flex-start; gap: 6px;
  background: var(--gray-100); border: 1px solid var(--gray-200);
  border-radius: 10px; padding: 9px 11px; margin-top: 14px;
  font-size: .64rem; font-weight: 500; color: #0a1330;
  line-height: 1.5;
}
.sched-hint i { color: var(--primary); font-size: .7rem; margin-top: 1px; flex-shrink: 0; }
#sched-section .tf-validate-btn { margin-top: 16px; }
#sched-date, #sched-time { padding: 9px 14px !important; }

/* Étape "Date & heure" — raccourcis rapides (même esprit que
   .amount-tiles, mais pilules rectangulaires plutôt que ronds : le
   libellé ("Ce soir 20h") est trop long pour un cercle) + un bouton
   "Autre date" qui révèle les champs date/heure existants. Voir
   schedPickQuickDate()/schedToggleCustomDate() (js/client.js). */
.sched-date-tiles { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
/* Fond blanc/écritures noires (demande explicite du 27/08) — remplace le
   blanc translucide pensé pour l'ancien fond marine du tunnel "Plus
   tard", devenu invisible depuis son passage au blanc. */
.sched-date-tile {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  border: 1.5px solid var(--gray-200); border-radius: 14px;
  background: #fff; color: #0a1330;
  padding: 10px 6px; cursor: pointer; font-family: inherit;
  transition: all .2s ease;
}
.sched-date-tile:hover { border-color: color-mix(in srgb, var(--op-clr, var(--primary)) 55%, transparent); transform: translateY(-2px); }
.sched-date-tile .sdt-label { font-size: .64rem; font-weight: 800; }
.sched-date-tile .sdt-sub { font-size: .5rem; font-weight: 600; color: var(--gray-500); }
.sched-date-tile.selected {
  background: linear-gradient(150deg, color-mix(in srgb, var(--op-clr, var(--primary)) 75%, white 25%), var(--op-clr, var(--primary)));
  border-color: transparent; color: var(--op-clr-text, #fff);
  box-shadow: 0 5px 16px color-mix(in srgb, var(--op-clr, var(--primary)) 40%, transparent);
}
.sched-date-tile.selected .sdt-sub { color: var(--op-clr-text, #fff); opacity: .8; }

.sched-date-custom-toggle {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; margin-top: 10px;
  border: 1.5px dashed var(--gray-200); border-radius: 12px;
  background: #fff; color: #0a1330;
  padding: 10px 14px; cursor: pointer; font-family: inherit;
  font-size: .64rem; font-weight: 700;
  transition: all .2s ease;
}
.sched-date-custom-toggle:hover { border-color: var(--op-clr, var(--primary)); color: #fff; }
.sched-date-custom-toggle i { color: var(--op-clr, var(--primary)); font-size: .72rem; }
#sched-date-custom-fields { margin-top: 12px; }

/* â”€â”€ Service Toggle â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
/* Deux cartes (Crédit/Transfert direct, Forfait/Internet-appels-SMS) —
   même traitement que .fcat-btn : inactif en gris neutre,
   actif coloré à la teinte de l'opérateur (--op-clr/--op-clr-text). */
.service-toggle {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
  margin-bottom: 10px;
}
.svc-tab {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
  border: none; border-radius: 14px;
  padding: 12px 10px;
  cursor: pointer;
  background: var(--gray-100); color: var(--gray-800);
  transition: var(--transition);
}
.svc-tab-title { font-size: .8rem; font-weight: 800; }
.svc-tab-sub { font-size: .62rem; font-weight: 600; color: var(--gray-500); text-align: center; line-height: 1.3; }
.svc-tab.active { background: var(--op-clr, var(--primary)); color: var(--op-clr-text, #fff); }
.svc-tab.active .svc-tab-sub { color: var(--op-clr-text, #fff); opacity: .7; }

/* â”€â”€ Amount Tiles â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.amount-tiles {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px;
  margin-bottom: 8px;
}
.amount-tile {
  border: 1.5px solid var(--gray-200);
  border-radius: 10px;
  padding: 7px 5px;
  cursor: pointer; text-align: center;
  transition: var(--transition); background: var(--white);
}
.amount-tile:hover { border-color: var(--primary); transform: translateY(-1px); }
.amount-tile.selected { border-color: var(--primary); background: rgba(255,98,0,.06); }
.amount-tile .tile-val { font-size: .74rem; font-weight: 800; color: var(--gray-800); }
.amount-tile.selected .tile-val { color: var(--primary); }

/* Carte "montant libre" — modèle sobre : bordure fine arrondie, aucun
   libellé séparé (le placeholder du champ fait office d'instruction),
   suffixe FCFA à droite. */
.amount-custom-wrap--plain {
  display: flex; align-items: center; gap: 8px;
  width: 100%; border-radius: 9px;
  background: transparent; border: 1.5px solid var(--gray-200);
  padding: 7px 12px 7px 4px;
  transition: var(--transition);
}
.amount-custom-wrap--plain:focus-within { border-color: var(--primary); }
.amount-custom-wrap--plain .form-control {
  flex: 1; min-width: 0;
  background: transparent !important; border: none !important; box-shadow: none !important;
  font-size: .82rem; font-weight: 600; line-height: 1;
  padding: 0; text-align: left;
  -moz-appearance: textfield;
}
/* Flèches +/- natives du champ number — masquées : rien n'empêche de
   taper un chiffre au clavier, seul le petit stepper visuel disparaît. */
.amount-custom-wrap--plain .form-control::-webkit-outer-spin-button,
.amount-custom-wrap--plain .form-control::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.amount-custom-wrap--plain .amount-custom-suffix {
  font-size: .68rem; font-weight: 700; color: var(--gray-500);
  letter-spacing: .04em;
}

/* Retour/Continuer sous le champ montant (demande explicite) — ligne
   horizontale, bouton retour discret (contour) + continuer plein
   (couleur opérateur, --op-clr posée par tfSelectOp()). */
.tf-wz-nav-row { display: flex; gap: 10px; margin-top: 16px; }
.tf-wz-back-btn2, .tf-wz-next-btn2 {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 7px;
  border-radius: 12px; padding: 12px; font-size: .82rem; font-weight: 800;
  font-family: var(--font); cursor: pointer; transition: var(--transition);
}
.tf-wz-back-btn2 {
  background: #fff; border: 1.5px solid var(--gray-200); color: var(--gray-700, #374151);
}
.tf-wz-back-btn2:hover { border-color: var(--gray-300); }
/* Bouton "Continuer" en bleu marine plein, identique quel que soit le
   réseau/moyen de paiement sélectionné (demande du 2026-09-03 : "en bleu
   marine et sans reflet de couleur") — ne suit plus --op-clr, aucun
   dégradé ni ombre colorée. */
.tf-wz-next-btn2 {
  background: #0F0A2E; border: none; color: #fff;
  box-shadow: none;
}
/* Grisé tant qu'aucun montant/forfait n'est choisi (demande explicite :
   "tant que le client ne sélectionne pas un montant le bouton continuer
   doit être grisé") — posé/retiré par _tfSetNextBtnEnabled()
   (js/client.js), en même temps que l'attribut disabled natif. */
.tf-wz-next-btn2:disabled {
  background: var(--gray-200, #E5E7EF); color: var(--gray-400, #9AA2B4);
  box-shadow: none; cursor: not-allowed;
}

/* â”€â”€ Forfait Tabs â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
/* Catégories en interrupteur à glissière : piste sombre discrète au repos,
   le segment sélectionné devient un bloc plein à la teinte opérateur
   (--op-clr/--op-clr-text, posées sur .tf-layout par tfSelectOp()). */
.forfait-cats {
  display: flex; gap: 3px; padding: 4px;
  width: fit-content; max-width: 100%; margin: 0 auto 16px;
  overflow-x: auto; scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  scroll-behavior: smooth;
  overscroll-behavior-x: contain;
  touch-action: pan-x;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 20px;
}
.forfait-cats::-webkit-scrollbar { display: none; }
.fcat-btn {
  flex: 0 0 auto;
  display: flex; align-items: center; justify-content: center; gap: 7px;
  border: none; border-radius: 16px;
  padding: 11px 8px;
  background: transparent;
  color: rgba(255,255,255,.5);
  font-family: inherit; font-weight: 700; font-size: .72rem;
  cursor: pointer;
  transition: var(--transition);
}
.fcat-btn i { font-size: .78rem; }
.fcat-btn.active {
  background: linear-gradient(135deg,
    color-mix(in srgb, var(--op-clr, var(--primary)) 100%, white 8%),
    var(--op-clr, var(--primary)));
  color: var(--op-clr-text, #fff);
  box-shadow: 0 8px 18px color-mix(in srgb, var(--op-clr, var(--primary)) 40%, transparent);
}
@media (prefers-reduced-motion: reduce) {
  .fcat-btn { transition: none; }
}

/* â”€â”€ Forfait Cards â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.forfait-grid {
  display: flex; flex-direction: column; gap: 12px;
}
/* Annonce de destination (International) — une seule fois par pays,
   au-dessus de ses paliers de prix, plutôt que de répéter "Pass X" sur
   chaque carte (voir tfRenderForfaits). */
/* International (demande explicite : "le pays s'affiche et quand le
   client clique que les offres sortent") — chaque destination est un
   accordéon : badge pays cliquable, paliers de prix repliés dessous
   jusqu'au tap (voir tfToggleIntlGroup(), tfRenderForfaits() et
   l'équivalent schedRenderForfaits()). */
.intl-group { margin-bottom: 12px; }
.intl-group:last-child { margin-bottom: 0; }
.forfait-group-badge {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; border: 1.5px solid var(--gray-200, #E5E7EF); font-family: var(--font); cursor: pointer;
  padding: 12px 16px; border-radius: 12px;
  font-size: .78rem; font-weight: 800;
  background: #fff; color: #16121F;
}
.intl-group-chev { font-size: .68rem; color: var(--gray-500); transition: transform .2s ease; }
.intl-group.open .intl-group-chev { transform: rotate(180deg); }
.intl-group-body {
  display: none; flex-direction: column; gap: 12px;
  margin-top: 10px;
}
.intl-group.open .intl-group-body { display: flex; }

/* Sous-groupes d'une catégorie (ex. Pass Mix 1-3j/5-7j/30j + International
   au sein d'"Appels") — onglets soulignés : texte simple sur le fond de
   l'appli, un trait plein à la teinte opérateur glisse sous l'onglet actif
   plutôt qu'un bloc de couleur. */
.forfait-subcats {
  display: flex; gap: 8px; padding: 0 2px 10px;
  /* Centré quand tout tient (fit-content + margin auto, même technique que
     .forfait-cats plus haut) plutôt que via justify-content:center/safe
     center sur le conteneur défilant : cette dernière approche recule mal
     sur certains WebView Android (voir plus bas), alors que fit-content +
     margin:auto centre l'élément lui-même sans jamais gêner son propre
     défilement une fois qu'il déborde (il passe alors simplement à
     max-width:100%, aligné à gauche par défaut, sans configuration
     spéciale). */
  width: fit-content; max-width: 100%; margin: 0 auto 12px;
  overflow-x: auto;
  scrollbar-width: none;
  /* Défilement à l'inertie natif (WebView Android/iOS) — sans ça, le
     défilement horizontal est saccadé au doigt au lieu d'être fluide. */
  -webkit-overflow-scrolling: touch;
  scroll-behavior: smooth;
  overscroll-behavior-x: contain;
  /* touch-action: indique tout de suite au navigateur qu'un geste ici est
     un défilement horizontal (pas un scroll vertical de page à laisser
     remonter) — sans ça, certains WebView Android hésitent/retardent la
     décision au premier mouvement du doigt, ce qui se ressent comme un
     défilement qui "n'accroche pas" ou reste bloqué. */
  touch-action: pan-x;
}
.forfait-subcats::-webkit-scrollbar { display: none; }
/* Les onglets entrent en fondu au tap d'une catégorie (au lieu d'un
   simple affichage instantané) — classe rejouée par tfRenderSubCats() à
   chaque tap, y compris d'une catégorie à une autre. */
.forfait-subcats.fsub-reveal .fsub-tab {
  animation: fsub-tab-in .3s cubic-bezier(.22,1,.36,1) backwards;
}
.forfait-subcats.fsub-reveal .fsub-tab:nth-child(1) { animation-delay: 0s; }
.forfait-subcats.fsub-reveal .fsub-tab:nth-child(2) { animation-delay: .04s; }
.forfait-subcats.fsub-reveal .fsub-tab:nth-child(3) { animation-delay: .08s; }
.forfait-subcats.fsub-reveal .fsub-tab:nth-child(4) { animation-delay: .12s; }
.forfait-subcats.fsub-reveal .fsub-tab:nth-child(n+5) { animation-delay: .16s; }
@keyframes fsub-tab-in {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .forfait-subcats.fsub-reveal .fsub-tab { animation: none; }
}
/* Modèle "pilules" (demande explicite : "propose un autre modèle") —
   chaque sous-groupe est une capsule contourée, remplie de la teinte
   opérateur quand active, plutôt qu'un texte simple souligné. Reste une
   rangée défilante horizontale (aucun changement de structure/JS). */
.fsub-tab {
  flex: 0 0 auto;
  display: flex; align-items: center; gap: 6px;
  border: 1.5px solid rgba(255,255,255,.16); border-radius: 999px;
  background: none;
  padding: 7px 14px;
  color: rgba(255,255,255,.55);
  font-family: inherit; font-weight: 700; font-size: .74rem;
  white-space: nowrap; cursor: pointer;
  transition: background .2s ease, border-color .2s ease, color .2s ease;
  -webkit-user-select: none; user-select: none;
}
.fsub-tab-count { display: none; }
.fsub-tab.active {
  border-color: transparent; color: var(--op-clr-text, #fff);
  background: linear-gradient(135deg,
    color-mix(in srgb, var(--op-clr, var(--primary)) 100%, white 8%),
    var(--op-clr, var(--primary)));
}
.fsub-tab.active .fsub-tab-count { color: var(--op-clr-text, #fff); }
@media (prefers-reduced-motion: reduce) {
  .fsub-tab::after { transition: none; }
}

/* Carte "premium" pleine largeur (une par ligne) — fond crème, badge logo
   dégradé, prix affiché en grand comme statistique héro, et pastille
   "Les avantages du pass" au-dessus des deux statistiques (detail/durée)
   plutôt que du texte brut empilé. --fc-1/--fc-2/--fc-text portent la
   teinte par opérateur, posées par les classes .op-orange/.op-moov/.op-mtn
   déjà présentes sur la carte (voir tfRenderForfaits()). */
/* Modèle "blanc, sans tache" (demande explicite : "supprime les
   bordures et rends la section bien blanc sans tache orange") — plus
   de halo décoratif ni de liseré coloré, fond blanc pur, teinte
   opérateur réservée au prix (léger) et à l'anneau de sélection
   (état, pas décor). */
/* Modèle "pilule prix" (demande explicite : "utilise ce modèle", sur
   capture de référence) — carte fine à bordure claire, titre + sous-
   texte (détail/validité) empilés à gauche, prix en pilule pleine
   couleur à droite sur une seule ligne, plutôt que le bloc prix
   multi-lignes précédent. */
.forfait-card {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  background: #fff;
  border: 1.5px solid #DCEAFB;
  border-radius: 14px;
  padding: 12px 14px;
  cursor: pointer; text-align: left;
  box-shadow: 0 3px 10px rgba(15,10,46,.05);
  transition: var(--transition);
}
.forfait-card:hover { transform: translateY(-2px); }
.forfait-card.op-orange { --fc-1: #FF7A1A; --fc-2: #FF6200; --fc-text: #fff; }
.forfait-card.op-moov   { --fc-1: #4FA3F0; --fc-2: #1D7AE0; --fc-text: #fff; }
.forfait-card.op-mtn    { --fc-1: #FFDD55; --fc-2: #FFCC00; --fc-text: #3D2E00; }
.forfait-card.selected {
  border-color: var(--fc-2, var(--primary));
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--fc-2, var(--primary)) 25%, transparent);
}

.fc-top { display: flex; align-items: center; gap: 9px; min-width: 0; position: relative; }
.fc-id { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.fc-icon {
  width: 38px; height: 38px; border-radius: 12px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; overflow: hidden;
  background: linear-gradient(135deg, var(--fc-1, var(--primary)), var(--fc-2, var(--primary)));
  box-shadow: 0 6px 14px color-mix(in srgb, var(--fc-2, var(--primary)) 40%, transparent);
}
.fc-icon-img { width: 100%; height: 100%; object-fit: cover; }
/* Même correctif que .op-card--orange .op-logo-img : le PNG Orange a une
   large marge blanche autour du logo. */
.fc-icon.op-orange .fc-icon-img { transform: scale(1.7); }

.fc-title { font-size: .88rem; font-weight: 800; color: var(--gray-800); line-height: 1.25; }
.fc-sub { font-size: .68rem; font-weight: 500; color: var(--gray-500); }

.fc-price {
  flex-shrink: 0; white-space: nowrap;
  background: linear-gradient(135deg, var(--fc-1, var(--primary)), var(--fc-2, var(--primary)));
  color: var(--fc-text, #fff);
  font-size: .68rem; font-weight: 800;
  border-radius: 999px; padding: 7px 13px;
  box-shadow: 0 6px 14px color-mix(in srgb, var(--fc-2, var(--primary)) 35%, transparent);
}

.fc-check {
  position: absolute; top: -6px; left: -6px;
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--fc-2, var(--primary)); color: #fff;
  display: flex; align-items: center; justify-content: center; font-size: .5rem;
  opacity: 0; transform: scale(.6);
  transition: opacity .2s ease, transform .2s cubic-bezier(.34,1.56,.64,1);
  box-shadow: 0 6px 14px color-mix(in srgb, var(--fc-2, var(--primary)) 45%, transparent);
}
.forfait-card.selected .fc-check { opacity: 1; transform: scale(1); }

/* Bandeau "Les avantages du pass" — pastille dégradée à la teinte
   opérateur (au lieu du tag plat précédent), sert de transition entre
   l'identité du forfait (logo/nom/prix) et son détail (.fc-stats). */
.fc-adv-section {
  display: inline-flex; align-items: center; gap: 6px;
  border-radius: 999px; padding: 5px 12px 5px 6px;
  margin-bottom: 10px;
  background: linear-gradient(135deg, var(--fc-1, var(--primary)), var(--fc-2, var(--primary)));
  box-shadow: 0 6px 14px color-mix(in srgb, var(--fc-2, var(--primary)) 30%, transparent);
}
.fc-adv-ico {
  width: 14px; height: 14px; border-radius: 50%;
  background: rgba(255,255,255,.28);
  display: flex; align-items: center; justify-content: center;
  font-size: .42rem; color: var(--fc-text, #fff);
}
.fc-adv-lbl {
  font-size: .48rem; font-weight: 800; color: var(--fc-text, #fff);
  text-transform: uppercase; letter-spacing: .04em;
}

@media (prefers-reduced-motion: reduce) {
  .forfait-card, .fc-check { transition: none; }
}

/* â”€â”€ Recipient Input â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */

/* Carte-pilule : drapeau et bouton contacts en pastilles rondes de part
   et d'autre du champ, plutôt que des icônes en position absolue sur un
   simple input bordé. */
.recipient-wrap {
  display: flex; align-items: center; gap: 8px;
  border-radius: 16px; padding: 5px;
  background: var(--gray-100); border: 1.5px solid var(--gray-200);
  transition: var(--transition);
}
.recipient-wrap:focus-within { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(255,98,0,.12); }
.recipient-wrap:has(.rcp-valid) { border-color: var(--secondary); box-shadow: 0 0 0 3px rgba(0,154,68,.12); }
.recipient-wrap .form-control {
  flex: 1; min-width: 0;
  background: transparent !important; border: none !important; box-shadow: none !important;
  padding: 8px 4px; font-size: 1.15rem; font-weight: 700;
}

/* Étape "Numéro" (#step-dest/#sched-step-dest) : centre le champ dans la
   zone marine au lieu de le laisser collé en haut — la carte réseau de
   l'étape précédente est bien plus haute, laissant sinon un grand vide
   sous ce champ court une fois _tfSyncSlideHeight()/_schedSyncSlideHeight()
   appliqué (js/client.js). min-height fixe une hauteur confortable à
   centrer dedans (measurée via scrollHeight par ces mêmes fonctions). */
/* Carte blanche dédiée (demande explicite : "crée une section blanche
   uniquement pour eux") — titre/consigne/champ de cette étape isolés
   dans leur propre encart blanc arrondi, plutôt que posés à même le
   fond du tunnel. */
#step-dest, #sched-step-dest {
  display: flex; flex-direction: column; justify-content: center;
  min-height: 70px;
  background: #fff; border: 1px solid var(--gray-100, #F1F2F6);
  border-radius: 16px; padding: 16px;
  box-shadow: 0 4px 14px rgba(15,10,46,.05);
}

/* Drapeau réseau à côté du champ, pas dedans (demande explicite : "je ne
   veux pas que le logo du reseau se trouve dans le champ" + capture de
   référence) — ligne horizontale flag + champ pilule. Contour lavande
   très doux plutôt qu'une ombre. */
.tf-dest-row {
  display: flex; flex-direction: row; align-items: center; gap: 12px;
  margin: 10px 0 6px;
}
.tf-dest-row .recipient-wrap {
  flex: 1; min-width: 0; margin: 0;
  padding: 4px 6px;
}
.tf-slide .tf-dest-row .recipient-wrap {
  background: #fff !important;
  border: 1.5px solid #E3E6F5 !important;
  box-shadow: none !important;
}
.tf-slide .tf-dest-row .recipient-wrap:focus-within {
  border-color: var(--op-clr, var(--primary)) !important;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--op-clr, var(--primary)) 15%, transparent) !important;
}
/* Consigne au-dessus du champ (demande explicite : "base-toi sur
   l'image 2") — texte d'aide court, sous le titre d'étape partagé
   (#wzc-active-sub, déjà "Numéro du destinataire"). */
/* margin-left:2px compense l'écart de padding entre .tf-stepper-card
   (18px, où vit le titre #wzc-active-sub) et la carte #step-dest/
   #sched-step-dest (16px, voir ci-dessus, où vit ce sous-texte) — sans
   ça les deux lignes ne démarrent pas au même bord gauche ("aligne bien
   les deux bien à gauche"). */
.rcp-hint { font-size: .86rem; font-weight: 400; color: #0A0A0F; margin: 2px 0 12px 2px; }
/* "Choisir dans mes contacts" — ouvre le répertoire du téléphone
   (openContactsPicker(), js/client.js) et écrit le numéro dans le champ. */
.rcp-contacts-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; margin: 10px 0 2px; padding: 11px 12px;
  border: none; border-radius: 12px;
  background: rgba(15,10,46,.05); color: #0F0A2E;
  font-family: var(--font); font-size: .8rem; font-weight: 800; cursor: pointer;
  transition: background .15s;
}
.rcp-contacts-btn:hover { background: rgba(15,10,46,.09); }
.rcp-contacts-btn:active { transform: scale(.99); }
.rcp-contacts-btn i { font-size: .9rem; }
/* Deux boutons sur la même ligne : "Choisir dans mes contacts" (extensible)
   + "Moi-même" (compact). */
.rcp-pick-row { display: flex; flex-wrap: nowrap; gap: 8px; margin: 10px 0 2px; }
.rcp-pick-row .rcp-contacts-btn {
  flex: 1 1 0; min-width: 0;
  width: auto; margin: 0; white-space: nowrap;
  font-size: .74rem; padding: 11px 10px;
}
.rcp-pick-row .rcp-contacts-btn span {
  overflow: hidden; text-overflow: ellipsis;
}
/* Badge logo réseau, à côté du champ (voir tfSelectOp()/schedSelectOp(),
   js/client.js, qui y écrivent déjà le logo dès l'opérateur choisi à
   l'étape 1) — cliquable pour revenir le changer (onclick="wzBack()"/
   "schedWzBack()" dans le HTML). */
.rcp-flag {
  width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0;
  background: var(--gray-100); border: 1px solid var(--gray-200);
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; overflow: hidden; cursor: pointer;
  transition: opacity .15s;
}
.rcp-flag:hover { opacity: .75; }
.rcp-status {
  display: flex; align-items: center; gap: 6px;
  font-size: .78rem; margin-top: 3px; min-height: 14px;
}
/* Le message injecté par tfUpdateRecipient() est un <span> à l'intérieur
   de #rcp-status (qui porte déjà .rcp-status) — lui donner la même
   classe dupliquait margin-top/min-height (span dans son propre parent
   flex) et créait un grand vide avant l'avertissement en dessous. */
.rcp-msg { display: flex; align-items: center; gap: 6px; }
.rcp-msg.ok { color: var(--secondary); }
.rcp-msg.err { color: #EF4444; }

/* Chip d'avertissement discret (ambre translucide) plutôt qu'un pavé plein
   à la couleur criarde de l'opérateur (Orange/MTN/Moov) — un fond
   saturé pour un simple message de prudence paraissait trop agressif,
   pas assez "carte d'alerte" standard. */
.tf-recipient-warning {
  display: flex; align-items: flex-start; gap: 7px;
  background: rgba(255,179,64,.12); border: 1px solid rgba(255,179,64,.3);
  border-radius: 10px; padding: 8px 10px;
  margin-top: 2px;
  font-size: .64rem; font-weight: 600; color: #FFD08A;
  line-height: 1.4;
}
.tf-recipient-warning i { color: #FFB340; font-size: .68rem; margin-top: 2px; flex-shrink: 0; }

/* â”€â”€ Payment Methods â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
/* Paiement — icônes horizontaux */
.payment-grid {
  display: flex; flex-direction: row;
  justify-content: space-between; align-items: flex-start;
  gap: 4px;
}
.pm-row {
  position: relative;
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  cursor: pointer; flex: 1;
  padding: 6px 3px; border-radius: 13px;
  border: 1.5px solid color-mix(in srgb, var(--pm-clr, #fff) 40%, transparent);
  transition: background .18s, border-color .18s, transform .2s cubic-bezier(.34,1.56,.64,1);
}
.pm-row:hover { background: rgba(255,255,255,.05); transform: translateY(-2px); }
.pm-row.selected {
  background: rgba(255,255,255,.06);
  border-color: var(--pm-clr);
  transform: translateY(-3px);
  box-shadow: 0 4px 16px var(--pm-glow);
}
.pm-row::before { display: none; }

.pm-row-check {
  position: absolute; top: 4px; right: 4px;
  width: 14px; height: 14px; border-radius: 50%;
  background: rgba(255,255,255,.15); color: transparent;
  display: flex; align-items: center; justify-content: center;
  font-size: .46rem; transition: var(--transition);
}
.pm-row.selected .pm-row-check { background: var(--pm-clr); color: #fff; }

.pm-row-logo {
  width: 26px; height: 26px; border-radius: 8px;
  overflow: hidden; flex-shrink: 0;
  box-shadow: 0 2px 8px rgba(0,0,0,.3);
  transition: box-shadow .2s;
}
.pm-row-logo svg { width: 26px; height: 26px; display: block; }
.pm-row-logo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-row.selected .pm-row-logo { box-shadow: 0 4px 14px var(--pm-glow); }

.pm-row-name {
  background: #fff; color: #1a1a2e;
  font-size: .5rem; font-weight: 900;
  padding: 4px 7px; border-radius: 999px;
  white-space: nowrap;
  box-shadow: 0 2px 6px rgba(0,0,0,.15);
  transition: color .2s;
}
.pm-row.selected .pm-row-name { color: var(--pm-clr); }
.pm-row-sub, .pm-row-radio, .pm-row-info,
.pm-chip, .pm-bubble { display: none; }
/* ── Carte paiement fixe (panneaux) ─────────────────────────────────── */
.tf-pay-card {
  background: rgba(255,255,255,.04);
  border: 1.5px solid rgba(255,255,255,.09);
  border-radius: 20px;
}
.tf-pay-panel {
  display: flex; flex-direction: column; gap: 10px;
  padding: 0;
}
.tf-pay-card-hd {
  display: flex; align-items: center; gap: 8px;
  font-size: .75rem; font-weight: 900; color: rgba(255,255,255,.5);
  text-transform: uppercase; letter-spacing: .06em;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(255,255,255,.07);
}
.tf-pay-card-hd i { color: var(--primary); font-size: .8rem; }
.tf-pay-divider {
  height: 1px; background: rgba(255,255,255,.07); margin: 0 -4px;
}
/* Saisie numéro — style premium */
.tf-pay-num-wrap {
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  padding: 18px 16px 16px;
  background: rgba(255,255,255,.04);
  border: 1.5px solid rgba(255,255,255,.08);
  border-radius: 18px;
  transition: border-color .25s, box-shadow .25s;
}
.tf-pay-num-wrap:focus-within {
  border-color: var(--pm-clr, var(--primary));
  box-shadow: 0 0 0 4px var(--pm-glow, rgba(138,99,255,.18));
}
.tf-pay-num-input {
  width: 100%; background: none; border: none; outline: none;
  text-align: center; font-family: var(--font);
  font-size: 1.35rem; font-weight: 900; letter-spacing: .15em;
  color: #fff; padding: 4px 0;
}
.tf-pay-num-input::placeholder {
  color: rgba(255,255,255,.45); font-size: .85rem;
  font-weight: 400; letter-spacing: .05em;
}
.tf-pay-num-input:disabled { cursor: not-allowed; color: rgba(255,255,255,.2); }
.tf-pay-num-label {
  font-size: .6rem; font-weight: 800;
  color: var(--pm-clr, rgba(255,255,255,.2));
  text-transform: uppercase; letter-spacing: .1em;
  transition: color .2s;
}
.tf-pay-num-bar {
  width: 40%; height: 1.5px; border-radius: 99px;
  background: linear-gradient(90deg, transparent, var(--pm-clr, rgba(255,255,255,.1)), transparent);
  margin-top: 2px;
}
.tf-pay-num-bar {
  width: 60%; height: 2px; border-radius: 99px;
  background: linear-gradient(90deg, transparent, var(--pm-clr, rgba(255,255,255,.15)), transparent);
  transition: background .3s;
}

/* Paiement par solde disponible — pas de numéro à saisir, voir
   tfSelectPayment() dans js/client.js. */
.tf-pay-solde-wrap {
  display: flex; align-items: center; justify-content: center;
  padding: 16px; margin-top: 4px;
  background: rgba(34,197,94,.08);
  border: 1.5px solid rgba(34,197,94,.3);
  border-radius: 18px;
  overflow: hidden;
}
.tf-pay-solde-dest-marquee {
  display: flex; align-items: center; gap: 8px;
  color: #fff; font-size: 1rem; font-weight: 800; letter-spacing: .04em;
  animation: tf-solde-dest-in .4s cubic-bezier(.34,1.56,.64,1);
}
.tf-pay-solde-dest-marquee i { color: #22C55E; font-size: 1rem; }
@keyframes tf-solde-dest-in {
  from { opacity: 0; transform: translateX(-16px); }
  to   { opacity: 1; transform: translateX(0); }
}

@keyframes tf-btn-appear {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
/* Bouton "Continuer" en bleu marine plein, identique quel que soit le
   réseau ou le moyen de paiement (demande du 2026-09-03 : "en bleu marine
   et sans reflet de couleur") — ne suit plus --op-clr, et plus d'ombre
   colorée sous le bouton. */
.tf-pay-next-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%;
  padding: 13px 0; border-radius: 12px;
  background: #0F0A2E;
  border: none; color: #fff;
  font-size: .85rem; font-weight: 900; letter-spacing: .05em;
  font-family: var(--font); cursor: pointer;
  box-shadow: none;
  transition: transform .15s, opacity .15s;
  animation: tf-btn-appear .28s cubic-bezier(.34,1.56,.64,1);
}
.tf-pay-next-btn:disabled {
  background: var(--gray-200, #E5E7EF); color: var(--gray-400, #9AA2B4);
  box-shadow: none; cursor: not-allowed;
}
.tf-pay-next-btn:not(:disabled):hover {
  transform: translateY(-2px);
  opacity: .92;
}
/* Partage la ligne avec le bouton Retour (demande explicite : "a ce niveau
   ajoute le bouton retour") — même patron que les autres étapes
   (.tf-wz-nav-row), le bouton Continuer garde ses couleurs propres au
   moyen de paiement plutôt que de devenir un simple .tf-wz-next-btn2. */
.tf-wz-nav-row .tf-pay-next-btn { width: auto; flex: 1; margin-top: 0; }

/* ── Récapitulatif panneau ───────────────────────────────────────────── */
.tf-inline-recap { display: none; }

.tf-recap-title {
  font-size: .72rem; font-weight: 900; color: rgba(255,255,255,.5);
  text-transform: uppercase; letter-spacing: .05em;
  margin-bottom: 10px; display: flex; align-items: center; gap: 6px;
}
.tf-recap-title i { color: var(--primary); }
.tf-recap-rows {
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.09);
  border-radius: 14px; overflow: hidden; margin-bottom: 14px;
}
.tf-recap-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 6px 12px; border-bottom: 1px solid rgba(255,255,255,.05);
  font-size: .68rem;
}
.tf-recap-row:last-child { border-bottom: none; }
.tf-recap-row span   { color: rgba(255,255,255,.4); font-weight: 600; }
.tf-recap-row strong { color: #fff; font-weight: 800; }
.tf-recap-row--total { background: rgba(255,98,0,.1); }
.tf-recap-row--total strong { color: var(--primary); font-size: .76rem; }
.tf-recap-actions {
  display: flex; gap: 8px;
}
.tf-recap-back-btn {
  padding: 13px 16px; border-radius: 99px; white-space: nowrap;
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.12);
  color: rgba(255,255,255,.6); font-size: .78rem; font-weight: 800;
  font-family: var(--font); cursor: pointer;
  display: flex; align-items: center; gap: 7px;
  transition: background .15s, color .15s;
}
.tf-recap-back-btn:hover { background: rgba(255,255,255,.14); color: #fff; }
/* Bleu marine par défaut (demande explicite du 27/08 : "Payer maintenant"
   + "mets le bleu marine") plutôt que la couleur du moyen de paiement —
   --pm-clr reste utilisable si posé plus haut dans le DOM, mais la valeur
   de repli passe de l'orange (#ff6200) au bleu marine de marque. */
.tf-validate-btn {
  width: 100%; padding: 14px; border-radius: 14px;
  background: linear-gradient(135deg, var(--pm-clr, #1B234F), var(--pm-clr, #0F0A2E));
  border: none; color: #fff; font-size: .88rem; font-weight: 900;
  font-family: var(--font); cursor: pointer; letter-spacing: .04em;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 6px 22px var(--pm-glow, rgba(15,10,46,.35));
  transition: transform .15s, box-shadow .15s;
  margin-top: 4px;
}
.tf-validate-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 28px var(--pm-glow, rgba(15,10,46,.45)); }
/* Partage la ligne avec le bouton Retour (demande explicite : "sur la
   meme ligne que payer maintenant ajoute un bouton retour") — même
   patron que .tf-wz-nav-row .tf-pay-next-btn plus haut. */
.tf-wz-nav-row .tf-validate-btn { width: auto; flex: 1; margin-top: 0; }

/* Délai de 30s pour valider le paiement — voir PaymentTimer/tfShowRecap()
   dans js/client.js. Passé ce délai, le wizard est réinitialisé. */
.tf-recap-timer {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  padding: 8px; margin-bottom: 10px; border-radius: 10px;
  background: rgba(255,255,255,.04);
  font-size: .68rem; color: rgba(255,255,255,.5); font-weight: 600;
}
.tf-recap-timer i { color: #F59E0B; font-size: .68rem; }
.tf-recap-timer strong { color: #F59E0B; font-weight: 900; font-variant-numeric: tabular-nums; }

/* Récapitulatif de paiement sur fond blanc (demande explicite du 27/08 :
   "rends les écritures en noir") — .tf-recap-row/.tf-recap-timer/
   .tf-recap-back-btn sont PARTAGÉS avec l'espace cabine (voir cabine.html),
   resté sombre : les couleurs translucides blanches d'origine y restent
   correctes, d'où cette surcharge scopée à .tf-slide plutôt qu'un
   changement des règles de base. */
.tf-slide .tf-recap-row { border-bottom-color: var(--gray-200) !important; }
.tf-slide .tf-recap-row span   { color: var(--gray-500) !important; }
.tf-slide .tf-recap-row strong { color: #0a1330 !important; }
.tf-slide .tf-recap-row--total { background: rgba(15,10,46,.06) !important; }
.tf-slide .tf-recap-timer {
  background: var(--gray-100) !important;
  color: var(--gray-600) !important;
}
.tf-slide .tf-recap-back-btn {
  background: var(--gray-100) !important;
  border: 1px solid var(--gray-200) !important;
  color: var(--gray-600) !important;
}
.tf-slide .tf-recap-back-btn:hover { background: var(--gray-200) !important; color: #0a1330 !important; }

.tf-recap-confirm-btn {
  flex: 1; padding: 13px; border-radius: 99px;
  background: linear-gradient(135deg, #ff6200, #ff8c00);
  border: none; color: #fff; font-size: .82rem; font-weight: 900;
  cursor: pointer; font-family: var(--font);
  display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 6px 20px rgba(255,98,0,.35); transition: transform .15s, box-shadow .15s;
}
.tf-recap-confirm-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 26px rgba(255,98,0,.45); }

/* â”€â”€ Summary Card â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.tf-sidebar { position: sticky; top: calc(var(--header-h) + 12px); }
.summary-card {
  background: var(--white);
  border-radius: var(--radius-xl);
  border: 1.5px solid var(--gray-200);
  overflow: hidden; box-shadow: var(--shadow);
}
.summary-head {
  background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
  color: #fff; padding: 18px 20px;
  display: flex; align-items: center; gap: 10px;
}
.summary-head .sh-title { font-size: .95rem; font-weight: 800; }
.summary-head .sh-sub   { font-size: .72rem; opacity: .75; margin-top: 2px; }
.summary-body { padding: 16px 20px 8px; }
.sum-row {
  padding: 9px 0; border-bottom: 1px solid var(--gray-200);
  display: flex; flex-direction: column; gap: 2px;
}
.sum-row:last-child { border-bottom: none; }
.sum-label { font-size: .68rem; color: var(--gray-400); text-transform: uppercase; letter-spacing: .5px; }
.sum-val   { font-size: .88rem; font-weight: 700; }
.sum-total {
  margin: 12px 20px;
  background: var(--gray-100);
  border-radius: var(--radius);
  padding: 13px 16px;
  display: flex; align-items: center; justify-content: space-between;
}
.sum-total .st-lbl { font-size: .82rem; font-weight: 700; }
.sum-total .st-amt { font-size: 1.25rem; font-weight: 800; color: var(--primary); }

/* Validation checklist */
.vcheck-list { padding: 8px 20px 12px; display: flex; flex-direction: column; gap: 5px; }
.vcheck-row  { display: flex; align-items: center; gap: 8px; font-size: .76rem; color: var(--gray-400); }
.vcheck-row.done { color: var(--secondary); }
.vcheck-row i { width: 14px; }

/* Validate CTA */
.btn-validate-main {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: calc(100% - 40px); margin: 0 20px 20px;
  padding: 15px;
  background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  color: #fff; border: none; border-radius: var(--radius-lg);
  font-size: .97rem; font-weight: 800; cursor: pointer;
  transition: var(--transition); box-shadow: var(--shadow-orange);
}
.btn-validate-main:hover:not(:disabled) {
  transform: translateY(-2px);
  box-shadow: 0 8px 28px rgba(255,98,0,.45);
}
.btn-validate-main:disabled {
  background: var(--gray-300); color: var(--gray-400);
  box-shadow: none; cursor: not-allowed;
}

/* â”€â”€ Contacts Quick-Pick â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.contacts-list { display: flex; flex-direction: column; gap: 2px; }
.contacts-group-label {
  font-size: .65rem; font-weight: 700; text-transform: uppercase; letter-spacing: .5px;
  color: var(--gray-400); padding: 10px 12px 4px;
}
.contact-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border-radius: var(--radius);
  cursor: pointer; transition: background .15s;
}
.contact-item:hover { background: var(--gray-100); }
.contact-avatar {
  width: 36px; height: 36px; border-radius: 50%;
  background: linear-gradient(135deg,var(--primary),var(--secondary));
  display: flex; align-items: center; justify-content: center;
  font-size: .75rem; font-weight: 800; color: #fff; flex-shrink: 0;
}
.contact-name { font-size: .85rem; font-weight: 600; }
.contact-num  { font-size: .75rem; color: var(--gray-400); }
.contact-op   { margin-left: auto; font-size: .72rem; font-weight: 700; padding: 3px 8px; border-radius: 99px; }

/* â”€â”€ Responsive transfert â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
@media (max-width: 900px) {
  .tf-layout { grid-template-columns: 1fr; }
  .tf-sidebar { position: static; }
  .btn-validate-main { margin-bottom: 24px; }
}
@media (max-width: 520px) {
  .amount-tiles { grid-template-columns: repeat(4,1fr); }
  .op-row       { justify-content: space-around; }
  .forfait-grid { grid-template-columns: 1fr 1fr; }
  .payment-grid { flex-wrap: wrap; gap: 8px; }
  .balance-strip { flex-wrap: wrap; }
  .bs-recharge   { width: 100%; text-align: center; }
}

/* ================================================================
   CLIENT PAGE — Layout autonome sans sidebar
   ================================================================ */

/* ── Sections hors Accueil : contenu fixe top ── */
html { background: #ffffff; }
body:not(.on-home) { background: #ffffff !important; }
body:not(.on-home) .client-page { padding-top: 0 !important; }
body:not(.on-home) .cs-section.active {
  display: block;
  position: fixed;
  inset: 0;
  height: 100vh; width: 100%;
  overflow-y: auto; overflow-x: hidden;
  z-index: 100;
  padding: 20px 20px 110px;
  background: #ffffff;
  /* Interface plein écran strictement blanche : aucun liseré / ombre /
     arrondi / animation sur les bords (demande explicite). */
  box-shadow: none;
  border: none;
  border-radius: 0;
  outline: none;
  animation: none;
  transform: none;
  filter: none;
  -webkit-mask-image: none;
          mask-image: none;
}
@media (max-width: 600px) {
  body:not(.on-home) .cs-section.active { padding: 16px 12px 110px; }
}
body:not(.on-home) .cs-section.active > * { margin-bottom: 16px; }
body:not(.on-home) .cs-section.active > .pgc-panel { margin-bottom: 6px; }

/* ── Dark mode : carte & panneau ─────────────────────────── */

/* anciens sélecteurs conservés pour compatibilité */
.cn-brand    { display: flex; align-items: center; gap: 10px; }
.cn-logo-icon { display: none; }
.cn-logo-text { font-size: 1.2rem; font-weight: 800; color: var(--gray-800); }
.cn-logo-text span { color: var(--secondary); }
.cn-spacer   { flex: 1; }
.cn-tagline  { display: none; }

/* Icon button */
.cn-icon-btn {
  width: 38px; height: 38px; background: none; border: none;
  cursor: pointer; border-radius: var(--radius); color: var(--gray-500);
  font-size: .95rem; display: flex; align-items: center; justify-content: center;
  transition: var(--transition); position: relative;
}
.cn-icon-btn:hover { background: var(--gray-100); color: var(--gray-800); }
.cn-notif-dot {
  position: absolute; top: 6px; right: 6px;
  width: 8px; height: 8px; background: var(--primary);
  border-radius: 50%; border: 2px solid var(--white); display: none;
}

/* Text buttons (login/register) */
.cn-text-btn {
  height: 36px; padding: 0 14px; border: none; cursor: pointer;
  border-radius: var(--radius); font-size: .82rem; font-weight: 700;
  font-family: var(--font); display: flex; align-items: center; gap: 6px;
  transition: var(--transition);
}
.cn-btn-login  { background: none; color: var(--primary); border: 1.5px solid rgba(255,98,0,.35); }
.cn-btn-login:hover  { background: rgba(255,98,0,.06); border-color: var(--primary); }
.cn-btn-register { background: var(--primary); color: #fff; }
.cn-btn-register:hover { background: var(--primary-dark); }
@media(max-width:480px){
  .cn-btn-login .btn-label, .cn-btn-register .btn-label { display: none; }
}

/* User chip */
.cn-user-chip {
  display: flex; align-items: center; gap: 8px;
  padding: 3px 6px 3px 3px; background: var(--gray-100);
  border-radius: var(--radius-lg);
}
.cn-chip-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--secondary));
  color: #fff; font-size: .72rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.cn-chip-info { line-height: 1.25; padding: 0 2px; }
.cn-chip-name { font-size: .8rem; font-weight: 700; color: var(--gray-800); }
.cn-chip-role { font-size: .67rem; color: var(--gray-500); }

/* â”€â”€ Main container â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.cn-main {
  max-width: 1140px; margin: 0 auto;
  padding: 28px 20px 80px;
}
@media(max-width:600px){ .cn-main { padding: 18px 14px 60px; } }

/* â”€â”€ Sections â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.cn-section { margin-bottom: 36px; }
.cn-section-divider { height: 1px; background: var(--gray-200); margin-bottom: 36px; }

.cn-sec-head {
  display: flex; align-items: center; gap: 14px;
  padding-bottom: 14px; margin-bottom: 18px;
  border-bottom: 2px solid var(--gray-200);
}
.cn-sec-icon {
  width: 44px; height: 44px; border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.05rem; flex-shrink: 0;
}
.cn-sec-title { font-size: 1.05rem; font-weight: 800; color: var(--gray-800); line-height: 1.2; }
.cn-sec-sub   { font-size: .78rem; color: var(--gray-500); margin-top: 3px; }
.cn-sec-extra { margin-left: auto; flex-shrink: 0; }

/* â”€â”€ Balance strip with inline stats â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.bs-stats-row {
  display: flex; gap: 0;
  background: rgba(255,255,255,.13);
  border-radius: var(--radius); overflow: hidden;
  margin-left: auto; flex-shrink: 0;
}
.bs-stat-item { padding: 10px 18px; text-align: center; }
.bs-stat-num  { font-size: .92rem; font-weight: 800; color: #fff; }
.bs-stat-lbl  { font-size: .63rem; color: rgba(255,255,255,.68); margin-top: 2px; white-space: nowrap; }
.bs-stat-div  { width: 1px; background: rgba(255,255,255,.18); align-self: stretch; margin: 8px 0; }
@media(max-width:680px){ .bs-stats-row { display: none; } }

/* ================================================================
   CLIENT SIDEBAR — layout barre latérale gauche
   ================================================================ */

/* â”€â”€ Wrapper global sous la topnav â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.client-layout {
  display: grid;
  grid-template-columns: 258px 1fr;
  min-height: calc(100vh - 62px);
  align-items: start;
}

/* â”€â”€ Sidebar â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.client-sidebar {
  position: sticky; top: 62px;
  height: calc(100vh - 62px);
  background: var(--white);
  border-right: 1px solid var(--gray-200);
  display: flex; flex-direction: column;
  overflow-y: auto; overflow-x: hidden;
  scrollbar-width: thin; scrollbar-color: var(--gray-200) transparent;
  z-index: 50; flex-shrink: 0;
}

/* Logo dans sidebar */
.csb-logo {
  display: flex; align-items: center; gap: 10px;
  padding: 18px 16px 14px;
  border-bottom: 1px solid var(--gray-200);
}
.csb-logo-icon {
  width: 34px; height: 34px;
  background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  border-radius: 9px; color: #fff; font-size: .85rem;
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.csb-logo-text { font-size: 1.15rem; font-weight: 800; color: var(--gray-800); line-height: 1; }
.csb-logo-text span { color: var(--secondary); }
.csb-mobile-close {
  margin-left: auto; display: none;
  width: 32px; height: 32px; background: none; border: none;
  color: var(--gray-500); font-size: 1rem; cursor: pointer;
  border-radius: var(--radius); align-items: center; justify-content: center;
}
.csb-mobile-close:hover { background: var(--gray-100); }

/* Carte utilisateur */
.csb-user-block {
  padding: 14px 16px;
  border-bottom: 1px solid var(--gray-200);
}
.csb-user-row { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.csb-user-avatar {
  width: 38px; height: 38px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(135deg, var(--primary), var(--secondary));
  color: #fff; font-size: .76rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center;
}
.csb-user-name { font-size: .86rem; font-weight: 700; color: var(--gray-800); line-height: 1.2; }
.csb-user-role { font-size: .7rem; color: var(--gray-500); margin-top: 1px; }

/* Mini balance dans sidebar */
.csb-balance-mini {
  background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  border-radius: var(--radius); padding: 12px 14px;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
.csb-bal-info {}
.csb-bal-label { font-size: .63rem; color: rgba(255,255,255,.7); text-transform: uppercase; letter-spacing: .4px; }
.csb-bal-amount { font-size: 1.1rem; font-weight: 800; color: #fff; margin-top: 1px; }
.csb-recharge-btn {
  background: rgba(255,255,255,.18); border: 1.5px solid rgba(255,255,255,.35);
  color: #fff; padding: 5px 10px; border-radius: var(--radius-sm);
  font-size: .72rem; font-weight: 700; cursor: pointer; white-space: nowrap;
  font-family: var(--font); transition: var(--transition);
}
.csb-recharge-btn:hover { background: rgba(255,255,255,.28); }

/* Bloc invité dans sidebar */
.csb-guest-block {
  padding: 14px 16px;
  border-bottom: 1px solid var(--gray-200);
}
.csb-guest-title { font-size: .82rem; font-weight: 700; color: var(--gray-700); margin-bottom: 4px; }
.csb-guest-sub   { font-size: .73rem; color: var(--gray-500); margin-bottom: 10px; }
.csb-guest-btns  { display: flex; flex-direction: column; gap: 6px; }
.csb-guest-btns .btn { justify-content: center; }

/* Navigation sidebar */
.csb-nav { flex: 1; padding: 10px 0; }
.csb-nav-label {
  font-size: .63rem; font-weight: 700; color: var(--gray-400);
  text-transform: uppercase; letter-spacing: .7px;
  padding: 10px 16px 4px;
}
.csb-item {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px; cursor: pointer;
  font-size: .86rem; font-weight: 600; color: var(--gray-600);
  border-left: 3px solid transparent;
  transition: background .15s, color .15s, border-color .15s;
  user-select: none; position: relative;
}
.csb-item:hover { background: var(--gray-100); color: var(--gray-800); }
.csb-item.active {
  background: rgba(255,98,0,.08); color: var(--primary);
  border-left-color: var(--primary); font-weight: 700;
}
.csb-item i { width: 18px; text-align: center; font-size: .95rem; flex-shrink: 0; }
.csb-item-badge {
  margin-left: auto; background: var(--primary); color: #fff;
  font-size: .6rem; font-weight: 800; line-height: 1;
  padding: 2px 6px; border-radius: 10px; min-width: 18px; text-align: center;
}

/* Footer sidebar */
.csb-footer {
  padding: 12px 16px; border-top: 1px solid var(--gray-200); margin-top: auto;
}
.csb-logout-btn {
  width: 100%; padding: 10px 14px;
  background: none; border: 1.5px solid var(--gray-200);
  border-radius: var(--radius); color: var(--gray-500);
  font-size: .83rem; font-weight: 600; cursor: pointer;
  font-family: var(--font); display: flex; align-items: center;
  justify-content: center; gap: 8px; transition: var(--transition);
}
.csb-logout-btn:hover { background: rgba(255,98,0,.06); color: var(--primary); border-color: var(--primary); }

/* â”€â”€ Zone principale â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ */
.client-main-area {
  min-height: calc(100vh - 62px);
  background: var(--light-bg);
  padding: 24px;
}

/* Sections (remplacent les onglets) */
.cs-section { display: none; }
.cs-section.active {
  display: flex; flex-direction: column; gap: 20px;
  animation: fadeIn .25s ease;
  background: transparent;
  padding: 0;
}

/* ── Fond spécifique section Historique — fond principal blanc, comme
   les cartes de commande qu'il porte (voir .hoc-card) ── */
#cs-historique.active {
  background: var(--light-bg);
  padding: 0 16px 16px;
  min-height: 100%;
}
/* Cartes d'historique élargies (demande explicite) — la liste déborde du
   padding latéral de la section pour gagner ~50 px de largeur. */
#history-list { margin: 0 1px; }

/* En-tête "Historique" : même modèle que le bandeau identité de
   "À propos"/"Contact" (icône/titre/sous-titre centrés en colonne, bouton
   "trois traits" en badge absolu) — demande explicite, même patron que
   #cs-profit .cs-sec-bar.
   #cs-historique.active n'a plus de padding-top (voir plus haut) : cette
   carte n'a donc plus besoin d'annuler une marge verticale via un margin
   négatif — seule une marge négative HORIZONTALE reste nécessaire pour
   toucher les bords. Le margin-top négatif a été retiré volontairement :
   #cs-historique.active défile (overflow-y:auto, voir body:not(.on-home)
   .cs-section.active) et un margin négatif vertical n'annule pas de façon
   fiable le padding-top d'un conteneur qui scrolle (le padding restait
   visible comme un espace blanc résiduel en haut, même une fois annulé
   "sur le papier") — d'où le padding-top:0 directement sur le parent
   plutôt qu'un margin négatif ici. */
#cs-historique .cs-sec-bar {
  position: relative; overflow: hidden;
  flex-direction: column; align-items: center; text-align: center;
  gap: 5px;
  padding: 15px 20px 13px; margin: 0 -16px 10px;
  border-radius: 0 0 20px 20px;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  box-shadow: 0 10px 24px rgba(6,10,28,.32), 0 1px 0 rgba(255,255,255,.04) inset;
  /* Couche de composition dédiée (même correctif que .pgc-hero-card) —
     bandeau sur fond dégradé, sujet au même glitch de rendu. */
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
#cs-historique .cs-sec-bar::after {
  content: ''; position: absolute; top: -20px; left: 50%; transform: translateX(-50%);
  width: 120px; height: 120px; border-radius: 50%;
  background: rgba(255,255,255,.05);
  pointer-events: none;
}
#cs-historique .cs-sec-bar-info,
#cs-historique .cs-sec-bar-ico { position: relative; z-index: 1; }
#cs-historique .cs-sec-bar-ico--hist {
  width: 38px; height: 38px; border-radius: 12px; font-size: .95rem;
  background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.18);
  color: #fff;
  margin-bottom: 1px;
}
#cs-historique .cs-sec-bar-info { align-items: center; }
#cs-historique .cs-sec-bar-title { font-size: .95rem; }
#cs-historique .cs-sec-bar-sub {
  color: #8FA0C6; font-size: .62rem;
  text-transform: uppercase; letter-spacing: .04em;
}

/* En-tête de section dans la zone principale */
.cs-page-head {
  margin-bottom: 22px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--gray-200);
}
.cs-page-title {
  font-size: 1.2rem; font-weight: 800; color: var(--gray-800);
  display: flex; align-items: center; gap: 10px; margin-bottom: 4px;
}
.cs-page-title i { color: var(--primary); font-size: 1rem; }
.cs-page-sub { font-size: .8rem; color: var(--gray-500); }

/* État sidebar masquée (desktop toggle) */
.client-layout.sidebar-off .client-sidebar {
  display: none;
}
.client-layout.sidebar-off {
  grid-template-columns: 1fr;
}

/* Centrage absolu du nom dans la topnav (position:sticky du bandeau
   sert déjà de contexte de positionnement pour cet enfant absolu) */
.cn-brand-center {
  position: absolute; left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
}

/* Bouton Profits */
.cn-profit-btn {
  display: flex; align-items: center; gap: 7px;
  height: 36px; padding: 0 16px;
  background: linear-gradient(135deg, var(--secondary), #007a35);
  color: #fff; border: none; border-radius: 20px;
  font-size: .82rem; font-weight: 700; cursor: pointer;
  box-shadow: 0 2px 10px rgba(0,154,68,.35);
  transition: opacity .18s, transform .18s;
  flex-shrink: 0;
}
.cn-profit-btn:hover { opacity: .88; transform: translateY(-1px); }

/* ── Onglets principal (cs-tabs) ─────────────────────────────── */
.cs-tabs {
  display: flex; gap: 4px;
  background: var(--white);
  border-radius: var(--radius-lg);
  padding: 6px;
  margin-bottom: 22px;
  box-shadow: 0 2px 12px rgba(0,0,0,.07);
  border: 1px solid var(--gray-100);
  overflow-x: auto;
}
.cs-tab {
  display: flex; align-items: center; gap: 7px;
  padding: 10px 18px; border: none; background: none;
  border-radius: var(--radius); cursor: pointer;
  font-size: .84rem; font-weight: 600; color: var(--gray-500);
  white-space: nowrap; transition: all .18s ease; flex-shrink: 0;
}
.cs-tab:hover { background: var(--gray-100); color: var(--gray-700); }
.cs-tab.active {
  background: var(--primary); color: #fff;
  box-shadow: 0 3px 10px rgba(255,98,0,.35);
}
.cs-tab i { font-size: .88rem; }

/* ── Section Profit ─────────────────────────────────────────── */
.profit-kpi-row {
  display: grid; grid-template-columns: repeat(4,1fr); gap: 14px;
  margin-bottom: 4px;
}
@media(max-width:760px){ .profit-kpi-row { grid-template-columns: repeat(2,1fr); } }
.profit-kpi {
  background: var(--white); border-radius: var(--radius-lg);
  padding: 20px 16px; text-align: center;
  box-shadow: 0 2px 12px rgba(0,0,0,.07);
  border: 1px solid var(--gray-100);
}
.pk-icon {
  width: 44px; height: 44px; border-radius: 12px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 1.1rem; margin-bottom: 10px;
}
.pk-val { font-size: 1.25rem; font-weight: 800; color: var(--gray-800); line-height: 1; }
.pk-lbl { font-size: .72rem; color: var(--gray-500); margin-top: 5px; font-weight: 600; }

.pf-breakdown { display: flex; flex-direction: column; gap: 12px; }
.pf-op-row {
  display: flex; align-items: center; gap: 12px;
}
.pf-op-name { width: 60px; font-size: .82rem; font-weight: 700; color: var(--gray-700); }
.pf-bar-wrap { flex: 1; background: var(--gray-100); border-radius: 99px; height: 10px; overflow: hidden; }
.pf-bar { height: 100%; border-radius: 99px; transition: width .5s ease; }
.pf-op-amount { font-size: .8rem; font-weight: 700; color: var(--gray-600); min-width: 80px; text-align: right; }

/* ── Badge NEW sur item sidebar ─────────────────────────────── */
.csb-item-badge--new {
  margin-left: auto; padding: 2px 7px;
  background: linear-gradient(135deg, var(--primary), #e05500);
  color: #fff; font-size: .6rem; font-weight: 800;
  border-radius: 99px; letter-spacing: .5px;
}

/* ── Section Espace Partenaires ─────────────────────────────── */
.ph5-hero { display:none; }

/* Hero v2 (désactivé) */
.ph5-hero2 { display: none; }

@keyframes blink {
  0%, 100% { opacity: 1; }
  50%       { opacity: .25; }
}

/* Hero v3 */
.ph5-hero3 {
  position: relative; overflow: hidden;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border: 1.5px solid rgba(255,98,0,.2);
  border-radius: 18px; margin-bottom: 10px;
  padding: 24px 22px 20px;
  box-shadow: 0 8px 28px rgba(0,0,0,.4);
  /* Même correctif que .pgc-hero-card/.pgc-qr-card : couche de composition
     dédiée contre le glitch de rendu (fond dégradé qui semble "bouger")
     observé sur certains WebView Android. */
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
.ph5-hero3-corner {
  position: absolute; top: -30px; right: -30px;
  width: 120px; height: 120px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.22) 0%, transparent 70%);
  pointer-events: none;
}

/* Hero v2 */
.ph5-hero2 {
  position: relative; overflow: hidden;
  background: radial-gradient(ellipse at 50% 0%, #1f0d00 0%, #0a0a10 65%);
  border: 1px solid rgba(255,98,0,.25);
  border-top: 2px solid #FF6200;
  border-radius: 18px; margin-bottom: 10px;
  padding: 22px 18px 20px;
  display: flex; flex-direction: column; align-items: center; text-align: center;
}
.ph5-hero2-glow {
  position: absolute; top: -40px; left: 50%; transform: translateX(-50%);
  width: 220px; height: 220px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.18) 0%, transparent 70%);
  pointer-events: none;
}
.ph5-hero2-badge {
  display: inline-flex; align-items: center; gap: 5px;
  background: rgba(255,98,0,.12); border: 1px solid rgba(255,98,0,.3);
  color: #FF6200; font-size: .52rem; font-weight: 700;
  padding: 4px 12px; border-radius: 99px; letter-spacing: .08em;
  text-transform: uppercase; margin-bottom: 18px;
}

/* Visuel orbital */
.ph5-hero2-visual {
  position: relative; width: 130px; height: 130px; margin-bottom: 18px;
}
.ph5-hero2-ring {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
  border-radius: 50%; border: 1px solid rgba(255,98,0,.2);
}
.ph5-hero2-ring--outer { width: 130px; height: 130px; border-style: dashed; }
.ph5-hero2-ring--inner { width: 90px; height: 90px; border-color: rgba(255,98,0,.15); }
.ph5-hero2-core {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
  width: 56px; height: 56px; border-radius: 16px;
  background: linear-gradient(135deg, #FF6200, #c94800);
  box-shadow: 0 0 28px rgba(255,98,0,.5), inset 0 1px 0 rgba(255,255,255,.15);
  display: flex; align-items: center; justify-content: center;
}
.ph5-hero2-logo {
  font-size: 1rem; font-weight: 900; color: #fff; letter-spacing: -.02em;
}
.ph5-hero2-logo span { color: rgba(255,255,255,.7); }
.ph5-hero2-orb {
  position: absolute; width: 28px; height: 28px; border-radius: 50%;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,98,0,.3);
  display: flex; align-items: center; justify-content: center;
  font-size: .6rem; color: #FF6200;
  box-shadow: 0 0 8px rgba(255,98,0,.2);
}
.ph5-hero2-orb--1 { top: 0;   left: 50%; transform: translateX(-50%); }
.ph5-hero2-orb--2 { bottom: 0; left: 50%; transform: translateX(-50%); }
.ph5-hero2-orb--3 { left: 0;  top: 50%; transform: translateY(-50%); }
.ph5-hero2-orb--4 { right: 0; top: 50%; transform: translateY(-50%); }

.ph5-hero2-title {
  font-size: .92rem; font-weight: 900; color: #fff;
  line-height: 1.2; margin-bottom: 8px; letter-spacing: -.01em;
}
.ph5-hero2-sub {
  font-size: .6rem; color: rgba(255,255,255,.38); line-height: 1.7;
  margin-bottom: 18px; max-width: 280px;
}
.ph5-hero2-stats {
  display: flex; align-items: center; gap: 0;
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.08);
  border-radius: 12px; overflow: hidden; width: 100%;
}
.ph5-hero2-stat {
  flex: 1; display: flex; flex-direction: column; align-items: center;
  padding: 10px 8px;
}
.ph5-hero2-stat-val { font-size: .85rem; font-weight: 900; color: #FF6200; line-height: 1; }
.ph5-hero2-stat-lbl { font-size: .46rem; color: rgba(255,255,255,.3); text-transform: uppercase; letter-spacing: .07em; margin-top: 3px; }
.ph5-hero2-stat-sep { width: 1px; height: 32px; background: rgba(255,255,255,.07); flex-shrink: 0; }
.ph5-glow { display: none; }
.ph5-ring { display: none; }
.ph5-ring-inner { display: none; }
.ph5-hero-body { display: none; }
.ph5-hero-sep { display: none; }
.ph5-title { display: none; }

/* Chip */
.ph5-badge {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(255,98,0,.1);
  border: 1px solid rgba(255,98,0,.28);
  color: var(--primary);
  font-size: .46rem; font-weight: 600; letter-spacing: .12em;
  padding: 3px 9px; border-radius: 99px; text-transform: uppercase;
  margin-bottom: 14px;
}
.ph5-badge i { font-size: .4rem; }

/* Trio de cercles */
.ph5-trio {
  display: flex; align-items: center; justify-content: center;
  gap: 0; margin-bottom: 14px; width: 100%;
}
.ph5-trio-item {
  display: flex; flex-direction: column; align-items: center; gap: 5px;
}
.ph5-trio-line {
  flex: 1; height: 1px; background: rgba(255,98,0,.25);
  max-width: 32px;
}
.ph5-trio-circle {
  width: 44px; height: 44px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: .75rem;
}
.ph5-trio-circle--fill {
  background: var(--primary);
  color: #fff;
  box-shadow: 0 0 0 3px rgba(255,98,0,.15);
}
.ph5-trio-circle--mid {
  background: rgba(255,98,0,.12);
  border: 1.5px solid rgba(255,98,0,.4);
  color: var(--primary);
  font-size: .65rem; font-weight: 800; letter-spacing: .02em;
}
.ph5-trio-circle--outline {
  background: transparent;
  border: 1.5px solid rgba(255,255,255,.15);
  color: rgba(255,255,255,.5);
  font-size: .65rem;
}
.ph5-trio-lbl {
  font-size: .5rem; font-weight: 500; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em;
}

/* Textes */
.ph5-brand {
  font-size: .88rem; font-weight: 700; color: var(--primary);
  letter-spacing: .01em; margin-bottom: 6px; line-height: 1.25;
}
.ph5-sub {
  font-size: .6rem; font-weight: 300; color: rgba(255,255,255,.35);
  line-height: 1.65; margin-bottom: 12px;
}

/* Bouton principal */
.ph5-tag {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--primary);
  border: none; color: #fff;
  font-size: .58rem; font-weight: 600;
  padding: 7px 16px; border-radius: 99px;
  cursor: pointer; font-family: var(--font);
  transition: background .2s;
}
.ph5-tag:hover { background: var(--primary-dark); }

/* Ancienne classe conservée pour compatibilité */
.ph5-why-btn {
  display: inline-flex; align-items: center; gap: 5px;
  background: transparent; border: 1px solid rgba(255,255,255,.18);
  color: rgba(255,255,255,.55); font-size: .58rem; font-weight: 400; font-family: var(--font);
  padding: 7px 14px; border-radius: 99px; cursor: pointer; transition: border-color .2s, color .2s;
}
.ph5-why-btn:hover { border-color: rgba(255,98,0,.4); color: rgba(255,255,255,.8); }
.ph5-why-icon { font-size: .5rem; transition: transform .3s; }
.ph5-why-icon.open { transform: rotate(180deg); }

/* Accordéon autonome — style "éditorial minimal" (direction C choisie
   par l'utilisateur le 24/08 : pas d'icône, numérotation discrète en
   bleu marine, chevron fin). Une carte blanche distincte par accordéon
   (demande explicite du 24/08 : "crée une section pour chaque"), plutôt
   qu'un seul cadre continu avec un filet entre les deux lignes. */
.ph5-accordion {
  margin-bottom: 0;
  background: #fff; border: 1px solid #E8E9EE; border-radius: 16px;
  padding: 2px 18px;
}
.ph5-acc-btn {
  width: 100%; display: flex; align-items: center; justify-content: flex-start;
  background: transparent;
  border: none;
  border-radius: 0; color: #16121F;
  font-size: .68rem; font-weight: 700; font-family: var(--font);
  padding: 14px 0; cursor: pointer;
  transition: background .2s;
  letter-spacing: .01em;
}
.ph5-acc-btn .ph5-why-icon { color: #0F0A2E; opacity: .3; flex-shrink: 0; margin-left: auto; }
.ph5-acc-btn:hover { background: var(--gray-100); }
.ph5-acc-btn.open .ph5-acc-num { color: #FF6200; }

/* Numéro discret remplaçant l'ancienne icône */
.ph5-acc-num { font-size: .66rem; font-weight: 800; color: #0F0A2E; width: 16px; flex-shrink: 0; transition: color .2s; }
.ph5-acc-title { font-size: .86rem; font-weight: 800; color: #16121F; line-height: 1.3; }
.ph5-acc-sub   { font-size: .7rem; font-weight: 450; color: #5B5F6E; line-height: 1.5; margin-top: 3px; }

/* Bouton CTA partenaire */
.ph5-cta-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; background: #FF6200;
  border: none; border-radius: 12px;
  color: #fff; font-size: .72rem; font-weight: 700; font-family: var(--font);
  padding: 13px 20px; cursor: pointer; margin-bottom: 10px;
  box-shadow: 0 4px 18px rgba(255,98,0,.35);
  transition: opacity .2s, transform .15s;
}
.ph5-cta-btn:hover { opacity: .88; transform: translateY(-1px); }
.ph5-cta-btn:active { transform: translateY(0); }

/* ── Écran de connexion cabine (page entière, pas une modale) — voir
   showCabineLoginGate() dans js/cabine.js. Réutilise .pln-modal/.pln-*
   (mêmes classes que la modale de connexion partenaire d'index.html) pour
   un rendu identique, seul le conteneur change (plein écran plutôt que
   superposé au tableau de bord). ── */
.cab-login-gate {
  position: fixed; inset: 0; z-index: 3000;
  display: flex; align-items: center; justify-content: center;
  padding: 20px; box-sizing: border-box;
  background: #09090f;
}

/* ── Modal login partenaire (pln) ──────────────────────────────── */
.pln-modal {
  position: relative; overflow: hidden;
  background: #09090f;
  border: 1px solid rgba(255,98,0,.22);
  border-radius: 22px;
  width: 92%; max-width: 360px;
  animation: slideUp .28s ease;
  box-shadow: 0 0 0 1px rgba(255,255,255,.04) inset,
              0 30px 70px rgba(0,0,0,.7),
              0 0 60px rgba(255,98,0,.06);
}
/* Écran de paiement d'abonnement (#cab-abo-gate) : plus étroit que le
   login partenaire ci-dessus — override scopé pour ne pas rétrécir aussi
   l'écran de connexion, qui partage la même classe .pln-modal. */
#cab-abo-gate .pln-modal { max-width: 300px; }
#cab-abo-gate .pln-cta { width: 80%; margin: 0 auto; }
/* Steps indicator */
.pln-steps {
  display: flex; align-items: center; justify-content: center; gap: 0;
  padding: 4px 20px 12px;
}
.pln-step {
  width: 8px; height: 8px; border-radius: 99px;
  background: rgba(255,255,255,.15);
  transition: all .35s ease;
}
.pln-step--active { width: 24px; background: #FF6200; box-shadow: 0 0 8px rgba(255,98,0,.5); }
.pln-step--done   { background: rgba(255,98,0,.4); }
.pln-step-line { flex: 1; height: 1px; background: rgba(255,255,255,.08); margin: 0 6px; max-width: 40px; }
/* Slides */
.pln-slides { position: relative; overflow: hidden; }
.pln-slide {
  transition: transform .38s cubic-bezier(.4,0,.2,1), opacity .3s ease;
}
.pln-slide--hidden {
  display: none; opacity: 0; transform: translateX(40px);
}
.pln-slide--exit {
  opacity: 0; transform: translateX(-40px);
  pointer-events: none;
}
.pln-slide--enter {
  opacity: 1; transform: translateX(0);
}
/* Back button */
.pln-back-btn {
  width: 28px; height: 28px; border-radius: 50%;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.08);
  color: rgba(255,255,255,.5); font-size: .65rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .2s;
}
.pln-back-btn:hover { background: rgba(255,255,255,.12); }
/* Autre modèle de "retour" (demande explicite : "je ne veux pas de
   flèche ni de croix") — lien texte plutôt qu'une icône, même principe
   que .prg-topbar-close--text ; libellé/onclick reposés dynamiquement
   par openPartnerLoginModal()/prtGoStep() (js/client.js) selon l'étape
   ("Fermer" à l'étape 1, "Retour" à l'étape 2). */
.pln-back-btn--text {
  width: auto; height: auto; border-radius: 8px;
  background: none; border: none; padding: 5px 10px;
  font-family: var(--font); font-size: .66rem; font-weight: 700;
}
/* User card */
.pln-user-card {
  display: flex; align-items: center; gap: 12px;
  margin: 0 16px 14px;
  background: rgba(255,98,0,.06); border: 1px solid rgba(255,98,0,.18);
  border-radius: 14px; padding: 12px 14px;
}
.pln-user-ava {
  width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(135deg,#c94e00,#FF6200);
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem; font-weight: 900; color: #fff; text-transform: uppercase;
}
.pln-user-name { font-size: .72rem; font-weight: 800; color: #fff; margin-bottom: 2px; }
.pln-user-tel  { font-size: .58rem; color: rgba(255,255,255,.35); }
.pln-glow {
  position: absolute; top: -80px; left: 50%; transform: translateX(-50%);
  width: 260px; height: 200px; border-radius: 50%;
  background: radial-gradient(ellipse, rgba(255,98,0,.15) 0%, transparent 70%);
  pointer-events: none;
}
.pln-topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 16px 0;
}
.pln-brand {
  display: flex; align-items: center; gap: 6px;
  font-size: .52rem; font-weight: 800; color: rgba(255,98,0,.7);
  text-transform: uppercase; letter-spacing: .12em;
}
.pln-brand-dot {
  width: 6px; height: 6px; border-radius: 50%; background: #FF6200;
  box-shadow: 0 0 6px #FF6200;
}
.pln-hero {
  display: flex; flex-direction: column; align-items: center;
  padding: 20px 20px 14px;
}
.pln-hero-ring {
  width: 62px; height: 62px; border-radius: 50%;
  background: conic-gradient(from 0deg, #FF6200, #ff8c42, #FF6200);
  padding: 2px; margin-bottom: 14px;
  box-shadow: 0 0 24px rgba(255,98,0,.3);
}
.pln-hero-ico {
  width: 100%; height: 100%; border-radius: 50%;
  background: #09090f;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.2rem; color: #FF6200;
}
.pln-hero-title { font-size: .95rem; font-weight: 900; color: #fff; margin-bottom: 5px; letter-spacing: -.02em; }
.pln-hero-sub   { font-size: .57rem; color: rgba(255,255,255,.3); }
.pln-denied {
  display: flex; align-items: center; gap: 10px;
  background: rgba(239,68,68,.08); border: 1px solid rgba(239,68,68,.25);
  border-radius: 10px; padding: 10px 14px; margin: 0 16px 12px;
  font-size: .6rem; color: #f87171;
}
.pln-denied i { font-size: .8rem; flex-shrink: 0; }
/* Statut "vérification en cours" — remplace le bouton "Continuer" de
   l'étape 1 de connexion (voir _agLoginAutoAdvance(), js/client.js), qui
   avance désormais toute seule dès que le numéro est complet. */
.pln-form { padding: 0 16px 16px; display: flex; flex-direction: column; gap: 14px; }
.pln-field { display: flex; flex-direction: column; gap: 6px; }
.pln-remember { display: flex; align-items: center; gap: 9px; cursor: pointer; user-select: none; margin-top: -4px; }
.pln-remember input[type="checkbox"] { display: none; }
.pln-remember-box {
  flex-shrink: 0; width: 18px; height: 18px; border-radius: 6px;
  background: rgba(255,255,255,.04); border: 1.5px solid rgba(255,255,255,.15);
  display: flex; align-items: center; justify-content: center;
  transition: background .2s, border-color .2s;
}
.pln-remember-box i { font-size: .5rem; color: #17110c; opacity: 0; transform: scale(.6); transition: opacity .15s, transform .15s; }
.pln-remember input[type="checkbox"]:checked + .pln-remember-box {
  background: linear-gradient(135deg, #ff9a3c, #ff6200); border-color: transparent;
}
.pln-remember input[type="checkbox"]:checked + .pln-remember-box i { opacity: 1; transform: scale(1); }
.pln-remember-txt { font-size: .6rem; color: rgba(255,255,255,.55); }
.pln-label { font-size: .52rem; font-weight: 700; color: rgba(255,255,255,.35); text-transform: uppercase; letter-spacing: .08em; display: flex; align-items: center; gap: 5px; }
.pln-label i { font-size: .5rem; color: rgba(255,98,0,.5); }
.pln-input-wrap {
  display: flex; align-items: center;
  background: rgba(255,255,255,.04); border: 1.5px solid rgba(255,255,255,.1);
  border-radius: 12px; overflow: hidden;
  transition: border-color .2s, box-shadow .2s;
}
.pln-input-wrap:focus-within {
  border-color: rgba(255,98,0,.5);
  box-shadow: 0 0 0 3px rgba(255,98,0,.1);
}
.pln-prefix {
  font-size: .62rem; font-weight: 700; color: rgba(255,255,255,.5);
  padding: 0 12px; white-space: nowrap; flex-shrink: 0;
}
.pln-sep { width: 1px; height: 22px; background: rgba(255,255,255,.1); flex-shrink: 0; }
.pln-input {
  flex: 1; background: none; border: none; outline: none;
  color: #fff; font-family: var(--font); font-size: .72rem;
  padding: 12px 14px;
}
.pln-pin-row { display: flex; gap: 10px; justify-content: center; }
.pln-pin-box {
  width: 52px; height: 52px; border-radius: 14px;
  background: rgba(255,255,255,.05); border: 1.5px solid rgba(255,255,255,.1);
  color: #FF6200; font-size: 1.4rem; text-align: center;
  font-family: var(--font); outline: none;
  transition: border-color .2s, background .2s, box-shadow .2s;
  -webkit-text-security: disc;
}
.pln-pin-box:focus {
  border-color: #FF6200; background: rgba(255,98,0,.08);
  box-shadow: 0 0 0 3px rgba(255,98,0,.15);
}
.pln-pin-box:not(:placeholder-shown) { border-color: rgba(255,98,0,.4); }
.pln-pin-hint {
  font-size: .5rem; color: rgba(255,255,255,.2); text-align: center;
  display: flex; align-items: center; justify-content: center; gap: 4px;
}
/* Ancien pln-btn-wrap conservé pour compatibilité */
.pln-btn-wrap { display: flex; gap: 10px; }
.pln-btn { display: none; }
.pln-btn-circle { display: none; }

/* ── Nouveau bouton CTA partenaire ─────────────────────────────── */
.pln-cta {
  position: relative; width: 100%; height: 52px;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 6px 0 20px;
  background: transparent;
  border: none; border-radius: 16px; cursor: pointer;
  font-family: var(--font); overflow: hidden;
  transition: transform .18s, box-shadow .2s;
}
.pln-cta::before {
  content: ''; position: absolute; inset: 0; border-radius: 16px;
  padding: 1.5px;
  background: linear-gradient(135deg, #FF6200, #ff9a52, #c94e00);
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  animation: plnBorderSpin 4s linear infinite;
}
@keyframes plnBorderSpin {
  0%   { background-position: 0% 50%; }
  50%  { background-position: 100% 50%; }
  100% { background-position: 0% 50%; }
}
.pln-cta-bg {
  position: absolute; inset: 0; border-radius: 16px;
  background: linear-gradient(135deg, rgba(201,78,0,.18), rgba(255,98,0,.1));
  transition: background .25s;
}
.pln-cta:hover .pln-cta-bg {
  background: linear-gradient(135deg, rgba(201,78,0,.35), rgba(255,98,0,.22));
}
.pln-cta:hover  { transform: translateY(-1px); box-shadow: 0 8px 24px rgba(255,98,0,.25); }
.pln-cta:active { transform: translateY(0); }
.pln-cta-label {
  position: relative; z-index: 1;
  font-size: .77rem; font-weight: 800; color: #fff; letter-spacing: .02em;
}
.pln-cta-arrow {
  position: relative; z-index: 1; flex-shrink: 0;
  width: 40px; height: 40px; border-radius: 11px;
  background: linear-gradient(135deg, #c94e00, #FF6200);
  display: flex; align-items: center; justify-content: center;
  font-size: .78rem; color: #fff;
  box-shadow: 0 4px 14px rgba(255,98,0,.45);
  transition: transform .18s;
}
.pln-cta:hover .pln-cta-arrow { transform: translateX(3px); }
/* Banner "Devenir partenaire" — v3 */
.pln-join3 {
  position: relative; overflow: hidden;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin: 0 14px 16px; padding: 13px 12px 13px 13px;
  background: linear-gradient(135deg, #1a0900 0%, #2d1200 50%, #1a0900 100%);
  border: 1px solid rgba(255,98,0,.35);
  border-radius: 16px; cursor: pointer; width: calc(100% - 28px);
  font-family: var(--font); text-align: left;
  box-shadow: 0 4px 20px rgba(255,98,0,.12), 0 0 0 1px rgba(255,98,0,.08) inset;
  transition: transform .18s, box-shadow .2s;
}
.pln-join3:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 28px rgba(255,98,0,.22), 0 0 0 1px rgba(255,98,0,.15) inset;
}
.pln-join3-glow {
  position: absolute; top: -30px; right: 30px;
  width: 100px; height: 80px; border-radius: 50%;
  background: radial-gradient(ellipse, rgba(255,98,0,.2), transparent 70%);
  pointer-events: none;
}
.pln-join3-left { display: flex; align-items: center; gap: 11px; }
.pln-join3-ico {
  width: 38px; height: 38px; border-radius: 11px; flex-shrink: 0;
  background: linear-gradient(135deg,#c94e00,#FF6200);
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem; color: #fff;
  box-shadow: 0 4px 12px rgba(255,98,0,.4);
}
.pln-join3-title { font-size: .75rem; font-weight: 900; color: #fff; margin-bottom: 2px; }
.pln-join3-sub   { font-size: .55rem; color: rgba(255,255,255,.35); }
.pln-join3-tag {
  flex-shrink: 0; display: flex; align-items: center; gap: 5px;
  background: rgba(255,98,0,.15); border: 1px solid rgba(255,98,0,.3);
  border-radius: 999px; padding: 5px 12px;
  font-size: .58rem; font-weight: 800; color: #FF6200;
  transition: background .2s, gap .2s;
}
.pln-join3:hover .pln-join3-tag { background: #FF6200; color: #fff; gap: 8px; }

/* Bande reset mot de passe — étape 2 */
.pln-reset-strip {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin: 0 14px 14px; padding: 10px 10px 10px 14px;
  background: rgba(255,255,255,.03);
  border: 1px dashed rgba(255,255,255,.1);
  border-radius: 12px;
}
.pln-reset-left {
  display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0;
}
.pln-reset-ico {
  width: 26px; height: 26px; border-radius: 7px; flex-shrink: 0;
  background: rgba(255,255,255,.06);
  display: flex; align-items: center; justify-content: center;
  font-size: .58rem; color: rgba(255,255,255,.3);
}
.pln-reset-left > span {
  font-size: .65rem; font-weight: 600; color: rgba(255,255,255,.35);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.pln-reset-cta {
  flex-shrink: 0;
  background: none; border: 1px solid rgba(15,10,46,.35);
  border-radius: 8px; padding: 5px 12px;
  color: #0F0A2E; font-size: .6rem; font-weight: 800;
  font-family: var(--font); cursor: pointer;
  display: flex; align-items: center; gap: 6px;
  transition: background .2s, border-color .2s;
}
.pln-reset-cta:hover { background: rgba(15,10,46,.08); border-color: rgba(15,10,46,.6); }
.pln-reset-cta i { font-size: .5rem; transition: transform .2s; }
.pln-reset-cta:hover i { transform: translateX(3px); }

.pln-footer {
  border-top: 1px solid rgba(255,255,255,.06);
  padding: 6px 12px 12px;
  display: flex; flex-direction: column; gap: 0;
}
.pln-footer-row {
  width: 100%; display: flex; align-items: center; gap: 12px;
  background: none; border: none; cursor: pointer; font-family: var(--font);
  padding: 10px 8px; border-radius: 10px;
  transition: background .18s;
  text-align: left;
}
.pln-footer-row:hover { background: rgba(255,255,255,.04); }
.pln-footer-ico {
  width: 34px; height: 34px; border-radius: 9px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .72rem;
}
.pln-footer-ico--gray   { background: rgba(255,255,255,.07); color: rgba(255,255,255,.4); }
.pln-footer-ico--orange { background: rgba(255,98,0,.12); color: #FF6200; border: 1px solid rgba(255,98,0,.2); }
.pln-footer-text { flex: 1; display: flex; flex-direction: column; gap: 2px; }
.pln-footer-label { font-size: .62rem; font-weight: 700; color: rgba(255,255,255,.55); }
.pln-footer-hint  { font-size: .52rem; color: rgba(255,255,255,.45); }
.pln-footer-arr   { font-size: .5rem; color: rgba(255,255,255,.2); flex-shrink: 0; }
.pln-footer-divider { height: 1px; background: rgba(255,255,255,.05); margin: 0 8px; }

/* ── Connexion "Espace Partenaire" — thème clair (direction B choisie
   via canvas de design le 24/08 : "je veux un fond blanc et les
   écritures en noir", modèle "tout blanc" retenu). Le patron .pln-*
   ci-dessus reste sombre pour ses autres usages (#cab-abo-gate) — cet
   override est scopé à #modal-partner-login uniquement, dans la
   continuité de l'override existant sur .pln-user-card. */
#modal-partner-login .pln-modal {
  background: #fff; border: 1px solid #E8E9EE;
  box-shadow: 0 8px 32px rgba(16,18,31,.14);
}
#modal-partner-login .pln-glow { display: none; }
#modal-partner-login .pln-back-btn {
  background: var(--gray-100); border: 1px solid #E8E9EE; color: var(--gray-600);
}
#modal-partner-login .pln-back-btn:hover { background: #E8E9EE; }
#modal-partner-login .pln-back-btn--text { background: none; border: none; }
#modal-partner-login .pln-back-btn--text:hover { background: var(--gray-100); }
#modal-partner-login .pln-step { background: #E8E9EE; }
#modal-partner-login .pln-step--active { background: #0F0A2E; box-shadow: none; }
#modal-partner-login .pln-step--done { background: rgba(15,10,46,.35); }
#modal-partner-login .pln-step-line { background: #E8E9EE; }
#modal-partner-login .pln-hero-ring { background: rgba(15,10,46,.06); box-shadow: none; padding: 0; }
#modal-partner-login .pln-hero-ico { background: transparent; color: #0F0A2E; }
#modal-partner-login .pln-hero-title { color: #16121F; }
#modal-partner-login .pln-hero-sub { color: var(--gray-500); }
#modal-partner-login .pln-label { color: var(--gray-500); }
#modal-partner-login .pln-label i { color: #0F0A2E; opacity: .5; }
#modal-partner-login .pln-input-wrap {
  background: #fff; border: 1.5px solid #E8E9EE;
}
#modal-partner-login .pln-input-wrap:focus-within {
  border-color: #0F0A2E; box-shadow: 0 0 0 3px rgba(15,10,46,.08);
}
#modal-partner-login .pln-input { color: #16121F; }
#modal-partner-login .pln-input::placeholder { color: #C7CAD2; }
#modal-partner-login .pln-denied { color: #dc2626; }
/* Bouton d'action simplifié (demande explicite : "propose un autre
   modèle simple") — plus de boîte séparée autour de la flèche ni
   d'ombre portée, juste l'icône posée à côté du texte. */
#modal-partner-login .pln-cta::before { display: none; }
#modal-partner-login .pln-cta-bg { background: #0F0A2E; }
#modal-partner-login .pln-cta:hover .pln-cta-bg { background: #1B234F; }
#modal-partner-login .pln-cta:hover { box-shadow: none; }
/* Bouton "Continuer" : sans flèche, libellé centré (demande explicite). */
#modal-partner-login .pln-cta {
  justify-content: center;
  padding: 0 20px;
}
#modal-partner-login .pln-cta-arrow { display: none; }
#modal-partner-login .pln-join3 {
  background: var(--gray-100); border: 1px solid #E8E9EE; box-shadow: none;
}
#modal-partner-login .pln-join3:hover { box-shadow: none; }
#modal-partner-login .pln-join3-glow { display: none; }
#modal-partner-login .pln-join3-ico {
  background: rgba(255,98,0,.1); box-shadow: none; color: #FF6200;
}
#modal-partner-login .pln-join3-title { color: #16121F; }
#modal-partner-login .pln-join3-sub { color: var(--gray-500); }
#modal-partner-login .pln-reset-strip { background: var(--gray-100); border: 1px dashed #E8E9EE; }
#modal-partner-login .pln-reset-ico { background: #fff; color: var(--gray-500); }
#modal-partner-login .pln-reset-left > span { color: var(--gray-500); }

/* ── Connexion "Espace Cabine" (cabine.html) — même demande que ci-dessus
   ("uniquement un fond blanc, et les écritures en bleu marine et noir"),
   scopée à #cab-login-gate uniquement : #cab-abo-gate (paiement
   d'abonnement) partage la même classe .cab-login-gate mais reste sombre,
   avec des styles inline qui supposent ce fond (jamais touché ici). */
#cab-login-gate .pln-modal {
  background: #fff; border: 1px solid #E8E9EE;
  box-shadow: 0 8px 32px rgba(16,18,31,.14);
}
#cab-login-gate .pln-glow { display: none; }
#cab-login-gate .pln-brand { color: #0F0A2E; }
#cab-login-gate .pln-brand-dot { background: #0F0A2E; box-shadow: none; }
#cab-login-gate .pln-hero-ring { background: rgba(15,10,46,.06); box-shadow: none; padding: 0; }
#cab-login-gate .pln-hero-ico { background: transparent; color: #0F0A2E; }
#cab-login-gate .pln-hero-title { color: #16121F; }
#cab-login-gate .pln-hero-sub { color: var(--gray-500); }
#cab-login-gate .pln-label { color: var(--gray-500); }
#cab-login-gate .pln-label i { color: #0F0A2E; opacity: .5; }
#cab-login-gate .pln-input-wrap {
  background: #fff; border: 1.5px solid #E8E9EE;
}
#cab-login-gate .pln-input-wrap:focus-within {
  border-color: #0F0A2E; box-shadow: 0 0 0 3px rgba(15,10,46,.08);
}
#cab-login-gate .pln-input { color: #16121F; }
#cab-login-gate .pln-input::placeholder { color: #C7CAD2; }
#cab-login-gate .pln-denied { color: #dc2626; }
#cab-login-gate .pln-cta::before { display: none; }
#cab-login-gate .pln-cta-bg { background: #0F0A2E; }
#cab-login-gate .pln-cta:hover .pln-cta-bg { background: #1B234F; }
#cab-login-gate .pln-cta:hover { box-shadow: 0 8px 24px rgba(15,10,46,.2); }
#cab-login-gate .pln-cta-arrow { background: rgba(255,255,255,.15); box-shadow: none; }
#cab-login-gate .pw-field-wrap--dark .pw-field-eye { color: var(--gray-400); }
#cab-login-gate .pw-field-wrap--dark .pw-field-eye:hover { color: var(--gray-600); }
#admin-login-gate .pw-field-wrap--dark .pw-field-eye { color: var(--gray-400); }
#admin-login-gate .pw-field-wrap--dark .pw-field-eye:hover { color: var(--gray-600); }

/* ── Modal choix partenaire (pa-modal) ─────────────────────────── */
.pa-modal {
  position: relative; overflow: hidden;
  background: #0c0c15;
  border: 1px solid rgba(255,98,0,.2);
  border-radius: 24px;
  width: 92%; max-width: 340px;
  padding: 28px 22px 20px;
  animation: slideUp .28s ease;
  box-shadow: 0 24px 60px rgba(0,0,0,.6), 0 0 0 1px rgba(255,255,255,.04) inset;
}
.pa-bg-blob {
  position: absolute; top: -40px; right: -40px;
  width: 160px; height: 160px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.18) 0%, transparent 70%);
  pointer-events: none;
}
.pa-close {
  position: absolute; top: 14px; right: 14px;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.08);
  width: 28px; height: 28px; border-radius: 50%;
  color: rgba(255,255,255,.5); font-size: .7rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .2s;
}
.pa-close:hover { background: rgba(255,255,255,.12); }
.pa-brand {
  display: flex; align-items: center; gap: 8px; margin-bottom: 18px;
}
.pa-brand-mark {
  width: 32px; height: 32px; border-radius: 8px;
  background: #FF6200;
  display: flex; align-items: center; justify-content: center;
  font-size: .7rem; font-weight: 900; color: #fff; font-family: var(--font);
  flex-shrink: 0; letter-spacing: -.5px;
}
.pa-brand-mark span { color: rgba(255,255,255,.7); }
.pa-brand-tag {
  font-size: .5rem; font-weight: 700; color: rgba(255,98,0,.7);
  text-transform: uppercase; letter-spacing: .1em;
}
.pa-title {
  font-size: 1.1rem; font-weight: 900; color: #fff;
  letter-spacing: -.02em; margin-bottom: 5px;
}
.pa-sub {
  font-size: .58rem; color: rgba(255,255,255,.3); margin-bottom: 18px;
}
.pa-divider-line {
  height: 1px; background: linear-gradient(90deg, #FF6200 0%, rgba(255,98,0,.0) 100%);
  margin-bottom: 18px; opacity: .3;
}
.pa-actions { display: flex; flex-direction: column; gap: 10px; margin-bottom: 18px; }
.pa-action {
  width: 100%; display: flex; align-items: center; justify-content: space-between;
  gap: 12px; border-radius: 14px; padding: 13px 14px;
  cursor: pointer; border: none; font-family: var(--font);
  transition: transform .15s, opacity .2s;
  text-align: left;
}
.pa-action:active { transform: scale(.98); }
.pa-action--primary {
  background: linear-gradient(135deg, #e55a00, #FF6200);
  box-shadow: 0 6px 20px rgba(255,98,0,.35);
}
.pa-action--ghost {
  background: rgba(255,255,255,.03);
  border: 1px solid rgba(255,255,255,.09) !important;
}
.pa-action--ghost:hover { background: rgba(255,98,0,.06); border-color: rgba(255,98,0,.3) !important; }
.pa-action-left { display: flex; align-items: center; gap: 11px; }
.pa-action-ico {
  width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .8rem;
}
.pa-action-ico--solid  { background: rgba(255,255,255,.18); color: #fff; }
.pa-action-ico--outline { background: rgba(255,98,0,.1); border: 1px solid rgba(255,98,0,.3); color: #FF6200; }
.pa-action-title { font-size: .72rem; font-weight: 800; color: #fff; margin-bottom: 2px; }
.pa-action-sub   { font-size: .52rem; color: rgba(255,255,255,.45); }
.pa-action--ghost .pa-action-sub { color: rgba(255,255,255,.3); }
.pa-action-arr   { font-size: .6rem; color: rgba(255,255,255,.4); flex-shrink: 0; }
.pa-action--primary .pa-action-arr { color: rgba(255,255,255,.6); }
.pa-footer {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-size: .52rem; color: rgba(255,255,255,.2);
  padding-top: 14px; border-top: 1px solid rgba(255,255,255,.05);
}

/* ── Modal login Admin (adx) ───────────────────────────────────── */
/* ── Écran de connexion admin (carte centrée plein écran, pas une
   modale) — voir showAdminLoginGate() dans js/admin.js. Réutilise
   .adx-modal/.adx-* (mêmes classes que la modale de connexion admin
   d'index.html). ── */
.admin-login-gate {
  position: fixed; inset: 0; z-index: 3000;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 16px; padding: 20px; box-sizing: border-box;
  background: linear-gradient(180deg, #0F0A2E 0%, #170F42 45%, #07070f 100%);
}

/* Fond blanc, logo/badge "ADMIN" retirés (demande explicite) — .adx-*
   n'est utilisé que par cet unique écran (#admin-login-gate,
   espace-gestion.html), donc les règles de base sont directement
   converties au thème clair plutôt que scopées comme pour
   #modal-partner-login/#cab-login-gate (partagées avec un autre écran
   resté sombre). */
.adx-modal {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid #E8E9EE;
  border-radius: 22px; width: 92%; max-width: 360px;
  animation: slideUp .3s ease;
  box-shadow: 0 8px 32px rgba(16,18,31,.14);
}
.adx-grid { display: none; }
.adx-glow-top { display: none; }
.adx-slides { position: relative; overflow: hidden; }
.adx-slide { position: relative; z-index: 1; transition: transform .35s cubic-bezier(.4,0,.2,1), opacity .3s; }
.adx-slide--hidden { display: none; opacity: 0; transform: translateX(40px); }
.adx-slide--exit   { opacity: 0; transform: translateX(-40px); pointer-events: none; }
.adx-slide--enter  { opacity: 1; transform: translateX(0); }
.adx-hero {
  display: flex; flex-direction: column; align-items: center;
  padding: 18px 20px 14px;
}
.adx-hero-title { font-size: .95rem; font-weight: 900; color: #16121F; margin-bottom: 5px; letter-spacing: -.02em; }
.adx-hero-sub   { font-size: .57rem; color: var(--gray-500); }
.adx-form  { padding: 0 16px 16px; display: flex; flex-direction: column; gap: 14px; }
.adx-field { display: flex; flex-direction: column; gap: 6px; }
.adx-label { font-size: .52rem; font-weight: 700; color: var(--gray-500); text-transform: uppercase; letter-spacing: .08em; display: flex; align-items: center; gap: 5px; }
.adx-label i { color: #7c3aed; opacity: .6; font-size: .5rem; }
.adx-input-wrap {
  display: flex; align-items: center;
  background: #fff; border: 1.5px solid #E8E9EE;
  border-radius: 12px; overflow: hidden; transition: border-color .2s, box-shadow .2s;
}
.adx-input-wrap:focus-within { border-color: #7c3aed; box-shadow: 0 0 0 3px rgba(109,40,217,.12); }
.adx-prefix { font-size: .62rem; font-weight: 700; color: var(--gray-500); padding: 0 12px; white-space: nowrap; flex-shrink: 0; }
.adx-sep   { width: 1px; height: 22px; background: #E8E9EE; flex-shrink: 0; }
.adx-input { flex: 1; background: none; border: none; outline: none; color: #16121F; font-family: var(--font); font-size: .72rem; padding: 12px 14px; }
.adx-input::placeholder { color: #C7CAD2; }
.adx-pin-row { display: flex; gap: 10px; justify-content: center; }
.adx-pin-box {
  width: 52px; height: 52px; border-radius: 14px;
  background: rgba(255,255,255,.04); border: 1.5px solid rgba(139,92,246,.2);
  color: #a78bfa; font-size: 1.4rem; text-align: center;
  font-family: var(--font); outline: none;
  transition: border-color .2s, background .2s, box-shadow .2s;
}
.adx-pin-box:focus { border-color: #7c3aed; background: rgba(109,40,217,.1); box-shadow: 0 0 0 3px rgba(109,40,217,.15); }
.adx-pin-box::-ms-reveal, .adx-pin-box::-ms-clear { display: none !important; }
/* "Rester connecté" — même structure que .pln-remember (modale cabine),
   accent violet plutôt qu'orange pour rester cohérent avec la palette de
   la modale admin (.adx-cta, .adx-pin-box). */
.adx-remember { display: flex; align-items: center; gap: 9px; cursor: pointer; user-select: none; margin-top: -4px; }
.adx-remember input[type="checkbox"] { display: none; }
.adx-remember-box {
  flex-shrink: 0; width: 18px; height: 18px; border-radius: 6px;
  background: rgba(255,255,255,.04); border: 1.5px solid rgba(139,92,246,.2);
  display: flex; align-items: center; justify-content: center;
  transition: background .2s, border-color .2s;
}
.adx-remember-box i { font-size: .5rem; color: #fff; opacity: 0; transform: scale(.6); transition: opacity .15s, transform .15s; }
.adx-remember input[type="checkbox"]:checked + .adx-remember-box {
  background: linear-gradient(135deg,#5b21b6,#7c3aed); border-color: transparent;
}
.adx-remember input[type="checkbox"]:checked + .adx-remember-box i { opacity: 1; transform: scale(1); }
.adx-remember-txt { font-size: .6rem; color: rgba(255,255,255,.55); }
/* Bouton d'action simplifié (demande explicite : "propose un autre
   modèle simple") — violet uni plutôt qu'un dégradé, plus de boîte
   séparée autour de la flèche ni d'ombre portée. */
.adx-cta {
  position: relative; overflow: hidden; width: 100%;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  padding: 0 20px; height: 50px;
  background: #7c3aed;
  border: none; border-radius: 14px; cursor: pointer; font-family: var(--font);
  color: #fff; box-shadow: none;
  transition: opacity .15s;
}
.adx-cta:hover { opacity: .9; }
.adx-cta > span { font-size: .75rem; font-weight: 800; }
.adx-cta-arr {
  width: auto; height: auto; flex-shrink: 0;
  background: none; display: flex; align-items: center;
  justify-content: center; font-size: .78rem;
  transition: background .2s, transform .18s;
}
.adx-cta:hover .adx-cta-arr { transform: translateX(3px); }
.adx-user-card {
  display: flex; align-items: center; gap: 12px;
  margin: 0 16px 14px;
  background: rgba(109,40,217,.08); border: 1px solid rgba(139,92,246,.2);
  border-radius: 14px; padding: 12px 14px;
}
.adx-user-ava {
  width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(135deg,#5b21b6,#7c3aed);
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem; font-weight: 900; color: #fff; text-transform: uppercase;
}
.adx-user-name { font-size: .72rem; font-weight: 800; color: #fff; margin-bottom: 3px; }
.adx-user-role { font-size: .55rem; color: #a78bfa; display: flex; align-items: center; gap: 4px; }
.adx-denied {
  display: flex; align-items: center; gap: 10px;
  background: rgba(239,68,68,.08); border: 1px solid rgba(239,68,68,.25);
  border-radius: 10px; padding: 10px 14px; margin: 0 16px 12px;
  font-size: .6rem; color: #dc2626;
}
.adx-denied i { font-size: .8rem; flex-shrink: 0; }
.adx-secure {
  text-align: center; font-size: .5rem; color: rgba(255,255,255,.45);
  padding: 0 16px 14px; display: flex; align-items: center; justify-content: center; gap: 5px;
}
.adx-steps {
  display: flex; align-items: center; justify-content: center; gap: 0;
  padding: 10px 20px 14px; position: relative; z-index: 1;
}
.adx-step {
  width: 8px; height: 8px; border-radius: 99px;
  background: rgba(255,255,255,.12); transition: all .35s ease;
}
.adx-step--active { width: 24px; background: #7c3aed; box-shadow: 0 0 8px rgba(124,58,237,.6); }
.adx-step--done   { background: rgba(124,58,237,.4); }
.adx-step-line    { flex: 1; height: 1px; background: rgba(139,92,246,.12); margin: 0 6px; max-width: 40px; }

/* ── Modal réinitialisation mot de passe (client) ─────────────── */
.rst-modal {
  background: #ffffff; border: 1px solid rgba(0,0,0,.08);
  border-radius: 20px; width: 92%; max-width: 340px;
  overflow: hidden; animation: slideUp .28s ease;
  box-shadow: 0 20px 50px rgba(0,0,0,.18);
}
.rst-header {
  background: #ffffff;
  border-bottom: 1px solid rgba(0,0,0,.07);
  padding: 22px 20px 18px; text-align: center; position: relative;
}
.rst-close {
  position: absolute; top: 10px; right: 12px;
  background: none; border: none; color: rgba(0,0,0,.4);
  font-size: .9rem; cursor: pointer;
}
.rst-header-ico {
  width: 50px; height: 50px; border-radius: 50%; margin: 0 auto 12px;
  background: rgba(15,10,46,.12); border: 2px solid rgba(15,10,46,.3);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem; color: #0F0A2E;
  box-shadow: 0 0 20px rgba(15,10,46,.2);
}
.rst-header-title { font-size: .85rem; font-weight: 800; color: #000000; margin-bottom: 5px; }
.rst-header-sub   { font-size: .57rem; color: rgba(0,0,0,.5); line-height: 1.5; }
.rst-body  { padding: 20px 18px; }
.rst-field { margin-bottom: 14px; }
.rst-label { font-size: .55rem; font-weight: 700; color: rgba(0,0,0,.5); display: block; margin-bottom: 6px; text-transform: uppercase; letter-spacing: .08em; }
.rst-input-wrap { position: relative; }
.rst-ico { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); font-size: .65rem; color: rgba(15,10,46,.7); }
.rst-input {
  width: 100%; background: var(--gray-100); border: 1.5px solid var(--gray-200);
  border-radius: 10px; color: #000000; font-family: var(--font);
  font-size: .68rem; padding: 10px 12px 10px 32px; box-sizing: border-box;
  outline: none; transition: border-color .2s;
}
.rst-input:focus { border-color: #0F0A2E; background: rgba(15,10,46,.05); }
.rst-btn {
  width: 100%; background: #0F0A2E; border: none; border-radius: 10px;
  color: #fff; font-size: .68rem; font-weight: 800; font-family: var(--font);
  padding: 12px; cursor: pointer; display: flex; align-items: center;
  justify-content: center; gap: 8px; box-shadow: 0 4px 14px rgba(15,10,46,.4);
  transition: opacity .2s;
}
.rst-btn:hover { opacity: .9; }
.rst-sent {
  display: flex; align-items: flex-start; gap: 12px;
  background: rgba(34,197,94,.08); border: 1px solid rgba(34,197,94,.25);
  border-radius: 12px; padding: 14px; margin-bottom: 4px;
  font-size: .57rem;
}
.rst-sent > i { color: #22c55e; font-size: 1.2rem; flex-shrink: 0; margin-top: 2px; }
.rst-sent-title { font-size: .68rem; font-weight: 800; color: #22c55e; margin-bottom: 5px; }
.rst-sent-msg   { color: rgba(0,0,0,.55); line-height: 1.6; }

/* Cases code PIN — .pin-box est sombre par défaut (voir plus bas), même
   surcharge claire que .ag-modal (fond blanc du même style). */
.rst-modal .pin-box {
  border: 1.5px solid rgba(0,0,0,.15);
  border-radius: 12px;
  background: var(--gray-100);
  color: #0F0A2E;
}
.rst-modal .pin-box:focus {
  border-color: #0F0A2E;
  box-shadow: 0 0 0 4px rgba(15,10,46,.14);
  background: #ffffff;
}
.rst-modal .pin-box.pin-filled {
  border-color: #0F0A2E;
  background: #0F0A2E;
  color: #fff;
}

/* ── Tableau admin — réinitialisations ─────────────────────────── */
.rst-admin-row {
  display: flex; align-items: flex-start; justify-content: space-between;
  padding: 14px 16px; border-bottom: 1px solid rgba(255,255,255,.05);
  gap: 12px;
}
.rst-admin-row:last-child { border-bottom: none; }
.rst-admin-info { flex: 1; min-width: 0; }
.rst-admin-name { font-size: .78rem; font-weight: 700; color: var(--text); margin-bottom: 4px; display: flex; align-items: center; gap: 6px; }
.rst-admin-meta { font-size: .68rem; color: var(--text-muted); margin-bottom: 3px; display: flex; align-items: center; gap: 6px; }
.rst-admin-date { font-size: .63rem; color: var(--text-muted); display: flex; align-items: center; gap: 5px; }
.rst-admin-actions { display: flex; flex-direction: column; align-items: flex-end; flex-shrink: 0; }

/* ── Modal inscription partenaire v2 ───────────────────────────── */
/* Thème clair (même modèle que la modale admin "Créer un nouveau compte",
   voir .form-control/.form-label/.type-card, admin.html) — remplace
   l'ancien thème sombre de ce formulaire, demande explicite pour que la
   candidature partenaire (côté client) ressemble à la création de compte
   côté admin. Structure inchangée (3 étapes, bandeaux "01/02/03", champ
   "Code de parrainage" déjà présent — voir #prg-parrain-code plus bas). */
.prg-modal {
  background: var(--white); border: 1px solid var(--gray-200);
  border-radius: 22px; width: 94%; max-width: 390px;
  max-height: 92vh; display: flex; flex-direction: column;
  overflow: hidden; animation: slideUp .3s cubic-bezier(.16,1,.3,1);
  box-shadow: 0 24px 60px rgba(0,0,0,.18);
}

/* Topbar */
.prg-topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 16px 12px; flex-shrink: 0;
}
.prg-topbar-brand { display: flex; align-items: center; gap: 9px; }
.prg-topbar-title { font-size: .72rem; font-weight: 800; color: var(--gray-800); }
.prg-topbar-close {
  width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0;
  background: var(--gray-100); border: none; color: var(--gray-600);
  font-size: .7rem; cursor: pointer; display: flex; align-items: center; justify-content: center;
  transition: background .15s;
}
.prg-topbar-close:hover { background: #FEE2E2; color: #EF4444; }
/* Autre modèle de "retour" (demande explicite : "je ne veux pas de
   croix ni aussi de flèche") — simple lien texte plutôt qu'une icône. */
.prg-topbar-close--text {
  width: auto; height: auto; border-radius: 8px; flex-shrink: 0;
  background: none; padding: 5px 10px;
  font-family: var(--font); font-size: .66rem; font-weight: 700;
}
.prg-topbar-close--text:hover { background: var(--gray-100); color: var(--gray-800); }

/* Stepper */
.prg-stepper {
  display: flex; align-items: center; justify-content: space-between; padding: 12px 20px; flex-shrink: 0;
  border-bottom: 1px solid var(--gray-200);
}
.prg-stp { display: flex; flex-direction: column; align-items: center; gap: 4px; flex-shrink: 0; }
.prg-stp-num {
  width: 28px; height: 28px; border-radius: 50%;
  background: var(--gray-100); border: 2px solid var(--gray-300);
  display: flex; align-items: center; justify-content: center;
  font-size: .6rem; font-weight: 800; color: var(--gray-400);
  transition: all .3s;
}
.prg-stp-lbl { font-size: .46rem; color: var(--gray-500); font-weight: 600; white-space: nowrap; transition: color .3s; }
.prg-stp--active .prg-stp-num { background: #0F0A2E; border-color: #0F0A2E; color: #fff; box-shadow: 0 0 12px rgba(15,10,46,.35); }
.prg-stp--active .prg-stp-lbl { color: #0F0A2E; }
.prg-stp--done .prg-stp-num   { background: rgba(34,197,94,.12); border-color: #22c55e; color: #22c55e; }
.prg-stp--done .prg-stp-lbl   { color: #22c55e; }
.prg-stp-line { flex: 1; height: 2px; background: var(--gray-200); margin: 0 6px; margin-bottom: 14px; transition: background .3s; }
.prg-stp-line--done { background: #22c55e; }

/* Step hero */
.prg-step-hero {
  position: relative; overflow: hidden;
  background: rgba(15,10,46,.05); border: 1px solid rgba(15,10,46,.15);
  border-radius: 14px; padding: 14px 16px; margin-bottom: 16px;
}
.prg-step-hero-num {
  position: absolute; right: -4px; top: -8px;
  font-size: 3.5rem; font-weight: 900; color: rgba(15,10,46,.08);
  line-height: 1; letter-spacing: -.05em; pointer-events: none; user-select: none;
}
.prg-step-hero-tag {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: .5rem; font-weight: 700; color: #0F0A2E;
  background: rgba(15,10,46,.1); border: 1px solid rgba(15,10,46,.25);
  padding: 3px 9px; border-radius: 99px; margin-bottom: 6px;
  text-transform: uppercase; letter-spacing: .08em;
}
.prg-step-hero-title { font-size: .78rem; font-weight: 800; color: var(--gray-800); }

/* Corps */
.prg-body  { flex: 1; overflow-y: auto; padding: 16px; }
.prg-panel { }
.prg-section-title {
  display: flex; align-items: center; gap: 7px;
  font-size: .6rem; font-weight: 700; color: #0F0A2E;
  text-transform: uppercase; letter-spacing: .1em;
  margin-bottom: 14px; padding-bottom: 8px;
  border-bottom: 1px solid rgba(15,10,46,.15);
}
.prg-notice {
  display: flex; align-items: flex-start; gap: 7px;
  background: rgba(56,189,248,.08); border: 1px solid rgba(56,189,248,.25);
  border-radius: 8px; padding: 8px 10px; margin-bottom: 14px;
  font-size: .55rem; color: var(--gray-600); line-height: 1.5;
}
.prg-field  { margin-bottom: 12px; }
.prg-label  {
  font-size: .74rem; font-weight: 600; color: var(--gray-700);
  display: block; margin-bottom: 5px;
}
.prg-consent {
  display: flex; align-items: flex-start; gap: 9px;
  margin: 6px 0 4px; cursor: pointer;
  font-size: .72rem; line-height: 1.5; color: var(--gray-700);
}
.prg-consent input { margin-top: 2px; width: 16px; height: 16px; flex-shrink: 0; accent-color: #0F0A2E; cursor: pointer; }
.prg-consent a { color: #0F0A2E; font-weight: 600; }
.prg-input-wrap { position: relative; }
.prg-ico    { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); font-size: .65rem; color: rgba(15,10,46,.65); }
.prg-input  {
  width: 100%; background: var(--white); border: 1.5px solid var(--gray-300);
  border-radius: var(--radius); color: var(--gray-800); font-family: var(--font);
  font-size: .74rem; padding: 10px 12px; box-sizing: border-box;
  outline: none; transition: border-color .2s, background .2s;
}
.prg-input--icon { padding-left: 33px; }
.prg-input:focus { border-color: #0F0A2E; background: rgba(15,10,46,.03); }
.prg-input::placeholder { color: var(--gray-400); }
.prg-select   { appearance: none; cursor: pointer; }
.prg-textarea { resize: vertical; min-height: 90px; line-height: 1.6; padding: 10px 12px !important; }

/* Upload */
.prg-upload {
  border: 2px dashed var(--gray-300); border-radius: 12px;
  padding: 18px; text-align: center; cursor: pointer;
  transition: border-color .2s, background .2s; background: var(--gray-100);
}
.prg-upload:hover { border-color: rgba(15,10,46,.4); background: rgba(15,10,46,.04); }
.prg-upload--done { border-color: rgba(34,197,94,.4); border-style: solid; background: rgba(34,197,94,.05); }
.prg-upload-ico   { font-size: 1.3rem; color: var(--gray-400); margin-bottom: 7px; display: block; }
.prg-upload--done .prg-upload-ico { color: #22c55e; }
.prg-upload-lbl   { font-size: .6rem; color: var(--gray-600); margin-bottom: 3px; }
.prg-upload-fn    { font-size: .54rem; color: var(--gray-400); word-break: break-all; }
.prg-upload--done .prg-upload-fn { color: #22c55e; font-weight: 600; }

/* Abonnements */
.prg-abo-list { display: flex; flex-direction: column; gap: 8px; }
.prg-abo2 {
  position: relative; overflow: hidden;
  background: rgba(255,255,255,.03); border: 1.5px solid rgba(255,255,255,.08);
  border-radius: 13px; padding: 12px 12px 10px; cursor: pointer;
  transition: border-color .2s, background .2s;
}
.prg-abo2          { background: var(--gray-100); border: 1.5px solid var(--gray-200); }
.prg-abo2:hover    { background: rgba(15,10,46,.05); border-color: rgba(15,10,46,.25); }
.prg-abo2--sel     { background: rgba(15,10,46,.06); border-color: #0F0A2E; box-shadow: 0 0 0 1px #0F0A2E; }
.prg-abo2--popular { border-color: rgba(15,10,46,.3); }
.prg-abo2-popular-tag {
  position: absolute; top: 0; right: 0;
  background: #0F0A2E; color: #fff;
  font-size: .42rem; font-weight: 800; letter-spacing: .08em;
  padding: 3px 9px; border-radius: 0 11px 0 8px;
}
.prg-abo2-top  { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.prg-abo2-name { font-size: .75rem; font-weight: 900; color: var(--gray-800); }
.prg-abo2-badge { font-size: .42rem; font-weight: 700; padding: 2px 7px; border-radius: 99px; border: 1px solid; }
.prg-abo2-price { font-size: .85rem; font-weight: 900; color: #0F0A2E; line-height: 1; }
.prg-abo2-price span { font-size: .46rem; font-weight: 600; color: var(--gray-500); margin-left: 2px; }
.prg-abo2-desc  { font-size: .54rem; color: var(--gray-500); line-height: 1.5; margin-bottom: 8px; }
.prg-abo2-desc strong { color: var(--gray-700); }
.prg-abo2-feats { display: grid; grid-template-columns: 1fr 1fr; gap: 3px 6px; }
.prg-abo2-feats span { font-size: .52rem; color: var(--gray-600); display: flex; align-items: center; gap: 5px; }
.prg-abo2-feats i { color: #22c55e; font-size: .48rem; }
.prg-abo2-check { display: none; position: absolute; top: 10px; right: 10px; font-size: .85rem; color: #0F0A2E; }
.prg-abo2--sel .prg-abo2-check { display: block; }

/* Moyens de paiement */
.prg-pay-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; }
.prg-pay-card {
  display: flex; align-items: center; gap: 8px;
  background: var(--gray-100); border: 1.5px solid var(--gray-200);
  border-radius: 10px; padding: 9px 11px; cursor: pointer;
  transition: border-color .18s, background .18s;
  font-size: .6rem; font-weight: 600; color: var(--gray-600);
}
.prg-pay-card:hover  { background: rgba(15,10,46,.06); border-color: rgba(15,10,46,.2); }
.prg-pay-card--sel   { background: rgba(15,10,46,.08); border-color: #0F0A2E; color: var(--gray-800); }
/* Logo réel (voir #prg-pay-abo/#prg-pay-vers, index.html, et
   #cab-retrait-grid, cabine.html) — remplace les anciennes pastilles de
   couleur .prg-pay-dot (supprimées, plus aucune grille ne les utilise) ;
   .prg-pay-logo affiche un <img> de marque, ou une icône pour les moyens
   sans logo dédié (ex. "Compte bancaire"). */
.prg-pay-logo {
  width: 20px; height: 20px; border-radius: 6px; flex-shrink: 0; overflow: hidden;
  background: #fff; display: flex; align-items: center; justify-content: center;
}
.prg-pay-logo img { width: 100%; height: 100%; object-fit: cover; }

/* Onglet Retrait cabine — verrouillage pendant le délai de 24h entre deux
   modifications (voir confirmCabRetrait()/renderCabRetraitState() dans
   js/cabine.js). */
.prg-pay-grid--locked { pointer-events: none; opacity: .5; }
.cab-btn-primary:disabled { opacity: .5; cursor: not-allowed; }

/* Réseaux exploités — case à cocher par réseau (logo réel), plusieurs
   réseaux peuvent être cochés en même temps (voir prgToggleNet(),
   js/client.js). Remplace l'ancien trio de champs numériques (quantité de
   puces par réseau, jamais vraiment nécessaire : une simple déclaration
   "j'ai / j'ai pas" suffit). */
.prg-net-list { display: flex; flex-direction: column; gap: 8px; }
.prg-net-row {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border-radius: 12px; cursor: pointer;
  border: 1.5px solid var(--gray-200); background: var(--gray-100);
  transition: all .18s ease;
}
.prg-net-logo {
  width: 32px; height: 32px; border-radius: 9px; flex-shrink: 0; overflow: hidden;
  background: #fff; display: flex; align-items: center; justify-content: center;
}
.prg-net-logo img { width: 100%; height: 100%; object-fit: cover; }
.prg-net-name { flex: 1; font-weight: 800; font-size: .74rem; color: var(--gray-800); }
.prg-net-check {
  width: 22px; height: 22px; border-radius: 7px; flex-shrink: 0;
  border: 1.5px solid var(--gray-300); background: transparent;
  display: flex; align-items: center; justify-content: center; color: transparent; font-size: .6rem;
  transition: all .18s ease;
}
.prg-net-row--on { border-color: rgba(15,10,46,.5); background: rgba(15,10,46,.07); }
.prg-net-row--on .prg-net-check { background: #0F0A2E; border-color: #0F0A2E; color: #fff; }

/* Aperçu en direct du parrain (prénom) dès qu'un code valide est saisi —
   #prg-parrain-feedback (candidature partenaire) et #ag-reg-parrain-feedback
   (inscription client, coupon clair, voir plus bas #reg-slide-3) — les deux
   sur fond clair désormais, voir _wireParrainLookup(), js/client.js. */
.parrain-fb {
  display: none; align-items: center; gap: 6px;
  font-size: .62rem; font-weight: 700; margin-top: 6px;
}
.parrain-fb--checking { color: var(--gray-500); }
.parrain-fb--ok       { color: #22c55e; }
.parrain-fb--warn     { color: #f59e0b; }
/* Coordonnées disponibles/non disponibles (surnom, téléphone, email, nom
   de cabine, nom+prénom — voir _wireLiveChecks(), js/client.js) : icône
   couleur seule, jamais de libellé texte visible (sens porté par
   title/aria-label pour l'accessibilité) — .parrain-fb--unavailable
   distinct de --warn (ambre, réservé à un vrai avertissement comme
   "aucun client trouvé" pour un code parrain, pas une indisponibilité). */
.parrain-fb--unavailable { color: #ef4444; }

/* Footer navigation */
.prg-footer {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 12px 16px; border-top: 1px solid var(--gray-200); flex-shrink: 0;
}
.prg-btn-back {
  display: flex; align-items: center; gap: 6px; flex-shrink: 0;
  background: none; border: 1.5px solid var(--gray-300);
  border-radius: 10px; color: var(--gray-500);
  font-size: .62rem; font-weight: 700; font-family: var(--font);
  padding: 9px 14px; cursor: pointer; transition: border-color .15s, color .15s;
}
.prg-btn-back:hover { border-color: var(--gray-400); color: var(--gray-700); }
.prg-btn-fwd {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 8px;
  background: #0F0A2E; border: none; border-radius: 10px; color: #fff;
  font-size: .68rem; font-weight: 800; font-family: var(--font);
  padding: 11px 16px; cursor: pointer;
  box-shadow: 0 4px 16px rgba(15,10,46,.4);
  transition: background .2s, transform .1s;
}
.prg-btn-fwd:hover   { background: #1B234F; }
.prg-btn-fwd:active  { transform: scale(.98); }
.prg-btn-fwd:disabled { background: rgba(15,10,46,.35); cursor: not-allowed; box-shadow: none; }

/* Confirmation */
.prg-success { text-align: center; padding: 24px 12px; }
.prg-success-ico { font-size: 3.2rem; color: #22c55e; margin-bottom: 14px; }
.prg-success-title { font-size: .92rem; font-weight: 900; color: var(--gray-800); margin-bottom: 10px; }
.prg-success-msg  { font-size: .6rem; color: var(--gray-500); line-height: 1.75; margin-bottom: 22px; }
.prg-success-btn  {
  background: #FF6200; border: none; border-radius: 10px;
  color: #fff; font-size: .68rem; font-weight: 800; font-family: var(--font);
  padding: 12px 32px; cursor: pointer; box-shadow: 0 4px 16px rgba(255,98,0,.4);
}


/* Surcharges orange pour modal partenaire */
.prt-input {
  background: rgba(255,98,0,.07) !important;
  border-color: rgba(255,98,0,.2) !important;
}
.prt-input:focus { border-color: rgba(255,98,0,.6) !important; }
.prt-pin-box:focus      { border-color: #FF6200 !important; background: rgba(255,98,0,.12) !important; }
.prt-pin-box.adm-pin-filled { border-color: #FF6200 !important; background: #FF6200 !important; color: #fff !important; }
.prt-submit {
  background: linear-gradient(135deg, #c94800, #FF6200) !important;
  box-shadow: 0 4px 18px rgba(255,98,0,.4) !important;
}

/* Modal admin */
.adm-modal {
  background: #0d0d16; border: 1px solid rgba(138,99,255,.3);
  border-radius: 20px; width: 92%; max-width: 340px;
  overflow: hidden; animation: slideUp .28s ease;
}
.adm-modal-header {
  background: linear-gradient(135deg, #3b1fa8 0%, #5b32d6 100%);
  padding: 22px 20px 18px; text-align: center; position: relative;
}
.adm-modal-close {
  position: absolute; top: 10px; right: 12px;
  background: none; border: none; color: rgba(255,255,255,.6);
  font-size: .9rem; cursor: pointer; line-height: 1;
}
.adm-modal-ico {
  width: 48px; height: 48px; border-radius: 50%; margin: 0 auto 10px;
  background: rgba(255,255,255,.15); border: 2px solid rgba(255,255,255,.2);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem; color: #fff;
}
.adm-modal-title { font-size: .88rem; font-weight: 800; color: #fff; margin-bottom: 3px; }
.adm-modal-sub   { font-size: .56rem; color: rgba(255,255,255,.55); }
.adm-modal-body  { padding: 20px 18px; }
.adm-denied {
  display: flex; align-items: flex-start; gap: 10px;
  background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.3);
  border-radius: 10px; padding: 10px 12px; margin-bottom: 14px;
  font-size: .57rem; color: #f87171; line-height: 1.5;
}
.adm-denied i { flex-shrink: 0; margin-top: 1px; }
.adm-field { margin-bottom: 14px; }
.adm-label { font-size: .56rem; font-weight: 700; color: rgba(255,255,255,.4); display: block; margin-bottom: 6px; text-transform: uppercase; letter-spacing: .08em; }
.adm-input-wrap { position: relative; }
.adm-input-ico  { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: rgba(138,99,255,.6); font-size: .65rem; }
.adm-input {
  width: 100%; background: rgba(138,99,255,.07); border: 1.5px solid rgba(138,99,255,.2);
  border-radius: 10px; color: #fff; font-family: var(--font);
  font-size: .7rem; padding: 11px 12px 11px 34px; box-sizing: border-box;
  outline: none; transition: border-color .2s;
}
.adm-input:focus { border-color: rgba(138,99,255,.6); }
.adm-pin-row { display: flex; gap: 8px; justify-content: center; }
.adm-pin-box {
  width: 44px; height: 44px; border-radius: 50%; text-align: center;
  background: rgba(138,99,255,.07); border: 1.5px solid rgba(138,99,255,.2);
  color: #fff; font-size: 1.05rem; font-family: var(--font); outline: none;
  transition: border-color .2s, background .2s;
}
.adm-pin-box:focus      { border-color: #a78bfa; background: rgba(138,99,255,.15); }
.adm-pin-box.adm-pin-filled { border-color: rgba(138,99,255,.5); background: rgba(138,99,255,.12); }
.adm-submit {
  width: 100%; background: linear-gradient(135deg, #5b32d6, #3b1fa8);
  border: none; border-radius: 12px; color: #fff;
  font-size: .68rem; font-weight: 700; font-family: var(--font);
  padding: 13px; cursor: pointer; margin-top: 6px;
  box-shadow: 0 4px 18px rgba(91,50,214,.4);
  display: flex; align-items: center; justify-content: center; gap: 8px;
  transition: opacity .2s, transform .15s;
}
.adm-submit:hover  { opacity: .9; transform: translateY(-1px); }

/* ── Champ mot de passe complexe (cabine/admin) — bouton œil + liste de
   critères en temps réel. Voir Auth.initComplexPasswordField()/
   togglePasswordVisibility() (js/auth.js), réutilisé partout où ce mot de
   passe est créé (candidature partenaire, réinitialisation, création de
   compte admin) ou saisi à la connexion. Habillage clair par défaut
   (assorti à .prg-input/.form-control) ; .pw-field-wrap--dark ci-dessous
   pour les écrans de connexion sur fond sombre (cabine/admin). ── */
.pw-field-wrap { position: relative; }
.pw-field-wrap input[type="password"],
.pw-field-wrap input[type="text"] { padding-right: 38px !important; }
.pw-field-eye {
  position: absolute; top: 50%; right: 6px; transform: translateY(-50%);
  width: 26px; height: 26px; border-radius: 50%; border: none; background: none;
  color: var(--gray-400); cursor: pointer; display: flex; align-items: center; justify-content: center;
  font-size: .8rem; transition: color .15s;
}
.pw-field-eye:hover { color: var(--gray-600); }
.pw-field-wrap--dark .pw-field-eye { color: rgba(255,255,255,.4); }
.pw-field-wrap--dark .pw-field-eye:hover { color: rgba(255,255,255,.75); }

.pwck-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
.pwck-item {
  display: flex; align-items: center; gap: 6px;
  font-size: .64rem; font-weight: 600; color: var(--gray-400);
  transition: color .2s;
}
.pwck-item i { font-size: .68rem; color: var(--gray-300); transition: color .2s; }
.pwck-item--ok { color: #16a34a; }
.pwck-item--ok i { color: #16a34a; }
.pwck-list--dark .pwck-item { color: rgba(255,255,255,.35); }
.pwck-list--dark .pwck-item i { color: rgba(255,255,255,.25); }
.pwck-list--dark .pwck-item--ok,
.pwck-list--dark .pwck-item--ok i { color: #34d399; }
.adm-submit:active { transform: translateY(0); }

/* Portail d'accès — style "éditorial minimal" (direction A choisie via
   canvas de design le 24/08) : label sans icône au-dessus d'une carte
   à ligne unique, même langage que .ph5-accordion ci-dessus. */
.ph5-gate-row {
  display: flex; align-items: center; gap: 12px; text-decoration: none;
  background: #fff; border: 1px solid #E8E9EE;
  border-radius: 16px; padding: 15px 16px;
  cursor: pointer; transition: background .18s, border-color .18s, transform .12s;
}
.ph5-gate-row--partner:hover { background: rgba(255,98,0,.04); border-color: rgba(255,98,0,.25); transform: translateX(3px); }
.ph5-gate-row--admin:hover   { background: rgba(15,10,46,.04); border-color: rgba(15,10,46,.2); transform: translateX(3px); }
.ph5-gate-row-body { flex: 1; min-width: 0; }
.ph5-gate-row-title { font-size: .86rem; font-weight: 800; color: #16121F; line-height: 1.3; }
.ph5-gate-row-sub   { font-size: .7rem; font-weight: 450; color: #5B5F6E; line-height: 1.5; margin-top: 3px; }
.ph5-gate-row-arr { font-size: .55rem; color: #0F0A2E; opacity: .3; flex-shrink: 0; }

/* "Espace partenaire" en vert pur, écritures en blanc (demande explicite)
   — scopé à cette seule carte via son id, "Devenir partenaire" juste en
   dessous (même classe .ph5-gate-row--partner) n'est pas touchée. */
#ph5-gate-espace-partenaire { background: #008A3B; border-color: #008A3B; }
#ph5-gate-espace-partenaire:hover { background: #06A346; border-color: #06A346; transform: translateX(3px); }
#ph5-gate-espace-partenaire .ph5-gate-row-title { color: #fff; }
#ph5-gate-espace-partenaire .ph5-gate-row-sub { color: rgba(255,255,255,.6); }
#ph5-gate-espace-partenaire .ph5-gate-row-arr { color: #fff; opacity: .6; }

/* Carte administrateur */
.ph5-admin-card {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 14px;
  background: rgba(138,99,255,.06);
  border: 1px solid rgba(138,99,255,.2);
  border-radius: 13px; padding: 14px 14px;
  cursor: pointer; transition: background .2s, border-color .2s, transform .15s;
}
.ph5-admin-card:hover { background: rgba(138,99,255,.1); border-color: rgba(138,99,255,.4); transform: translateY(-1px); }
.ph5-admin-card-glow {
  position: absolute; left: -10px; top: 50%; transform: translateY(-50%);
  width: 70px; height: 70px; border-radius: 50%;
  background: radial-gradient(circle, rgba(138,99,255,.15) 0%, transparent 70%);
  pointer-events: none;
}
.ph5-admin-ico {
  width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0;
  background: rgba(138,99,255,.12); border: 1.5px solid rgba(138,99,255,.3);
  display: flex; align-items: center; justify-content: center;
  font-size: .9rem; color: #a78bfa;
  box-shadow: 0 0 14px rgba(138,99,255,.2);
}
.ph5-admin-info { flex: 1; min-width: 0; }
.ph5-admin-title { font-size: .72rem; font-weight: 800; color: #fff; margin-bottom: 2px; }
.ph5-admin-sub   { font-size: .55rem; color: rgba(255,255,255,.3); margin-bottom: 6px; }
.ph5-admin-badge {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(138,99,255,.12); border: 1px solid rgba(138,99,255,.25);
  color: #a78bfa; font-size: .48rem; font-weight: 600;
  padding: 2px 8px; border-radius: 99px;
}
.ph5-admin-arrow {
  width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0;
  background: rgba(138,99,255,.12); border: 1px solid rgba(138,99,255,.25);
  display: flex; align-items: center; justify-content: center;
  font-size: .55rem; color: #a78bfa;
}

/* Carte d'accès partenaire */
.ph5-access-card {
  position: relative; overflow: hidden;
  display: flex; align-items: center;
  background: linear-gradient(120deg, #0e0e14 55%, #1a0800 100%);
  border: 1px solid rgba(255,98,0,.3);
  border-radius: 16px; cursor: pointer;
  transition: transform .15s, box-shadow .15s;
  box-shadow: 0 4px 20px rgba(0,0,0,.4);
  min-height: 100px;
}
.ph5-access-card:hover { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(255,98,0,.25); }
.ph5-access-grid {
  position: absolute; inset: 0; pointer-events: none;
  background-image: repeating-linear-gradient(0deg, rgba(255,255,255,.02) 0px, rgba(255,255,255,.02) 1px, transparent 1px, transparent 18px),
                    repeating-linear-gradient(90deg, rgba(255,255,255,.02) 0px, rgba(255,255,255,.02) 1px, transparent 1px, transparent 18px);
}
.ph5-access-glow {
  position: absolute; right: -20px; top: 50%; transform: translateY(-50%);
  width: 120px; height: 120px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.2) 0%, transparent 70%);
  pointer-events: none;
}

/* Gauche */
.ph5-access-left {
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 5px;
  padding: 18px 16px; flex-shrink: 0; min-width: 90px;
}
.ph5-access-logo {
  font-size: 1.1rem; font-weight: 900; color: #FF6200;
  letter-spacing: -.02em; line-height: 1;
}
.ph5-access-label {
  font-size: .46rem; font-weight: 600; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em;
  text-align: center; line-height: 1.4;
}
.ph5-access-ops { display: flex; gap: 4px; margin-top: 2px; }
.ph5-access-ops span {
  width: 8px; height: 8px; border-radius: 50%; display: block; opacity: .8;
}

/* Séparateur vertical */
.ph5-access-sep {
  width: 1px; height: 60px; flex-shrink: 0;
  background: linear-gradient(to bottom, transparent, rgba(255,98,0,.3), transparent);
}

/* Droite */
.ph5-access-right {
  flex: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  padding: 18px 16px; gap: 4px; position: relative; z-index: 1;
}
.ph5-access-lock {
  width: 44px; height: 44px; border-radius: 50%;
  background: rgba(255,98,0,.15); border: 1.5px solid rgba(255,98,0,.4);
  display: flex; align-items: center; justify-content: center;
  font-size: .9rem; color: #FF6200; margin-bottom: 6px;
  box-shadow: 0 0 16px rgba(255,98,0,.25);
}
.ph5-access-right-title {
  font-size: .75rem; font-weight: 800; color: #fff;
}
.ph5-access-right-sub {
  font-size: .52rem; color: rgba(255,255,255,.35);
}
.ph5-access-arrow {
  position: absolute; bottom: 12px; right: 14px;
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(255,98,0,.2); border: 1px solid rgba(255,98,0,.3);
  display: flex; align-items: center; justify-content: center;
  font-size: .48rem; color: #FF6200;
}

/* CTA circulaire */
.ph5-circ-wrap {
  position: relative; width: 72px; height: 72px;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
}
.ph5-circ-ring {
  position: absolute; border-radius: 50%;
  border: 1.5px solid rgba(255,98,0,.25);
  animation: pulse-ring 2.4s ease-out infinite;
}
.ph5-circ-ring--1 { width: 46px;  height: 46px;  animation-delay: 0s; }
.ph5-circ-ring--2 { width: 58px;  height: 58px;  animation-delay: .5s;  border-color: rgba(255,98,0,.15); }
.ph5-circ-ring--3 { width: 72px;  height: 72px;  animation-delay: 1s;   border-color: rgba(255,98,0,.07); }
@keyframes pulse-ring {
  0%   { transform: scale(.92); opacity: 1; }
  100% { transform: scale(1.08); opacity: 0; }
}
.ph5-circ-btn {
  width: 38px; height: 38px; border-radius: 50%;
  background: linear-gradient(135deg, #FF6200, #c94800);
  box-shadow: 0 0 16px rgba(255,98,0,.55), inset 0 1px 0 rgba(255,255,255,.15);
  display: flex; align-items: center; justify-content: center;
  position: relative; z-index: 2;
  transition: transform .15s, box-shadow .15s;
}
.ph5-circ-btn:hover { transform: scale(1.07); box-shadow: 0 0 24px rgba(255,98,0,.7); }
.ph5-circ-btn i { font-size: .75rem !important; }

/* CTA partenaire v2 */
.ph5-cta2 {
  position: relative; overflow: hidden;
  display: flex; align-items: center; justify-content: space-between;
  background: linear-gradient(135deg, #FF6200 0%, #d94f00 100%);
  border-radius: 14px; padding: 14px 16px;
  cursor: pointer; margin-bottom: 0;
  box-shadow: 0 6px 24px rgba(255,98,0,.4);
  transition: transform .15s, box-shadow .15s;
}
.ph5-cta2:hover { transform: translateY(-2px); box-shadow: 0 10px 30px rgba(255,98,0,.5); }
.ph5-cta2:active { transform: translateY(0); }
.ph5-cta2-shine {
  position: absolute; top: 0; left: -60%;
  width: 40%; height: 100%;
  background: linear-gradient(to right, transparent, rgba(255,255,255,.12), transparent);
  transform: skewX(-20deg);
  animation: shine 3s infinite;
}
@keyframes shine { 0%,70% { left:-60%; } 100% { left:160%; } }
.ph5-cta2-left { display: flex; align-items: center; gap: 12px; }
.ph5-cta2-ico {
  width: 40px; height: 40px; border-radius: 11px;
  background: rgba(255,255,255,.18);
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; color: #fff; flex-shrink: 0;
}
.ph5-cta2-title { font-size: .78rem; font-weight: 800; color: #fff; line-height: 1.1; }
.ph5-cta2-sub   { font-size: .52rem; color: rgba(255,255,255,.65); margin-top: 2px; }
.ph5-cta2-arrow { color: rgba(255,255,255,.6); font-size: .6rem; flex-shrink: 0; }

/* Animation slideUp pour modals */
@keyframes slideUp {
  from { transform: translateY(30px); opacity: 0; }
  to   { transform: translateY(0);    opacity: 1; }
}

/* Secteur 2 */
.ph5-sector2 {
  background: linear-gradient(145deg, #120930 0%, #0a0620 100%);
  border: 1px solid rgba(255,98,0,.18); border-radius: 18px;
  padding: 20px 14px 20px; margin-bottom: 6px;
  position: relative; overflow: hidden;
}
.ph5-sector2::before {
  content: ''; position: absolute; top: 0; left: 15%; right: 15%; height: 2px; border-radius: 2px;
  background: linear-gradient(90deg, transparent, rgba(255,98,0,.7), transparent);
  box-shadow: 0 0 12px rgba(255,98,0,.4);
}
.ph5-s2-title {
  font-size: .62rem; font-weight: 900; color: rgba(255,255,255,.55);
  text-transform: uppercase; letter-spacing: .1em; text-align: center;
  margin-bottom: 18px;
}
.ph5-perks {
  display: flex; justify-content: space-between; gap: 6px; margin-bottom: 0;
}
.ph5-perk { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 10px; }
.ph5-perk-circle {
  width: 52px; height: 52px; border-radius: 50%;
  background: rgba(255,98,0,.1);
  border: 1.5px solid rgba(255,98,0,.25);
  color: var(--primary); font-size: 1.1rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 16px rgba(255,98,0,.15);
  transition: transform .2s, box-shadow .2s;
}
.ph5-perk-circle:hover { transform: translateY(-3px); box-shadow: 0 8px 22px rgba(255,98,0,.25); }
.ph5-perk-lbl {
  font-size: .57rem; font-weight: 800; color: #fff;
  text-align: center; line-height: 1.35; text-transform: uppercase; letter-spacing: .05em;
  opacity: .82;
}
.ph5-s2-divider { height: 1px; background: rgba(255,255,255,.06); margin: 18px 0; }
.ph5-circles {
  display: flex; justify-content: space-around; align-items: center; gap: 8px;
}
.ph5-circle {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 5px;
  aspect-ratio: 1; max-width: 80px; border-radius: 50%;
  background: var(--cc); border: 1.5px solid var(--ccb);
  box-shadow: 0 0 16px var(--cc);
  justify-content: center; padding: 10px;
}
.ph5-circle-val { font-size: .9rem; font-weight: 900; color: var(--ccl); line-height: 1; }
.ph5-circle-lbl { font-size: .52rem; font-weight: 800; color: rgba(255,255,255,.3); text-transform: uppercase; letter-spacing: .05em; text-align: center; line-height: 1.2; }

.ph4-hero {
  background: linear-gradient(160deg, #190f3e 0%, #0f0830 100%);
  border: 1px solid rgba(255,98,0,.18);
  border-radius: 18px; margin-bottom: 14px;
  overflow: hidden;
}
.ph4-top {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 16px 0;
}
.ph4-badge {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(255,98,0,.12); color: var(--primary);
  border: 1px solid rgba(255,98,0,.25);
  font-size: .58rem; font-weight: 900; letter-spacing: .07em;
  padding: 4px 10px; border-radius: 99px; text-transform: uppercase;
}
.ph4-tag {
  background: rgba(34,197,94,.12); color: #22c55e;
  border: 1px solid rgba(34,197,94,.25);
  font-size: .6rem; font-weight: 800;
  padding: 3px 10px; border-radius: 99px;
}
.ph4-main {
  display: flex; align-items: center; gap: 14px;
  padding: 16px 16px 0;
}
.ph4-icon {
  width: 48px; height: 48px; flex-shrink: 0; border-radius: 14px;
  background: linear-gradient(135deg, var(--primary), #9b3000);
  color: #fff; font-size: 1.2rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 14px rgba(255,98,0,.4);
}
.ph4-titles { flex: 1; }
.ph4-title { font-size: .78rem; font-weight: 700; color: rgba(255,255,255,.5); }
.ph4-brand { font-size: 1.1rem; font-weight: 900; color: var(--primary); line-height: 1.1; }
.ph4-sub { font-size: .7rem; color: rgba(255,255,255,.3); line-height: 1.5; margin-top: 4px; }

.ph4-divider {
  height: 1px; background: rgba(255,255,255,.06); margin: 14px 16px;
}
.ph4-features {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
  padding: 0 16px;
}
.ph4-feat {
  display: flex; align-items: center; gap: 7px;
  font-size: .7rem; font-weight: 700; color: rgba(255,255,255,.55);
}
.ph4-feat i { color: #22c55e; font-size: .65rem; flex-shrink: 0; }

.ph4-stats {
  display: flex; align-items: center;
  padding: 14px 16px;
}
.ph4-stat { flex: 1; text-align: center; }
.ph4-stat-val { font-size: .95rem; font-weight: 900; color: #fff; }
.ph4-stat-lbl { font-size: .55rem; font-weight: 700; color: rgba(255,255,255,.45); text-transform: uppercase; letter-spacing: .05em; margin-top: 2px; }
.ph4-stat-sep { width: 1px; height: 28px; background: rgba(255,255,255,.08); }

/* Avantages — bulles circulaires */
.adv-grid {
  display: flex; justify-content: space-between; gap: 8px;
  margin-bottom: 4px;
}
.adv-card {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.adv-card-top { display: none; }
.adv-icon {
  width: 58px; height: 58px; border-radius: 50%;
  background: var(--ab); color: var(--ac); font-size: 1.1rem;
  display: flex; align-items: center; justify-content: center;
  border: 2px solid color-mix(in srgb, var(--ac) 35%, transparent);
  box-shadow: 0 0 18px var(--ab), 0 0 6px var(--ab);
  transition: transform .18s, box-shadow .2s;
}
.adv-card:hover .adv-icon { transform: scale(1.08); box-shadow: 0 0 26px var(--ab); }
.adv-title {
  font-size: .65rem; font-weight: 900; color: #fff;
  text-align: center; line-height: 1.3;
}
.adv-sub { display: none; }

.partner-success-msg {
  background: rgba(0,154,68,.08); border: 1.5px solid rgba(0,154,68,.25);
  border-radius: var(--radius); padding: 14px 16px;
  font-size: .88rem; color: var(--secondary);
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 20px;
}

/* ── Espace Cabiniste Auth v5 — Premium Card ─────── */
.cs4-box {
  margin-top: 6px; border-radius: 22px; overflow: visible;
  border: 1px solid rgba(255,98,0,.15);
  background: linear-gradient(170deg, #0e0828 0%, #120a30 55%, #090520 100%);
  box-shadow: 0 10px 40px rgba(0,0,0,.45);
  position: relative;
}
/* Trait lumineux orange en haut */
.cs4-box::before {
  content: ''; position: absolute; top: 0; left: 15%; right: 15%; height: 2px; border-radius: 2px;
  background: linear-gradient(90deg, transparent, #FF6200 40%, #FF9500 60%, transparent);
  box-shadow: 0 0 14px rgba(255,98,0,.55);
  pointer-events: none;
}

/* Bannière info — chip interne */
.cs4-banner {
  margin: 18px 14px 0;
  background: rgba(255,98,0,.08);
  border: 1px solid rgba(255,98,0,.18);
  border-radius: 12px;
  padding: 10px 13px;
  display: flex; align-items: flex-start; gap: 9px;
}
.cs4-banner-icon { color: var(--primary); font-size: .78rem; flex-shrink: 0; margin-top: 1px; }
#cs4-banner-txt { font-size: .68rem; font-weight: 600; color: rgba(255,255,255,.6); line-height: 1.45; }

/* Onglets — pill switcher */
.cs4-toggle {
  display: flex;
  margin: 14px 14px 0;
  background: rgba(0,0,0,.35);
  border-radius: 13px; padding: 3px;
  border: 1px solid rgba(255,255,255,.06);
}
.cs4-tgl {
  flex: 1; padding: 9px 8px;
  background: none; border: none; border-radius: 10px;
  color: rgba(255,255,255,.3); font-size: .74rem; font-weight: 800;
  cursor: pointer; font-family: inherit;
  transition: all .22s cubic-bezier(.34,1.2,.64,1);
}
.cs4-tgl.active {
  background: linear-gradient(135deg, #FF6200, #cc4000);
  color: #fff;
  box-shadow: 0 3px 14px rgba(255,98,0,.4);
}

/* Zone formulaire */
.cs4-form { padding: 14px 14px 18px; }

/* Carte interne pour le champ téléphone */
.cs4-tel-wrap {
  display: flex; align-items: center;
  background: rgba(0,0,0,.3);
  border: 1.5px solid rgba(255,255,255,.07);
  border-radius: 14px; padding: 0 12px; margin-bottom: 12px;
  transition: border-color .2s, box-shadow .2s;
}
.cs4-tel-wrap:focus-within {
  border-color: rgba(255,98,0,.4);
  box-shadow: 0 0 0 3px rgba(255,98,0,.1);
  background: rgba(255,98,0,.03);
}
.cs4-flag { font-size: .85rem; padding: 13px 8px 13px 0; font-weight: 700; color: rgba(255,255,255,.65); white-space: nowrap; }
.cs4-sep  { width: 1px; height: 18px; background: rgba(255,255,255,.1); margin-right: 10px; }
.cs4-tel  { flex: 1; background: none; border: none; outline: none; color: #fff; font-size: .84rem; font-weight: 700; padding: 13px 0; }
.cs4-tel::placeholder { color: rgba(255,255,255,.45); font-weight: 400; }

/* PIN reveal */
.cs4-pin-wrap {
  max-height: 0; overflow: hidden; opacity: 0; transform: translateY(-6px);
  transition: max-height .28s ease, opacity .25s ease, transform .25s ease;
  margin-bottom: 0;
}
.cs4-pin-wrap.visible { max-height: 120px; opacity: 1; transform: translateY(0); margin-bottom: 12px; }

/* Section PIN encadrée */
.cs4-pin-section {
  background: rgba(255,98,0,.04);
  border: 1px solid rgba(255,98,0,.13);
  border-radius: 13px; padding: 12px 10px 14px;
}
.cs4-pin-lbl {
  font-size: .62rem; font-weight: 800; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .09em;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  margin-bottom: 12px;
}
.cs4-pin-lbl i { color: var(--primary); }

/* Bouton */
.cs4-btn {
  width: 100%; padding: 13px; border-radius: 14px; border: none;
  background: linear-gradient(135deg, #FF6200, #cc3d00);
  color: #fff; font-size: .84rem; font-weight: 900;
  cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px;
  font-family: inherit; letter-spacing: .03em;
  box-shadow: 0 4px 0 rgba(0,0,0,.3), 0 6px 22px rgba(255,98,0,.35);
  transition: transform .15s, box-shadow .15s;
}
.cs4-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 0 rgba(0,0,0,.25), 0 10px 28px rgba(255,98,0,.45); }
.cs4-btn:active { transform: translateY(1px); box-shadow: 0 2px 0 rgba(0,0,0,.3), 0 4px 12px rgba(255,98,0,.3); }

.cs4-demo {
  margin-top: 10px; font-size: .64rem; color: rgba(255,255,255,.45); text-align: center;
}
.cs4-demo strong { color: rgba(255,255,255,.35); }
.cs4-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px; }
.cs4-field {
  background: rgba(0,0,0,.3); border: 1.5px solid rgba(255,255,255,.07);
  border-radius: 12px; padding: 11px 12px; color: #fff;
  font-size: .8rem; font-weight: 600; outline: none;
  transition: border-color .18s, box-shadow .18s; width: 100%; box-sizing: border-box;
  font-family: inherit;
}
.cs4-field::placeholder { color: rgba(255,255,255,.2); }
.cs4-field:focus { border-color: rgba(255,98,0,.4); box-shadow: 0 0 0 3px rgba(255,98,0,.1); }

/* ── Espace Cabiniste Auth v3 — deux secteurs + cercles ─────── */
.cab3-wrap {
  margin-top: 6px; border-radius: 20px; overflow: hidden;
  border: 1px solid rgba(138,99,255,.2);
}
/* Secteur 1 — très sombre, centré */
.cab3-header {
  background: linear-gradient(160deg, #190f3e 0%, #100830 100%);
  padding: 24px 20px 0; text-align: center;
  display: flex; flex-direction: column; align-items: center;
}
.cab3-orbit {
  position: relative; width: 76px; height: 76px;
  display: flex; align-items: center; justify-content: center;
  margin-bottom: 14px;
}
.cab3-orbit-ring {
  position: absolute; inset: 0; border-radius: 50%;
  border: 1.5px dashed rgba(255,98,0,.3);
  animation: orbitSpin 12s linear infinite;
}
@keyframes orbitSpin { to { transform: rotate(360deg); } }
.cab3-orbit-icon {
  width: 56px; height: 56px; border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), #9b3000);
  color: #fff; font-size: 1.2rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 8px rgba(255,98,0,.08), 0 4px 16px rgba(255,98,0,.4);
}
.cab3-header-title { font-size: .95rem; font-weight: 900; color: #fff; margin-bottom: 4px; }
.cab3-header-sub   { font-size: .7rem; color: rgba(255,255,255,.3); margin-bottom: 18px; }
.cab3-tabs {
  display: flex; width: 100%; border-top: 1px solid rgba(255,255,255,.06);
}
.cab3-tab {
  flex: 1; padding: 12px 8px; border: none; background: none;
  color: rgba(255,255,255,.45); font-size: .75rem; font-weight: 800;
  cursor: pointer; border-bottom: 2px solid transparent;
  transition: color .15s, border-color .15s;
}
.cab3-tab.active { color: var(--primary); border-bottom-color: var(--primary); }

/* Secteur 2 — moins sombre */
.cab3-form-area {
  background: #130a30;
  padding: 22px 18px 18px;
}
.cab3-input-row {
  display: flex; align-items: center; gap: 0;
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  border-radius: 12px; padding: 0 14px; margin-bottom: 18px;
  transition: border-color .18s;
}
.cab3-input-row:focus-within { border-color: rgba(255,98,0,.4); }
.cab3-flag { font-size: .9rem; padding: 12px 0; }
.cab3-code { font-size: .78rem; font-weight: 800; color: rgba(255,255,255,.4); padding: 12px 8px; border-right: 1px solid rgba(255,255,255,.1); margin-right: 10px; }
.cab3-tel  { flex: 1; background: none; border: none; outline: none; color: #fff; font-size: .85rem; font-weight: 700; padding: 12px 0; }
.cab3-tel::placeholder { color: rgba(255,255,255,.45); font-weight: 400; }

.cab3-pin-title {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.45);
  text-transform: uppercase; letter-spacing: .08em; margin-bottom: 14px;
}
.cab3-pin-title span {
  flex: 1; height: 1px; background: rgba(255,255,255,.08);
}
.cab3-pin-row {
  display: flex; justify-content: center; gap: 14px; margin-bottom: 20px;
}
.cab3-pin {
  width: 52px; height: 52px; border-radius: 50%;
  background: rgba(255,255,255,.05); border: 1.5px solid rgba(255,255,255,.1);
  color: #fff; text-align: center; font-size: 1.4rem; font-weight: 900; outline: none;
  transition: border-color .18s, background .18s, box-shadow .18s;
}
.cab3-pin:focus {
  border-color: var(--primary); background: rgba(255,98,0,.1);
  box-shadow: 0 0 14px rgba(255,98,0,.3);
}
.cab3-btn {
  width: 100%; padding: 13px; border-radius: 12px; border: none;
  background: linear-gradient(135deg, var(--primary), #cc4400);
  color: #fff; font-size: .85rem; font-weight: 800;
  cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 4px 16px rgba(255,98,0,.3); transition: opacity .15s;
}
.cab3-btn:hover { opacity: .88; }
.cab3-demo {
  margin-top: 14px; font-size: .67rem; color: rgba(255,255,255,.45); text-align: center;
}
.cab3-demo strong { color: rgba(255,255,255,.38); }
.cab3-name-row {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px;
}
.cab3-name-field {
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: 11px 12px; color: #fff;
  font-size: .82rem; font-weight: 600; outline: none; transition: border-color .18s;
}
.cab3-name-field::placeholder { color: rgba(255,255,255,.2); }
.cab3-name-field:focus { border-color: rgba(255,98,0,.4); }

/* ── Espace Cabiniste Auth v2 — deux secteurs + cercles ─────── */
.cab2-box {
  margin-top: 6px; border-radius: 20px; overflow: hidden;
  border: 1px solid rgba(255,98,0,.18);
}
/* Secteur 1 — sombre */
.cab2-s1 {
  background: linear-gradient(160deg, #190f3e 0%, #0f0830 100%);
  padding: 18px 18px 0;
}
.cab2-s1-top {
  display: flex; align-items: center; gap: 14px; margin-bottom: 18px;
}
.cab2-s1-circle {
  width: 50px; height: 50px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(135deg, var(--primary), #9b3000);
  color: #fff; font-size: 1.1rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 6px rgba(255,98,0,.1), 0 4px 14px rgba(255,98,0,.35);
}
.cab2-s1-title { font-size: .9rem; font-weight: 900; color: #fff; }
.cab2-s1-sub   { font-size: .7rem; color: rgba(255,255,255,.3); margin-top: 2px; }
.cab2-tabs {
  display: flex; gap: 0;
}
.cab2-tab {
  flex: 1; padding: 11px 8px; border: none; background: none;
  color: rgba(255,255,255,.3); font-size: .75rem; font-weight: 800;
  cursor: pointer; border-bottom: 2px solid transparent;
  transition: color .15s, border-color .15s;
}
.cab2-tab.active { color: var(--primary); border-bottom-color: var(--primary); }

/* Secteur 2 — moins sombre */
.cab2-s2 {
  background: #2a1e6a;
  padding: 20px 18px 18px;
}
.cab2-field-wrap {
  display: flex; align-items: center;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1);
  border-radius: 12px; padding: 0 12px; margin-bottom: 16px;
  transition: border-color .18s;
}
.cab2-field-wrap:focus-within { border-color: rgba(255,98,0,.45); }
.cab2-prefix { font-size: .78rem; color: rgba(255,255,255,.4); white-space: nowrap; padding: 12px 0; }
.cab2-prefix-sep { width: 1px; height: 16px; background: rgba(255,255,255,.1); margin: 0 10px; }
.cab2-input {
  flex: 1; background: none; border: none; outline: none;
  color: #fff; font-size: .85rem; font-weight: 700; padding: 12px 0;
}
.cab2-input::placeholder { color: rgba(255,255,255,.45); font-weight: 400; }
.cab2-pin-label {
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.45);
  text-transform: uppercase; letter-spacing: .07em; margin-bottom: 12px; text-align: center;
}
.cab2-pin-row {
  display: flex; gap: 12px; justify-content: center; margin-bottom: 18px;
}
.cab2-pin-dot {
  width: 50px; height: 50px; border-radius: 50%;
  background: rgba(255,255,255,.05); border: 1.5px solid rgba(255,255,255,.12);
  color: #fff; text-align: center; font-size: 1.3rem; font-weight: 900; outline: none;
  transition: border-color .18s, background .18s, box-shadow .18s;
}
.cab2-pin-dot:focus {
  border-color: var(--primary); background: rgba(255,98,0,.08);
  box-shadow: 0 0 12px rgba(255,98,0,.25);
}
.cab2-btn {
  width: 100%; padding: 13px; border-radius: 12px; border: none;
  background: linear-gradient(135deg, var(--primary), #cc4400);
  color: #fff; font-size: .85rem; font-weight: 800;
  cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 4px 16px rgba(255,98,0,.3); transition: opacity .15s;
}
.cab2-btn:hover { opacity: .88; }
.cab2-demo {
  margin-top: 14px; font-size: .67rem; color: rgba(255,255,255,.45); text-align: center;
}
.cab2-demo strong { color: rgba(255,255,255,.38); }
.cab2-row2 {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px;
}
.cab2-field {
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: 11px 12px; color: #fff;
  font-size: .82rem; font-weight: 600; outline: none; transition: border-color .18s;
}
.cab2-field::placeholder { color: rgba(255,255,255,.2); }
.cab2-field:focus { border-color: rgba(255,98,0,.45); }

/* ── Espace Cabiniste Auth ───────────────────────────────────── */
.cab-auth-box {
  margin-top: 20px;
  background: linear-gradient(160deg, #190f3e 0%, #0f0830 100%);
  border: 1px solid rgba(255,98,0,.18);
  border-radius: 20px; overflow: hidden;
}
.cab-tabs {
  display: flex; padding: 6px; gap: 6px;
  background: rgba(0,0,0,.2); margin: 16px 16px 0;
  border-radius: 12px;
}
.cab-tab {
  flex: 1; padding: 9px 8px; border: none; background: none;
  color: rgba(255,255,255,.3); font-size: .75rem; font-weight: 800;
  cursor: pointer; border-radius: 8px;
  transition: color .15s, background .15s;
}
.cab-tab.active {
  background: var(--primary); color: #fff;
  box-shadow: 0 2px 10px rgba(255,98,0,.35);
}
.cab-panel {
  display: flex; flex-direction: column;
  padding: 20px 18px 22px; gap: 0;
}
.cab-panel-icon { display: none; }
.cab-panel-title {
  font-size: .9rem; font-weight: 900; color: #fff;
  margin-bottom: 4px;
}
.cab-panel-sub {
  font-size: .72rem; color: rgba(255,255,255,.3);
  margin-bottom: 18px; line-height: 1.5;
}
.cab-input-wrap {
  display: flex; align-items: center;
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: 0 12px; width: 100%; margin-bottom: 14px;
  transition: border-color .18s;
}
.cab-input-wrap:focus-within { border-color: rgba(255,98,0,.5); }
.cab-prefix { font-size: .78rem; color: rgba(255,255,255,.4); white-space: nowrap; padding: 12px 0; }
.cab-prefix-sep { width: 1px; height: 18px; background: rgba(255,255,255,.1); margin: 0 10px; }
.cab-input {
  flex: 1; background: none; border: none; outline: none;
  color: #fff; font-size: .85rem; font-weight: 700; padding: 12px 0;
}
.cab-input::placeholder { color: rgba(255,255,255,.45); font-weight: 400; }
.cab-pin-label {
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.45);
  text-transform: uppercase; letter-spacing: .07em; margin-bottom: 10px;
}
.cab-pin-row {
  display: flex; gap: 8px; justify-content: center; margin-bottom: 18px;
}
.cab-pin-row .pin-box {
  flex: 1; max-width: 52px; height: 48px; border-radius: 10px;
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  color: #fff; text-align: center; font-size: 1.2rem; font-weight: 900; outline: none;
  transition: border-color .18s, background .18s;
}
.cab-pin-row .pin-box:focus { border-color: var(--primary); background: rgba(255,98,0,.07); }
.cab-submit-btn {
  width: 100%; padding: 13px; border-radius: 10px; border: none;
  background: linear-gradient(135deg, var(--primary), #cc4400);
  color: #fff; font-size: .85rem; font-weight: 800;
  cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 4px 14px rgba(255,98,0,.3); transition: opacity .15s;
}
.cab-submit-btn:hover { opacity: .88; }
.cab-demo {
  margin-top: 14px; font-size: .67rem; color: rgba(255,255,255,.45); text-align: center;
}
.cab-demo strong { color: rgba(255,255,255,.38); }
.cab-row-2 {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px;
}
.cab-field {
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: 11px 12px; color: #fff;
  font-size: .82rem; font-weight: 600; outline: none; transition: border-color .18s;
}
.cab-field::placeholder { color: rgba(255,255,255,.2); }
.cab-field:focus { border-color: rgba(255,98,0,.5); }

/* ══════════════════════════════════════════════════════════════
   LAYOUT APP MOBILE (bottom nav)
══════════════════════════════════════════════════════════════ */

/* Topnav : pill utilisateur */
.cn-user-pill {
  display: flex; align-items: center; gap: 8px;
}
.cup-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--primary); color: #fff;
  font-size: .75rem; font-weight: 800; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
}
.cup-info { line-height: 1.25; }
.cup-name { font-size: .82rem; font-weight: 700; color: var(--gray-800); }
.cup-role { font-size: .66rem; color: var(--gray-500); }
.cup-logout {
  width: 32px; height: 32px; border: none; background: none;
  color: var(--gray-400); cursor: pointer;
  border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  transition: var(--transition);
}
.cup-logout:hover { background: var(--gray-100); color: var(--primary); }

/* Page principale */
.client-page {
  max-width: 720px; margin: 0 auto;
  padding: 12px 20px 110px;
  min-height: calc(100vh - 62px);
}
@media (max-width: 600px) { .client-page { padding: 10px 12px 110px; } }
/* Accueil : la carte de solde est le tout premier élément — on retire le
   padding-top pour qu'elle touche directement le topnav, sans quoi le
   bandeau (couleur variable selon le thème choisi) laisse un liseré du
   fond de page visible entre lui et le topnav. */
body.on-home .client-page { padding-top: 0; }

/* Carte solde en haut */
#balance-header { margin-bottom: 8px; }
.bh-card {
  background: linear-gradient(135deg, var(--primary) 0%, #cc4e00 100%);
  border-radius: var(--radius-lg);
  padding: 22px 22px;
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  box-shadow: 0 6px 24px rgba(255,98,0,.35);
}
.bh-info { min-width: 0; }
.bh-greeting { font-size: .78rem; color: rgba(255,255,255,.75); font-weight: 600; margin-bottom: 3px; }
.bh-amount {
  font-size: 1.7rem; font-weight: 900; color: #fff;
  line-height: 1.1; margin-bottom: 2px; white-space: nowrap;
}
.bh-label { font-size: .68rem; color: rgba(255,255,255,.6); }
.bh-recharge-btn {
  flex-shrink: 0;
  background: rgba(255,255,255,.18); border: 1.5px solid rgba(255,255,255,.4);
  color: #fff; font-size: .82rem; font-weight: 700;
  padding: 9px 18px; border-radius: 20px; cursor: pointer;
  display: flex; align-items: center; gap: 6px;
  transition: background .18s;
}
.bh-recharge-btn:hover { background: rgba(255,255,255,.32); }

/* Bottom navigation — bulle flottante */
.bottom-nav {
  position: fixed; bottom: 14px; z-index: 200;
  left: 50%; transform: translateX(-50%) translateY(0);
  width: calc(100% - 28px); max-width: 520px;
  background: #fff;
  backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
  border-radius: 36px;
  border: 1.5px solid rgba(22,163,74,.2);
  border-top: 3px solid #16A34A;
  display: flex; align-items: center;
  box-shadow: 0 10px 30px rgba(0,0,0,.14);
  padding: 8px 6px calc(8px + env(safe-area-inset-bottom, 0px));
  transition: transform .28s ease, opacity .28s ease;
}
/* Masquée pendant le défilement (haut ou bas), réapparaît à l'arrêt */
.bottom-nav--scroll-hidden {
  transform: translateX(-50%) translateY(140%);
  opacity: 0;
  pointer-events: none;
}

.bn-item {
  flex: 1; display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 4px;
  padding: 4px 2px;
  color: var(--gray-500); cursor: pointer;
  font-size: .57rem; font-weight: 600; letter-spacing: .1px;
  transition: color .25s; position: relative;
  text-decoration: none; -webkit-tap-highlight-color: transparent;
}

/* Cercle autour de l'icône */
.bn-item i {
  font-size: 1rem;
  width: 40px; height: 40px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(0,0,0,.04);
  border: 1.5px solid rgba(0,0,0,.08);
  transition: all .28s cubic-bezier(.34,1.56,.64,1);
}
.bn-item:active i { transform: scale(.82); }

/* Cercles pastel par icône (inactif) : évite le gris terne uniforme,
   chacune garde un repère couleur propre. L'état actif (orange, plus
   bas) reste prioritaire grâce à :not(.active). Teintes assombries pour
   rester lisibles sur le fond blanc de .bottom-nav (demande explicite). */
.bn-item:not(.active) i.bn-ico--indigo { background: rgba(99,102,241,.12); border-color: rgba(99,102,241,.25); color: #4F46E5; }
.bn-item:not(.active) i.bn-ico--violet { background: rgba(168,85,247,.12); border-color: rgba(168,85,247,.25); color: #9333EA; }
.bn-item:not(.active) i.bn-ico--teal   { background: rgba(20,184,166,.14);  border-color: rgba(20,184,166,.28);  color: #0D9488; }

/* Actif : cercle orange brillant surélevé */
.bn-item.active { color: var(--primary); }
.bn-item.active i {
  background: linear-gradient(145deg, #FF6200, #cc4200);
  border-color: transparent;
  color: #fff;
  box-shadow: 0 0 0 4px rgba(255,98,0,.18), 0 4px 18px rgba(255,98,0,.55);
  transform: translateY(-4px) scale(1.08);
}
.bn-item.active span { color: var(--primary); font-weight: 700; }

/* Point lumineux sous l'item actif */
.bn-item.active::after {
  content: '';
  position: absolute; bottom: 0;
  width: 4px; height: 4px; border-radius: 50%;
  background: #FF6200;
  box-shadow: 0 0 8px rgba(255,98,0,.8);
}
.bn-item:not(.active)::after { display: none; }
.bn-item::before { display: none; }

/* WhatsApp — grand cercle vert surélevé */
.bn-whatsapp { gap: 4px; }
.bn-wa-circle {
  width: 40px; height: 40px; border-radius: 50%;
  background: linear-gradient(145deg, var(--primary), #cc4400);
  color: #fff;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 3px rgba(255,98,0,.18), 0 4px 16px rgba(255,98,0,.5);
  margin-top: 0;
  border: 1.5px solid rgba(255,255,255,.15);
  transition: transform .28s cubic-bezier(.34,1.56,.64,1), box-shadow .28s;
}
.bn-whatsapp:hover .bn-wa-circle { transform: scale(1.08); }
.bn-whatsapp span { color: var(--gray-500); font-weight: 600; }
.bn-wa-circle i {
  width: auto; height: auto; border-radius: 0;
  background: none; border: none; transform: none;
  display: inline; font-size: 1.05rem;
}

/* Badge NEW */
.bn-badge {
  position: absolute; top: 0; right: calc(50% - 28px);
  background: linear-gradient(135deg, #FF6200, #cc4400);
  color: #fff;
  font-size: .48rem; font-weight: 900; padding: 2px 5px;
  border-radius: 99px; letter-spacing: .5px; pointer-events: none;
  box-shadow: 0 2px 8px rgba(255,98,0,.4);
}

/* ── Carte solde + actions rapides (home-balance-card) ──────── */
.hbc-balance {
  background: linear-gradient(135deg, var(--primary) 0%, #cc4e00 100%);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  padding: 24px 22px 18px; color: #fff;
}
.hbc-balance--guest { padding: 20px 22px 18px; }
.hbc-bal-label { font-size: .78rem; font-weight: 600; opacity: .82; margin-bottom: 6px; }
.hbc-bal-label strong { color: #fff; }
.hbc-bal-amount { font-size: 2.1rem; font-weight: 900; line-height: 1.1; margin-bottom: 3px; }
.hbc-bal-sub { font-size: .7rem; opacity: .65; }
/* Portefeuille invité */
.hbc-wallet-top {
  display: flex; align-items: center; gap: 10px; margin-bottom: 20px;
}
.hbc-wallet-icon-wrap {
  width: 38px; height: 38px; border-radius: 12px;
  background: rgba(255,255,255,.22); color: #fff;
  display: flex; align-items: center; justify-content: center; font-size: 1.1rem;
}
.hbc-wallet-tag {
  font-size: .75rem; font-weight: 700; opacity: .8; letter-spacing: .5px; text-transform: uppercase;
}
.hbc-wallet-row { margin-bottom: 18px; }
.hbc-wallet-locked-amount {
  display: flex; align-items: baseline; gap: 8px; margin-top: 2px;
}
.hbc-locked-dots {
  font-size: 1.6rem; font-weight: 900; letter-spacing: 4px; line-height: 1;
  color: rgba(255,255,255,.55);
}
.hbc-locked-curr {
  font-size: .85rem; font-weight: 700; opacity: .55;
}
.hbc-unlock-btn {
  width: 100%; padding: 11px; border-radius: 12px;
  background: #fff; color: var(--primary); border: none;
  font-size: .83rem; font-weight: 800; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  transition: opacity .18s; box-shadow: 0 2px 10px rgba(0,0,0,.12);
}
.hbc-unlock-btn:hover { opacity: .9; }

.hbc-actions {
  display: flex; padding: 12px 8px 4px; gap: 4px;
  background: #fff; border-radius: 0 0 var(--radius-lg) var(--radius-lg);
  border: 1.5px solid var(--frame-green); border-top: none;
}
.hbc-btn {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 7px;
  padding: 10px 4px 12px;
  background: transparent; border: none; cursor: pointer;
  font-size: .7rem; font-weight: 700; color: var(--gray-600);
  transition: background .15s; border-radius: var(--radius-md);
}
.hbc-btn:active { background: #fff3ea; }
.hbc-btn-icon {
  width: 42px; height: 42px; border-radius: 13px;
  display: flex; align-items: center; justify-content: center; font-size: 1rem;
}
.hbc-btn-locked { opacity: .45; }

/* ── Wallet connecté — décorations ──────────────────────────── */
.hbc-balance--user {
  background: linear-gradient(140deg, #FF6200 0%, #ff8c00 55%, #e05d00 100%);
  position: relative; overflow: hidden;
}
.hbc-deco-circle {
  position: absolute; border-radius: 50%; background: rgba(255,255,255,.1); pointer-events: none;
}
.hbc-deco-1 { width: 180px; height: 180px; top: -70px; right: -50px; }
.hbc-deco-2 { width: 110px; height: 110px; bottom: -40px; right: 50px; }
.hbc-chip {
  margin-left: auto; background: rgba(255,255,255,.22);
  border: 1px solid rgba(255,255,255,.4); border-radius: 20px;
  padding: 4px 12px; font-size: .7rem; font-weight: 800; color: #fff;
  display: flex; align-items: center; gap: 5px; letter-spacing: .3px;
}

/* ── Sections home ───────────────────────────────────────────── */
.home-section {
  margin-top: 8px;
  margin-bottom: 0;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border: 1.5px solid rgba(255,98,0,.22);
  border-top: 2px solid rgba(255,98,0,.45);
  border-radius: var(--radius-lg);
  padding: 16px 14px;
  box-shadow: 0 6px 24px rgba(0,0,0,.45), 0 0 0 1px rgba(255,98,0,.08) inset;
}
#home-fidelite {
  background: linear-gradient(145deg, #17103a 0%, #1e1248 55%, #120c2c 100%);
  border-color: rgba(255,98,0,.22);
  border-top-color: rgba(255,98,0,.35);
  box-shadow: 0 6px 24px rgba(0,0,0,.45), 0 0 0 1px rgba(255,98,0,.08) inset;
  padding: 10px 16px;
  border-radius: var(--radius-lg);
}

/* Réclamation + Service clients (section) */
.rcp-card { background: none; box-shadow: none; border: none; margin-top: -10px; }

/* Espace excessif entre "Recharge de masse" et "FAQ" juste en dessous
   (demande explicite du 25/08 : "supprime l'espace blanc") — la carte
   .rcp-bulk-card et le wrapper .home-section de la FAQ cumulaient
   chacun leur propre padding/margin ; resserré ici sans toucher aux
   autres sections .home-section. */
#rcp-faq-section { margin-top: -24px; padding-top: 8px; }

/* Même resserrement au-dessus de "Mes commandes programmées" (demande
   explicite du 25/08 : "fais pareil"), entre elle et le tunnel de
   commande juste au-dessus — même mécanisme, scopé à cette seule
   section. Ordre des deux cartes inversé (demande explicite) : "Mes
   commandes programmées" est désormais la première, "Récharge en masse"
   la seconde — voir index.html. Titre en bleu marine de marque
   (#0F0A2E, même teinte que .bottom-nav) pour le distinguer du titre
   noir de la carte "Récharge en masse" (.rcp-bulk-title, non touché
   ailleurs). */
#rcp-mcp-section { margin-top: -62px; padding-top: 8px; }
#rcp-mcp-section .rcp-bulk-title { color: #0F0A2E; }

/* Rapproche "Récharge en masse" de ce qui la précède immédiatement au-
   dessus — réglage de base, utilisé en mode "Maintenant" (Chap Chap
   juste au-dessus, "Mes commandes programmées" masquée). */
#rcp-bulk-section { margin-top: -43px; }

/* Réglage spécifique au mode "Plus tard" (demande explicite :
   "uniquement au niveau de plus tard, rapproche les deux") — les deux
   contextes ci-dessus/ci-dessous partageaient la même règle jusqu'ici,
   ce qui resserrait aussi Chap Chap/"Récharge en masse" en mode
   "Maintenant" à chaque ajustement voulu seulement ici ; body.order-
   mode-later posée par setOrderMode() (js/client.js) permet de les
   régler indépendamment. */
body.order-mode-later #rcp-bulk-section { margin-top: -55px; }

/* Questions fréquentes — modèle "cartes numérotées" (demande explicite :
   "propose un autre modèle plus beau") : chaque question est sa propre
   carte séparée, avec un grand numéro en filigrane dans le coin — plus
   aéré et éditorial qu'une liste compacte à lignes divisées. */
.rcp-faq2-eyebrow {
  display: block; width: fit-content; margin: 0 auto 10px;
  font-size: .58rem; font-weight: 800; color: #0F0A2E;
  background: rgba(15,10,46,.08); border-radius: 999px;
  padding: 3px 10px; text-transform: uppercase; letter-spacing: .08em;
}
.rcp-faq2-hd {
  font-size: 1.2rem; font-weight: 900; color: #16121F; text-align: center;
  width: fit-content; max-width: 100%; margin: 0 auto 14px; position: relative;
}
/* Même soulignement "trait curviligne" bleu marine que « Reprendre
   rapidement » (demande explicite) — vaguelette SVG répétée sous le titre. */
.rcp-faq2-hd::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -9px; height: 7px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='7' viewBox='0 0 36 7'%3E%3Cpath d='M1 4 Q 6 0.5 10 4 T 19 4 T 28 4 T 36 4' fill='none' stroke='%230F0A2E' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;
  background-size: auto 7px;
}
.rcp-faq2-sub { font-size: .78rem; color: var(--gray-500); text-align: center; line-height: 1.55; margin-bottom: 22px; }
.rcp-faq2-list { display: flex; flex-direction: column; gap: 10px; margin: 0 -10px; }
@media (max-width: 600px) { .rcp-faq2-list { margin: 0 -8px; } }
.rcp-faq2-row {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(0,0,0,.07);
  border-radius: 14px;
  box-shadow: 0 6px 18px rgba(0,0,0,.05);
  padding: 0 16px;
}
.rcp-faq2-num {
  position: absolute; top: 6px; right: 14px;
  font-size: 2rem; font-weight: 900; color: rgba(15,10,46,.08);
  line-height: 1; pointer-events: none;
}
.rcp-faq2-q-row {
  position: relative; z-index: 1;
  display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%;
  background: none; border: none; cursor: pointer;
  padding: 16px 0; font-family: var(--font); text-align: left;
}
.rcp-faq2-q { font-size: .84rem; font-weight: 700; color: #16121F; letter-spacing: .005em; }
.rcp-faq2-toggle-wrap {
  flex-shrink: 0; width: 26px; height: 26px; border-radius: 50%;
  background: rgba(15,10,46,.08);
  display: flex; align-items: center; justify-content: center;
  transition: background .2s;
}
.rcp-faq2-toggle { color: #0F0A2E; font-size: .68rem; transition: transform .25s ease; }
.rcp-faq2-row.open .rcp-faq2-toggle-wrap { background: #0F0A2E; }
.rcp-faq2-row.open .rcp-faq2-toggle { color: #fff; transform: rotate(45deg); }
.rcp-faq2-a { position: relative; z-index: 1; max-height: 0; overflow: hidden; transition: max-height .3s ease; }
.rcp-faq2-row.open .rcp-faq2-a { max-height: 200px; }
.rcp-faq2-a-inner { font-size: .78rem; color: var(--gray-500); line-height: 1.6; padding: 0 0 16px; }

/* Avis clients — modèle "une carte + pastilles", agrandi et sophistiqué
   (demande explicite : "agrandir la taille et propose un modèle très
   esthétique et professionnel") : carte plus spacieuse, liseré accent,
   grand guillemet décoratif en filigrane, typographie plus affirmée —
   même recette de défilement que le carrousel promo existant
   (.promo-carousel-wrap/_promoCarouselInit(), js/client.js). */
.rcp-reviews-hd { font-size: 1.05rem; font-weight: 800; color: #16121F; margin-bottom: 12px; }
.rcp-reviews-carousel { overflow: hidden; border-radius: 20px; margin: 0 -10px; }
@media (max-width: 600px) { .rcp-reviews-carousel { margin: 0 -8px; } }
.rcp-reviews-track {
  display: flex;
  transition: transform .5s cubic-bezier(.4,0,.2,1);
}
.rcp-review-card {
  position: relative; overflow: hidden;
  flex: 0 0 100%; min-width: 0;
  min-height: 170px;
  background: #fff;
  border: 1px solid rgba(0,0,0,.06);
  border-radius: 20px;
  box-shadow: 0 14px 32px rgba(0,0,0,.09);
  padding: 20px 18px;
  display: flex; flex-direction: column;
}
.rcp-review-quote {
  position: absolute; top: 14px; right: 20px;
  font-size: 2.6rem; color: rgba(15,10,46,.08);
  line-height: 1; pointer-events: none;
}
.rcp-review-title { position: relative; font-size: .88rem; font-weight: 800; color: #16121F; letter-spacing: .01em; margin-bottom: 8px; }
.rcp-review-text { position: relative; font-size: .74rem; color: var(--gray-500); line-height: 1.55; margin-bottom: 18px; }
.rcp-review-foot { display: flex; align-items: center; gap: 10px; margin-top: auto; padding-top: 12px; border-top: 1px solid rgba(0,0,0,.06); }
.rcp-review-avatar {
  flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%;
  background: linear-gradient(135deg, #1B234F, #0F0A2E);
  color: #fff; font-size: .76rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 12px rgba(15,10,46,.3);
}
.rcp-review-name { font-size: .74rem; font-weight: 800; color: #16121F; margin-bottom: 2px; }
.rcp-review-stars { font-size: .66rem; color: #16A34A; letter-spacing: 1.5px; }

.rcp-reviews-dots {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  margin-top: 10px;
}
.rcp-reviews-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: rgba(15,10,46,.2);
  transition: background .25s, width .25s;
}
.rcp-reviews-dot.active {
  width: 16px; border-radius: 3px; background: #0F0A2E;
}

/* Recharge de masse (professionnels) — modèle "accordéon repliable"
   (demande explicite : "je veux un modèle qui s'ouvre") : seuls l'icône
   et le titre sont visibles par défaut, le clic déplie la description,
   les cas d'usage et le bouton de contact. */
.rcp-bulk-card {
  background: #fff;
  border: 1.5px solid rgba(15,10,46,.25);
  box-shadow: 0 8px 24px rgba(0,0,0,.06);
  border-radius: 20px;
  margin: 12px -12px;
  overflow: hidden;
}
@media (max-width: 600px) { .rcp-bulk-card { margin: 12px -6px; } }
.rcp-bulk-head {
  display: flex; align-items: center; gap: 14px; width: 100%;
  background: none; border: none; cursor: pointer;
  padding: 14px 16px; min-height: 68px; box-sizing: border-box;
  font-family: var(--font); text-align: left;
}
.rcp-bulk-head-text { flex: 1; min-width: 0; }
.rcp-bulk-ico {
  flex-shrink: 0;
  width: 36px; height: 36px;
  border-radius: 50%;
  background: #000; color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: .92rem;
}
.rcp-bulk-title { font-size: .8rem; font-weight: 900; color: #16121F; }
.rcp-bulk-sub { font-size: .62rem; color: var(--gray-500); margin-top: 2px; }
.rcp-bulk-chevron { color: var(--gray-500); font-size: .66rem; flex-shrink: 0; transition: transform .25s ease; }
.rcp-bulk-card.open .rcp-bulk-chevron { transform: rotate(180deg); }
.rcp-bulk-body { max-height: 0; overflow: hidden; transition: max-height .35s ease; }
.rcp-bulk-card.open .rcp-bulk-body { max-height: 560px; }
/* Largeur réduite de 2 px (demande explicite). */
#rcp-bulk-section .rcp-bulk-card { margin-left: -11px; margin-right: -11px; }

.rcp-bulk-body-inner { padding: 0 14px 16px; }
.rcp-bulk-desc { font-size: .78rem; color: #16121F; font-weight: 600; margin: 0 0 12px; }
/* Autre modèle d'organisation (demande explicite) : les publics cibles
   passent d'une liste en 2 colonnes à une rangée d'étiquettes "pilule" qui
   s'enroulent naturellement. */
.rcp-bulk-list { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.rcp-bulk-item {
  display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
  background: rgba(15,10,46,.05);
  border: 1px solid rgba(15,10,46,.1);
  border-radius: 999px; padding: 7px 12px;
  font-size: .72rem; font-weight: 700; color: #16121F;
}
.rcp-bulk-item i { color: #0F0A2E; font-size: .72rem; flex-shrink: 0; }
.rcp-bulk-cta {
  background: none;
  border-radius: 14px;
  padding: 0;
}
.rcp-bulk-cta p { font-size: .78rem; font-weight: 700; color: #0F0A2E; margin: 0 0 12px; }
.rcp-bulk-cta-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; box-sizing: border-box;
  background: #000; color: #fff;
  font-size: .8rem; font-weight: 800;
  padding: 13px; border-radius: 999px;
  text-decoration: none;
}

/* Chiffres de confiance — modèle "simple, libellé en haut, fond blanc"
   (demande explicite), réutilise directement .asc-stats/.asc-stat/etc.
   déjà utilisées dans la Vitrine app plus bas dans la page, avec des
   couleurs adaptées au fond clair (surcharges scopées ci-dessous). */
.rcp-stats-card {
  background: none;
  border: none;
  box-shadow: none;
  padding: 0 0 24px;
  margin: 12px 0;
  border-bottom: 1px solid rgba(0,0,0,.08);
}
.rcp-stats-hd { font-size: 1rem; font-weight: 800; color: #16121F; text-align: center; margin-bottom: 16px; }
.rcp-stats-card .asc-stat-val { font-size: 1.7rem; color: #0F0A2E; }
.rcp-stats-card .asc-stat-lbl { font-size: .62rem; color: var(--gray-500); }
.rcp-stats-card .asc-stat + .asc-stat::before { background: rgba(0,0,0,.1); }

/* Appel à l'action "Télécharger l'app" — reproduction textuelle de la
   référence fournie (bannière CTA SendChap, demande explicite : "je veux
   textuellement ce modèle") adaptée au contexte KBINE PLUS : fond pêche,
   texte à gauche, grand logo à droite. */
.rcp-cta-card {
  background: none;
  border: none;
  box-shadow: none;
  padding: 12px 0;
  margin: 0 0 28px;
}
.rcp-cta-row { display: flex; align-items: center; gap: 16px; }
.rcp-cta-text { flex: 1; min-width: 0; text-align: left; padding-left: 10px; }
/* Titre facon vitrine (repris du heros de l'Espace web) : amorce bleu
   marine, puis « en » petit + « Côte d'Ivoire » en tres grand orange pur. */
.rcp-cta-title { font-weight: 900; color: #0F0A2E; margin-bottom: 12px; line-height: 1.1; letter-spacing: -.02em; }
.rcp-cta-lead { display: block; font-size: clamp(1.15rem, 4.6vw, 1.5rem); }
.rcp-cta-geo { display: block; margin-top: 3px; }
.rcp-cta-en { font-size: .58em; font-weight: 800; color: #8B879C; vertical-align: middle; margin-right: .14em; }
.rcp-cta-ci { font-size: clamp(1.85rem, 7.4vw, 2.6rem); font-weight: 900; letter-spacing: -.03em; color: #FF6200; vertical-align: middle; }
.rcp-cta-desc {
  font-size: .8rem; font-weight: 450; color: #5B5F6E;
  line-height: 1.7; letter-spacing: .005em; margin: 0 0 16px;
}
.rcp-cta-btn {
  display: inline-block; text-decoration: none;
  background: #0F0A2E; color: #fff;
  font-size: .78rem; font-weight: 800;
  padding: 12px 22px; border-radius: 999px;
}
.rcp-cta-caption { font-size: .64rem; color: var(--gray-500); margin-top: 12px; }
.rcp-cta-art { flex: 0 0 44%; display: flex; align-items: flex-end; justify-content: center; gap: 6px; }
.rcp-cta-logo-big {
  width: 100%; max-width: 110px; height: auto; object-fit: contain;
}
.rcp-cta-logo-big--c { max-width: 140px; }

.home-section--bare {
  background: none;
  border: none;
  box-shadow: none;
  margin-top: -4px;
}

/* Demande explicite : à partir de "Rejoignez-nous dès maintenant sur"
   jusqu'au bas de la page (jusque-là fond blanc de .client-page/body qui
   transparaissait, .home-section--light étant elle-même transparente), le
   fond doit être bleu marine — même teinte que .bottom-nav (#0F0A2E), qui
   flotte par-dessus. padding-bottom généreux + margin-bottom négatif
   annulant la réserve de 110px de .client-page (place pour le nav flottant)
   : le bloc s'étend visuellement jusqu'à la limite basse réelle de la page,
   quel que soit son contenu. margin-left/right négatif : annule le padding
   horizontal de .client-page (20px desktop/12px mobile, voir media query
   ci-dessous) pour retrouver le même surplomb de 14px de chaque côté que
   .bottom-nav (width: calc(100% - 28px)) — "occupe tout l'espace comme la
   barre flottante". */
.home-section--light {
  position: relative;
  overflow: hidden;
  background: linear-gradient(150deg, #141B45 0%, #0A0A22 100%);
  border: none;
  box-shadow: none;
  border-radius: 10px 10px 0 0;
  padding: 18px 20px 110px;
  margin: -20px -20px -110px;
}
/* Liseré d'accent en tête du pied de page (demande explicite : "propose
   un modèle professionnel") — fine ligne dégradée, touche premium plutôt
   qu'une coupure franche entre la carte précédente et le fond marine. */
.home-section--light::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: linear-gradient(to right, transparent, rgba(255,98,0,.7), transparent);
}
@media (max-width: 600px) {
  .home-section--light { margin-left: -12px; margin-right: -12px; padding-left: 14px; padding-right: 14px; }
}

/* Pied de page — modèle inspiré d'une référence fournie (Jèko), adapté au
   contexte KBINE PLUS, disposition plus soignée (demande explicite :
   "dispose pour avoir un modèle plus esthétique et plus professionnel") :
   séparateur entre le bloc marque et les colonnes, titres de colonne avec
   accent, liens avec icône repère — empilés verticalement (écran étroit)
   plutôt qu'en rangée comme la référence desktop. */
/* Disposition "marque à gauche, réseaux à droite" (demande explicite :
   "propose moi autre manière de disposition") — entête façon magazine :
   logo+nom et icônes sociales sur la même ligne, tout aligné à gauche
   en dessous, plutôt que tout centré. */
.ftr-row { display: flex; flex-direction: column; align-items: stretch; gap: 10px; text-align: left; }
.ftr-masthead { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.ftr-brand-top { display: flex; align-items: center; gap: 11px; }
.ftr-logo {
  width: 30px; height: 30px; border-radius: 9px;
  background: #fff; object-fit: contain; padding: 6px;
  box-shadow: 0 4px 14px rgba(0,0,0,.25);
}
.ftr-brand-name { font-size: 1.05rem; font-weight: 900; color: #fff; letter-spacing: .04em; }
.ftr-tagline { font-size: .76rem; color: rgba(255,255,255,.55); line-height: 1.6; margin: 0; max-width: 340px; }
/* Modèle "façon Jumia" (demande explicite : "je veux ce modèle") —
   colonnes de liens avec titre en majuscules gras, liens simples en
   dessous, plutôt qu'une ligne unique de liens séparés par des points.
   Panneau blanc distinct (demande explicite : "fonds bleu marine et
   blanc", même esprit que .cqt-band/.cqt-wrapper : bandeau marine en
   tête, corps blanc en dessous) plutôt qu'un fond marine uniforme. */
/* Zone unique bleu marine (demande explicite : "rends la zone blanche en
   bleu marine et les écritures en blanc") — le panneau ne fait plus que
   laisser transparaître le fond marine dégradé de .home-section--light,
   sans coin arrondi ni marge haute qui créerait une cassure. */
.ftr-white-panel {
  background: transparent;
  border-radius: 0;
  margin: 0 -20px -110px;
  padding: 12px 20px 48px;
}
@media (max-width: 600px) { .ftr-white-panel { margin-left: -12px; margin-right: -12px; padding-left: 14px; padding-right: 14px; } }

/* Logotype "KBINE PLUS" en tête du pied de page (demande explicite) —
   « KBINE » plein blanc, « PLUS » en contour seul, sur le fond marine. */
.ftr-wordmark {
  text-align: center;
  font-family: var(--font);
  font-weight: 900;
  font-size: clamp(1.7rem, 8vw, 2.4rem);
  line-height: 1;
  letter-spacing: .01em;
  color: #fff;
  margin: 4px 0 16px;
}
.ftr-wordmark-outline {
  color: transparent;
  -webkit-text-stroke: 1.4px #fff;
  text-stroke: 1.4px #fff;
}

/* Modèle compact : une seule ligne de liens qui reflue, puis icônes
   sociales + copyright sur une ligne séparée par un filet — remplace
   l'ancien modèle "façon Jumia" à 3 colonnes (titres + gros icônes),
   bien plus haut, pour réduire nettement la hauteur du panneau blanc
   (demande explicite). */
.ftr-links-row {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: 5px 14px; margin-bottom: 10px;
}
.ftr-links-row a {
  font-size: .7rem; font-weight: 600; color: rgba(255,255,255,.82);
  text-decoration: none; transition: color .15s;
}
.ftr-links-row a:hover { color: #fff; }
.ftr-bottom-row {
  display: flex; flex-direction: column; align-items: center; gap: 7px;
  padding-top: 8px; border-top: 1px solid rgba(255,255,255,.15);
}
.ftr-social-sm { display: flex; gap: 8px; }
.ftr-social-sm-btn {
  width: 26px; height: 26px; border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
  font-size: .72rem; color: #fff;
  transition: transform .15s;
}
.ftr-social-sm-btn:hover { transform: translateY(-2px); }
.ftr-social-sm-btn--tt { background: #000; border: 1px solid rgba(255,255,255,.18); }
.ftr-social-sm-btn--wa { background: linear-gradient(135deg, #25D366, #128C7E); }
/* .asc-copyright porte déjà sa propre bordure/marge de séparation (voir
   plus bas) — ici cette séparation est déjà assurée par .ftr-bottom-row,
   la dupliquer donnerait un double filet/espace. */
.ftr-bottom-row .asc-copyright { margin-top: 0; padding-top: 0; border-top: none; font-size: .62rem; color: rgba(255,255,255,.7); }

/* ── Vitrine app (façon fiche App Store) ──────────────────────── */
/* Occupe toute la largeur comme .bottom-nav (demande explicite) : même
   technique que .home-section--light plus bas dans ce fichier — margin
   horizontal négatif annulant le padding de .client-page (20px desktop/
   12px mobile), padding repris à 14px pour retrouver le même surplomb que
   .bottom-nav (width: calc(100% - 28px)). */
.asc-card {
  margin: 8px -20px 0;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  /* padding-bottom : la section suivante (.home-section--light, "Suivez-
     nous") a un margin-top: -20px volontaire (voir son commentaire) pour
     s'étendre jusqu'en bas de la page — 20px pile suffisait tout juste à
     ne plus chevaucher le bouton mais laissait les deux collés (aucune
     séparation visible) ; marge supplémentaire ici pour un vrai espace. */
  padding: 16px 14px 36px;
  box-shadow: 0 6px 24px rgba(0,0,0,.45);
  border: 1.5px solid rgba(255,255,255,.08);
}
@media (max-width: 600px) {
  .asc-card { margin-left: -12px; margin-right: -12px; }
}
.asc-top { display: flex; align-items: center; gap: 14px; }
.asc-icon {
  flex-shrink: 0; width: 92px; height: 92px; border-radius: 16px;
  background: none;
  display: flex; align-items: center; justify-content: center;
  color: var(--primary); font-size: 1.4rem;
  overflow: hidden;
}
/* Réduit spécifiquement dans ce badge (le PNG lui-même a déjà sa propre
   marge autour de la mascotte, inutile de zoomer ici) — demande explicite,
   n'affecte que cet emplacement, jamais le fichier logo partagé ailleurs. */
.asc-icon img { width: 100%; height: 100%; object-fit: contain; transform: scale(.78); }
.asc-info { flex: 1; min-width: 0; }
.asc-title {
  font-size: 1.05rem; font-weight: 900; color: var(--primary);
  text-transform: uppercase; letter-spacing: .02em; line-height: 1.25;
}
.asc-sub {
  font-size: .62rem; font-weight: 700; color: #fff;
  margin-top: 3px;
}
.asc-rating {
  display: flex; align-items: center; gap: 6px;
  margin-top: 8px; font-size: .76rem; font-weight: 700;
  color: #fff;
}
.asc-stars { color: var(--primary); letter-spacing: 1px; }
.asc-dot { opacity: .6; }

/* Chiffres de confiance — bloc orange imbriqué dans .asc-card (bleu
   marine), maquette de référence fournie par le client. */
.asc-stats-card {
  margin-top: 28px;
  background: rgba(255,255,255,.05);
  border: none;
  border-radius: var(--radius-md, 14px);
  padding: 12px 10px;
  box-shadow: none;
}
.asc-stats {
  display: flex;
}
.asc-stat { flex: 1; text-align: center; position: relative; }
.asc-stat + .asc-stat::before {
  content: ''; position: absolute; left: 0; top: 4px; bottom: 4px;
  width: 1px; background: rgba(255,255,255,.15);
}
.asc-stat-val { font-size: .88rem; font-weight: 900; color: var(--primary); line-height: 1.1; }
.asc-stat-lbl {
  font-size: .48rem; font-weight: 700; color: rgba(255,255,255,.6);
  text-transform: uppercase; letter-spacing: .06em; margin-top: 2px;
}

/* Copyright intégré en bas de la vitrine */
.asc-copyright {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  margin-top: 16px; padding-top: 16px;
  border-top: 1px solid rgba(0,0,0,.08);
  font-size: .68rem; font-weight: 600; color: var(--gray-500);
}
.asc-copyright-logo { height: 16px; width: auto; object-fit: contain; opacity: .8; }

/* Liens rapides sous le copyright (Recharge/Forfaits/Support/téléphone/
   WhatsApp) — demande explicite, mêmes actions que les raccourcis
   existants (openRechargeModalGated()/handleClientWhatsappClick()) plutôt
   que de dupliquer cette logique. */
.asc-footer-links {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: 6px; margin-top: 5px;
  font-size: .7rem; font-weight: 600;
}
.asc-footer-links a { color: rgba(255,255,255,.6); text-decoration: none; }
.asc-footer-links a:hover { color: var(--primary); }
.asc-footer-dot { color: rgba(255,255,255,.3); }

/* #home-balance-card est un simple conteneur : .pgc-card / .pgc-balance-card /
   .pgc-panel gèrent chacun leur propre habillage. Un border/overflow:hidden
   ici casserait le position:sticky de .pgc-sticky-wrap qu'il contient. */
.home-section-head {
  display: flex; align-items: center; gap: 10px; margin-bottom: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(255,98,0,.28);
  background: linear-gradient(90deg, rgba(255,98,0,.06) 0%, transparent 60%);
  margin-left: -14px; margin-right: -14px; padding-left: 14px; padding-right: 14px;
  border-radius: 0;
}
.home-section-head--center { justify-content: center; }
.home-section-head--center .home-section-title { flex: 1; justify-content: center; }
.home-section-title {
  font-size: .9rem; font-weight: 900; color: #fff;
  display: flex; align-items: center; gap: 8px;
}
.home-section-title i { color: var(--primary); filter: drop-shadow(0 0 5px rgba(255,98,0,.5)); }
.home-section-badge {
  font-size: .62rem; font-weight: 800; padding: 2px 8px;
  background: rgba(255,98,0,.2); color: #FF9020; border-radius: 20px;
  letter-spacing: .5px; border: 1px solid rgba(255,98,0,.3);
}
.fid-badge-promo {
  font-size: .62rem; font-weight: 800; padding: 2px 8px;
  background: rgba(255,200,0,.15); color: #FFCC44;
  border-radius: 20px; margin-left: auto;
  border: 1px solid rgba(255,200,0,.25);
}

/* ── Message d'instruction commande ────────────────────────── */
/* Bandeau clair pastel (demande explicite du 27/08, référence fournie) —
   remplace l'ancienne carte sombre à badge lumineux, jamais branchée
   jusqu'ici (voir #sched-section, index.html : seul endroit qui utilise
   ce composant pour l'instant). */
.tf-order-intro {
  background: #EAF9EF;
  border: 1px solid #B8E8C4;
  border-radius: 14px;
  padding: 12px 14px; margin-bottom: 26px;
}
.tf-oi-title {
  font-size: .92rem; font-weight: 800; color: #16121F; line-height: 1.3;
  margin-bottom: 4px;
}
.tf-oi-sub {
  font-size: .74rem; color: var(--gray-600); line-height: 1.55; font-weight: 500;
}

/* ── Actualités — nouvelle section ─────────────────────────── */
.actu-section .home-section-head {
  flex-wrap: wrap; gap: 10px;
}
.actu-tabs {
  display: flex; gap: 6px; margin-left: auto;
}
.actu-tab {
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.1);
  color: rgba(255,255,255,.45); border-radius: 99px;
  padding: 3px 9px; font-size: .58rem; font-weight: 800;
  cursor: pointer; font-family: var(--font);
  transition: all .2s; white-space: nowrap;
}
.actu-tab.active {
  background: var(--primary); border-color: var(--primary);
  color: #fff; box-shadow: 0 2px 10px rgba(255,98,0,.35);
}

.actu-list { display: block; }

/* Une news vedette en haut + les suivantes en liste compacte */
.actu-cat {
  font-size: .48rem; font-weight: 900; text-transform: uppercase;
  letter-spacing: .5px; border-radius: 99px;
  display: inline-block; padding: 1px 5px;
  width: fit-content;
}
.actu-cat--foot { background: rgba(34,197,94,.15); color: #4ade80; }
.actu-cat--pol  { background: rgba(99,102,241,.18); color: #a5b4fc; }
.actu-cat--kbine { background: rgba(255,98,0,.18); color: #FF9A3C; }

.actu-featured {
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.08);
  border-radius: 12px; padding: 12px 14px;
  display: flex; flex-direction: column; gap: 6px;
  cursor: pointer; margin-bottom: 10px;
  transition: background .15s;
}
.actu-featured:hover { background: rgba(255,255,255,.1); }
.actu-featured-top { display: flex; align-items: center; gap: 8px; }
.actu-featured-title {
  font-size: .78rem; font-weight: 800; color: #fff; line-height: 1.4;
}

.actu-mini-list { display: flex; flex-direction: column; }
.actu-mini-item {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 2px;
  border-top: 1px solid rgba(255,255,255,.07);
  cursor: pointer;
}
.actu-mini-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.actu-mini-dot--foot { background: #4ade80; }
.actu-mini-dot--pol  { background: #a5b4fc; }
.actu-mini-dot--kbine { background: #FF6200; }
.actu-mini-title {
  flex: 1; min-width: 0;
  font-size: .64rem; font-weight: 600; color: rgba(255,255,255,.75);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.actu-mini-time { font-size: .52rem; color: rgba(255,255,255,.3); flex-shrink: 0; }

.actu-meta {
  font-size: .52rem; color: rgba(255,255,255,.3); font-weight: 500;
  display: flex; align-items: center; gap: 4px;
}
.actu-meta i { font-size: .48rem; }

/* ── Ancienne liste simple ──────────────────────────────────── */
.actu-list-old {
  background: #fff; border-radius: var(--radius-lg);
  border: 1px solid #f0e8e0; overflow: hidden;
}
.actu-item {
  display: flex; align-items: center; gap: 14px;
  padding: 16px; border-bottom: 1px solid #faf0ea;
  cursor: pointer; transition: background .15s;
}
.actu-item:active { background: #fff8f3; }
.actu-icon-wrap {
  width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem;
}
.actu-item-body { flex: 1; min-width: 0; }
.actu-item-cat {
  font-size: .68rem; font-weight: 800; text-transform: uppercase;
  letter-spacing: .5px; margin-bottom: 4px;
}
.actu-item-title {
  font-size: .82rem; font-weight: 600; color: var(--gray-800);
  line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.actu-item-meta {
  font-size: .7rem; color: var(--gray-400); margin-top: 5px;
  display: flex; align-items: center; gap: 5px;
}
.actu-arrow { color: var(--gray-300); font-size: .8rem; flex-shrink: 0; }

/* ── Fidélité ────────────────────────────────────────────────── */
.fid-card {
  background: #fff; border-radius: var(--radius-lg);
  padding: 18px 18px 14px;
  box-shadow: 0 2px 8px rgba(168,230,176,.25);
}
.fid-reward-visual {
  display: flex; align-items: center; gap: 14px; margin-bottom: 16px;
  padding-bottom: 14px; border-bottom: 1px solid var(--gray-100);
}
.fid-cake-icon { font-size: 2.6rem; line-height: 1; }
.fid-reward-title { font-size: .95rem; font-weight: 900; color: #000; }
.fid-reward-sub { font-size: .75rem; color: var(--gray-500); margin-top: 2px; }
.fid-progress-labels {
  display: flex; justify-content: space-between; align-items: center;
  font-size: .78rem; font-weight: 700; color: var(--gray-700); margin-bottom: 8px;
}
.fid-goal { color: var(--primary); }
.fid-bar-track {
  height: 10px; border-radius: 20px; background: var(--gray-100); overflow: hidden; margin-bottom: 6px;
}
.fid-bar-fill {
  height: 100%; border-radius: 20px; width: 0%;
  background: linear-gradient(90deg, var(--primary), #ff8c42);
  transition: width .6s cubic-bezier(.34,1.56,.64,1);
}
.fid-progress-hint { font-size: .72rem; color: var(--gray-400); text-align: center; margin-top: 4px; }
.fid-milestones {
  display: flex; justify-content: space-between; margin-top: 12px; padding-top: 10px;
  border-top: 1px solid var(--gray-100); position: relative;
}
.fid-ms {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  font-size: .65rem; font-weight: 700; color: var(--gray-400);
}
.fid-ms.reached { color: var(--primary); }
.fid-ms-dot {
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--gray-200); border: 2px solid var(--gray-300);
  display: flex; align-items: center; justify-content: center; font-size: .55rem;
}
.fid-ms.reached .fid-ms-dot { background: var(--primary); border-color: var(--primary); color: #fff; }
.fid-ms-goal .fid-ms-dot { font-size: .75rem; background: transparent; border: none; }

/* ── Mur de connexion (sections privées) ─────────────────────── */
.elc-wall {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; padding: 44px 24px 40px;
  background: #fff;
  border-radius: 20px; margin-bottom: 16px;
  border: 1px solid #E8E9EE;
}
.elc-wall-glow { display: none; }
.elc-wall-lock {
  width: 64px; height: 64px; border-radius: 50%;
  background: rgba(15,10,46,.06);
  border: none;
  color: #0F0A2E; font-size: 1.35rem;
  display: flex; align-items: center; justify-content: center;
  margin: 0 auto 16px;
  overflow: hidden;
}
.elc-wall-lock img { width: 78%; height: 78%; object-fit: contain; }
.elc-wall-title {
  font-size: 1rem; font-weight: 900; color: #000000;
  margin-bottom: 8px;
}
.elc-wall-sub {
  font-size: .78rem; color: var(--gray-500);
  line-height: 1.6; max-width: 220px; margin: 0 auto 22px;
}
.elc-wall-btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 12px 26px; border-radius: 99px; border: none;
  background: #0F0A2E; background-image: none;
  -webkit-appearance: none; appearance: none;
  color: #fff; font-size: .85rem; font-weight: 800;
  cursor: pointer; transition: opacity .15s;
  box-shadow: none;
}
.elc-wall-btn:hover  { opacity: .88; }
.elc-wall-btn:active { opacity: .75; }

/* Lien secondaire "Ouvrir un compte" (direction B choisie via canvas
   de design le 25/08) — sous le bouton principal "Se connecter",
   plutôt qu'un second bouton plein de même poids. */
.elc-wall-signup {
  margin-top: 16px; font-size: .68rem; color: var(--gray-500);
}
.elc-wall-signup a {
  color: #0F0A2E; font-weight: 800; text-decoration: underline; cursor: pointer;
}

/* Lien "Retour" — les 5 encarts "verrouillé" inline (historique/
   dépenses/portefeuille/transférer/profit) n'avaient aucune échappatoire
   pour un invité qui n'a pas envie de se connecter (demande explicite :
   "propose une option de retour partout"). Absent du popup
   #modal-private-space, qui a déjà sa croix de fermeture. */
.elc-wall-back {
  margin-top: 14px; background: none; border: none; cursor: pointer;
  font-family: var(--font); font-size: .72rem; font-weight: 700;
  color: var(--gray-500); display: inline-flex; align-items: center; gap: 5px;
  transition: color .15s;
}
.elc-wall-back i { font-size: .62rem; }
.elc-wall-back:hover { color: #0F0A2E; }

/* "Se connecter" + "S'inscrire" (#modal-private-space uniquement) — fond
   orange retiré, contours bleu marine sur les deux, même gabarit
   (demande explicite). */
#modal-private-space .elc-wall-btn {
  width: 100%; justify-content: center; box-sizing: border-box;
  background: none; border: 1.5px solid #0d1a3d;
  color: #0d1a3d;
}
#modal-private-space .elc-wall-btn:hover  { background: rgba(13,26,61,.06); opacity: 1; }
#modal-private-space .elc-wall-btn:active { background: rgba(13,26,61,.1); opacity: 1; }
.elc-wall-btn--outline { margin-top: 8px; }

/* Popup "Espace privé" (#modal-private-space) uniquement — remplace le
   badge logo + phrase unique (.elc-wall-lock/.elc-wall-sub, toujours
   utilisés tels quels par les 4 encarts "verrouillé" inline des sections
   historique/dépenses/portefeuille/profil, jamais retouchés ici) par un
   badge icône contextuel + une liste de bénéfices courts, adaptée par
   service (voir openPrivateSpaceNotice(), js/client.js). */
.elc-wall-badge {
  width: 42px; height: 42px; border-radius: 50%; margin: 0 auto 8px;
  background: linear-gradient(145deg, #FF6200, #CC4E00);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 8px 16px -6px rgba(255,98,0,.55);
  color: #fff; font-size: .95rem; flex-shrink: 0;
}
.elc-wall-list {
  list-style: none; margin: 2px auto 12px; padding: 0;
  display: flex; flex-direction: column; gap: 6px;
  text-align: left; width: 100%; max-width: 220px;
}
.elc-wall-list li {
  display: flex; align-items: center; gap: 7px;
  font-size: .66rem; font-weight: 600; color: #2b241c; line-height: 1.35;
  background: #FBF7F2; border: 1px solid rgba(28,23,18,.06);
  padding: 6px 9px; border-radius: 9px;
}
.elc-wall-list .chk {
  width: 13px; height: 13px; border-radius: 50%; flex-shrink: 0;
  background: rgba(0,154,68,.12); color: #009A44;
  display: flex; align-items: center; justify-content: center; font-size: .44rem;
}
/* Popup uniquement : la carte .elc-wall/.elc-wall-title/.elc-wall-btn reste
   partagée avec les 4 encarts "verrouillé" inline (padding/taille d'origine
   pour eux, voir plus haut) — resserrée ici en plus pour un popup qui
   n'a pas besoin d'autant de respiration qu'une section pleine page. */
#modal-private-space .elc-wall     { padding: 28px 20px 22px; }
#modal-private-space .elc-wall-title { font-size: .88rem; margin-bottom: 2px; }
#modal-private-space .elc-wall-btn   { padding: 9px 20px; font-size: .76rem; }

/* Popup "Espace privé" : le .elc-wall fait toute la carte, le modal
   lui-même reste transparent (pas de double cadre). */
.priv-modal {
  position: relative; background: none; box-shadow: none;
  max-width: 288px; overflow: visible;
}
.priv-modal-close {
  position: absolute; top: -42px; right: 0;
  width: 32px; height: 32px; border-radius: 50%;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.25);
  color: #fff; font-size: .85rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background .15s;
}
.priv-modal-close:hover { background: rgba(255,255,255,.22); }

/* ── Section Profil / Coordonnées ───────────────────────────── */
.pc-card {
  position: relative; overflow: hidden;
  background: #0d0d18;
  border: 1px solid rgba(255,255,255,.07);
  border-radius: 20px; margin: 12px 12px 0; padding: 18px 16px 14px;
}
.pc-card-bg {
  position: absolute; top: -40px; right: -40px; width: 160px; height: 160px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.12), transparent 70%);
  pointer-events: none;
}
.pc-card-top {
  display: flex; align-items: center; gap: 12px; margin-bottom: 14px;
}
.pc-card-ava-wrap {
  position: relative; flex-shrink: 0; cursor: pointer;
}
.pc-card-id { flex: 1; min-width: 0; }
.pc-card-name {
  font-size: .82rem; font-weight: 900; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  margin-bottom: 3px;
}
.pc-card-sub {
  font-size: .55rem; color: rgba(255,255,255,.35);
  display: flex; align-items: center; gap: 5px;
}
.pc-card-solde { text-align: right; flex-shrink: 0; }
.pc-card-solde-val {
  font-size: .9rem; font-weight: 900; color: #22c55e;
  white-space: nowrap;
}
.pc-card-solde-lbl {
  font-size: .48rem; font-weight: 700; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .08em;
}
.pc-card-sep {
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.08), transparent);
  margin-bottom: 14px;
}
.pc-card-metrics {
  display: flex; align-items: center; gap: 0;
}
.pc-card-metric {
  flex: 1; display: flex; align-items: center; gap: 10px;
}
.pc-card-metric-ico { font-size: .78rem; flex-shrink: 0; }
.pc-card-metric-val {
  font-size: .75rem; font-weight: 800; color: #fff; margin-bottom: 2px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100px;
}
.pc-card-metric-lbl {
  font-size: .48rem; font-weight: 700; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em;
}
.pc-card-vline {
  width: 1px; height: 32px; background: rgba(255,255,255,.07); margin: 0 14px;
  flex-shrink: 0;
}

/* Carte profil v3 — regroupée en une seule carte blanche professionnelle
   (au lieu de deux bandes de couleur contrastées orange/navy empilées) :
   texte en noir/bleu marine, un simple séparateur discret entre le
   montant et l'identité plutôt qu'un changement de fond. */
.pc3-card {
  margin: 12px 0 0;
  background: #fff;
  border-radius: 20px 20px 0 0; overflow: hidden;
  border: 1px solid #E8ECF4; border-bottom: none;
  box-shadow: none;
}
.pc3-top {
  background: #fff;
  padding: 20px 18px 16px; position: relative; overflow: hidden;
  display: flex; flex-direction: column; gap: 4px;
}
.pc3-top::before {
  content: ''; position: absolute; top: -30px; right: -30px;
  width: 120px; height: 120px; border-radius: 50%;
  background: rgba(10,19,48,.04); pointer-events: none;
}
.pc3-top::after { content: none; }
.pc3-top-label {
  font-size: .52rem; font-weight: 700; color: rgba(0,0,0,.45);
  text-transform: uppercase; letter-spacing: .1em;
}
.pc3-top-amount {
  font-size: 1.6rem; font-weight: 900; color: #0a1330;
  letter-spacing: -.03em; line-height: 1;
}
.pc3-top-badge {
  display: inline-flex; align-items: center; gap: 5px;
  background: rgba(34,197,94,.1); border: 1px solid rgba(34,197,94,.25);
  border-radius: 999px;
  padding: 3px 10px; font-size: .52rem; font-weight: 700; color: #16a34a;
  width: fit-content; margin-top: 4px;
}
.pc3-bottom {
  background: #fff; padding: 14px 16px;
  border-top: 1px solid #F0F2F7;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
}
.pc3-left { display: flex; align-items: center; gap: 11px; flex: 1; min-width: 0; }
.pc3-ava-wrap { position: relative; flex-shrink: 0; cursor: pointer; }
.pc3-ava { width: 44px !important; height: 44px !important; font-size: .85rem !important; }
.pc3-name {
  font-size: .72rem; font-weight: 800; color: #0a1330;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 3px;
}
.pc3-tel { font-size: .58rem; color: rgba(0,0,0,.4); }
.pc3-right { flex-shrink: 0; text-align: right; }
.pc3-stat-val { font-size: .9rem; font-weight: 900; color: #FF6200; }
.pc3-stat-lbl { font-size: .48rem; font-weight: 700; color: rgba(0,0,0,.35); text-transform: uppercase; letter-spacing: .07em; }

/* Ancien .pc-hero conservé vide */
.pc-hero { display: none; }
.pc-hero-glow { display: none; }

.pc-hero {
  position: relative; overflow: hidden;
  text-align: center; padding: 36px 20px 24px;
  background: linear-gradient(160deg, #190f3e 0%, #0f0830 100%);
  border-radius: 20px; margin-bottom: 16px;
  border: 1px solid rgba(138,99,255,.2);
}
.pc-hero-glow {
  position: absolute; top: -40px; left: 50%; transform: translateX(-50%);
  width: 180px; height: 180px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.35) 0%, transparent 70%);
  pointer-events: none;
}
.pc-avatar-wrap {
  position: relative; display: inline-block; margin-bottom: 14px;
  cursor: pointer;
}
.pc-avatar-edit {
  position: absolute; inset: 0; border-radius: 50%;
  background: rgba(0,0,0,.45); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: .9rem; opacity: 0;
  transition: opacity .2s;
}
.pc-avatar-wrap:hover .pc-avatar-edit { opacity: 1; }
.pc-avatar {
  width: 76px; height: 76px; border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), #9b3500);
  color: #fff; font-size: 1.6rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 4px rgba(255,98,0,.2), 0 6px 24px rgba(255,98,0,.4);
}
.pc-avatar-badge {
  position: absolute; bottom: 1px; right: 1px;
  width: 22px; height: 22px; border-radius: 50%;
  background: #22c55e; color: #fff;
  font-size: .52rem; display: flex; align-items: center; justify-content: center;
  border: 2px solid #0f0828;
}
.pc-name {
  font-size: 1.15rem; font-weight: 900; color: #fff;
  margin-bottom: 6px; letter-spacing: -.01em;
}
.pc-role-tag {
  display: inline-flex; align-items: center; gap: 5px;
  background: rgba(255,98,0,.15); color: var(--primary);
  border: 1px solid rgba(255,98,0,.25);
  font-size: .65rem; font-weight: 800; padding: 4px 12px; border-radius: 99px;
  text-transform: uppercase; letter-spacing: .05em;
  margin-bottom: 20px;
}
.pc-bubbles {
  display: flex; justify-content: center; gap: 10px; margin: 4px 0;
}
.pc-bubble {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.07);
  border-radius: 16px; padding: 12px 14px; min-width: 76px;
  transition: background .2s, transform .15s;
}
.pc-bubble:hover { background: rgba(255,255,255,.07); transform: translateY(-2px); }
.pc-bubble-ico {
  width: 36px; height: 36px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center; font-size: .75rem;
}
.pc-bubble-val {
  font-size: .8rem; font-weight: 900; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 80px;
  text-align: center;
}
.pc-bubble-lbl {
  font-size: .5rem; font-weight: 700; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em;
}

/* ancien coord-row conservé pour compatibilité */
.coord-row { display:none; }

/* ── Coordonnées v2 — lignes ─────────────────────────────────── */
.crd2-panel {
  background: linear-gradient(150deg, #14161d 0%, #101218 55%, #0a0b0f 100%);
  border: 1px solid rgba(255,255,255,.07);
  border-radius: 18px; margin: 10px 12px; overflow: hidden;
}
.crd2-head {
  display: flex; align-items: center; gap: 8px;
  padding: 14px 16px 12px;
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .1em;
  border-bottom: 1px solid rgba(255,255,255,.05);
}
.crd2-head i { color: var(--primary); font-size: .7rem; }

.crd2-row {
  display: flex; align-items: center; gap: 14px;
  padding: 14px 16px;
  transition: background .15s;
}
.crd2-row:hover { background: rgba(255,255,255,.03); }
.crd2-ico {
  width: 38px; height: 38px; border-radius: 12px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .8rem;
}
.crd2-info { flex: 1; min-width: 0; }
.crd2-lbl {
  font-size: .5rem; font-weight: 700; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .08em; margin-bottom: 4px;
}
.crd2-val {
  font-size: .82rem; font-weight: 800; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.crd2-val--green { color: #22c55e; }
.crd2-divider {
  height: 1px; margin: 0 16px;
  background: rgba(255,255,255,.05);
}

/* Police propre à la LISTE du profil client (demande du 2026-09-03 :
   "une bonne police comme celle de Gmail") — Poppins (géométrique, rond,
   proche de Google Sans/Product Sans). Portée strictement à
   #cs-profit-content : les modales ouvertes par ces lignes
   (#modal-client-notifications, #modal-change-pin, #modal-client-devices)
   sont hors de ce conteneur et gardent la police de l'app. Les graisses
   très hautes (900/800) des titres/valeurs sont ramenées à 600 : Poppins
   Black paraît lourd à cette taille. */
#cs-profit-content {
  font-family: "Poppins", "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
#cs-profit-content .rcp-bulk-title,
#cs-profit-content .ref2-banner-title,
#cs-profit-content .crd2-val,
#cs-profit-content #pc-coordonnees-card .crd2-val { font-weight: 600; }
#cs-profit-content .crd2-lbl,
#cs-profit-content #pc-coordonnees-card .crd2-lbl { font-weight: 500; }
/* Taille de police de cette liste (2026-09-03 : agrandie puis réduite —
   compromis entre l'ancienne .8rem et la version élargie .95rem). */
#cs-profit-content .rcp-bulk-title,
#cs-profit-content .ref2-banner-title { font-size: .85rem; }
#cs-profit-content .crd2-val,
#cs-profit-content #pc-coordonnees-card .crd2-val { font-size: .85rem; }
#cs-profit-content .crd2-lbl,
#cs-profit-content #pc-coordonnees-card .crd2-lbl { font-size: .7rem; }

/* ── Modèle "réglages sectionnés" (demande du 2026-09-03 : "propose-moi
   un autre") ──────────────────────────────────────────────────────────
   Deux groupes étiquetés — « Mon compte » (coordonnées + parrainage) et
   « Sécurité & appareils » (notifications + code PIN + appareils) —
   chacun dans son propre cadre blanc, filet fin entre les lignes.
   L'étiquette encode une vraie catégorie, pas de la décoration. Tout est
   scopé à #cs-profit-content. */
#cs-profit-content { background: none; border: 0; box-shadow: none; }

.pfgrp + .pfgrp { margin-top: 18px; }
.pfgrp-label {
  font-size: .78rem; font-weight: 500; letter-spacing: .08em;
  text-transform: uppercase; color: #16121F;
  padding: 0 4px 9px;
}
.pfgrp-card {
  background: #fff;
  border: 1px solid #ECEDF2;
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 1px 2px rgba(15,10,46,.04);
}
/* Chaque item perd bordure / arrondi / ombre / marges ; le filet gère la
   séparation à l'intérieur du groupe. */
.pfgrp-card > #pc-coordonnees-card,
.pfgrp-card > .ref2-wrap,
.pfgrp-card > .crd2-panel--white {
  margin: 0; border: 0; border-radius: 0; box-shadow: none;
}
.pfgrp-card > * + * { border-top: 1px solid #EEEFF3; }

/* En-têtes / lignes : hauteur et retrait homogènes. */
#cs-profit-content .rcp-bulk-head,
#cs-profit-content .ref2-banner,
#cs-profit-content .crd2-panel--white .crd2-row {
  min-height: 56px; padding: 12px 16px;
}
#cs-profit-content .ref2-banner { border-bottom: 0; }

/* Icône uniforme : carré arrondi, fond neutre, même taille partout
   (avant : cercle noir plein / transparent / cercle à halo selon la
   carte). Les icônes des 3 dernières lignes gardent leur couleur (style
   inline dans le HTML) — un peu de couleur sur un socle identique. */
#cs-profit-content .rcp-bulk-ico,
#cs-profit-content .ref2-banner-ico,
#cs-profit-content .crd2-panel--white .crd2-ico {
  width: 33px; height: 33px;
  border-radius: 9px;
  background: #F2F3F7;
  box-shadow: none;
}
#cs-profit-content .rcp-bulk-ico { background: #0F0A2E; color: #fff; }
#cs-profit-content .rcp-bulk-ico i,
#cs-profit-content .ref2-banner-ico i,
#cs-profit-content .crd2-panel--white .crd2-ico i { font-size: .8rem; }

/* Variante blanche des lignes-cartes "Profil" (Notifications/Changer le
   PIN/Appareils connectés) — jamais à .crd2-panel de base (Notifications
   admin etc., qui gardent leur fond sombre standard). "Mes coordonnées"
   n'en fait plus partie (voir #pc-coordonnees-card plus bas) : elle est
   devenue repliable, sur le modèle de "Récharge en masse", et gère son
   propre style. */
.crd2-panel--white {
  margin: 12px 0 10px;
  background: #fff; border: 1px solid #E8ECF4;
  border-radius: 20px;
  box-shadow: none;
}
.crd2-panel--white .crd2-head { color: #0a1330; border-bottom-color: #F0F2F7; }
.crd2-panel--white .crd2-head i { color: #0a1330; }
.crd2-panel--white .crd2-row {
  min-height: 68px; box-sizing: border-box;
  padding: 14px 16px;
}
/* Fond gris au survol réservé à la souris réelle : sur tactile (WebView
   Capacitor), un tap laissait ce :hover "collé" et la section (souvent
   "Notifications") restait grise au lieu de rester bien blanche — même
   correctif que .pgc-menu-drawer-item / .op-card ailleurs dans ce fichier. */
@media (hover: hover) and (pointer: fine) {
  .crd2-panel--white .crd2-row:hover { background: #F8F9FC; }
}
.crd2-panel--white .crd2-ico {
  border-radius: 50%;
  box-shadow: 0 4px 12px -2px var(--crd2-glow, transparent);
}
.crd2-panel--white .crd2-lbl { color: rgba(0,0,0,.4); }
.crd2-panel--white .crd2-val { color: #0a1330; }
.crd2-panel--white .crd2-val--green { color: #16a34a; }
.crd2-panel--white .crd2-divider { background: #F0F2F7; }

/* "Mes coordonnées" — repliable, même modèle que "Récharge en masse"
   (demande explicite : "base-toi sur le modèle de commande en masse",
   voir #pc-coordonnees-card, index.html, et .rcp-bulk-card ci-dessous).
   Contenu interne (téléphone/solde/membre depuis) toujours sans icônes
   ni traits séparateurs (demandes explicites précédentes), juste
   libellé/valeur espacés. Même largeur que "Parrainez & gagnez"
   (demande explicite) — .rcp-bulk-card déborde de -12px de chaque côté
   par défaut (voir "Récharge en masse", non touchée), annulé ici pour
   revenir à la largeur normale du conteneur, comme .ref2-wrap. */
#pc-coordonnees-card {
  margin: 12px 0 10px;
  border: 1px solid #E8ECF4;
  box-shadow: none;
}
/* Modèle "fiche" (demande explicite : "propose un autre modèle") —
   libellé à gauche / valeur à droite sur une seule ligne, plutôt
   qu'empilés, pour un rendu plus compact façon relevé. Version
   affinée (demande explicite : "rends la plus esthétique en gardant la
   même disposition") — plus d'air entre les lignes, valeurs en chiffres
   tabulaires pour un alignement propre, palette resserrée (libellé gris
   doux, valeur bleu marine profond plutôt que noir pur). */
/* Modèle "relevé professionnel" (demande explicite : "propose un autre
   modèle professionnel") — libellé en petites majuscules au-dessus de
   la valeur (empilés, plus juxtaposés), fine barre d'accent verticale à
   gauche de chaque ligne plutôt qu'un trait horizontal (jamais de trait
   de séparation ici, demande explicite précédente). */
#pc-coordonnees-card .crd2-row { padding: 16px 20px 16px 26px; position: relative; }
#pc-coordonnees-card .crd2-row::before {
  content: ''; position: absolute; left: 10px; top: 14px; bottom: 14px; width: 3px;
  border-radius: 3px; background: #0F2350;
}
#pc-coordonnees-card .crd2-info { display: block; }
#pc-coordonnees-card .crd2-lbl {
  font-size: .6rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: #0F2350; margin-bottom: 5px;
}
#pc-coordonnees-card .crd2-val {
  font-size: 1rem; font-weight: 800; color: #0A0A0A;
  font-variant-numeric: tabular-nums; letter-spacing: .01em;
}
#pc-coordonnees-card .crd2-val--green { color: #0A0A0A; }
/* Bandeau/icône alignés sur le même format que "Parrainez & gagnez"
   (demande explicite) — fond légèrement teinté + icône en carré arrondi
   clair, plutôt que le fond blanc uni/cercle noir plein hérité de
   "Récharge en masse". */
#pc-coordonnees-card .rcp-bulk-head { background: #fff; border-bottom: 0; }
#pc-coordonnees-card .rcp-bulk-title { color: #0F2350; }
/* En-tête blanc, icône (le "logo") sur un petit carré arrondi gris,
   glyphe noir (demande du 2026-09-03). */
#pc-coordonnees-card .rcp-bulk-ico {
  width: 31px; height: 31px; border-radius: 9px;
  background: #EEF0F4; color: #0A0A0A; font-size: .72rem;
}

/* ── Coordonnées — bulles cercles ───────────────────────────── */
.crd-panel {
  position: relative; overflow: hidden;
  background: linear-gradient(160deg, #190f3e 0%, #0f0830 100%);
  border: 1px solid rgba(255,98,0,.18);
  border-radius: 20px; margin-bottom: 14px;
  padding-bottom: 20px;
}
.crd-panel-head {
  display: flex; align-items: center; gap: 9px;
  padding: 14px 18px 14px;
  font-size: .72rem; font-weight: 900; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .08em;
  border-bottom: 1px solid rgba(255,255,255,.06);
  margin-bottom: 20px;
}
.crd-panel-head i { color: var(--primary); font-size: .82rem; }

/* Grille de bulles */
.crd-bubbles {
  display: flex; justify-content: space-around; align-items: flex-start;
  padding: 0 10px; gap: 8px;
}
.crd-bubble {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.crd-bubble-ring {
  width: 72px; height: 72px; border-radius: 50%;
  background: var(--cg);
  border: 1.5px solid var(--cr);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 18px var(--cg);
}
.crd-bubble-icon {
  width: 52px; height: 52px; border-radius: 50%;
  background: rgba(0,0,0,.35);
  color: var(--ci);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem;
  border: 1px solid var(--ci);
  box-shadow: 0 0 10px color-mix(in srgb, var(--ci) 30%, transparent);
}
.crd-bubble-lbl {
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em; text-align: center;
}
.crd-bubble-val {
  font-size: .78rem; font-weight: 900; color: #fff;
  text-align: center; line-height: 1.3;
  word-break: break-word;
}
.crd-bubble-val--green { color: #22c55e; }

/* ── Télécharger l'application Android ── */
.appdl-wrap { margin: 14px 12px 0; }
.asc-appdl-btn {
  margin-top: 12px;
  background: #ffffff !important;
  box-shadow: 0 4px 14px rgba(0,0,0,.2) !important;
}
.asc-appdl-btn .appdl-label { color: #0A0A0F !important; }
.asc-appdl-btn .appdl-arrow { color: rgba(10,10,15,.55) !important; }
.asc-appdl-btn .appdl-btn-bg { background: radial-gradient(ellipse at left center, rgba(0,0,0,.05), transparent 70%) !important; }
.asc-appdl-btn .appdl-ico { border: 1.5px solid var(--gray-200); }
.appdl-btn {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 10px;
  width: 100%; padding: 13px 18px;
  border: none; border-radius: 14px; cursor: pointer;
  background: linear-gradient(135deg, #FF6200 0%, #D62B00 100%);
  outline: none;
  box-shadow: 0 4px 14px rgba(255,98,0,.35);
  text-decoration: none; color: inherit;
  transition: transform .15s;
}
.appdl-btn:hover { transform: scale(.99); }
.appdl-btn-bg {
  position: absolute; inset: 0;
  background: radial-gradient(ellipse at left center, rgba(255,255,255,.12), transparent 70%);
  pointer-events: none;
}
.appdl-ico {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  background: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: .95rem; color: #25D366; position: relative;
}
.appdl-label { font-size: .75rem; font-weight: 800; position: relative; color: #fff; flex: 1; }
.appdl-arrow { font-size: .7rem; color: rgba(255,255,255,.6); position: relative; }

/* Variante réduite — écran de connexion admin (.adx-modal, carte étroite,
   voir espace-gestion.html #admin-login-android-dl) : le gabarit normal
   ci-dessus (pensé pour la pleine largeur de "Mon profil" côté client)
   y était disproportionné, texte sur deux lignes. */
.appdl-btn--sm { padding: 9px 14px; border-radius: 11px; gap: 8px; }
.appdl-btn--sm .appdl-ico { width: 26px; height: 26px; border-radius: 8px; font-size: .78rem; }
.appdl-btn--sm .appdl-label { font-size: .68rem; }
.appdl-btn--sm .appdl-arrow { font-size: .62rem; }

/* Section dédiée sous l'écran de connexion admin, détachée du formulaire
   par une ligne de séparation — plutôt que collée juste sous "Retour à
   l'accueil" (voir .ag-switch-line). */
/* Bloc totalement détaché de la carte de connexion admin (.adx-modal) —
   sa propre carte, alignée sur la même largeur, espacée par le gap de
   .admin-login-gate (flex column) plutôt qu'une bordure de séparation. */
.ag-appdl-section {
  width: 92%; max-width: 360px; box-sizing: border-box;
  padding: 16px; border-radius: 18px;
  background: #0b0b12;
  border: 1px solid rgba(255,255,255,.08);
}
.ag-appdl-sep {
  text-align: center; font-size: .62rem; font-weight: 700;
  color: rgba(255,255,255,.35); text-transform: uppercase; letter-spacing: .07em;
  margin-bottom: 10px;
}

/* ── Parrainage v2 ───────────────────────────────────────────── */
/* Carte "Parrainez & gagnez" — même traitement blanc/noir/marine et pleine
   largeur que les panneaux .crd2-panel--white ci-dessus (demande
   explicite : "fais pareil"). */
.ref2-wrap {
  margin: 12px 0 10px;
  border-radius: 20px; overflow: hidden;
  border: 1px solid #E8ECF4;
  box-shadow: none;
  background: #fff;
}
/* Bandeau devenu un <button> repliable (demande explicite : "utilise le
   même modèle ici", voir .rcp-bulk-head) — reset des styles par défaut
   du bouton (bord/fond/police/alignement), le fond teinté et la bordure
   basse d'origine restent posés explicitement ici. */
.ref2-banner {
  display: flex; align-items: center; justify-content: space-between;
  width: 100%; padding: 14px 16px; min-height: 68px; box-sizing: border-box;
  background: #fff;
  border: none; border-bottom: 1px solid #F0F2F7;
  cursor: pointer; font-family: inherit; text-align: left;
}
.ref2-banner-left { display: flex; align-items: center; gap: 14px; }
.ref2-banner-ico {
  width: 38px; height: 38px; border-radius: 12px; flex-shrink: 0;
  background: none; color: #0a1330;
  display: flex; align-items: center; justify-content: center; font-size: .8rem;
}
.ref2-banner-title { font-size: .7rem; font-weight: 800; color: #0a1330; margin-bottom: 2px; }
.ref2-banner-sub { font-size: .5rem; color: rgba(0,0,0,.4); }
.ref2-banner-pill {
  background: rgba(34,197,94,.1); color: #16a34a;
  border: 1px solid rgba(34,197,94,.25); border-radius: 999px;
  padding: 3px 8px; font-size: .48rem; font-weight: 700; display: flex; align-items: center; gap: 4px;
}
.ref2-chevron { color: rgba(0,0,0,.35); font-size: .62rem; transition: transform .25s ease; }
.ref2-wrap.open .ref2-chevron { transform: rotate(180deg); }
.ref2-body { max-height: 0; overflow: hidden; transition: max-height .35s ease; }
.ref2-wrap.open .ref2-body { max-height: 420px; }
/* Autre modèle du contenu "Code de parrainage" (demande explicite :
   "propose un autre modèle") — remplace .ref2-counters/.ref2-link/
   .ref2-flow (abandonnées) : tuiles teintées pour les compteurs, code
   plus affirmé avec bouton "Copier" étiqueté, étapes sans trait de
   liaison (cohérent avec "je ne veux pas de traits" ailleurs). */
.refv2-stats { display: flex; gap: 10px; padding: 14px; }
.refv2-stat {
  flex: 1; text-align: center;
  background: rgba(10,19,48,.035); border-radius: 14px;
  padding: 12px 8px;
}
.refv2-stat--green { background: rgba(34,197,94,.06); }
.refv2-stat-val { font-size: 1.15rem; font-weight: 900; color: #0a1330; margin-bottom: 3px; }
.refv2-stat-val--green { color: #16a34a; }
.refv2-stat-lbl { font-size: .5rem; font-weight: 700; color: rgba(0,0,0,.4); text-transform: uppercase; letter-spacing: .07em; }

.refv2-code { padding: 0 14px 14px; }
.refv2-code-lbl { font-size: .5rem; font-weight: 900; color: #000; text-transform: uppercase; letter-spacing: .08em; margin-bottom: 7px; }
.refv2-code-row {
  display: flex; align-items: center; gap: 10px;
  background: #F8F9FC; border: 1px solid #E8ECF4;
  border-radius: 12px; padding: 10px 10px 10px 14px;
}
.refv2-code-val {
  flex: 1; font-size: .82rem; font-weight: 800; color: #0a1330; letter-spacing: .04em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.refv2-copy-btn {
  display: flex; align-items: center; gap: 5px; flex-shrink: 0;
  background: #0F0A2E; color: #fff; border: none;
  border-radius: 9px; padding: 8px 12px; cursor: pointer;
  font-size: .62rem; font-weight: 700; font-family: inherit;
  transition: opacity .15s;
}
.refv2-copy-btn:hover { opacity: .85; }

/* Invitation à télécharger l'app — bouton unique : texte discret à gauche
   (le lien réel n'est jamais montré), pastille "Partager" à droite. */
.refv2-invite-btn {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  width: 100%; cursor: pointer; font-family: inherit; text-align: left;
  background: #F8F9FC; border: 1px solid #E8ECF4; border-radius: 12px;
  padding: 9px 9px 9px 14px; transition: background .15s;
}
.refv2-invite-btn:hover { background: #F1F3F9; }
.refv2-invite-btn:active { background: #EAEDF5; }
.refv2-invite-txt {
  display: inline-flex; align-items: center; gap: 6px; min-width: 0;
  font-size: .72rem; font-weight: 700; color: rgba(10,19,48,.55);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.refv2-invite-txt i { color: #0F2350; flex-shrink: 0; }
.refv2-invite-cta {
  display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0;
  background: #0F0A2E; color: #fff; border-radius: 9px; padding: 8px 12px;
  font-size: .62rem; font-weight: 700;
}

/* ── Téléchargement APK v4 — ticket ─────────────────────────── */
.apk4-ticket {
  display: flex; align-items: stretch;
  margin: 12px 12px 0;
  background: #0d0d18;
  border: 1px solid rgba(255,98,0,.18);
  border-radius: 18px; overflow: hidden;
}
.apk4-left {
  flex: 1; padding: 18px 16px;
  display: flex; flex-direction: column; justify-content: center; gap: 8px;
}
.apk4-label {
  font-size: .42rem; font-weight: 800; letter-spacing: .14em;
  color: rgba(255,255,255,.45); text-transform: uppercase;
}
.apk4-name {
  font-size: 1.5rem; font-weight: 900; color: #fff; line-height: 1;
  letter-spacing: -.02em;
}
.apk4-name span { color: var(--primary); }
.apk4-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.apk4-chip {
  font-size: .5rem; font-weight: 700;
  background: rgba(255,255,255,.06); color: rgba(255,255,255,.45);
  border-radius: 999px; padding: 3px 9px;
  display: flex; align-items: center; gap: 4px;
}
.apk4-chip--free { background: rgba(255,98,0,.1); color: var(--primary); }
.apk4-perf {
  display: flex; flex-direction: column; align-items: center;
  justify-content: space-between; width: 20px; flex-shrink: 0;
  position: relative;
}
.apk4-hole {
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--bg, #13131f);
  position: absolute; left: 50%; transform: translateX(-50%);
  border: 1px solid rgba(255,98,0,.18);
}
.apk4-hole--top { top: -9px; }
.apk4-hole--bot { bottom: -9px; }
.apk4-dash {
  position: absolute; top: 10px; bottom: 10px; left: 50%;
  transform: translateX(-50%);
  width: 1px;
  background: repeating-linear-gradient(
    to bottom,
    rgba(255,98,0,.3) 0px, rgba(255,98,0,.3) 5px,
    transparent 5px, transparent 10px
  );
}
.apk4-right {
  width: 90px; flex-shrink: 0;
  background: var(--primary);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 4px; text-decoration: none; color: #fff;
  transition: background .18s;
}
.apk4-right:hover { background: #e05500; }
.apk4-big-ico { font-size: 1.6rem; opacity: .9; }
.apk4-dl-lbl { font-size: .62rem; font-weight: 900; letter-spacing: .03em; }
.apk4-dl-sub { font-size: .48rem; font-weight: 700; opacity: .65; letter-spacing: .08em; }

/* ── Téléchargement APK v3 — store card ─────────────────────── */
.apk3-card {
  position: relative; overflow: hidden;
  margin: 12px 12px 0;
  background: linear-gradient(135deg, #1a0e00 0%, #0d0d18 60%);
  border: 1px solid rgba(255,98,0,.2);
  border-radius: 18px; padding: 16px;
}
.apk3-noise {
  position: absolute; inset: 0; border-radius: 18px; pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.03'/%3E%3C/svg%3E");
  opacity: .4;
}
.apk3-top {
  display: flex; align-items: center; gap: 12px; margin-bottom: 14px;
}
.apk3-app-ico {
  width: 50px; height: 50px; border-radius: 14px; flex-shrink: 0;
  background: linear-gradient(135deg, var(--primary), #9b3500);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 1.2rem;
  box-shadow: 0 4px 14px rgba(255,98,0,.4);
}
.apk3-app-info { flex: 1; min-width: 0; }
.apk3-app-name {
  font-size: .85rem; font-weight: 900; color: #fff;
  letter-spacing: .04em; margin-bottom: 5px;
}
.apk3-app-meta {
  display: flex; align-items: center; gap: 6px;
  font-size: .52rem; color: rgba(255,255,255,.35); font-weight: 600;
}
.apk3-tag {
  background: rgba(255,98,0,.12); color: var(--primary);
  border-radius: 999px; padding: 2px 8px;
  display: flex; align-items: center; gap: 4px;
}
.apk3-dot { opacity: .3; }
.apk3-dl-circle {
  width: 42px; height: 42px; border-radius: 50%; flex-shrink: 0;
  background: var(--primary);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: .85rem; text-decoration: none;
  box-shadow: 0 4px 14px rgba(255,98,0,.4);
  transition: transform .15s, box-shadow .15s;
  animation: apk3Pulse 2s ease-in-out infinite;
}
.apk3-dl-circle:hover { transform: scale(1.08); box-shadow: 0 6px 20px rgba(255,98,0,.6); }
/* transform-only (au lieu d'animer le flou du box-shadow, coûteux en
   repaint continu) : même effet "respirant", GPU-composited. */
@keyframes apk3Pulse {
  0%, 100% { transform: scale(1); }
  50%       { transform: scale(1.06); }
}
@media (prefers-reduced-motion: reduce) { .apk3-dl-circle { animation: none; } }
.apk3-bar {
  height: 3px; border-radius: 999px;
  background: rgba(255,255,255,.06); margin-bottom: 12px; overflow: hidden;
}
.apk3-bar-fill {
  height: 100%; width: 100%; border-radius: 999px;
  background: linear-gradient(90deg, var(--primary), #ff9a5c);
  animation: apk3Shimmer 2s ease-in-out infinite;
}
@keyframes apk3Shimmer {
  0%   { opacity: .5; transform: translateX(-100%); }
  100% { opacity: 1;  transform: translateX(0); }
}
.apk3-footer {
  display: flex; justify-content: space-between;
  font-size: .5rem; color: rgba(255,255,255,.45); font-weight: 600;
  gap: 8px;
}
.apk3-footer span { display: flex; align-items: center; gap: 5px; }
.apk3-footer i { color: rgba(255,98,0,.5); }

/* ── Téléchargement APK v2 — circulaire orange ───────────────── */
.apk2-wrap {
  margin: 12px 12px 0;
  background: rgba(255,98,0,.05);
  border: 1px solid rgba(255,98,0,.15);
  border-radius: 18px; padding: 20px 16px 18px;
  display: flex; flex-direction: column; align-items: center; gap: 12px;
  text-align: center;
}
.apk2-ring {
  width: 72px; height: 72px; border-radius: 50%;
  background: conic-gradient(var(--primary) 0%, rgba(255,98,0,.1) 60%, var(--primary) 100%);
  display: flex; align-items: center; justify-content: center;
  animation: apk2Spin 6s linear infinite;
  flex-shrink: 0;
}
@keyframes apk2Spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
.apk2-circle {
  width: 60px; height: 60px; border-radius: 50%;
  background: #0d0d18;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.5rem; color: var(--primary);
  animation: apk2Spin 6s linear infinite reverse;
}
.apk2-title {
  font-size: .78rem; font-weight: 900; color: #fff; margin-bottom: 3px;
}
.apk2-sub {
  font-size: .55rem; color: rgba(255,255,255,.35); font-weight: 600;
}
.apk2-btn {
  display: inline-flex; align-items: center; gap: 8px;
  background: var(--primary); color: #fff;
  font-size: .7rem; font-weight: 800;
  border-radius: 999px; padding: 10px 22px;
  text-decoration: none;
  box-shadow: 0 4px 16px rgba(255,98,0,.35);
  transition: box-shadow .18s, transform .15s;
}
.apk2-btn:hover { box-shadow: 0 6px 22px rgba(255,98,0,.5); transform: translateY(-1px); }

/* ── Téléchargement APK ──────────────────────────────────────── */
.apk-banner {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; text-decoration: none;
  margin: 16px auto 0; width: calc(100% - 32px); max-width: 420px;
  padding: 14px 16px;
  background: linear-gradient(135deg, #1a2e1a 0%, #0f1a0f 100%);
  border: 1px solid rgba(34,197,94,.25);
  border-radius: 16px;
  transition: border-color .18s, background .18s;
}
.apk-banner:hover { border-color: rgba(34,197,94,.5); background: linear-gradient(135deg, #1e3a1e 0%, #122012 100%); }
.apk-banner--compact {
  margin: 10px 12px 0; width: calc(100% - 24px);
}
.apk-banner-left { display: flex; align-items: center; gap: 12px; }
.apk-ico {
  width: 40px; height: 40px; border-radius: 12px; flex-shrink: 0;
  background: rgba(34,197,94,.15);
  color: #22c55e; font-size: 1.1rem;
  display: flex; align-items: center; justify-content: center;
}
.apk-title { font-size: .72rem; font-weight: 800; color: #fff; margin-bottom: 3px; }
.apk-sub { font-size: .52rem; color: rgba(255,255,255,.35); font-weight: 600; }
.apk-right { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.apk-size {
  font-size: .5rem; font-weight: 900; color: #22c55e;
  background: rgba(34,197,94,.12); border: 1px solid rgba(34,197,94,.2);
  border-radius: 6px; padding: 3px 7px; letter-spacing: .05em;
}
.apk-arrow {
  color: #22c55e; font-size: .8rem;
  animation: apkBounce .8s ease-in-out infinite alternate;
}
@keyframes apkBounce {
  from { transform: translateY(0); }
  to   { transform: translateY(3px); }
}

/* ── Parrainage card — nouveau modèle ───────────────────────── */
.rfl-card {
  position: relative; overflow: hidden;
  border-radius: 20px; margin-top: 14px;
  background: linear-gradient(155deg, #0d1e0d 0%, #091608 50%, #0f1808 100%); border: 1px solid rgba(255,98,0,.18);
  border: 1px solid rgba(34,197,94,.2);
  padding: 20px 18px 18px;
}
.rfl-bg-deco {
  position: absolute; top: -30px; right: -30px;
  width: 130px; height: 130px; border-radius: 50%;
  background: radial-gradient(circle, rgba(34,197,94,.18) 0%, transparent 70%);
  pointer-events: none;
}

/* En-tête */
.rfl-head {
  display: flex; align-items: center; gap: 11px; margin-bottom: 18px;
}
.rfl-head-icon {
  width: 42px; height: 42px; border-radius: 14px; flex-shrink: 0;
  background: linear-gradient(135deg, #ff6200, #cc4400);
  color: #fff; font-size: 1rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 14px rgba(255,98,0,.4);
}
.rfl-head-text { flex: 1; }
.rfl-head-title { font-size: .92rem; font-weight: 900; color: #fff; }
.rfl-head-sub   { font-size: .68rem; color: rgba(255,255,255,.35); margin-top: 1px; }
.rfl-head-badge {
  background: rgba(34,197,94,.15); color: #22c55e;
  border: 1px solid rgba(34,197,94,.25);
  font-size: .65rem; font-weight: 800;
  border-radius: 99px; padding: 4px 10px;
  white-space: nowrap;
}

/* Stats */
.rfl-stats {
  display: flex; align-items: center;
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.07);
  border-radius: 14px; padding: 14px 12px; margin-bottom: 16px;
}
.rfl-stat { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 5px; }
.rfl-stat-icon {
  width: 38px; height: 38px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center; font-size: .85rem;
}
.rfl-stat-icon--orange { background: rgba(255,98,0,.15); color: var(--primary); }
.rfl-stat-icon--green  { background: rgba(34,197,94,.12); color: #22c55e; }
.rfl-stat-val { font-size: 1.1rem; font-weight: 900; color: #fff; }
.rfl-stat-lbl { font-size: .6rem; font-weight: 700; color: rgba(255,255,255,.3); text-transform: uppercase; letter-spacing: .05em; }
.rfl-stat-div { width: 1px; height: 44px; background: rgba(255,255,255,.08); }

/* Lien */
.rfl-link-block { margin-bottom: 16px; }
.rfl-link-label {
  font-size: .62rem; font-weight: 800; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .07em; margin-bottom: 7px;
}
.rfl-link-row {
  display: flex; align-items: center; gap: 8px;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1);
  border-radius: 12px; padding: 10px 12px;
}
.rfl-link-url {
  flex: 1; font-size: .75rem; font-weight: 700;
  color: #22c55e; word-break: break-all;
}
.rfl-copy-btn {
  width: 34px; height: 34px; border-radius: 10px; border: none; flex-shrink: 0;
  background: rgba(34,197,94,.2); color: #22c55e; cursor: pointer;
  display: flex; align-items: center; justify-content: center; font-size: .85rem;
  transition: background .15s, transform .12s;
}
.rfl-copy-btn:hover  { background: rgba(34,197,94,.35); }
.rfl-copy-btn:active { transform: scale(.92); }

/* Étapes */
.rfl-steps {
  display: flex; align-items: center; justify-content: center; gap: 6px;
}
.rfl-step {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
}
.rfl-step-num {
  width: 26px; height: 26px; border-radius: 50%;
  background: rgba(255,98,0,.2); color: var(--primary);
  font-size: .72rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid rgba(255,98,0,.3);
}
.rfl-step-txt {
  font-size: .6rem; font-weight: 700; color: rgba(255,255,255,.35);
  text-align: center; max-width: 60px; line-height: 1.3;
}
.rfl-step-arrow { color: rgba(255,255,255,.45); font-size: .65rem; margin-bottom: 16px; }

/* ── Section Profit KPI ──────────────────────────────────────── */
.profit-kpi-row {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px;
  margin-bottom: 4px;
}
@media(min-width:600px) { .profit-kpi-row { grid-template-columns: repeat(4,1fr); } }
.profit-kpi {
  background: var(--white); border: 1.5px solid var(--gray-100);
  border-radius: var(--radius-lg); padding: 16px 14px;
  box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.pf-kpi-icon {
  width: 38px; height: 38px; border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  font-size: .95rem; margin-bottom: 10px;
}
.pf-kpi-val { font-size: 1.1rem; font-weight: 800; color: var(--gray-800); margin-bottom: 3px; }
.pf-kpi-lbl { font-size: .7rem; color: var(--gray-500); font-weight: 500; }
.pf-op-row { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.pf-op-name { font-size: .8rem; font-weight: 600; color: var(--gray-700); min-width: 52px; }
.pf-bar-wrap { flex: 1; height: 8px; background: var(--gray-100); border-radius: 99px; overflow: hidden; }
.pf-bar { height: 100%; border-radius: 99px; transition: width .5s; }
.pf-op-amount { font-size: .78rem; font-weight: 700; color: var(--gray-600); min-width: 80px; text-align: right; }

/* ════/* ══════════════════════════════════════════════════════════════
   MODAL AUTH — design app fintech
══════════════════════════════════════════════════════════════ */
.modal-overlay:has(#modal-auth-gate) { align-items: flex-end; }
@media(min-width:500px) { .modal-overlay:has(#modal-auth-gate) { align-items: center; } }

/* "Nouveau destinataire" — fenêtre "bottom sheet" (demande explicite :
   "elle ne doit pas prendre grand, elle doit prendre du bas pour se
   limiter au milieu", d'après deux captures de référence) : ancrée en
   bas d'écran plutôt que centrée, coins arrondis seulement en haut,
   hauteur limitée à son propre contenu (jamais pleine hauteur) — voir
   index.html/js/client.js (ctpShowManualScreen()/ctpManualGoToAmount()). */
#ctp-screen-manual { align-items: flex-end; padding: 0; }
#ctp-screen-manual .modal {
  width: 100%; max-width: none; margin: 0;
  border-radius: 20px 20px 0 0;
  /* dvh : suit la hauteur réelle même quand la barre d'adresse mobile est
     visible ; vh en repli pour les vieux navigateurs. */
  max-height: 88vh;
  max-height: 88dvh;
  overscroll-behavior: contain;
}
/* Espacements fluides (demande explicite : "adapté à toute sorte de
   téléphone") — l'air sous le bouton se réduit sur les petits écrans et
   se plafonne sur les grands ; barre système mobile prise en compte. */
#ctp-screen-manual .modal-body {
  padding-top: clamp(14px, 3.5vw, 24px);
  padding-bottom: calc(clamp(28px, 9vh, 120px) + env(safe-area-inset-bottom, 0px));
}
/* En-tête sans trait de séparation, titre centré (demande explicite) — la
   croix reste calée à droite. */
#ctp-screen-manual .modal-header {
  border-bottom: none;
  justify-content: center;
  position: relative;
}
#ctp-screen-manual .modal-title { text-align: center; }
#ctp-screen-manual .modal-close {
  position: absolute;
  left: clamp(12px, 4vw, 24px);
  right: auto;
  top: 50%;
  transform: translateY(-50%);
  background: none;
  border: none;
  color: #0F0A2E;
}
#ctp-screen-manual .modal-close:hover {
  background: none;
  color: #0F0A2E;
}
#ctp-screen-manual .modal-close i {
  font-size: .95rem;
  -webkit-text-stroke: 1px currentColor;
}
/* Pas de reflet coloré (demande explicite) — champ et bouton sans halo
   orange, ni au focus ni sur le bouton "Continuer". */
#ctp-screen-manual .ct-input-pill:focus-within {
  box-shadow: none;
}
#ctp-screen-manual .ct-confirm-btn,
#ctp-screen-manual .ct-confirm-btn:hover {
  box-shadow: none;
}
#ctp-screen-manual .ct-confirm-btn {
  border-radius: 18px;
  padding: clamp(14px, 4vw, 18px);
  width: min(94%, 530px);
  font-size: clamp(.85rem, 3.6vw, .95rem);
  background: linear-gradient(135deg, #0F0A2E, #1A1040);
}
#ctp-screen-manual .ct-confirm-btn:disabled {
  background: #D8DCE6;
}
/* Pas de fond blanc autour du champ (demande explicite) — le champ repose
   directement sur la feuille, sans carte ni ombre. */
#ctp-screen-manual .ct-form-card {
  background: none;
  box-shadow: none;
  padding: 0;
}
/* Champ numéro façon "ligne" (demande explicite, d'après modèle) : libellé
   rouge en casse normale, pas de pilule ni de préfixe +225, un simple trait
   sous le champ, placeholder large et clair. */
#ctp-manual-step-phone .ct-field-label {
  color: #D93F2B;
  text-transform: none;
  letter-spacing: 0;
  font-size: .72rem;
  margin-bottom: 6px;
}
#ctp-manual-step-phone .ct-flag,
#ctp-manual-step-phone .ct-pill-sep {
  display: none;
}
#ctp-manual-step-phone .ct-input-pill {
  border: none;
  border-bottom: 2px solid #0F0A2E;
  border-radius: 0;
  padding: 6px 2px;
  gap: 0;
}
#ctp-manual-step-phone .ct-input-pill:focus-within {
  border-bottom-color: #0F0A2E;
  box-shadow: none;
}
#ctp-manual-step-phone .ct-input {
  font-size: clamp(1.05rem, 5vw, 1.25rem);
  font-weight: 500;
  min-width: 0;
  text-overflow: ellipsis;
}
#ctp-manual-step-phone .ct-input::placeholder {
  color: rgba(0,0,0,.28);
  font-weight: 400;
}
/* Aperçu du destinataire trouvé — modèle bleu marine plutôt que vert
   (demande explicite). Seul le nom est affiché : ni avatar, ni pastille,
   ni mention "Client KBINE PLUS". */
#ct-recipient-preview {
  background: rgba(15,10,46,.05);
  border-color: rgba(15,10,46,.18);
  overflow: hidden;
  align-items: center;
}
#ct-recipient-preview .ct-rcp-avatar,
#ct-recipient-preview .ct-rcp-check {
  display: none;
}
/* Message d'erreur du lookup ("Aucun compte client actif trouvé…") :
   sous le champ, sans fond ni bordure, juste du texte rouge (demande
   explicite). */
#ctp-manual-step-phone #ct-error {
  background: none;
  border: none;
  border-radius: 0;
  padding: 0 2px;
  margin: 8px 0 0;
  color: #ef4444;
  font-size: .74rem;
}

/* Nom long : tronqué proprement plutôt que de déborder de la carte. */
#ct-recipient-preview .ct-rcp-info { min-width: 0; }
#ct-recipient-preview .ct-rcp-name {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Carte destinataire de l'étape "Montant" — même modèle bleu marine, sans
   l'avatar "H" (demande explicite). */
#ctp-manual-step-amount .ct-recipient-preview {
  background: rgba(15,10,46,.05);
  border-color: rgba(15,10,46,.18);
  align-items: center;
  margin-top: -22px;
}
#ctp-manual-step-amount .ct-rcp-avatar {
  display: none;
}
#ctp-manual-step-amount .ctp-manual-change-btn,
#ctp-manual-step-amount .ctp-manual-change-btn span {
  color: #0F0A2E;
}
/* Champ montant façon "ligne" (demande explicite, même modèle que le
   champ numéro) : pas de libellé ni de suffixe "FCFA", pas de pilule,
   un simple trait bleu marine sous le champ, placeholder large et clair. */
#ctp-manual-step-amount .ct-input-pill {
  border: none;
  border-bottom: 2px solid #0F0A2E;
  border-radius: 0;
  padding: 6px 2px;
  margin-top: 16px;
}
#ctp-manual-step-amount .ct-input-pill:focus-within {
  border-bottom-color: #0F0A2E;
  box-shadow: none;
}
#ctp-manual-step-amount .ct-input {
  font-size: clamp(1.05rem, 5vw, 1.25rem);
  font-weight: 500;
  min-width: 0;
}
#ctp-manual-step-amount .ct-input::placeholder {
  color: rgba(0,0,0,.28);
  font-weight: 400;
}
/* Pas de flèches haut/bas du champ nombre (demande explicite). */
#ctp-manual-step-amount .ct-input { -moz-appearance: textfield; }
#ctp-manual-step-amount .ct-input::-webkit-outer-spin-button,
#ctp-manual-step-amount .ct-input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

.ag-modal {
  background: #ffffff;
  border: none;
  border-radius: 28px;
  width: 100%; max-width: 340px;
  padding: 0 0 16px;
  box-shadow: 0 -4px 60px rgba(0,0,0,.25);
  animation: agSlideUp .32s cubic-bezier(.32,1.12,.5,1);
  position: relative; overflow: hidden;
}
@media(min-width:500px) {
  .ag-modal { border-radius: 28px; box-shadow: 0 24px 80px rgba(0,0,0,.7); }
}
@keyframes agSlideUp {
  from { transform: translateY(40px); opacity: 0; }
  to   { transform: translateY(0);    opacity: 1; }
}

/* En-tête coloré par étape (inscription uniquement, voir #reg-slide-1/2/3,
   index.html) — bandeau plein-largeur avec le logo en grand au centre
   (demande explicite : le logo remplace le titre texte), carte blanche
   juste en dessous, sur le modèle d'une capture de référence fournie par
   le client. */
.ag-step-header {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  position: relative;
  padding: 60px 14px 90px;
  background: linear-gradient(145deg, #0F0A2E 0%, #1A1040 55%, #0D0820 100%);
}
.ag-step-back {
  position: absolute; left: 14px; top: 14px;
  width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
  background: none; border: none;
  color: #fff; font-size: .8rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: opacity .15s;
}
.ag-step-back:hover { opacity: .7; }
.ag-step-header-logo { width: clamp(70px, 24vw, 100px); height: clamp(70px, 24vw, 100px); object-fit: contain; }
.ag-step-card {
  background: #fff; border-radius: 40px 40px 0 0;
  margin-top: -48px; padding: 56px 0 4px;
  position: relative; z-index: 1; overflow: hidden;
}

/* Déverrouillage (#ag-panel-unlock) — modèle simplifié : logo en badge
   dégradé, message, points de progression, bouton Confirmer (demande
   explicite, sur le modèle d'une capture de référence). Saisie via le
   clavier numérique natif de l'appareil (.pin-box reste un vrai <input
   inputmode=numeric>), plus de pavé numérique dédié à l'écran. */
.ag-unlock-wrap { padding: 54px 24px 24px; text-align: center; }
.ag-unlock-logo-badge {
  width: clamp(88px, 28vw, 112px); height: clamp(88px, 28vw, 112px);
  margin: 0 auto 18px; border-radius: 50%;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  box-shadow: 0 6px 18px rgba(10,19,48,.35);
  display: flex; align-items: center; justify-content: center;
}
.ag-unlock-logo { width: 62%; height: 62%; object-fit: contain; }
.ag-unlock-msg {
  font-size: .92rem; font-weight: 700; color: #0A0A0F;
  line-height: 1.4; margin: 0 12px 24px;
}
/* Points de progression : cases .pin-box existantes, redessinées en petits
   ronds pleins plutôt qu'en cases à chiffre visible (elles restent de
   vrais <input>, juste visuellement réduites à un point — le clavier
   natif s'ouvre normalement au tap, comme les autres .pin-row de l'app).
   Le petit rond visuel (16px) est bien trop petit comme zone tactile sur
   téléphone (rapport client : "n'arrivent pas a mettre leurs mot passe")
   — chaque case est désormais enveloppée dans un <label class="pin-hit">
   (voir index.html) qui agrandit la zone cliquable/tactile réelle sans
   changer l'apparence du point ; l'espacement vient de son padding, plus
   du gap de la ligne. */
.ag-unlock-dots.pin-row { gap: 0; padding: 0; margin-bottom: 28px; }
.pin-hit { display: flex; align-items: center; justify-content: center; padding: 15px; cursor: text; }
#pin-unlock-row.ag-unlock-dots .pin-box {
  width: 16px; height: 16px; min-width: 0;
  border-radius: 50%; border: 1.5px solid rgba(255,98,0,.4);
  background: transparent; padding: 0; font-size: 0;
  caret-color: transparent;
}
#pin-unlock-row.ag-unlock-dots .pin-box.pin-filled { background: var(--primary); border-color: var(--primary); }
.ag-unlock-confirm-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; max-width: 320px; margin: 0 auto;
  background: var(--gray-100); color: rgba(10,10,15,.35); border: none;
  border-radius: 14px; padding: 15px; font-size: .88rem; font-weight: 700;
  font-family: inherit; cursor: pointer;
}
/* Le 4e chiffre saisi soumet déjà automatiquement le formulaire (voir
   initPinRows(), js/client.js) — ce bouton passe simplement en couleur de
   marque une fois le code complet, comme confirmation visuelle avant
   l'envoi. */
form:has(#pin-unlock-row .pin-box:nth-child(4).pin-filled) .ag-unlock-confirm-btn {
  background: var(--primary); color: #fff;
}
.ag-unlock-forgot-line { margin-top: 18px; }
.ag-unlock-forgot-line button {
  color: var(--primary); text-decoration: none; font-size: .78rem;
}

/* Labels */
.ag-label {
  display: block; font-size: .6rem; font-weight: 800;
  color: #000000; margin-bottom: 5px;
  padding: 0 20px; text-transform: uppercase; letter-spacing: .07em;
}

/* Carte formulaire intérieure */
.ag-form-card {
  margin: 0 13px 4px;
  background: #ffffff;
  border: none;
  border-radius: 15px;
  padding: 9px 0 11px;
  position: relative;
}
/* Connexion : même modèle en-tête coloré/carte pleine largeur que
   l'inscription (#ag-login-slide-1/2 portent déjà leur propre
   .ag-step-header/.ag-step-card) — neutralise cette carte englobante pour
   ne pas revenir à des marges/coins arrondis en plus des leurs. */
#ag-panel-login .ag-form-card { margin: 0; padding: 0; border-radius: 0; background: transparent; }
.ag-field-label {
  font-size: .56rem; font-weight: 800; color: #000000;
  text-transform: uppercase; letter-spacing: .08em;
  padding: 0 16px 6px;
  display: flex; align-items: center; gap: 5px;
}
.ag-field-label i { color: var(--primary); font-size: .58rem; }

/* Adapte les marges à l'intérieur de la carte */
.ag-form-card .ag-input-wrap { margin: 0 15px; }
.ag-form-card .pin-row { padding: 4px 0; }
/* Agrandi (demande explicite) — distinct du déverrouillage ci-dessous, qui
   garde ses propres points de progression (.ag-unlock-dots). */
.ag-pin-section .pin-box { width: clamp(36px, 11vw, 44px); height: clamp(36px, 11vw, 44px); font-size: 1.05rem; }
.ag-form-card .ag-submit-btn { width: calc(100% - 30px); margin: 14px 15px 0; }
.ag-form-card .ag-live-success { margin: 11px 15px 0; }
.ag-form-card .form-group { margin-bottom: 0; }

/* Champ téléphone */
.ag-input-wrap {
  display: flex; align-items: center;
  margin: 0 18px;
  border: 1.5px solid rgba(0,0,0,.15); border-radius: 15px;
  background: #ffffff;
  transition: border-color .22s, background .22s;
  overflow: hidden;
}
.ag-input-wrap:focus-within {
  border-color: rgba(0,0,0,.35);
  background: #ffffff;
}
.ag-flag-prefix {
  padding: 0 8px 0 13px; font-size: .74rem; flex-shrink: 0;
  display: flex; align-items: center; gap: 6px; white-space: nowrap;
  color: #000000;
}
.ag-flag-prefix strong { font-size: .7rem; font-weight: 800; color: #000000; }
.ag-prefix-sep { width: 1px; height: 18px; background: rgba(0,0,0,.15); flex-shrink: 0; margin-right: 2px; }
.ag-input {
  flex: 1; border: none; background: transparent; outline: none;
  padding: 11px 12px 11px 0; font-size: .82rem; font-weight: 700;
  color: #000000; font-family: inherit; letter-spacing: .05em;
}
.ag-input::placeholder { color: rgba(0,0,0,.35); font-weight: 400; letter-spacing: 0; }

/* Étape téléphone (#ag-login-slide-1) — même format que l'étape téléphone
   de l'inscription (#reg-slide-2, demande explicite) : libellé centré
   grand/gras, champ large. */
#ag-login-slide-1 .ag-step1-msg {
  font-size: .85rem; font-weight: 900; margin: 0 24px 16px;
}
#ag-login-slide-1 .ag-input-wrap {
  max-width: min(300px, 88vw); margin: 0 auto;
  box-shadow: 0 2px 10px rgba(0,0,0,.05);
}
#ag-login-slide-1 .ag-input-wrap:focus-within {
  border-color: var(--primary);
  box-shadow: 0 2px 12px rgba(255,98,0,.14);
}
#ag-login-slide-1 .ag-input { font-size: .95rem; padding: 13px 10px; }
#ag-login-slide-1 .ag-flag-prefix { padding-left: 16px; }
/* Remonte le contenu (demande explicite) — moins d'espace vide au-dessus
   du code PIN que sur les autres étapes. */
#ag-login-slide-2 .ag-step-card { padding-top: 26px; }
#ag-login-slide-1 .ag-step-card { padding-top: 22px; }
#reg-slide-1 .ag-step-card { padding-top: 22px; }
/* Badge de confiance — remplit l'espace vide sous le formulaire sur les
   grands écrans (demande explicite). */
.ag-trust-badge {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  margin: 18px auto 0; color: rgba(0,0,0,.4);
  font-size: .62rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
}
.ag-trust-badge i { color: #22c55e; font-size: .68rem; }

/* Étape 1 de l'inscription (surnom) — champ à trait de soulignement,
   façon "réponds directement à la question", resserré et centré dans la
   carte blanche de .ag-step-card ci-dessus. */
#reg-slide-1 .ag-step-card .form-group {
  max-width: min(300px, 88vw); margin: 0 auto;
}
/* Rappelle qu'il s'agit d'une inscription (demande explicite) — au niveau
   du logo dans l'en-tête, sur les 3 étapes (même principe que les
   chiffres 01/02/03 en filigrane dans la carte). */
/* Rappelle qu'il s'agit d'une inscription/connexion (demande explicite) —
   badge centré au-dessus du contenu de chaque étape : fond blanc, texte
   noir, contour bleu marine (demande explicite). */
.ag-step-kicker {
  display: block; width: fit-content; margin: 0 auto 10px;
  font-size: .66rem; font-weight: 800;
  color: #000; background: #fff;
  border: 1.5px solid #0F0A2E; border-radius: 99px;
  padding: 4px 14px;
  text-transform: uppercase; letter-spacing: .16em;
}
/* Première étape (inscription ET connexion) : le badge porte une phrase
   complète — on abandonne la pilule pour reprendre la typo du grand titre
   d'accueil (.cwg-headline) : bleu marine, gras, casse normale, plus
   grand. Titre centré sur plusieurs lignes (max-width en ch), avec un
   trait orange court et détaché centré en dessous — un accent, pas un
   soulignement collé au texte. */
#reg-slide-1 .ag-step-kicker,
#ag-login-slide-1 .ag-step-kicker {
  width: auto; max-width: 22ch;
  background: none; border: none; border-radius: 0; padding: 0;
  margin: 0 auto 18px;
  text-transform: none; text-align: center; white-space: normal;
  font-size: clamp(1.1rem, 5.4vw, 1.4rem); line-height: 1.32;
  letter-spacing: -.02em; font-weight: 800; color: #0F0A2E;
}
#reg-slide-1 .ag-step-kicker::after,
#ag-login-slide-1 .ag-step-kicker::after {
  content: ""; display: block;
  width: 44px; height: 4px; border-radius: 99px;
  margin: 9px auto 0; background: #F77F00;
}
#reg-slide-1 .ag-label {
  padding: 0; text-align: center; margin-bottom: 16px;
  font-size: .95rem; color: #000; font-weight: 900;
  text-transform: none;
}
/* Champ carré (bordure sur les 4 côtés, coins peu arrondis) — demande
   explicite, remplace le style "trait de soulignement" précédent. */
#reg-slide-1 .ag-input-wrap {
  margin: 0; background: none;
  border: 1.5px solid rgba(0,0,0,.18); border-radius: 8px;
  transition: border-color .2s;
}
#reg-slide-1 .ag-input-wrap:focus-within { border-color: var(--primary); }
#reg-slide-1 .ag-input {
  text-align: center; font-size: 1rem; font-weight: 800;
  padding: 13px 10px;
}
#reg-slide-1 .ag-input::placeholder { font-size: .9rem; }
.ag-field-hint {
  font-size: .62rem; color: rgba(0,0,0,.4); font-weight: 600;
  text-align: center; margin-top: 8px;
}

/* Étape 2 de l'inscription (numéro) — même gabarit que l'étape téléphone
   de la connexion (#ag-login-slide-1) : champ resserré et centré. Libellé
   en majuscules grasses noires (demande explicite, inspiré d'une capture
   de référence dont le libellé était orange). */
/* Même format que le libellé de l'étape 1 (surnom, #reg-slide-1 .ag-label)
   — demande explicite. */
#reg-slide-2 .ag-step1-msg {
  padding: 0; text-align: center; margin: 0 0 16px;
  font-size: .85rem; color: #000; font-weight: 900;
}
#reg-slide-2 .ag-input-wrap {
  max-width: min(300px, 88vw); margin: 0 auto;
  box-shadow: 0 2px 10px rgba(0,0,0,.05);
}
#reg-slide-2 .ag-input-wrap:focus-within {
  border-color: var(--primary);
  box-shadow: 0 2px 12px rgba(255,98,0,.14);
}
#reg-slide-2 .ag-input { font-size: .95rem; padding: 13px 10px; }
#ag-panel-register #reg-slide-2 .ag-submit-btn {
  width: 100%; max-width: min(300px, 88vw);
  margin: 60px auto 0; padding: 13px 24px;
  font-size: .85rem;
}


#reg-slide-1 #ag-reg-surnom { text-align: center; padding-left: 4px; padding-right: 4px; }
#ag-reg-tel { text-align: left; }

/* Cases PIN */
.pin-row {
  display: flex; justify-content: center; gap: 10px;
  padding: 4px 22px;
}
.pin-box {
  width: 58px; height: 58px; border-radius: 18px;
  border: 1.5px solid rgba(255,255,255,.08);
  background: rgba(0,0,0,.3);
  font-size: 1.4rem; text-align: center; font-weight: 900;
  color: #fff; outline: none; flex-shrink: 0;
  transition: border-color .2s, box-shadow .2s, background .2s, transform .18s;
  -webkit-text-security: disc; text-security: disc;
}
.ag-modal .pin-row { gap: 8px; }
/* Modale "Changer mon code PIN" (fond clair, contrairement à .ag-modal) —
   mêmes cercles bleu marine, adaptés au thème clair. */
#modal-change-pin .pin-row { gap: 10px; justify-content: center; }
#modal-change-pin .pin-box {
  width: 46px; height: 46px; font-size: 1.1rem;
  border: 1.5px solid rgba(0,0,0,.15); border-radius: 50%;
  background: transparent; color: #0F0A2E;
}
#modal-change-pin .pin-box:focus {
  border-color: #0F0A2E; box-shadow: 0 0 0 4px rgba(15,10,46,.18); background: transparent;
}
#modal-change-pin .pin-box.pin-filled {
  border-color: #0F0A2E; background: #0F0A2E; color: #fff; box-shadow: none;
}
/* Bleu marine (demande explicite, remplace l'orange) — même teinte que les
   en-têtes .ag-step-header et les boutons .ag-submit-btn. */
.ag-modal .pin-box {
  border: 1.5px solid rgba(0,0,0,.15);
  border-radius: 50%;
  background: transparent;
  color: #0F0A2E;
}
.ag-modal .pin-box:focus {
  border-color: #0F0A2E;
  box-shadow: 0 0 0 4px rgba(15,10,46,.18);
  background: transparent;
}
.ag-modal .pin-box.pin-filled {
  border-color: #0F0A2E;
  background: #0F0A2E;
  color: #fff;
  box-shadow: none;
}
.pin-box::-ms-reveal, .pin-box::-ms-clear,
.pin-box::-webkit-contacts-auto-fill-button,
.pin-box::-webkit-credentials-auto-fill-button,
.pln-pin-box::-ms-reveal, .pln-pin-box::-ms-clear,
.pln-pin-box::-webkit-contacts-auto-fill-button,
.pln-pin-box::-webkit-credentials-auto-fill-button,
.adm-pin-box::-ms-reveal, .adm-pin-box::-ms-clear,
.prg-pin-box::-ms-reveal, .prg-pin-box::-ms-clear { display: none !important; }
.pin-box:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(255,98,0,.2);
  background: rgba(255,98,0,.07);
  transform: scale(1.07);
}
.pin-box.pin-filled {
  border-color: rgba(255,98,0,.55);
  background: rgba(255,98,0,.09);
}

/* États login */
@keyframes loginShake {
  0%,100% { transform: translateX(0); }
  15% { transform: translateX(-9px); } 30% { transform: translateX(9px); }
  45% { transform: translateX(-6px); } 60% { transform: translateX(6px); }
  75% { transform: translateX(-3px); } 90% { transform: translateX(3px); }
}
.ag-modal.login-valid { border-color: rgba(34,197,94,.4); }
.ag-modal.login-valid .ag-input-wrap { border-color: #22c55e !important; }
.ag-modal.login-valid .pin-box.pin-filled { border-color: #22c55e !important; background: rgba(34,197,94,.1) !important; }
.ag-modal.login-error { animation: loginShake .45s ease; }
.ag-modal.login-error .ag-input-wrap { border-color: #ef4444 !important; }
.ag-modal.login-error .pin-box.pin-filled { border-color: #ef4444 !important; background: rgba(239,68,68,.1) !important; }
/* Vérification serveur en cours (connexion automatique au 4e chiffre) —
   indicateur discret + coupe-circuit visuel contre un second déclenchement
   pendant que le premier appel est encore en vol. */
.ag-modal.login-checking .pin-row { opacity: .55; pointer-events: none; }

/* Section PIN encadrée */
.ag-pin-section {
  margin: 14px 18px 0;
  padding: 14px 12px 16px;
}
.ag-pin-section .pin-row { gap: 8px; }
/* Carte "HOLLAND / numéro" masquée (demande explicite) — les éléments
   restent dans le DOM (agLoginGoStep() y écrit toujours le nom/numéro
   récupérés du serveur), simplement invisibles. */
#ag-login-user-card { display: none; }
.ag-pin-reveal-label {
  font-size: .98rem; font-weight: 900; color: #000;
  text-transform: uppercase; letter-spacing: .02em; line-height: 1.35;
  display: flex; align-items: center; justify-content: center; gap: 5px;
  margin: 6px 0 18px; padding: 0;
}
.ag-pin-reveal-label i { color: #ef4444; font-size: .68rem; }

/* Étape 2 (numéro reconnu) : carte utilisateur + bouton retour réutilisés
   du patron de connexion partenaire (.pln-user-card/.pln-back-btn, pensés
   pour un fond sombre) — adaptés ici au thème clair de .ag-modal. */
.ag-modal .pln-user-name { color: #000000; }
.ag-modal .pln-user-tel  { color: rgba(0,0,0,.5); }
.ag-modal .pln-back-btn {
  background: rgba(0,0,0,.06); border: 1px solid rgba(0,0,0,.1);
  color: rgba(0,0,0,.6); margin: 0 0 12px 16px;
}

/* Étape 2 (numéro reconnu) de la connexion "Espace Partenaire" — même
   carte, jamais adaptée jusqu'ici : fond blanc + texte noir plutôt que le
   texte blanc quasi-invisible du patron dark d'origine. */
#modal-partner-login .pln-user-card {
  background: #fff; border-color: rgba(0,0,0,.1);
}
#modal-partner-login .pln-user-name { color: #000000; }
#modal-partner-login .pln-user-tel  { color: rgba(0,0,0,.5); }
.ag-modal .pln-back-btn:hover { background: rgba(0,0,0,.12); }

/* Bannière succès */
.ag-live-success {
  display: none; align-items: center; gap: 12px;
  margin: 16px 24px 0; padding: 14px 16px;
  background: linear-gradient(135deg, #22c55e, #16a34a);
  border-radius: 14px; color: #fff; font-weight: 700; font-size: .88rem;
  box-shadow: 0 4px 20px rgba(34,197,94,.4);
  animation: agSlideUp .3s ease;
}
.ag-live-success i { font-size: 1.2rem; flex-shrink: 0; }
.ag-live-success-sub { font-size: .72rem; font-weight: 500; opacity: .85; margin-top: 2px; }

/* Bouton principal */
/* Bleu marine (demande explicite, remplace l'orange) — même teinte que les
   en-têtes .ag-step-header. */
.ag-submit-btn {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  width: calc(100% - 36px); margin: 15px 18px 0;
  padding: 12px; border: none; border-radius: 15px;
  background: linear-gradient(145deg, #0F0A2E 0%, #1A1040 55%, #0D0820 100%);
  -webkit-appearance: none; appearance: none;
  color: #fff; font-size: .82rem; font-weight: 900; cursor: pointer;
  box-shadow: none;
  transition: opacity .15s;
  font-family: var(--font); letter-spacing: .04em;
}
.ag-submit-btn:hover { opacity: .88; }
.ag-submit-btn:active { opacity: .75; }
/* Grisé tant que la saisie n'est pas valide (ex. surnom < 4 caractères,
   voir _regUpdateSurnomBtn(), js/client.js). */
.ag-submit-btn:disabled {
  background: var(--gray-200); color: rgba(0,0,0,.35);
  cursor: not-allowed; opacity: 1;
}
.ag-submit-btn:disabled:hover { opacity: 1; }
/* "Continuer" (étape numéro, connexion client) — même modèle que
   "Continuer" de l'étape téléphone de l'inscription (demande explicite :
   "regarde ce modèle et applique"), aucune personnalisation propre :
   hérite de .ag-form-card .ag-submit-btn/.ag-submit-btn comme
   #reg-step2-continue-btn. */
/* Largeur réduite (demande explicite) — bouton centré plutôt que pleine
   largeur, même gabarit que #reg-slide-2 .ag-submit-btn. */
.ag-form-card #ag-login-tel-continue-btn {
  width: 100%; max-width: min(295px, 85vw);
  margin: 14px auto 0;
  border-radius: 15px;
  padding: 15px 12px;
}

/* Bouton "Continuer" de l'étape 1 (surnom) en plus petit format, centré
   plutôt que pleine largeur (demande explicite). */
#ag-panel-register #reg-slide-1 .ag-submit-btn {
  width: 100%; max-width: min(300px, 88vw);
  margin: 90px auto 0; padding: 13px 24px;
  font-size: .85rem;
}

/* Lien switch */
.ag-switch-line {
  text-align: center; margin-top: 2px;
  font-size: .7rem; color: #000000;
}
.ag-switch-line button {
  background: none; border: none; color: #000;
  font-weight: 700; cursor: pointer; font-size: .7rem;
  text-decoration: underline; font-family: inherit;
}

/* Démo */
/* form-group dans modal auth */
#ag-panel-login .form-group,
#ag-panel-register .form-group { margin-bottom: 8px; }
/* Étapes du stepper d'inscription (.pln-slide) : un seul champ (parfois
   deux, étape Code) suivi directement du bouton "Continuer"/"Créer mon
   compte" — l'écart par défaut du bouton (15px) empilé sur celui du
   form-group juste au-dessus était visuellement trop large pour un bloc
   aussi court. */
#ag-panel-register .pln-slide .ag-submit-btn { margin-top: 4px; }
/* Marges par étape (spécificité renforcée avec #ag-panel-register pour
   passer devant la règle générique ci-dessus). */
#ag-panel-register #reg-slide-3 .ag-submit-btn { width: 100%; max-width: min(220px, 80vw); margin: 44px auto 0; padding: 11px; font-size: .78rem; }

/* Étape 3 (code) de l'inscription — modèle "coupon", scopé à #reg-slide-3
   uniquement : les cases de code restent le composant .pin-box partagé
   (cercle déjà en place via .ag-modal .pin-box, inchangé pour ne pas
   affecter connexion/déblocage ailleurs dans l'app), seuls l'en-tête
   icône+libellé, le séparateur "Facultatif" et le champ de parrainage
   sont propres à cette étape. */
#reg-slide-3 .reg3-pin-group { margin-bottom: 12px; }
/* Même format que les libellés des étapes 1/2 (centré, grand, gras, noir
   — demande explicite), police agrandie. */
#reg-slide-3 .reg3-pin-head {
  display: flex; align-items: center; justify-content: center; gap: 5px;
  max-width: min(320px, 90vw); margin: 6px auto 18px; text-align: center;
  line-height: 1.35;
}
#reg-slide-3 .reg3-pin-ico {
  width: 14px; height: 14px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,98,0,.1); color: var(--primary);
  display: flex; align-items: center; justify-content: center; font-size: .45rem;
}
/* Cadenas en rouge (demande explicite) — distinct de la coche de
   confirmation juste après, qui garde sa couleur habituelle. */
#reg-slide-3 .reg3-pin-ico .fa-lock { color: #ef4444; }
#reg-slide-3 .reg3-pin-ico:has(.fa-lock) { background: rgba(239,68,68,.1); }
#reg-slide-3 .reg3-pin-lbl { font-size: .98rem; font-weight: 900; color: #000000; letter-spacing: -.01em; }
/* Cercles réduits pour tenir correctement sur un écran de téléphone
   (demande explicite) — l'ID l'emporte sur ces deux classes, sans affecter
   connexion/déblocage qui gardent la taille d'origine. */
#reg-slide-3 .pin-box { width: clamp(36px, 11vw, 44px); height: clamp(36px, 11vw, 44px); font-size: 1.05rem; }
#reg-slide-3 .pin-row { gap: 8px; padding: 2px 22px; }

/* Largeur alignée sur celle du groupe de 4 cercles au-dessus (44px + 8px
   de gap ×3 = 200px, demande explicite) plutôt que la pleine largeur de la
   carte. */
#reg-slide-3 .reg3-divider {
  display: flex; align-items: center; gap: 8px; margin: 0 auto 10px; max-width: min(220px, 80vw);
  font-size: .58rem; font-weight: 700; color: rgba(0,0,0,.4);
  text-transform: uppercase; letter-spacing: .08em;
}
#reg-slide-3 .reg3-divider::before, #reg-slide-3 .reg3-divider::after { content: ''; flex: 1; height: 1px; background: rgba(0,0,0,.12); }

/* Champ de parrainage — encadré bleu marine à trait plein (plus de bords
   pointillés ni d'encoches "coupon détachable"). */
#reg-slide-3 .reg3-coupon {
  position: relative; display: flex; flex-direction: column; align-items: center; gap: 3px;
  border: 1.5px solid #0F2350; border-radius: 11px;
  padding: 8px 10px; background: rgba(15,35,80,.04);
  margin: 0 auto; max-width: min(220px, 80vw); text-align: center;
}
#reg-slide-3 .reg3-coupon::before, #reg-slide-3 .reg3-coupon::after { display: none; }
#reg-slide-3 .reg3-coupon-ico {
  width: 20px; height: 20px; border-radius: 50%; flex-shrink: 0;
  background: #0F2350; color: #fff;
  display: flex; align-items: center; justify-content: center; font-size: .58rem;
}
#reg-slide-3 .reg3-coupon-body { width: 100%; min-width: 0; }
#reg-slide-3 .reg3-coupon-lbl { font-size: .5rem; font-weight: 700; color: #0F2350; text-transform: uppercase; letter-spacing: .03em; margin-bottom: 2px; text-align: center; }
#reg-slide-3 .reg3-coupon-input {
  border: none; background: none; outline: none; width: 100%;
  font-size: .72rem; font-weight: 800; letter-spacing: .03em; color: rgba(0,0,0,.7);
  font-family: inherit; padding: 0; text-align: center;
}
#reg-slide-3 .reg3-coupon-input::placeholder { color: rgba(0,0,0,.28); font-weight: 700; }
/* Fond clair sur tout le panneau d'inscription (#ag-modal, voir plus haut
   background:#fafafa) -> couleurs adaptées (.parrain-fb par défaut est pensé
   pour un fond sombre comme #prg-parrain-feedback, formulaire partenaire). */
#ag-panel-register .parrain-fb { margin: 6px 18px 0; font-size: .58rem; }
#ag-panel-register .parrain-fb--checking { color: rgba(0,0,0,.4); }
#ag-panel-register .parrain-fb--ok       { color: #16a34a; }
#ag-panel-register .parrain-fb--warn     { color: #d97706; }
#ag-panel-register .parrain-fb--unavailable { color: #dc2626; }

/* Panneau succès */
.ag-success-wrap {
  display: flex; flex-direction: column; align-items: center;
  padding: 36px 24px 40px; gap: 10px; text-align: center;
  animation: agSuccessIn .35s cubic-bezier(.34,1.56,.64,1);
}
@keyframes agSuccessIn {
  from { opacity: 0; transform: scale(.8); }
  to   { opacity: 1; transform: scale(1); }
}
.ag-success-circle {
  width: 72px; height: 72px; border-radius: 50%;
  background: linear-gradient(135deg, #22c55e, #16a34a);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 2rem;
  box-shadow: 0 0 0 10px rgba(34,197,94,.12), 0 6px 20px rgba(34,197,94,.3);
  margin-bottom: 6px;
}
.ag-success-title { font-size: 1.2rem; font-weight: 900; color: #0A0A0F; }
.ag-success-sub   { font-size: .85rem; color: rgba(10,10,15,.45); font-weight: 500; }
.ag-success-bar {
  width: 100%; height: 3px; background: rgba(10,10,15,.08);
  border-radius: 3px; overflow: hidden; margin-top: 18px;
}
.ag-success-fill {
  height: 100%; background: linear-gradient(90deg, #22c55e, #16a34a);
  border-radius: 3px; animation: agFillBar 1.8s linear forwards;
}
@keyframes agFillBar {
  from { width: 0; }
  to   { width: 100%; }
}

/* ══════════════════════════════════════════════════════════════
   LOADING SCREEN — badge dégradé (téléphone + flèche) et points
   animés, modèle commun à l'espace client et à l'espace partenaire
   (demande explicite).
══════════════════════════════════════════════════════════════ */
#page-loader {
  position: fixed; inset: 0; z-index: 9999;
  background: var(--white, #fff);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 22px;
  transition: opacity .45s ease, visibility .45s ease;
}
#page-loader.pl-hide { opacity: 0; visibility: hidden; }
.pl-badge {
  position: relative;
  display: flex; align-items: center; justify-content: center;
  animation: plLogoPop .6s cubic-bezier(.34,1.46,.64,1) both;
}
.pl-badge-logo { width: 90px; height: 90px; object-fit: contain; position: relative; z-index: 1; }
@keyframes plLogoPop {
  from { transform: scale(.5); opacity: 0; }
  to   { transform: scale(1);  opacity: 1; }
}
/* Cercle qui tourne autour du logo (demande explicite) — anneau plus
   grand que le logo, positionné derrière lui. */
.pl-ring {
  position: absolute; inset: -16px;
  border-radius: 50%;
  border: 3px solid rgba(15,10,46,.15);
  border-top-color: #0F0A2E;
  animation: plSpin .9s linear infinite;
}
@keyframes plSpin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .pl-ring { animation: none; }
}

/* ══════════════════════════════════════════════════════════════
   ACCUEIL AVANT CONNEXION (#client-welcome-gate) — recouvre toute
   l'interface tant qu'aucune session client n'est active.
   Disposition : courte bande marine de tête (logo + nom), puis
   grande section blanche où le titre et le sous-titre se révèlent
   de gauche à droite (« écriture »), boutons ancrés en bas. Style
   sobre, aucun reflet coloré. Voir showClientWelcomeGate()/boot()
   dans js/client.js.
   z-index 1500 : au-dessus de l'interface, sous la modale de
   connexion (.modal-overlay, 2000) et sous le loader (9999).
══════════════════════════════════════════════════════════════ */
.cwg-gate {
  position: fixed; inset: 0; z-index: 1500;
  display: flex; flex-direction: column;
  background: var(--white, #fff);
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  /* Le glissement dans la vitrine ne doit JAMAIS faire défiler l'espace
     client resté monté derrière (demande explicite : "la vitrine ne bouge
     pas"). overscroll-behavior coupe le "scroll chaining" quand on atteint
     le bord ; la classe html.cwg-open ci-dessous verrouille en plus le
     défilement du body pour le cas où le contenu de la vitrine tient
     entièrement dans l'écran (aucune zone scrollable à intercepter). */
  overscroll-behavior: contain;
}
html.cwg-open,
html.cwg-open body { overflow: hidden; overscroll-behavior: none; }

/* Bande marine de tête — affiches qui défilent dans le fond + voile marine. */
.cwg-band {
  position: relative; flex: 0 0 auto;
  height: 38vh; min-height: 240px; max-height: 340px;
  display: flex; align-items: center; justify-content: center;
  background: radial-gradient(130% 130% at 50% 0%, #241a5e 0%, #150d40 55%, #0b0726 100%);
  border-radius: 0;
  overflow: hidden;
}
.cwg-band-track {
  position: absolute; inset: 0; z-index: 0;
  display: flex; width: 500%;
  animation: cwgBandSlide 28s cubic-bezier(.7, 0, .3, 1) infinite;
  will-change: transform;
}
.cwg-band-slide {
  flex: 0 0 20%; width: 20%;
  background-size: cover; background-repeat: no-repeat; background-position: 50% 40%;
}
.cwg-band-slide--a { background-image: url("../img/web.png"); }
.cwg-band-slide--b { background-image: url("../img/prpr.png"); }
.cwg-band-slide--c { background-image: url("../img/OKOK.png"); }
.cwg-band-slide--d { background-image: url("../img/pub1.png"); }
@keyframes cwgBandSlide {
  0%,   18%  { transform: translateX(0); }
  22%,  40%  { transform: translateX(-20%); }
  44%,  62%  { transform: translateX(-40%); }
  66%,  84%  { transform: translateX(-60%); }
  88%, 100%  { transform: translateX(-80%); }
}
.cwg-band-veil {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(180deg,
    rgba(11,7,38,.60) 0%, rgba(11,7,38,.48) 45%, rgba(11,7,38,.82) 100%);
}
@media (prefers-reduced-motion: reduce) {
  .cwg-band-track { animation: none; }
}
.cwg-glow {
  position: absolute; top: -55%; left: 50%; transform: translateX(-50%);
  width: 300px; height: 300px; border-radius: 50%;
  background: rgba(255,255,255,.05); filter: blur(80px); pointer-events: none;
}
.cwg-brand {
  position: relative; z-index: 2;
  display: flex; align-items: center;
  margin-bottom: 34px;
  animation: cwgFadeUp .5s ease .05s both;
}
.cwg-logo-badge {
  width: 78px; height: 78px; border-radius: 50%; background: #fff;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 14px 34px -12px rgba(0,0,0,.5);
}
.cwg-logo { width: 78px; height: 78px; border-radius: 50%; object-fit: contain; }

/* Compteur "500K+ utilisateurs" — sous le sous-titre, gros chiffre bleu
   marine animé en montée (voir cwgAnimateStatCounter(), js/client.js,
   déclenché par showClientWelcomeGate()). */
.cwg-stat-big {
  margin-top: 40px; display: flex; flex-direction: column; align-items: center; gap: 2px;
  animation: cwgFadeIn .5s ease-out .62s both, cwgBreathe 3.4s ease-in-out 1.5s infinite;
}
.cwg-stat-big-num {
  color: #0F0A2E; font-weight: 800; line-height: 1;
  font-size: clamp(2.6rem, 12vw, 3.6rem); letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.cwg-stat-big-lbl { color: var(--gray-500, #8b879c); font-size: .82rem; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }

/* Section blanche — remonte légèrement sur la bande marine, coins hauts
   arrondis. */
.cwg-body {
  position: relative; z-index: 1;
  flex: 1 1 auto;
  display: flex; flex-direction: column; justify-content: flex-start;
  margin-top: -22px; background: #fff;
  border-radius: 22px 22px 0 0;
  padding: 18px 30px calc(24px + env(safe-area-inset-bottom, 0px));
}
.cwg-text { text-align: center; }

/* Entrée simple et sobre : fondu + très léger décalage vers le haut,
   sans scale/rebond/masque — la plus minimale essayée jusqu'ici. Les
   deux mots de couleur gardent ensuite un léger halo qui respire en
   boucle une fois posés, pour que l'écran reste vivant même une fois
   l'utilisateur immobile dessus (voir cwgGlowPulse plus bas). */
/* Modèle « héros Espace web » : amorce bleu marine (phrase de service),
   puis « en » petit + « Côte d'Ivoire » en très grand orange pur sur la
   même ligne, en dessous. */
.cwg-headline {
  margin: 0 auto 14px; font-weight: 900; color: #0F0A2E;
  line-height: 1.12; letter-spacing: -.02em;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
}
.cwg-headline-hl, .cwg-headline-rest, .cwg-headline-hl2 {
  opacity: 0; animation: cwgFadeIn .45s ease-out both;
}
/* Amorce : phrase de service en tête, bleu marine. */
.cwg-headline-hl {
  font-size: clamp(1.15rem, 4.8vw, 1.6rem); font-weight: 900;
  color: #0F0A2E; letter-spacing: -.02em; line-height: 1.16; max-width: 22ch;
  animation: cwgFadeIn .45s ease-out .04s both;
}
/* Bloc « en Côte d'Ivoire » en dessous. */
.cwg-headline-geo { display: block; margin-top: 4px; }
/* « en » : petit, gris, sur la même ligne que le grand mot. */
.cwg-headline-rest {
  font-size: .72rem; font-weight: 700; color: #8B879C;
  letter-spacing: 0; vertical-align: middle; margin-right: .16em;
  animation: cwgFadeIn .45s ease-out .12s both;
}
/* « Côte d'Ivoire » : mot-vedette, très grand, orange pur, souligné d'un
   seul trait courbe vert tracé à main levée. */
.cwg-headline-hl2 {
  position: relative; display: inline-block;
  font-size: clamp(1.9rem, 8vw, 2.8rem); font-weight: 900;
  letter-spacing: -.03em; color: #FF6200; vertical-align: middle;
  animation: cwgFadeIn .45s ease-out .2s both;
}
.cwg-headline-hl2::after {
  content: ""; position: absolute; left: 2px; right: 2px; bottom: -.12em; height: 12px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 20' preserveAspectRatio='none'%3E%3Cpath d='M4,15 Q100,-3 196,15' fill='none' stroke='%23008A3B' stroke-width='3.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
  pointer-events: none;
}
.cwg-subline {
  margin: 0 auto; color: #0F0A2E;
  font-size: .96rem; font-weight: 400; line-height: 1.55; max-width: 32ch;
  animation: cwgFadeIn .45s ease-out .38s both, cwgBreathe 3.4s ease-in-out 1.3s infinite;
}
.cwg-subline-hl { color: #F77F00; font-weight: 700; }

/* Actions sous le texte (légèrement descendues, pas ancrées en bas) */
.cwg-actions {
  margin-top: 44px; width: 100%;
  display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.cwg-primary-btn   { animation: cwgFadeUp .5s ease .95s both; }
.cwg-secondary-btn { animation: cwgFadeUp .5s ease 1.05s both; }

.cwg-primary-btn, .cwg-secondary-btn {
  width: 100%; max-width: 400px;
  font-family: var(--font); cursor: pointer;
  font-size: 1rem; font-weight: 800;
  padding: 17px 24px; border-radius: 15px;
  transition: transform .14s ease, box-shadow .14s ease, background .14s ease;
}
.cwg-primary-btn {
  border: none; color: #fff; background: #0F0A2E;
  box-shadow: 0 6px 16px -6px rgba(15,10,46,.4);
}
.cwg-primary-btn:active { transform: translateY(1px); box-shadow: 0 3px 10px -6px rgba(15,10,46,.4); }
.cwg-secondary-btn {
  background: var(--white, #fff); color: #0F0A2E;
  border: 1.5px solid rgba(15,10,46,.16);
}
.cwg-secondary-btn:active { transform: translateY(1px); background: #f7f6fa; }

@keyframes cwgFadeUp {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0); }
}
/* Entrée minimale : fondu + 8px de montée, rien d'autre. */
@keyframes cwgFadeIn {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
/* Halo continu des mots de couleur (voir .cwg-headline-hl/-hl2) : le
   texte respire doucement en boucle, pour garder l'écran d'accueil
   vivant même une fois l'animation d'entrée terminée. */
@keyframes cwgGlowPulse {
  0%, 100% { text-shadow: 0 0 0 transparent; }
  50%      { text-shadow: 0 0 14px var(--cwg-glow, transparent); }
}
/* Respiration continue pour les éléments sans halo de couleur (texte
   bleu marine, chiffre) — pour que rien ne reste figé une fois posé. */
@keyframes cwgBreathe {
  0%, 100% { opacity: 1; }
  50%      { opacity: .74; }
}
@media (prefers-reduced-motion: reduce) {
  .cwg-brand, .cwg-headline, .cwg-headline-hl, .cwg-headline-rest, .cwg-headline-hl2,
  .cwg-subline, .cwg-stat-big, .cwg-primary-btn, .cwg-secondary-btn {
    animation: none !important; opacity: 1 !important; transform: none !important;
    text-shadow: none !important; clip-path: none !important;
  }
}

/* ══════════════════════════════════════════════════════════════
   PULL-TO-REFRESH — indicateur (voir js/pull-to-refresh.js)
   Neutralise aussi le pull-to-refresh natif du navigateur/WebView
   (overscroll-behavior) pour ne pas entrer en conflit avec le geste
   personnalisé géré en JS.
══════════════════════════════════════════════════════════════ */
html, body { overscroll-behavior-y: contain; }
body:not(.on-home) .cs-section.active { overscroll-behavior-y: contain; }

#ptr-indicator {
  position: fixed;
  top: max(10px, env(safe-area-inset-top, 0px));
  left: 50%;
  height: 40px; min-width: 40px;
  transform: translateX(-50%) translateY(-46px);
  opacity: 0;
  z-index: 260;
  display: flex; align-items: center;
  background: var(--white, #fff);
  border-radius: 20px;
  box-shadow: var(--shadow-lg);
  pointer-events: none;
}
#ptr-indicator.ptr-anim { transition: transform .35s cubic-bezier(.34,1.56,.64,1), opacity .3s ease; }

.ptr-ring-box {
  position: relative;
  width: 40px; height: 40px;
  flex: 0 0 40px;
}
.ptr-ring {
  position: absolute; inset: 3px;
  border-radius: 50%;
  border: 3px solid rgba(255,98,0,.15);
  border-top-color: #FF6200;
  border-right-color: #009A44;
  transition: border-color .2s ease;
}
#ptr-indicator.ptr-loading .ptr-ring { animation: ptrSpin .8s cubic-bezier(.5,0,.5,1) infinite; }
#ptr-indicator.ptr-ready .ptr-ring { border-top-color: #009A44; }
@keyframes ptrSpin { to { transform: rotate(360deg); } }

/* Logo de l'app au centre de l'anneau. */
.ptr-logo {
  position: absolute; inset: 0; margin: auto;
  width: 20px; height: 20px; object-fit: contain;
  border-radius: 50%;
}

/* "Actualisation…" — un seul mot, visible uniquement pendant le
   rechargement réel (pas pendant le tirage, pour rester simple) : le
   badge s'élargit légèrement en pilule le temps de l'afficher. */
.ptr-label {
  font-size: .72rem; font-weight: 700; letter-spacing: .01em;
  color: var(--gray-700, #2D3748);
  white-space: nowrap;
  max-width: 0; opacity: 0; overflow: hidden;
  transition: max-width .25s ease, opacity .2s ease, padding-right .25s ease;
}
#ptr-indicator.ptr-loading .ptr-label { max-width: 140px; opacity: 1; padding-right: 16px; }

/* ══════════════════════════════════════════════════════════════
   BANNIÈRE "NOUVELLE VERSION DISPONIBLE" (voir js/update-notifier.js)
   — même carte crème/charcoal que .toast (#FBF6EE/#241C12),
   volontairement indépendante du thème clair/sombre comme le toast.
   Intégrée au flux normal de la page (pas en position fixe), juste sous
   la grille d'actions rapides (Facture/Recharge UV/Exchange/Cadeau) sur
   l'accueil — voir index.html, juste après #hbc-guest-panel.
══════════════════════════════════════════════════════════════ */
#update-banner {
  display: none;
  align-items: center; gap: 10px;
  margin: 14px 12px 0;
  background: #FBF6EE;
  border: 1px solid rgba(36,28,18,.08);
  border-radius: 18px;
  box-shadow: 0 8px 24px rgba(36,28,18,.15);
  padding: 10px 10px 10px 12px;
  box-sizing: border-box;
}
#update-banner.upb-show { display: flex; animation: upbIn .35s cubic-bezier(.34,1.2,.64,1); }
@keyframes upbIn {
  from { opacity: 0; transform: translateY(-10px); }
  to   { opacity: 1; transform: translateY(0); }
}

.upb-icon {
  position: relative; width: 36px; height: 36px; flex-shrink: 0;
  border-radius: 50%; background: rgba(36,28,18,.05);
  display: flex; align-items: center; justify-content: center;
}
.upb-icon img { width: 22px; height: 22px; object-fit: contain; }

.upb-text { flex: 1; min-width: 0; }
.upb-title { font-size: .76rem; font-weight: 700; color: #241C12; line-height: 1.3; }
.upb-sub { font-size: .64rem; color: rgba(36,28,18,.6); line-height: 1.35; margin-top: 1px; }

.upb-btn {
  flex-shrink: 0;
  background: #FF6200; color: #fff; border: none;
  font-size: .7rem; font-weight: 700; font-family: var(--font);
  padding: 9px 14px; border-radius: 999px;
  cursor: pointer; white-space: nowrap;
  transition: background .2s ease;
}
.upb-btn:hover { background: #CC4E00; }

.upb-close {
  flex-shrink: 0; cursor: pointer;
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(36,28,18,.05); border: none;
  display: flex; align-items: center; justify-content: center;
  color: rgba(36,28,18,.4); font-size: .55rem;
  transition: all .2s;
}
.upb-close:hover { background: rgba(36,28,18,.1); color: #241C12; }

@media (max-width: 380px) {
  .upb-sub { display: none; } /* garde la bannière compacte sur petit écran */
}

/* ══════════════════════════════════════════════════════════════
   CARROUSEL ACTUALITÉS
══════════════════════════════════════════════════════════════ */
.actu-carousel-wrap {
  background: #fff; border-radius: var(--radius-lg);
  border: 1.5px solid var(--frame-green); overflow: hidden;
}
.actu-carousel {
  display: flex; transition: transform .4s cubic-bezier(.4,0,.2,1);
}
.actu-slide {
  min-width: 100%; display: flex; align-items: center; gap: 14px; padding: 14px 16px;
}
.actu-slide-icon {
  width: 42px; height: 42px; border-radius: 12px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: 1.1rem;
}
.actu-slide-body { flex: 1; min-width: 0; }
.actu-slide-cat {
  font-size: .67rem; font-weight: 800; text-transform: uppercase;
  letter-spacing: .5px; display: block; margin-bottom: 3px;
}
.actu-slide-title {
  font-size: .82rem; font-weight: 800; color: #000; line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.actu-slide-meta {
  font-size: .7rem; color: var(--gray-400); display: block; margin-top: 5px;
}
/* Indicateurs */
.actu-dots {
  display: flex; justify-content: center; gap: 6px; padding: 8px 0 10px;
}
.actu-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--gray-200); cursor: pointer; transition: all .25s;
}
.actu-dot.active { background: var(--primary); width: 18px; border-radius: 4px; }

/* ══════════════════════════════════════════════════════════════
   SECTION RÉSEAU
══════════════════════════════════════════════════════════════ */
.info-stat-card {
  display: flex; align-items: center; gap: 14px;
  background: #fff; border: 1px solid #f0e8e0; border-radius: var(--radius-lg);
  padding: 16px 18px; margin-bottom: 12px;
}
.isc-icon {
  width: 50px; height: 50px; border-radius: 14px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: 1.3rem;
}
.isc-body { flex: 1; }
.isc-value {
  font-size: 2rem; font-weight: 900; color: var(--primary); line-height: 1;
}
.isc-plus { font-size: 1.3rem; vertical-align: top; }
.isc-label { font-size: .78rem; color: #333; font-weight: 700; margin-top: 3px; }
.isc-badge {
  font-size: .75rem; font-weight: 800; padding: 4px 10px;
  border-radius: 20px; border: 1px solid #ffe0cc;
}
.isc-chips {
  display: flex; flex-wrap: wrap; gap: 7px; padding: 2px 0 4px;
}
.isc-chip {
  font-size: .72rem; font-weight: 700; padding: 4px 10px;
  background: #fff3ea; color: var(--primary);
  border-radius: 20px; display: flex; align-items: center; gap: 5px;
}

/* ══════════════════════════════════════════════════════════════
   SECTION DISPONIBILITÉ
══════════════════════════════════════════════════════════════ */
.avail-card {
  background: #fff; border: 1.5px solid var(--frame-green); border-radius: var(--radius-lg);
  padding: 16px 18px;
}
.avail-pulse-wrap {
  display: flex; align-items: center; gap: 8px; margin-bottom: 14px;
}
.avail-pulse-dot {
  position: relative;
  width: 10px; height: 10px; border-radius: 50%; background: #009A44;
  box-shadow: 0 0 0 3px rgba(0,154,68,.2);
}
.avail-pulse-dot::after {
  content: ''; position: absolute; inset: -3px; border-radius: 50%;
  border: 2px solid rgba(0,154,68,.4);
  animation: availPulse 2s ease-out infinite;
}
@keyframes availPulse { 0% { transform: scale(.6); opacity: .7; } 100% { transform: scale(1.7); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .avail-pulse-dot::after { animation: none; } }
.avail-live-label { font-size: .78rem; font-weight: 800; color: #009A44; }
.avail-grid {
  display: flex; align-items: center; gap: 12px;
}
.avail-sep {
  width: 1px; height: 44px; background: #f0e8e0; flex-shrink: 0;
}
.avail-item { display: flex; align-items: center; gap: 12px; flex: 1; }
.avail-icon {
  width: 42px; height: 42px; border-radius: 12px;
  background: #fff3ea; color: var(--primary);
  display: flex; align-items: center; justify-content: center; font-size: 1.1rem;
  flex-shrink: 0;
}
.avail-val { font-size: 1.05rem; font-weight: 900; color: #000; }
.avail-sub { font-size: .72rem; color: var(--gray-400); margin-top: 2px; }

/* ══════════════════════════════════════════════════════════════
   AIDEZ VOS AMIS (partage du lien de parrainage, accueil)
══════════════════════════════════════════════════════════════ */
.frp2-card {
  background: linear-gradient(145deg, #17103a 0%, #1e1248 55%, #120c2c 100%);
  border-radius: var(--radius-lg);
  padding: 18px 18px 16px;
  box-shadow: 0 6px 24px rgba(0,0,0,.45), 0 0 0 1px rgba(255,98,0,.08) inset;
}
.frp2-head { display: flex; align-items: center; gap: 14px; margin-bottom: 16px; }
.frp2-ico {
  width: 50px; height: 50px; border-radius: 50%; flex-shrink: 0;
  background: #fff; display: flex; align-items: center; justify-content: center;
  font-size: 1.4rem; box-shadow: 0 4px 12px rgba(0,0,0,.15);
}
.frp2-body { flex: 1; min-width: 0; }
.frp2-title { font-size: 1.05rem; font-weight: 900; color: #fff; }
.frp2-sub   { font-size: .84rem; color: rgba(255,255,255,.6); margin-top: 2px; }
.frp2-sub strong { color: #FF6200; }
.frp2-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; background: #fff; color: #FF6200; border: none; border-radius: 99px;
  padding: 13px; font-size: .86rem; font-weight: 900; cursor: pointer;
  font-family: var(--font); transition: opacity .15s;
}
.frp2-btn:hover  { opacity: .9; }
.frp2-btn:active { opacity: .78; }

/* ══════════════════════════════════════════════════════════════
   RÉSEAUX SOCIAUX — modèle compact (titre + icônes plates sur une
   seule ligne, sans libellé ni gros badge circulaire coloré), calqué
   sur une maquette de référence fournie par le client.
══════════════════════════════════════════════════════════════ */
.social-row {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: 10px;
}
.social-row-title {
  font-size: .78rem; font-weight: 900; color: var(--primary);
}

/* Icône individuelle — petit carré arrondi plat, pas de libellé */
.social-mini {
  width: 26px; height: 26px; border-radius: 8px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .72rem; color: #fff;
  text-decoration: none;
  transition: transform .2s;
}
.social-mini:hover { transform: translateY(-2px); }
.social-mini:active { transform: scale(.9); }
.social-mini--tt { background: #000; border: 1px solid rgba(255,255,255,.4); }
.social-mini--sc { background: #FFFC00; color: #000; }
.social-mini--wa { background: linear-gradient(135deg, #25D366, #128C7E); }

/* ══════════════════════════════════════════════════════════════
   HISTORIQUE — modèle ticket/reçu  [ANCIEN — conservé pour compat]
══════════════════════════════════════════════════════════════ */
.hxt-card {
  background: #fff;
  border: 1px solid #f0f0f0;
  border-radius: 14px;
  overflow: hidden;
  margin-bottom: 10px;
  cursor: pointer;
  transition: box-shadow .18s;
  box-shadow: 0 1px 6px rgba(0,0,0,.06);
}
.hxt-card:hover { box-shadow: 0 4px 16px rgba(0,0,0,.1); }

/* Bande réseau colorée */
.hxt-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
}
.hxt-op-letter {
  font-size: .95rem;
  font-weight: 900;
  line-height: 1;
}
.hxt-op-sub {
  font-size: .65rem;
  font-weight: 600;
  margin-top: 2px;
}
.hxt-status-badge {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: .65rem;
  font-weight: 800;
  padding: 4px 10px;
  border-radius: 99px;
}

/* Corps du ticket */
.hxt-body {
  padding: 14px 16px 12px;
}
.hxt-amount {
  font-size: 1.45rem;
  font-weight: 900;
  color: #fff;
  text-align: center;
  letter-spacing: -.5px;
  margin-bottom: 12px;
}

/* Ligne perforée */
.hxt-divider {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 -16px 12px;
  color: rgba(255,255,255,.2);
  font-size: .7rem;
}
.hxt-divider span {
  flex: 1;
  border-top: 1.5px dashed rgba(255,255,255,.12);
}

/* Lignes de détail */
.hxt-rows { display: flex; flex-direction: column; gap: 7px; }
.hxt-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.hxt-lbl {
  font-size: .65rem;
  color: rgba(255,255,255,.35);
  display: flex;
  align-items: center;
  gap: 5px;
}
.hxt-lbl i { font-size: .6rem; width: 12px; text-align: center; }
.hxt-val {
  font-size: .68rem;
  font-weight: 700;
  color: rgba(255,255,255,.8);
}

/* Référence */
.hxt-ref {
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px dashed rgba(255,255,255,.1);
  text-align: center;
  font-size: .6rem;
  font-weight: 800;
  color: rgba(255,255,255,.2);
  letter-spacing: .12em;
}

/* ══════════════════════════════════════════════════════════════
   HISTORIQUE — nouvelle barre de filtres
══════════════════════════════════════════════════════════════ */
.hxf-bar {
  display: flex; align-items: center; gap: 10px; margin-bottom: 16px;
}
.hxf-chips {
  display: flex; gap: 6px; flex: 1; overflow-x: auto;
  scrollbar-width: none; -ms-overflow-style: none;
}
.hxf-chips::-webkit-scrollbar { display: none; }

.hxf-chip {
  display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0;
  padding: 7px 14px; border-radius: 99px; cursor: pointer;
  font-size: .72rem; font-weight: 700; border: 1.5px solid rgba(255,255,255,.1);
  background: rgba(255,255,255,.05); color: rgba(255,255,255,.45);
  transition: all .2s ease;
}
.hxf-chip:hover {
  background: rgba(255,255,255,.09); color: rgba(255,255,255,.75);
  border-color: rgba(255,255,255,.18);
}
.hxf-chip--all.hxf-active {
  background: linear-gradient(135deg, #FF6200, #cc4000);
  border-color: transparent; color: #fff;
  box-shadow: 0 3px 14px rgba(255,98,0,.4);
}
.hxf-chip.hxf-active:not(.hxf-chip--all) {
  background: rgba(var(--op), .15);
  border-color: var(--op); color: #fff;
  box-shadow: 0 3px 12px rgba(0,0,0,.3);
}
.hxf-dot {
  width: 8px; height: 8px; border-radius: 50%; display: inline-block; flex-shrink: 0;
}

.hxf-trash {
  width: 36px; height: 36px; border-radius: 10px; flex-shrink: 0;
  background: rgba(239,68,68,.08); border: 1.5px solid rgba(239,68,68,.18);
  color: rgba(239,68,68,.6); cursor: pointer; font-size: .8rem;
  display: flex; align-items: center; justify-content: center;
  transition: all .2s;
}
.hxf-trash:hover {
  background: rgba(239,68,68,.18); border-color: rgba(239,68,68,.4);
  color: #ef4444;
}

/* État vide */
.hxf-empty {
  display: flex; flex-direction: column; align-items: center;
  padding: 52px 20px 40px; text-align: center;
}
.hxf-empty-icon {
  width: 56px; height: 56px; border-radius: 18px; margin-bottom: 16px;
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.08);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.3rem; color: rgba(255,255,255,.45);
}
.hxf-empty-title {
  font-size: .85rem; font-weight: 800; color: rgba(255,255,255,.3); margin-bottom: 6px;
}
.hxf-empty-sub {
  font-size: .68rem; color: rgba(255,255,255,.45); font-weight: 500;
}

/* ══════════════════════════════════════════════════════════════
   HISTORIQUE — ancien design (filtres et bannière conservés)
══════════════════════════════════════════════════════════════ */
.hx-filters-wrap {
  background: rgba(255,255,255,.03);
  border: 1px solid rgba(255,255,255,.07);
  border-radius: 16px; padding: 14px 14px 10px; margin-bottom: 16px;
}
.hx-filter-label {
  font-size: .6rem; font-weight: 900; color: rgba(255,255,255,.45);
  text-transform: uppercase; letter-spacing: .1em;
  display: flex; align-items: center; gap: 5px;
  margin-bottom: 8px;
}
.hx-filter-label i { font-size: .65rem; }
.hx-filter-bar {
  display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px;
}
.hx-filter-bar--op { margin-bottom: 0; }
.hx-filter-actions { margin-top: 12px; padding-top: 10px; border-top: 1px solid rgba(255,255,255,.07); }
.hx-op-dot {
  width: 7px; height: 7px; border-radius: 50%; display: inline-block; margin-right: 2px;
}
.hx-filter-btn {
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.1);
  color: rgba(255,255,255,.5); border-radius: 99px;
  padding: 5px 14px; font-size: .68rem; font-weight: 700;
  cursor: pointer; font-family: var(--font); transition: all .2s;
  display: flex; align-items: center; gap: 5px;
}
.hx-filter-btn.hx-active {
  background: var(--primary); border-color: var(--primary); color: #fff;
}

/* ── Récapitulatif commandes dashboard ───────────────────────── */
.rcp-see-all {
  background: none; border: none; cursor: pointer;
  font-size: .55rem; font-weight: 700; color: var(--primary);
  display: flex; align-items: center; gap: 5px;
}
.rcp-item {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid rgba(255,255,255,.05);
  cursor: pointer; transition: background .15s;
}
.rcp-item:last-child { border-bottom: none; }
.rcp-item:hover { background: rgba(255,255,255,.02); border-radius: 10px; }
.rcp-op-ico {
  width: 38px; height: 38px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.05rem; font-weight: 900; overflow: hidden;
}
.rcp-op-ico img { width: 100%; height: 100%; object-fit: cover; }
/* Même correctif que .op-card--orange .op-logo-img : le PNG Orange a une
   large marge blanche autour du logo. */
.rcp-op-ico--orange img { transform: scale(1.7); }
.rcp-info { flex: 1; min-width: 0; }
.rcp-ref { font-size: .68rem; font-weight: 800; color: #fff; margin-bottom: 3px; }
.rcp-benef { color: rgba(255,255,255,.4); font-weight: 600; }
.rcp-date { font-size: .52rem; color: rgba(255,255,255,.3); font-weight: 600; }
.rcp-right { text-align: right; flex-shrink: 0; }
.rcp-amount { font-size: .75rem; font-weight: 900; color: #fff; margin-bottom: 4px; }
.rcp-status { font-size: .5rem; font-weight: 700; display: flex; align-items: center; gap: 4px; justify-content: flex-end; }

/* ══════════════════════════════════════════════════════════════
   HISTORIQUE — fond blanc, inspiré de "Mes commissions" (espace
   cabine) : puces de résumé + cartes blanches avec frise horaire.
   Voir renderHistoryList() dans js/client.js.
══════════════════════════════════════════════════════════════ */
.hx-list { display: block; padding: 0; }

/* Carte unique regroupant la recherche et le bouton "Réclamation" — fond
   blanc pleine largeur, texte noir/marine (demande explicite : "fais
   pareil" que les autres panneaux de Profil/Parrainage). */
.hxrc-section {
  position: relative; overflow: hidden;
  margin: 0 0 14px; padding: 0;
  display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.hxrc-section::after { display: none; }

/* Onglets de catégorie (Historique) — segment arrondi de style "pilule"
   (demande explicite : "crée une section ronde"), plutôt que du texte nu
   — même famille visuelle que .wz-mode-card. Défilement horizontal (voir
   filterHistoryCategory(), js/client.js) conservé pour les libellés
   longs. */
.hx-cat-filters {
  display: flex; justify-content: center; gap: 3px; overflow-x: auto;
  margin: 0 12px 12px; padding: 4px;
  border-radius: 999px;
}
.hx-cat-tab {
  flex-shrink: 0; background: none; border: none; cursor: pointer;
  border-radius: 999px;
  font-size: .74rem; font-weight: 700; color: var(--gray-400);
  padding: 7px 16px; white-space: nowrap; font-family: var(--font);
  transition: color .15s, background .15s;
}
.hx-cat-tab.active { color: #fff; background: #0F0A2E; box-shadow: 0 2px 8px rgba(15,10,46,.32); }

.hxrc-search {
  position: relative; z-index: 1;
  display: flex; align-items: center; gap: 10px;
  width: 70%;
  background: #F8F9FC;
  border: 1.5px solid transparent;
  border-radius: 14px; padding: 4px 14px 4px 4px;
  transition: border-color .15s, background .15s;
}
.hxrc-search:focus-within { background: #fff; }
.hxrc-search-ico {
  flex-shrink: 0; width: 30px; height: 30px; border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(0,0,0,.05);
  box-shadow: inset 0 0 0 1.5px rgba(0,0,0,.15);
  color: #000; font-size: .74rem;
}
.hxrc-search input {
  all: unset; box-sizing: border-box; flex: 1; min-width: 0;
  font-size: .74rem; font-weight: 600; color: #0a1330;
  padding: 9px 0;
}
.hxrc-search input::placeholder { color: rgba(0,0,0,.35); font-weight: 500; }

.hxrc-sep {
  position: relative; z-index: 1; height: 1px;
  background: #F0F2F7;
}

.hoc-list { display: flex; flex-direction: column; gap: 9px; }
.hoc-card {
  background: #fff; border: 1px solid var(--gray-200);
  border-radius: 13px; padding: 11px 13px;
  text-align: left; width: 100%;
  box-shadow: 0 1px 2px rgba(20,20,15,.03);
}

.hoc-card-top {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 9px; padding-bottom: 9px; margin-bottom: 10px;
  border-bottom: 1px solid var(--gray-100);
}
.hoc-id-row { display: flex; align-items: center; gap: 9px; min-width: 0; }
.hoc-ico {
  width: 28px; height: 28px; border-radius: 9px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .72rem;
}
.hoc-svc { font-size: .72rem; font-weight: 800; color: var(--gray-800); line-height: 1.3; }
.hoc-meta { font-size: .62rem; color: var(--gray-500); margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.hoc-ref { font-size: .64rem; color: var(--primary); font-weight: 600; }
/* Modèle "repliable" (demande explicite, espace cabine) — seule la
   référence est visible par défaut, le clic dessus déplie le reste
   (offre, montant, statut, étapes). */
.hoc-card--collapsible { cursor: default; }
.hoc-card--collapsible:hover { transform: none; border-color: var(--gray-200); }
/* Teinte de la ligne repliée selon le statut (demande explicite) — visible
   sans avoir à déplier la carte. */
.hoc-card--done { background: rgba(18,184,134,.08); border-color: rgba(18,184,134,.25); }
.hoc-card--done:hover { border-color: rgba(18,184,134,.35); }
.hoc-card--refunded { background: rgba(220,38,38,.06); border-color: rgba(220,38,38,.22); }
.hoc-card--refunded:hover { border-color: rgba(220,38,38,.32); }
.hoc-card--done .hoc-ref-main, .hoc-card--refunded .hoc-ref-main { color: var(--gray-800); }
.hocf-ref-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; cursor: pointer; }
.hoc-ref-main { font-size: .74rem; font-weight: 800; color: var(--gray-800); }
.hocf-chev { font-size: .68rem; color: var(--gray-400); transition: transform .2s ease; flex-shrink: 0; }
.hoc-card--collapsible.open .hocf-chev { transform: rotate(180deg); }
.hocf-details { display: none; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--gray-100); }
.hoc-card--collapsible.open .hocf-details { display: block; }
/* Ouvre le détail riche (.ordet-*, voir openCabOrderDetail()) pour une
   commande auto-créée ("Commande"/"Soutrali") — seule cette carte-ci
   propose ce bouton, jamais une commande d'un client qu'il ne fait que
   traiter (voir _renderCabHistTxnCard(), js/cabine.js). */
.hocf-track-btn {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  width: 100%; margin-top: 10px; padding: 8px; border-radius: 10px;
  border: 1px solid rgba(255,98,0,.25); background: rgba(255,98,0,.06);
  color: var(--primary); font-size: .72rem; font-weight: 700;
  font-family: inherit; cursor: pointer;
}
.hocf-track-btn:hover { background: rgba(255,98,0,.1); }
/* Logo/titre et montant/statut sur une seule ligne (demande explicite) —
   logo+titre à gauche, montant+statut à droite. */
.hocf-head-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.hocf-title-row { display: flex; align-items: center; gap: 10px; min-width: 0; }
.hocf-net-logo {
  width: 38px; height: 38px; border-radius: 50%; object-fit: cover; flex-shrink: 0;
  box-shadow: 0 0 0 1px var(--gray-200);
}
.hocf-title-row .hoc-svc { line-height: 1.35; }
.hocf-amount-status { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.hocf-amount {
  font-size: 1rem; font-weight: 900; color: var(--gray-800);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}

/* Frise Créée/Assignée/Terminée (demande explicite) — points reliés par
   un trait, façon suivi de commande, plutôt qu'une ligne de texte. */
.hocf-timeline { display: flex; align-items: flex-start; margin-top: 10px; }
.hocf-tl-step { display: flex; flex-direction: column; align-items: center; flex: 0 0 auto; }
.hocf-tl-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--primary); flex-shrink: 0; }
.hocf-tl-line { flex: 1 1 auto; height: 1.5px; background: var(--gray-200); margin: 4px 4px 0; min-width: 16px; }
.hocf-tl-lbl { font-size: .58rem; font-weight: 700; color: var(--gray-500); margin-top: 5px; white-space: nowrap; }
.hocf-tl-time { font-size: .62rem; font-weight: 800; color: var(--gray-800); margin-top: 1px; white-space: nowrap; }
.hoc-amounts { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex-shrink: 0; }
.hoc-pill-row { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }
/* Invitation à noter une commande validée pas encore notée (demande
   explicite : "affiche la possibilité de note ici") — mêmes 5 étoiles
   que .notation-stars--readonly (toutes éteintes, note=0) + libellé
   court ; la carte entière reste le déclencheur (onclick déjà posé sur
   .hoc-card, ouvre le détail où la vraie saisie a lieu). */
.hoc-rate-hint { display: inline-flex; align-items: center; gap: 4px; }
.hoc-rate-hint-lbl { font-size: .56rem; font-weight: 700; color: var(--gray-400); }
.hoc-montant { font-size: .78rem; font-weight: 800; color: var(--gray-800); font-variant-numeric: tabular-nums; }
.hoc-pill {
  font-size: .54rem; font-weight: 800; padding: 2px 25px; border-radius: 999px;
  display: inline-flex; align-items: center; gap: 3px; white-space: nowrap;
}
.hoc-pill--ok   { background: rgba(22,163,74,.1);  color: #16a34a; }
.hoc-pill--pend { background: rgba(217,119,6,.1);  color: #d97706; }
.hoc-pill--ko   { background: rgba(220,38,38,.1);  color: #dc2626; }
.hoc-pill--rfd  { background: rgba(124,58,237,.1); color: #7c3aed; }

/* Pied de carte : date complète (jour/mois/année + heure) et ID de
   commande, toujours visibles (demande explicite) — remplace l'ancienne
   ligne du temps (Envoyée/Assignée/Reçue, retirée sur demande explicite
   précédente : "je ne veux pas que le client voit toutes ces
   informations"). */
.hoc-card-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding-top: 8px; margin-top: 2px;
}
.hoc-card-date { font-size: .6rem; font-weight: 600; color: var(--gray-500); display: flex; align-items: center; gap: 5px; }
/* Référence copiable — texte plain (ni rouge ni gras, demande explicite),
   plus d'icône "#" devant, juste l'icône copier ; hocCopyRef() (au-dessus)
   fait la vraie copie. */
.hoc-card-ref {
  display: flex; align-items: center; gap: 5px;
  font-size: .6rem; font-weight: 800; color: #ef4444;
  background: none; border: none; padding: 0; flex-shrink: 0; cursor: pointer;
  font-family: var(--font); transition: color .15s;
}
.hoc-card-ref:hover { color: #dc2626; }
.hoc-card-ref i { font-size: .58rem; }

/* Indice de réclamation (voir _hocReclaHintInner) : compte à rebours tant
   que la fenêtre n'est pas ouverte, puis bandeau fermable une fois qu'elle
   l'est. Slot vide (aucune marge) tant qu'il n'a rien à montrer. */
.hoc-recla-hint-slot:empty { display: none; }
.hoc-recla-hint {
  margin-top: 10px; padding: 7px 10px; border-radius: 10px;
  font-size: .62rem; font-weight: 700;
  display: flex; align-items: center; gap: 6px;
}
.hoc-recla-hint--wait {
  background: #FF6200; color: #fff;
}
.hoc-recla-hint--wait strong { color: #fff; font-variant-numeric: tabular-nums; }
.hoc-recla-hint--ready {
  background: #fff; color: #12182B; border: 1px solid var(--gray-200);
  justify-content: space-between;
}
.hoc-recla-hint--ready i.fa-circle-check { color: var(--primary); }
.hoc-recla-hint--ready strong { color: var(--primary); font-weight: 800; }
.hoc-recla-hint-close {
  width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0;
  background: var(--gray-100); border: none; color: #12182B;
  font-size: .55rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}

/* État vide (demande explicite du 27/08 : "supprime ce modèle" — plus de
   cadre en pointillés, partout où .hx-empty est utilisé). */
.hx-empty {
  text-align: center; padding: 40px 20px;
  background: #fff; border-radius: 14px;
  border: none; box-shadow: 0 2px 10px rgba(0,0,0,.06);
}
.hx-empty-icon { font-size: 2rem; margin-bottom: 10px; }
.hx-empty-title {
  font-size: .82rem; font-weight: 600; color: #374151; margin-bottom: 4px;
}
.hx-empty-sub { font-size: .7rem; font-weight: 400; color: #9ca3af; }

/* ── Pharmacies de garde (#cs-pharmacies) ──────────────────── */
/* 4e modèle, plus professionnel (demande explicite du 28/08) — même
   carte bleu marine que le modèle précédent (géolocalisation + filtre
   commune), mais structurée en fiches "icône + libellé + sous-texte +
   chevron" façon menu d'options d'une appli établie, avec un
   éyebrow de section, plutôt que deux lignes minimalistes. */
.pharma-filter-card {
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border: 1px solid rgba(255,255,255,.06);
  border-radius: 16px; padding: 14px;
  box-shadow: 0 10px 26px -14px rgba(6,10,28,.5);
}
.pharma-filter-label {
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .09em;
  padding: 0 2px; margin-bottom: 10px;
}
.pharma-filter-sep { height: 1px; background: rgba(255,255,255,.08); margin: 4px 2px; }
.pharma-near-btn {
  width: 100%; display: flex; align-items: center; gap: 12px;
  background: none; color: #fff; border: none; border-radius: 10px;
  padding: 8px 4px; font-family: var(--font); text-align: left;
  cursor: pointer; transition: background .15s;
}
.pharma-near-btn:hover { background: rgba(255,255,255,.05); }
.pharma-near-btn:disabled { opacity: .6; cursor: default; }
.pharma-near-btn-badge, .pharma-commune-badge {
  width: 36px; height: 36px; border-radius: 11px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
}
.pharma-near-btn-badge {
  background: linear-gradient(135deg, var(--primary-light), var(--primary));
  color: #fff; font-size: .82rem;
}
.pharma-commune-badge {
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.1);
  color: rgba(255,255,255,.85); font-size: .78rem;
}
.pharma-near-btn-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pharma-near-btn-lbl { font-size: .82rem; font-weight: 800; color: #fff; }
.pharma-near-btn-sub { font-size: .64rem; color: rgba(255,255,255,.45); font-weight: 500; }
.pharma-near-btn-chev { font-size: .68rem; color: rgba(255,255,255,.3); flex-shrink: 0; }
.pharma-commune-filter {
  display: flex; align-items: center; gap: 12px;
  padding: 8px 4px; border-radius: 10px;
  position: relative;
}
.pharma-commune-filter:hover { background: rgba(255,255,255,.05); }
.pharma-commune-filter select {
  width: 100%; appearance: none; -webkit-appearance: none;
  background: none; border: none; outline: none; padding: 0;
  color: #fff; font-size: .78rem; font-weight: 700; font-family: var(--font);
  cursor: pointer;
}
.pharma-commune-filter select option { color: #16121F; }
.pharma-commune-chev { font-size: .68rem; color: rgba(255,255,255,.3); flex-shrink: 0; pointer-events: none; }

/* 5e modèle, sur affiche fournie le 28/08 (demande explicite : "je veux
   un modèle de ce genre") — fond clair vert plutôt que bleu marine,
   pin/croix pharmacie en dégradé vert, titre noir + accent vert,
   croix décorative en filigrane, filtre commune en pilule verte. */
/* 9e modèle (demande explicite : reprendre la capture "Pharmacies
   proches" telle quelle) — carte pleine teinte vert sapin (fond de la
   capture reconstitué en couleur plate, faute de photo derrière),
   badge icône blanc/texte teal, titre/description blancs, bouton blanc
   pleine largeur ; filtre commune détaché en pilule sous la carte. */
/* 12e modèle (demande explicite : "supprime le fond et mets les
   écritures en vert") — plus de carte pleine teinte : fond transparent,
   textes/icônes recolorés en vert sapin pour rester lisibles sur la
   page blanche. */
.pharma-near-card2 {
  background: none;
  border-radius: 0; padding: 4px 2px;
  box-shadow: none;
  margin: 4px 2px 12px;
}
.pharma-near-card2-top { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 16px; }
.pharma-near-card2-ico {
  width: 42px; height: 42px; border-radius: 13px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(22,163,74,.12); color: #1F5C4D; font-size: 1rem;
}
.pharma-near-card2-txt { min-width: 0; }
.pharma-near-card2-title { font-size: .88rem; font-weight: 800; color: #1F5C4D; margin-bottom: 3px; }
.pharma-near-card2-sub { font-size: .7rem; color: rgba(31,92,77,.75); line-height: 1.45; }
.pharma-near-card2-btn {
  width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px;
  background: rgba(22,163,74,.1); color: #1F5C4D; border: none; border-radius: 12px;
  padding: 11px; font-size: .8rem; font-weight: 800; font-family: var(--font);
  cursor: pointer;
}
.pharma-near-card2-btn:hover { background: rgba(22,163,74,.16); }
.pharma-near-card2-btn:disabled { opacity: .7; cursor: default; }

/* filtre commune fusionné dans le même bloc, séparé par une ligne fine. */
.pharma-near-card2-sep { height: 1px; background: rgba(22,163,74,.15); margin: 14px 2px 10px; }
.pharma-commune-filter--onCard { padding: 4px 2px; }
.pharma-commune-badge--onCard {
  width: 30px; height: 30px; border-radius: 9px;
  background: rgba(22,163,74,.12); border: none; color: #1F5C4D; font-size: .8rem;
}
.pharma-commune-filter--onCard .pcf-trigger { color: #1F5C4D; font-weight: 700; }
.pharma-commune-chev--onCard { color: #1F5C4D; }

/* Menu commune personnalisé (demande explicite : "propose un modèle
   plus esthétique" — la liste d'options d'un <select> natif n'est pas
   stylable, rendue par le navigateur/l'OS). .pcf-trigger remplace le
   <select>, .pcf-panel est le menu déroulant maison qui s'ouvre en
   dessous. */
.pcf-wrap { position: relative; }
.pcf-trigger {
  flex: 1; min-width: 0; text-align: left;
  background: none; border: none; padding: 0; margin: 0;
  font-family: var(--font); font-size: .78rem;
  cursor: pointer;
}
.pcf-trigger span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pharma-commune-chev { transition: transform .2s ease; }
.pcf-wrap.open .pharma-commune-chev { transform: rotate(90deg); }
.pcf-panel {
  position: absolute; left: 0; right: 0; top: calc(100% + 8px); z-index: 30;
  background: #fff; border-radius: 14px;
  box-shadow: 0 16px 36px -14px rgba(15,10,46,.3), 0 0 0 1px rgba(0,0,0,.04);
  max-height: 280px; overflow-y: auto;
  padding: 6px;
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
}
.pcf-wrap.open .pcf-panel { opacity: 1; visibility: visible; transform: translateY(0); }
.pcf-item {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; text-align: left; background: none; border: none;
  padding: 10px 12px; border-radius: 9px;
  font-size: .78rem; font-weight: 600; color: #16121F;
  cursor: pointer; font-family: var(--font);
}
.pcf-item:hover { background: var(--gray-100, #F1F2F6); }
.pcf-item.active { background: rgba(22,163,74,.1); color: #16A34A; font-weight: 800; }
.pcf-item-check { font-size: .64rem; color: #16A34A; opacity: 0; flex-shrink: 0; }
.pcf-item.active .pcf-item-check { opacity: 1; }
.pharma-commune-filter--standalone { margin: 0 2px 0; }
.pharma-commune-filter--green {
  background: linear-gradient(135deg, #EAF9EF, #DFF4E6);
  border-radius: 99px; padding: 11px 16px;
  box-shadow: inset 0 0 0 1px rgba(22,163,74,.1);
  position: relative; z-index: 1;
}
.pharma-commune-filter--green:hover { background: linear-gradient(135deg, #DFF4E6, #D3EFDD); }
.pharma-commune-badge--green {
  width: 26px; height: 26px; border-radius: 8px;
  background: none; border: none; color: #16A34A; font-size: .84rem;
}
.pharma-commune-filter--green select { color: #16121F; font-weight: 700; }
.pharma-commune-chev--green { color: #16A34A; }

/* 10e modèle (demande explicite : "propose un autre modèle") — carte
   vert sapin foncé (même famille que .pharma-near-card2 ci-dessus) au
   lieu de la pilule claire, pour unifier visuellement les deux blocs. */
.pharma-commune-filter--dark {
  background: linear-gradient(135deg, #2F5A4F, #1B4238);
  border-radius: 14px; padding: 12px 14px;
  box-shadow: 0 10px 22px -16px rgba(10,40,32,.5);
  position: relative; z-index: 1;
}
.pharma-commune-filter--dark:hover { background: linear-gradient(135deg, #356356, #1F4C41); }
.pharma-commune-badge--dark {
  width: 30px; height: 30px; border-radius: 9px;
  background: rgba(255,255,255,.14); border: none; color: #fff; font-size: .8rem;
}
.pharma-commune-filter--dark select { color: #fff; font-weight: 700; }
.pharma-commune-filter--dark select option { color: #16121F; }
.pharma-commune-chev--dark { color: rgba(255,255,255,.6); }
.pharma-updated { font-size: .62rem; color: var(--gray-400); text-align: center; margin: 10px 0 4px; }
.pharma-list { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; }
.pharma-loading { text-align: center; padding: 30px 0; color: var(--gray-500); font-size: .8rem; }
/* Carte pharmacie — refaite façon fiche (photo + fiche adresse + deux
   boutons) sur le modèle demandé le 28/08 : photo en haut (bords
   arrondis hérités de .pharma-card, overflow:hidden), nom + distance,
   ligne repère (pin + commune), adresse, puis Itinéraire (plein) et
   Appeler (contour) dans cet ordre. */
.pharma-card {
  background: #fff; border: 1px solid var(--gray-200); border-radius: 14px;
  padding: 0; overflow: hidden; box-shadow: 0 4px 14px rgba(0,0,0,.04);
}
.pharma-card-photo {
  width: calc(100% - 20px); aspect-ratio: 3.2 / 1;
  margin: 10px 10px 0;
  border-radius: 12px;
  background-size: cover; background-position: center 10%;
}
.pharma-card-body { padding: 14px 16px; }
.pharma-card-hd {
  display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
}
.pharma-card-name { font-size: .9rem; font-weight: 800; color: #16121F; }
.pharma-card-dist { font-size: .68rem; font-weight: 700; color: var(--primary); white-space: nowrap; }
.pharma-card-dist::before { content: '• '; }
.pharma-card-loc {
  display: flex; align-items: center; gap: 5px;
  font-size: .68rem; font-weight: 700; color: var(--primary); margin-top: 6px;
}
.pharma-card-addr { font-size: .72rem; color: var(--gray-500); margin-top: 8px; line-height: 1.5; }
.pharma-card-actions { display: flex; gap: 8px; margin-top: 14px; }
.pharma-card-btn {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px;
  background: #16A34A; color: #fff; text-decoration: none;
  border: 2px solid #16A34A;
  border-radius: 10px; padding: 9px 10px; font-size: .72rem; font-weight: 700;
}
.pharma-card-btn--ghost { background: #fff; color: #16A34A; border-color: #16A34A; }

/* Panneau détail (bottom sheet) */
.hx-detail-overlay {
  position: fixed; inset: 0; z-index: 500;
  background: rgba(0,0,0,.5); backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  opacity: 0; pointer-events: none; transition: opacity .25s;
}
.hx-detail-overlay.open { opacity: 1; pointer-events: all; }
.hx-detail-panel {
  width: 100%; max-width: 340px;
  background: #fff;
  border-radius: 18px;
  transform: translateY(16px) scale(.97); opacity: 0;
  transition: transform .28s cubic-bezier(.4,0,.2,1), opacity .28s ease;
  max-height: 88vh; overflow-y: auto; overflow-x: hidden;
}
.hx-detail-overlay.open .hx-detail-panel { transform: translateY(0) scale(1); opacity: 1; }

/* ── Bande d'en-tête façon billet (statut + notches + perforation) ── */
.hxtk-head {
  position: relative;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  padding: 11px 12px 15px; color: #fff;
}
.hxtk-head::after {
  content: '';
  position: absolute; top: -40%; right: -14%;
  width: 150px; height: 150px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.20), transparent 70%);
  pointer-events: none;
}
.hxtk-head-row {
  position: relative; z-index: 1;
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 8px;
}
.hxtk-title { font-size: .7rem; font-weight: 800; letter-spacing: -.01em; }
.hxtk-close {
  width: 19px; height: 19px; border-radius: 50%;
  background: rgba(255,255,255,.12); border: none; color: #fff;
  font-size: .58rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.hxtk-status { position: relative; z-index: 1; display: flex; align-items: center; gap: 8px; }
.hxtk-status-ring {
  width: 27px; height: 27px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .72rem;
}
.hxtk-status-ring--ok   { background: rgba(0,154,68,.22);  box-shadow: inset 0 0 0 1.5px rgba(0,255,140,.4);  color: #4ee08a; }
.hxtk-status-ring--pend { background: rgba(245,158,11,.22); box-shadow: inset 0 0 0 1.5px rgba(255,200,80,.5); color: #fbbf24; }
.hxtk-status-ring--fail { background: rgba(239,68,68,.22);  box-shadow: inset 0 0 0 1.5px rgba(255,120,120,.5); color: #fb7185; }
.hxtk-status-ring--rfd  { background: rgba(124,58,237,.22); box-shadow: inset 0 0 0 1.5px rgba(167,139,250,.5); color: #c4b5fd; }
.hxtk-status-lbl { font-size: .76rem; font-weight: 800; }
.hxtk-status-sub { font-size: .56rem; color: #8FA0C6; font-weight: 600; margin-top: 1px; }

.hxtk-notch-l, .hxtk-notch-r {
  position: absolute; bottom: -8px; width: 16px; height: 16px; border-radius: 50%;
  background: #fff; z-index: 2;
}
.hxtk-notch-l { left: -8px; }
.hxtk-notch-r { right: -8px; }
.hxtk-perf { border-top: 1.5px dashed rgba(255,255,255,.24); margin: 0 16px; }

.hxtk-body { padding: 10px 12px calc(12px + env(safe-area-inset-bottom, 0px)); }

.hx-detail-rows { display: flex; flex-direction: column; margin-bottom: 6px; }
.hx-detail-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 3px 0; border-bottom: 1px dashed var(--gray-200, #eef0f4); font-size: .64rem;
}
.hx-detail-row span { color: var(--gray-500, #9ca3af); font-weight: 500; }
.hx-detail-row strong { color: var(--gray-800, #111); font-weight: 700; font-variant-numeric: tabular-nums; }
.hx-detail-row span i { width: 11px; color: var(--gray-300, #d1d5db); margin-right: 2px; font-size: .6rem; }

.hxtk-actions { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; }
.hx-dl-btn {
  width: 100%; padding: 8px; border-radius: 10px;
  background: var(--primary); color: #fff; border: none;
  font-size: .68rem; font-weight: 800; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--font); box-shadow: 0 8px 18px rgba(255,98,0,.24);
}

/* ── Notation de commande (1-5 étoiles) ──────────────────────────────
   .notation-stars--input : saisie interactive (openOrderDetail(), voir
   js/client.js) — boutons cliquables, la note survolée/choisie et tout ce
   qui la précède s'allument. .notation-stars--readonly : simple affichage
   (carte d'historique, détail déjà noté, liste admin) — jamais cliquable. */
.notation-stars { display: inline-flex; gap: 3px; }
.notation-stars--input .notation-star {
  background: none; border: none; padding: 2px; cursor: pointer;
  font-size: 1.3rem; line-height: 1; color: var(--gray-300);
  transition: color .12s, transform .12s; font-family: inherit;
}
.notation-stars--input .notation-star.is-on { color: #F59E0B; transform: scale(1.05); }
.notation-stars--readonly .notation-star { font-size: .78rem; color: var(--gray-300); }
.notation-stars--readonly .notation-star.is-on { color: #F59E0B; }

.notation-box { margin-top: 14px; padding: 14px; border-radius: 12px; background: var(--gray-100); border: 1px solid var(--gray-200); }
.notation-box-title { font-size: .72rem; font-weight: 800; color: var(--gray-600); margin-bottom: 8px; }
.notation-box textarea {
  width: 100%; margin-top: 10px; padding: 8px 10px; border-radius: 8px;
  border: 1px solid var(--gray-200); font-family: var(--font); font-size: .74rem;
  resize: vertical; min-height: 50px; box-sizing: border-box;
}
.notation-box-done { display: flex; align-items: center; gap: 8px; font-size: .74rem; color: var(--gray-600); }
.notation-box-comment { margin-top: 6px; font-size: .72rem; color: var(--gray-500); font-style: italic; }

/* ══════════════════════════════════════════════════════════════
   SECTION DÉPENSES DU MOIS
══════════════════════════════════════════════════════════════ */

/* Bascule Jour/Mois + navigation — vivent DANS .sec-hero (fond sombre fixe
   ci-dessous), donc en blanc/faible opacité comme le reste du hero. Repris
   du fond gris clair d'une version précédente (bug : blanc sur blanc)
   quand ce bloc vivait hors de .sec-hero — inutile depuis qu'il y est
   imbriqué. */
.dp-view-toggle {
  display: flex; justify-content: center; gap: 6px;
  margin-top: 12px;
}
.dp-view-btn {
  font-family: inherit; font-size: .72rem; font-weight: 800;
  padding: 7px 20px; border-radius: 999px; border: 1px solid rgba(255,255,255,.15);
  background: rgba(255,255,255,.08); color: rgba(255,255,255,.6); cursor: pointer;
  transition: background .15s, color .15s, border-color .15s;
}
.dp-view-btn.active { background: var(--primary); border-color: var(--primary); color: #fff; }

/* Navigation mois (voir dpChangeMonth(), js/client.js) */
.dp-month-nav {
  display: flex; align-items: center; justify-content: center; gap: 14px;
  margin-top: 10px;
}
.dp-month-lbl {
  font-size: .8rem; font-weight: 800; color: #fff; text-transform: capitalize;
  min-width: 140px; text-align: center;
}
.dp-month-arrow {
  width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.15);
  color: rgba(255,255,255,.7); font-size: .68rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .15s, opacity .15s;
}
.dp-month-arrow:hover:not(:disabled) { background: rgba(255,255,255,.16); }
.dp-month-arrow:disabled { opacity: .3; cursor: default; }

/* ── Hero partagé Dépenses & Historique ── */
.sec-hero {
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border: 1.5px solid rgba(138,99,255,.25);
  border-radius: var(--radius-lg);
  padding: 16px 14px 14px;
  text-align: center; margin-bottom: 12px;
  position: relative; overflow: hidden;
}
.sec-hero::before {
  content: '';
  position: absolute; top: -30px; left: 50%; transform: translateX(-50%);
  width: 120px; height: 120px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.18) 0%, transparent 70%);
  pointer-events: none;
}
.sec-hero-icon {
  width: 36px; height: 36px; border-radius: 12px; margin: 0 auto 8px;
  background: rgba(255,98,0,.12); border: 1px solid rgba(255,98,0,.25);
  display: flex; align-items: center; justify-content: center;
  font-size: .95rem; color: var(--primary);
}
.sec-hero-amount {
  font-size: 1.6rem; font-weight: 900; color: #fff; line-height: 1;
  margin-bottom: 4px;
  background: linear-gradient(135deg,#fff 40%,rgba(255,255,255,.6));
  -webkit-background-clip: text; -webkit-text-fill-color: transparent;
}
.sec-hero-label {
  font-size: .6rem; font-weight: 700; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .8px; margin-bottom: 10px;
}
.sec-hero-chips {
  display: flex; justify-content: center; gap: 6px; flex-wrap: wrap;
}
.sec-chip {
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.1);
  border-radius: 99px; padding: 4px 10px;
  font-size: .6rem; font-weight: 800; color: rgba(255,255,255,.6);
  display: flex; align-items: center; gap: 5px;
}
.sec-chip--ok      { color: #22c55e; border-color: rgba(34,197,94,.25); background: rgba(34,197,94,.08); }
.sec-chip--fail    { color: #ef4444; border-color: rgba(239,68,68,.25);  background: rgba(239,68,68,.08); }
.sec-chip--pending { color: #f59e0b; border-color: rgba(245,158,11,.25); background: rgba(245,158,11,.08); }
.sec-hero--hx .sec-hero-icon { background: rgba(138,99,255,.12); border-color: rgba(138,99,255,.3); color: #8a63ff; }
.sec-hero--hx::before { background: radial-gradient(circle, rgba(138,99,255,.15) 0%, transparent 70%); }

/* Carte "Total dépensé" (#dp-recap) : plus aucun fond (demande explicite :
   "je ne veux pas voir de fonds") — texte directement sur le fond de page,
   sans carte ni halo ni icône (voir loadDepenses(), js/client.js), tout en
   noir. */
#dp-recap .sec-hero {
  background: none; border: none; box-shadow: none;
  padding-top: 32px;
}
#dp-recap .sec-hero::before { display: none; }
#dp-recap .sec-hero-amount {
  color: #000; background: none; -webkit-text-fill-color: initial;
}
#dp-recap .sec-hero-label { color: rgba(0,0,0,.55); }
/* Titre "Dépenses" à côté de la flèche retour. */
.dp-back-lbl {
  position: absolute; left: 30px; top: -2px; height: 32px;
  display: flex; align-items: center;
  font-family: var(--font); font-size: .9rem; font-weight: 800; color: #0F0A2E;
}
/* Libellé "Total dépensé en …" cliquable + flèche ⌄ : ouvre la modale
   "Choisir un mois / un jour" (voir dpOpenPeriodPicker(), client.js). */
#dp-recap .dp-period-btn {
  display: inline-flex; align-items: center; gap: 6px;
  margin: 0 auto 10px; padding: 4px 6px;
  background: none; border: none; cursor: pointer;
  font-family: inherit; font-size: .78rem; font-weight: 700;
  letter-spacing: .8px; text-transform: uppercase; color: #0A0A0F;
}
#dp-recap .dp-period-btn i {
  font-size: .72rem;
  -webkit-text-stroke: .8px currentColor;
}
/* Bascule Semaine / Mois sous le montant (voir dpSetView(), client.js). */
#dp-recap .dp-hero-switch {
  display: inline-flex; gap: 4px; margin: 12px auto 0;
  background: #EEF0F7; border-radius: 999px; padding: 3px;
}
#dp-recap .dp-hero-seg {
  border: none; background: none; cursor: pointer;
  font-family: var(--font); font-size: .74rem; font-weight: 800;
  color: rgba(0,0,0,.45);
  padding: 7px 22px; border-radius: 999px;
  transition: background .15s, color .15s;
}
#dp-recap .dp-hero-seg.active { background: #0F0A2E; color: #fff; }

/* Modale de sélection de période (#dp-period-picker) — s'ouvre en "bottom
   sheet" plein écran (même modèle que #ctp-screen-manual, demande explicite) :
   ancrée en bas, coins arrondis en haut, poignée + flèche retour à gauche. */
#dp-period-picker { align-items: flex-end; padding: 0; }
#dp-period-picker .modal {
  width: 100%; max-width: none; margin: 0;
  border-radius: 20px 20px 0 0;
  max-height: 88vh;
  max-height: 88dvh;
  overscroll-behavior: contain;
}
#dp-period-picker .modal-header {
  border-bottom: none;
  justify-content: center;
  position: relative;
}
#dp-period-picker .modal-title { text-align: center; }
#dp-period-picker .modal-close {
  position: absolute;
  left: clamp(12px, 4vw, 24px);
  right: auto;
  top: 50%;
  transform: translateY(-50%);
  background: none; border: none; color: #0F0A2E;
}
#dp-period-picker .modal-close:hover { background: none; color: #0F0A2E; }
#dp-period-picker .modal-close i {
  font-size: .95rem;
  -webkit-text-stroke: 1px currentColor;
}
#dp-period-picker .modal-body {
  padding-bottom: calc(20px + env(safe-area-inset-bottom, 0px));
}

/* Modale de sélection de période (#dp-period-picker) — onglets Semaine/Mois
   + roue de défilement style iOS + bouton OK (demande explicite, capture de
   référence). */
.dp-pick-tabs { display: flex; gap: 6px; margin-bottom: 14px; }
.dp-pick-tab {
  flex: 1; padding: 9px 0; border-radius: 999px;
  border: 1px solid var(--gray-200); background: var(--gray-100);
  font-family: var(--font); font-size: .82rem; font-weight: 800;
  color: var(--gray-500); cursor: pointer;
}
.dp-pick-tab.active { background: #0F0A2E; border-color: #0F0A2E; color: #fff; }

/* Roue */
.dp-wheel {
  position: relative; height: 220px; overflow: hidden;
  -webkit-mask-image: linear-gradient(180deg, transparent, #000 22%, #000 78%, transparent);
          mask-image: linear-gradient(180deg, transparent, #000 22%, #000 78%, transparent);
}
.dp-wheel-band {
  position: absolute; left: 0; right: 0; top: 50%; height: 44px;
  transform: translateY(-50%);
  background: rgba(15,10,46,.06); border-radius: 12px;
  pointer-events: none;
}
.dp-wheel-scroll {
  height: 100%; overflow-y: scroll;
  scroll-snap-type: y mandatory;
  padding: 88px 0; box-sizing: border-box;
  scrollbar-width: none; -ms-overflow-style: none;
}
.dp-wheel-scroll::-webkit-scrollbar { display: none; }
.dp-wheel-row {
  height: 44px; scroll-snap-align: center;
  display: flex; align-items: center; justify-content: center; gap: 10px;
  font-family: var(--font); font-size: 1.05rem; color: rgba(0,0,0,.32);
  transition: color .15s, font-weight .15s;
}
.dp-wheel-row.is-sel { color: #0F0A2E; font-weight: 800; }
.dp-wheel-row .dp-wheel-yr { color: rgba(0,0,0,.28); font-weight: 500; }
.dp-wheel-row.is-sel .dp-wheel-yr { color: rgba(15,10,46,.5); }
.dp-wheel-ok {
  width: 100%; margin-top: 18px; padding: 15px;
  border: none; border-radius: 14px;
  background: #0F0A2E; color: #fff;
  font-family: var(--font); font-size: .95rem; font-weight: 800;
  letter-spacing: .04em; cursor: pointer;
}
.dp-wheel-ok:active { opacity: .85; }
#dp-recap .dp-view-btn {
  background: #F1F3F8; border-color: #E0E4EC; color: rgba(0,0,0,.6);
}
#dp-recap .dp-view-btn.active { background: #0a1330; border-color: #0a1330; color: #fff; }
#dp-recap .dp-month-lbl { color: #000; }
#dp-recap .dp-month-arrow {
  background: #F1F3F8; border-color: #E0E4EC; color: rgba(0,0,0,.6);
}
#dp-recap .dp-month-arrow:hover:not(:disabled) { background: #E8ECF4; }
/* Retour à l'accueil — cette section n'a pas d'autre moyen d'y revenir
   (pas de .cs-sec-bar ici, voir loadDepenses(), js/client.js). */
.dp-back-btn {
  position: absolute; top: -2px; left: 0; z-index: 2;
  width: 32px; height: 32px; border-radius: 50%;
  background: none; border: none; outline: none;
  color: rgba(0,0,0,.85); cursor: pointer; font-size: 1rem;
  display: flex; align-items: center; justify-content: center;
}
.dp-back-btn:hover { background: none; color: #000; }
/* Flèche retour de l'espace client — sans fond, chevron en gras, même
   rendu partout (Dépenses, Transférer, Recharge). */
.dp-back-btn i,
.ctp-back i,
.rch-close i {
  -webkit-text-stroke: 1.1px currentColor;
}

/* En-tête section Dépenses */
.dp-section-header {
  background: linear-gradient(145deg, #0F0A2E 0%, #1A1040 55%, #0D0820 100%);
  border: 1.5px solid rgba(138,99,255,.2);
  border-radius: var(--radius-lg);
  padding: 20px 16px 18px;
  text-align: center;
  margin-bottom: 14px;
  box-shadow: 0 4px 20px rgba(0,0,0,.3);
}
.dp-section-icon {
  width: 42px; height: 42px; border-radius: 13px;
  background: rgba(255,98,0,.12); border: 1px solid rgba(255,98,0,.25);
  display: flex; align-items: center; justify-content: center;
  font-size: 1rem; color: var(--primary);
  margin: 0 auto 10px;
}
.dp-section-title {
  font-size: 1rem; font-weight: 900; color: #fff; margin-bottom: 4px;
}
.dp-section-sub {
  font-size: .65rem; font-weight: 700;
  color: rgba(255,255,255,.4); text-transform: capitalize; letter-spacing: .3px;
}

/* Répartition par opérateur */
.dp-op-breakdown {
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.08);
  border-radius: var(--radius-lg); padding: 14px 16px; margin-bottom: 16px;
  display: flex; flex-direction: column; gap: 10px;
}
.dp-op-row { display: flex; align-items: center; gap: 10px; }
.dp-op-name { font-size: .7rem; font-weight: 900; width: 46px; flex-shrink: 0; }
.dp-op-bar-wrap { flex: 1; height: 5px; background: rgba(255,255,255,.08); border-radius: 99px; overflow: hidden; }
.dp-op-bar  { height: 100%; border-radius: 99px; transition: width .6s ease; }
.dp-op-amt  { font-size: .65rem; font-weight: 800; color: rgba(255,255,255,.6); text-align: right; min-width: 80px; }

/* Titre "Vos dépenses" indépendant de la carte blanche ci-dessous (demande
   explicite) — simple libellé au-dessus, sans icône. */
.dp-services-title {
  font-size: 1.05rem; font-weight: 900; color: #000;
  padding: 0 4px; margin-bottom: 10px;
}

/* Bloc "Vos dépenses" / détail d'un service — carte flottante (ombre douce
   plutôt qu'une simple bordure plate) sur fond blanc, texte foncé. */
/* Carte blanche autour des lignes "Vos dépenses" (demande explicite) —
   fond blanc, coins arrondis, légère ombre neutre (aucune teinte bleutée).
   Lignes non cliquables (voir loadDepenses()). */
.dp-week-block {
  background: #ffffff;
  border-radius: 14px; margin-bottom: 12px; overflow: hidden;
  border: none;
  box-shadow: 0 2px 14px rgba(0,0,0,.05);
}
.dp-week-rows  { padding: 12px 0; }
/* Pas de carte blanche autour du message "aucune commande" ("Mes
   commandes programmées", demande explicite) — posée par _mcpRender()
   (js/client.js) uniquement quand la liste est vide. */
.dp-week-block.mcp-empty { background: none; box-shadow: none; }
/* Popup "détail d'un service" — fond blanc uni, sans trait de séparation
   bleuté sous l'en-tête (demande explicite). */
#modal-dp-service-detail .modal-header { border-bottom: none; }
#modal-dp-service-detail .dp-week-block { border: none; box-shadow: none; }

/* Ligne de dépense */
.dp-row {
  display: flex; align-items: center; gap: 12px;
  padding: 15px 18px;
  transition: background .15s;
}
.dp-row:hover { background: none; }
.dp-row-avatar {
  width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1rem; font-weight: 900;
}
.dp-row-info  { flex: 1; min-width: 0; }
.dp-row-op    { font-size: .82rem; font-weight: 900; color: #1a1a2e; }
.dp-row-num   { font-size: .68rem; color: rgba(0,0,0,.4); margin-top: 3px; }
.dp-row-share { font-size: .64rem; color: rgba(0,0,0,.4); font-weight: 600; margin-top: 3px; }
.dp-row-right { text-align: right; flex-shrink: 0; }
.dp-row-amt   { font-size: .98rem; font-weight: 900; color: #0A0A0F; }
.dp-row-date  { font-size: .64rem; color: rgba(0,0,0,.35); margin-top: 2px; }

/* ══════════════════════════════════════════════════════════════
   MODAL RECHARGE — dark indigo
══════════════════════════════════════════════════════════════ */
.rch-modal {
  background: #ffffff !important;
  border: none !important;
  border-radius: var(--radius-xl) !important;
  max-width: 420px; width: 100%;
  box-shadow: 0 20px 60px rgba(0,0,0,.2) !important;
}

/* Plein écran (demande explicite) : remplace le rendu "carte centrée sur
   fond flouté" par défaut de .modal-overlay/.modal — même esprit que la
   page "Transférer" (.cs-section#cs-transferer, déjà en plein écran) —
   scopé à #modal-recharge uniquement, les autres modales gardent leur
   rendu carte habituel. */
#modal-recharge { padding: 0; background: #fff; backdrop-filter: none; -webkit-backdrop-filter: none; }
#modal-recharge .rch-modal {
  max-width: 100%; width: 100%; height: 100%; max-height: 100%;
  border-radius: 0 !important;
  box-shadow: none !important;
  transform: none !important;
}

/* Plein écran (demande explicite) — même patron que #modal-recharge
   ci-dessus : remplace la petite carte centrée par défaut de
   .modal-overlay/.ag-modal pour la connexion/inscription client. */
#modal-auth-gate { padding: 0; background: #fff; backdrop-filter: none; -webkit-backdrop-filter: none; }
#modal-auth-gate .ag-modal {
  max-width: 100%; width: 100%; height: 100%; max-height: 100%;
  border-radius: 0;
  box-shadow: none;
  display: flex; flex-direction: column; justify-content: flex-start;
  overflow-y: auto;
}
/* Message d'instruction, à la place de l'ancien libellé de champ retiré */
.ag-step1-msg {
  font-size: .85rem; font-weight: 700; color: #0A0A0F;
  text-align: center; line-height: 1.45;
  margin: 0 30px 24px;
}

/* Header — bloc à part entière (fond léger + bordure basse), grille 3
   colonnes (bouton / titre / marge fantôme symétrique) pour que le titre
   reste vraiment centré malgré le bouton à gauche. Un seul bouton sert à
   la fois à fermer (étape 1) et à revenir en arrière (étape 2) — voir
   _rchSetHeader(), js/client.js. */
.rch-header {
  display: grid;
  grid-template-columns: 32px 1fr 32px;
  align-items: center;
  gap: 10px;
  padding: 16px 20px;
}
.rch-close {
  grid-column: 1;
  width: 32px; height: 32px; border-radius: 50%;
  background: none; box-shadow: none; border: none; outline: none;
  color: rgba(0,0,0,.85); cursor: pointer; font-size: .9rem;
  display: flex; align-items: center; justify-content: center;
}
.rch-close:hover, .rch-close:focus, .rch-close:active { background: none; color: #ef4444; outline: none; }

.rch-body { padding: 8px 20px 20px; }
.rch-section-label {
  grid-column: 2;
  display: flex; align-items: center; justify-content: center;
  font-size: .74rem; font-weight: 900; color: #000;
  text-transform: uppercase; letter-spacing: .05em; text-align: center;
  margin: 0;
}

/* Recharge en 2 étapes (montant → mode de paiement) : une seule étape
   visible à la fois, avec une petite animation d'entrée à chaque
   changement (voir rchGoStep1/rchGoStep2/openRechargeModalGated). Même
   hauteur minimale pour les deux étapes (pas de saut de taille en changeant
   d'étape) — l'étape montant, plus courte, répartit l'espace en plusieurs
   petits intervalles réguliers entre ses éléments (space-evenly) plutôt
   qu'un seul grand vide concentré à un endroit. */
.rch-step {
  min-height: 420px;
  display: flex;
  flex-direction: column;
  justify-content: space-evenly;
}
.rch-step--enter { animation: rch-step-in .32s cubic-bezier(.34,1.56,.64,1); }
@keyframes rch-step-in { from { opacity: 0; transform: translateX(14px); } to { opacity: 1; transform: translateX(0); } }

/* Méthodes de paiement — liste verticale (icône + nom + chevron), une ligne
   par réseau, teintée par la couleur de marque (--rch-clr, posée en
   inline-style sur chaque ligne) à la sélection. */
.rch-methods-row {
  display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px;
}
.rch-mth {
  display: flex; align-items: center; gap: 14px;
  background: #F8F9FC;
  border: 1.5px solid color-mix(in srgb, var(--rch-clr, #E0E4EC) 30%, transparent);
  border-radius: 16px; padding: 12px 14px; cursor: pointer;
  transition: all .2s cubic-bezier(.34,1.56,.64,1);
}
.rch-mth:hover { background: #F1F3F8; }
.rch-mth--active {
  border-color: var(--rch-clr, var(--primary));
  background: #F1F3F8;
  box-shadow: 0 0 0 1px var(--rch-clr, var(--primary));
}

.rch-mth-ico {
  width: 44px; height: 44px; border-radius: 13px; flex-shrink: 0;
  background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,.1);
  display: flex; align-items: center; justify-content: center;
  overflow: hidden; transition: transform .2s;
}
.rch-mth--active .rch-mth-ico { transform: scale(1.05); }
.rch-mth-ico img { width: 100%; height: 100%; object-fit: cover; }
.rch-mth-ico span { font-size: 1.4rem; line-height: 1; }

.rch-mth-pill {
  flex: 1;
  color: #1a1a2e;
  font-size: .78rem; font-weight: 800;
  transition: color .2s;
}
.rch-mth--active .rch-mth-pill { color: var(--rch-clr, var(--primary)); }

.rch-mth-chev {
  color: rgba(0,0,0,.25); font-size: .68rem; transition: color .2s, transform .2s;
}
.rch-mth--active .rch-mth-chev { color: var(--rch-clr, var(--primary)); transform: translateX(2px); }

/* Champ numéro (accordion) — bulle */
.rch-phone-wrap {
  max-height: 0; overflow: hidden;
  transition: max-height .35s cubic-bezier(.4,0,.2,1), opacity .3s, margin .3s;
  opacity: 0; margin-bottom: 0;
}
.rch-phone-wrap--open { max-height: 120px; opacity: 1; margin-bottom: 16px; margin-top: 4px; }
.rch-phone-label {
  font-size: .6rem; font-weight: 900; color: rgba(0,0,0,.4);
  text-transform: uppercase; letter-spacing: .7px; margin-bottom: 8px; padding-left: 6px;
}
.rch-phone-input {
  display: flex; align-items: center; gap: 10px;
  background: #F8F9FC; border: 1.5px solid var(--rch-clr, #E0E4EC);
  border-radius: 99px; padding: 12px 18px;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--rch-clr, transparent) 15%, transparent);
  transition: border-color .3s;
}
.rch-flag { font-size: .72rem; font-weight: 900; color: rgba(0,0,0,.6); white-space: nowrap; }
.rch-sep  { width: 1px; height: 18px; background: rgba(0,0,0,.15); flex-shrink: 0; }
.rch-input {
  flex: 1; background: none !important; border: none; outline: none;
  color: #0A0A0F; font-family: var(--font); min-width: 0;
}
.rch-input::placeholder { color: rgba(0,0,0,.3); }
.rch-input:-webkit-autofill,
.rch-input:-webkit-autofill:hover,
.rch-input:-webkit-autofill:focus,
.rch-input:-webkit-autofill:active {
  -webkit-text-fill-color: #0A0A0F;
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  box-shadow: 0 0 0 1000px #fff inset;
  caret-color: #0A0A0F;
  transition: background-color 9999s ease-in-out 0s;
}
.rch-phone-input .rch-input { font-size: .88rem; }

/* Montant — grand chiffre sans cadre, juste un trait dégradé en dessous
   (au lieu d'une bulle bordée), comme le modèle de référence. */
/* Étape 1 recharge : champ de saisie libre + chips additifs (voir rchAddAmount). */
.rch-amount-zone { text-align: center; margin: 18px 0 0; }
.rch-amount-row { display: flex; align-items: baseline; gap: 8px; justify-content: center; width: 100%; }
.rch-amount-input {
  width: 100%; max-width: 100%; text-align: center; flex: 1 1 auto; min-width: 0;
  background: none; border: none; outline: none; padding: 0;
  font-size: clamp(2.1rem, 11vw, 2.7rem); font-weight: 900; font-family: var(--font);
  color: #0A0A0F; font-variant-numeric: tabular-nums; letter-spacing: -.02em;
  -moz-appearance: textfield;
}
.rch-amount-input::-webkit-outer-spin-button,
.rch-amount-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.rch-amount-input::placeholder { color: rgba(0,0,0,.28); font-size: 1.35rem; font-weight: 700; letter-spacing: 0; }
.rch-amount-underline {
  height: 3px; width: 240px; margin: 12px auto 0;
  border-radius: 3px; background: #E8ECF4;
  position: relative; overflow: hidden;
}
.rch-amount-underline::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, var(--primary), var(--primary-dark, #E55600));
  transform: scaleX(1); transform-origin: center;
  transition: transform .45s cubic-bezier(.34,1.56,.64,1);
}
.rch-amount-underline.pulse::after { animation: rch-underline-pulse .45s cubic-bezier(.34,1.56,.64,1); }
@keyframes rch-underline-pulse {
  0%   { transform: scaleX(.3); }
  100% { transform: scaleX(1); }
}
.rch-amount-hint { text-align: center; font-size: .6rem; color: rgba(0,0,0,.4); font-weight: 600; margin-top: 8px; }

.rch-chips-row { display: flex; gap: 7px; flex-wrap: wrap; justify-content: center; margin: 14px 0 4px; }
.rch-chip {
  background: #F1F3F8; border: 1px solid #E0E4EC;
  border-radius: 99px; padding: 7px 12px; color: rgba(0,0,0,.65);
  font-size: .68rem; font-weight: 800; cursor: pointer; font-family: var(--font);
  display: inline-flex; align-items: center; gap: 4px;
  transition: border-color .15s, transform .15s;
}
.rch-chip:hover { border-color: var(--primary); transform: translateY(-1px); }
.rch-chip-plus { color: var(--primary); font-weight: 900; }

.rch-hint { font-size: .6rem; color: rgba(0,0,0,.4); font-weight: 600; text-align: center; margin: 12px 0 4px; }

/* Avertissement "non remboursable" — sa propre carte, comme .ct-error, au
   lieu d'un simple texte flottant sur le fond blanc. */
.rch-disclaimer {
  background: none; border: none;
  padding: 4px 6px;
  font-size: .68rem; color: rgba(220,38,38,.85); font-weight: 600;
  text-align: center; line-height: 1.5;
  margin: 12px 0 4px;
}
.rch-disclaimer i { margin-right: 4px; }

/* Récapitulatif montant + frais de service — voir _rchUpdateFeeRecap(),
   js/client.js, mis à jour en direct à chaque changement de montant. */
.rch-fee-recap {
  background: #F8F9FC; border: 1.5px solid #E8ECF4; border-radius: 14px;
  padding: 4px 14px; margin: 14px 0 4px;
}
.rch-fee-row {
  display: flex; align-items: center; justify-content: space-between;
  padding: 9px 0; font-size: .78rem;
  border-bottom: 1px solid #EEF1F6;
}
.rch-fee-row:last-child { border-bottom: none; }
.rch-fee-row span:first-child { color: rgba(0,0,0,.5); font-weight: 600; }
.rch-fee-row span:last-child { color: #0A0A0F; font-weight: 800; font-variant-numeric: tabular-nums; }
.rch-fee-row--total span:first-child { color: #0A0A0F; font-weight: 800; }
.rch-fee-row--total span:last-child { color: var(--primary); font-size: .86rem; font-weight: 900; }

/* Bouton confirmer — bulle */
.rch-confirm-btn {
  width: 80%; padding: 15px; border-radius: 14px;
  background: linear-gradient(135deg, #0d1a3d, #0a1330);
  border: none; color: #fff;
  font-size: .9rem; font-weight: 900; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 9px;
  font-family: var(--font);
  box-shadow: 0 6px 24px rgba(10,19,48,.45);
  transition: transform .22s cubic-bezier(.34,1.56,.64,1), box-shadow .2s;
  margin: 4px auto 0;
}
.rch-confirm-btn:hover { transform: translateY(-3px) scale(1.01); box-shadow: 0 12px 32px rgba(10,19,48,.55); }
.rch-confirm-btn:active { transform: scale(.98); }
.rch-confirm-btn:disabled {
  background: #D8DCE6; color: rgba(0,0,0,.35);
  box-shadow: none; cursor: not-allowed;
}
.rch-confirm-btn:disabled:hover { transform: none; box-shadow: none; }

/* ══════════════════════════════════════════════════════════════
   TUNNEL TRANSFERT — light overrides (fond blanc, 27/08 : les bordures
   translucides blanches pensées pour l'ancien fond marine devenaient
   invisibles sur fond blanc — remplacées par des bordures noires nettes)
══════════════════════════════════════════════════════════════ */
/* Tuiles "Montants rapides" — modèle "carte blanche" (demande explicite,
   référence fournie) : rectangle blanc, montant en grand/gras + "FCFA"
   en petit à côté, 2 par rangée — au lieu des petits ronds sombres
   précédents. */
/* Modèle "simple" (demande explicite) — tuiles plates à bordure fine,
   sans ombre ni effet de survol flottant ; sélection en aplat de
   couleur plutôt qu'un anneau. */
.tf-slide .amount-tiles { grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; }
.tf-slide .amount-tile {
  background: #fff !important;
  border: 1.5px solid var(--gray-200, #E5E7EF) !important;
  box-shadow: none !important;
  border-radius: 10px !important;
  width: auto !important; max-width: none !important; aspect-ratio: auto !important;
  padding: 12px 8px !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  transition: border-color .15s ease, background .15s ease !important;
}
.tf-slide .amount-tile:hover {
  border-color: var(--op-clr, var(--primary)) !important;
}
.tf-slide .amount-tile.selected {
  border-color: var(--op-clr, var(--primary)) !important;
  background: color-mix(in srgb, var(--op-clr, var(--primary)) 6%, white) !important;
}
.tf-slide .amount-tile .tile-val {
  color: #0a1330 !important; font-size: .92rem !important; font-weight: 800 !important;
}
.tf-slide .amount-tile .tile-val::after {
  content: ' FCFA'; font-size: .6em; font-weight: 600; color: var(--gray-500);
}
.tf-slide .amount-tile.selected .tile-val { color: var(--op-clr, var(--primary)) !important; }

/* Toggle service : deux cartes (Crédit/Forfait), l'inactive en gris
   clair bordé de noir sur le fond blanc du tunnel, l'active en couleur
   pleine de l'opérateur avec halo. */
.tf-slide .svc-tab {
  background: rgba(15,10,46,.08) !important;
  border: none !important;
  color: #16121F !important;
  transition: all .25s ease !important;
}
.tf-slide .svc-tab-sub { color: var(--gray-500) !important; }
.tf-slide .svc-tab.active {
  background: var(--op-clr, var(--primary)) !important;
  border-color: var(--op-clr, var(--primary)) !important;
  color: var(--op-clr-text, #fff) !important;
  box-shadow: 0 5px 16px color-mix(in srgb, var(--op-clr, var(--primary)) 40%, transparent) !important;
}
.tf-slide .svc-tab.active .svc-tab-sub { color: var(--op-clr-text, #fff) !important; opacity: .7; }

.tf-slide .form-control,
.tf-slide .rcp-input,
.tf-slide input[type=tel],
.tf-slide input[type=number] {
  background: #fff !important;
  border: 1.5px solid #16121F !important;
  color: #0a1330 !important; border-radius: 12px !important;
}
.tf-slide .form-control::placeholder,
.tf-slide input::placeholder { color: var(--gray-500) !important; }
.tf-slide .form-control:focus,
.tf-slide input:focus { border-color: var(--primary) !important; }

/* La carte-pilule du destinataire porte elle-même le fond/la bordure —
   son input interne reste transparent, sans quoi les deux se
   superposent (bordure de l'input + bordure de la pilule). */
.tf-slide .recipient-wrap {
  background: #fff !important;
  border: 1.5px solid #16121F !important;
  padding: 4px !important; border-radius: 14px !important;
}
.tf-slide .recipient-wrap:focus-within { border-color: var(--op-clr, var(--primary)) !important; }
.tf-slide .recipient-wrap:has(.rcp-valid) { border-color: var(--secondary) !important; }
.tf-slide .recipient-wrap .form-control {
  background: transparent !important; border: none !important; color: #0a1330 !important;
  padding: 7px 8px !important; text-align: center !important;
  font-size: 1.1rem !important; font-weight: 800 !important; letter-spacing: .03em !important;
}
/* Modèle "carte blanche" (demande explicite, référence fournie) — même
   traitement que .amount-tile juste au-dessus : fond blanc, texte
   sombre aligné à gauche, "FCFA" en gris à droite, plutôt qu'un champ
   transparent sur le fond sombre du tunnel. */
.tf-slide .amount-custom-wrap .form-control {
  background: transparent !important; border: none !important; color: #0a1330 !important;
}
.tf-slide .amount-custom-wrap .form-control::placeholder { color: rgba(10,19,48,.4) !important; }
.tf-slide .amount-custom-suffix { color: var(--gray-500) !important; }
.tf-slide .amount-custom-wrap--plain {
  background: #fff !important;
  border: none !important;
  box-shadow: 0 2px 10px rgba(0,0,0,.08) !important;
}
.tf-slide .amount-custom-wrap--plain:focus-within { box-shadow: 0 0 0 2px var(--op-clr, var(--primary)) !important; }

.tf-slide .input-group { background: transparent !important; }
.tf-slide .input-suffix { color: var(--gray-500) !important; font-weight: 700 !important; font-size: .74rem !important; }
.tf-slide .input-icon   { color: var(--primary) !important; font-size: .8rem !important; }
.tf-slide .form-hint    { color: var(--gray-500) !important; font-size: .58rem !important; margin-top: 3px !important; }
.tf-slide .form-control { padding: 9px 14px 9px 38px !important; font-size: .8rem !important; }
.tf-slide .input-group .input-icon { left: 12px; }

/* Autofill : le navigateur force un fond blanc sur les champs tel/numériques
   suggérés (numéro de téléphone), même avec background défini en CSS —
   #tf-order-now/#sched-section sont désormais des tunnels clairs (fond
   blanc, 27/08), donc autofill assorti (texte sombre sur blanc) plutôt
   que d'hériter du forçage sombre partagé par les espaces restés sombres
   ci-dessous (modales PIN, Réinitialisation, Profil, Facture...). */
.tf-slide .form-control:-webkit-autofill,
.tf-slide .form-control:-webkit-autofill:hover,
.tf-slide .form-control:-webkit-autofill:focus,
.tf-slide input:-webkit-autofill {
  -webkit-text-fill-color: #0a1330;
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  box-shadow: 0 0 0 1000px #fff inset;
  caret-color: #0a1330;
  transition: background-color 9999s ease-in-out 0s;
}
.tf-pay-num-input:-webkit-autofill,
.pln-input:-webkit-autofill,
.adx-input:-webkit-autofill,
.rst-input:-webkit-autofill,
.ag-input:-webkit-autofill,
.svc-input:-webkit-autofill {
  -webkit-text-fill-color: #fff;
  -webkit-box-shadow: 0 0 0 1000px #1a1330 inset;
  box-shadow: 0 0 0 1000px #1a1330 inset;
  caret-color: #fff;
  transition: background-color 9999s ease-in-out 0s;
}
/* .prg-input est désormais un champ clair (voir plus haut) — autofill
   assorti au lieu d'hériter du forçage sombre partagé ci-dessus. */
.prg-input:-webkit-autofill {
  -webkit-text-fill-color: var(--gray-800);
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  box-shadow: 0 0 0 1000px #fff inset;
  caret-color: var(--gray-800);
  transition: background-color 9999s ease-in-out 0s;
}

/* Onglets "Forfait" (catégories Appels/Internet/SMS + sous-catégories) —
   .fcat-btn/.fsub-tab/.forfait-cats sont PARTAGÉS avec l'espace cabine
   (voir cabine.html #cab-order-panel-forfait), resté sombre : la couleur
   translucide blanche d'origine y reste correcte, donc surcharge scopée
   ici aux deux tunnels clients désormais clairs plutôt qu'un changement
   des règles de base. */
#tf-order-now .forfait-cats, #sched-section .forfait-cats {
  background: #F5F6FA !important;
  border: none !important;
}
#tf-order-now .fcat-btn, #sched-section .fcat-btn { color: #16121F !important; }
#tf-order-now .fcat-btn.active, #sched-section .fcat-btn.active { color: var(--op-clr-text, #fff) !important; }
#tf-order-now .fsub-tab, #sched-section .fsub-tab {
  border-color: var(--gray-200, #EEF0F4) !important;
  color: #16121F !important;
}
#tf-order-now .fsub-tab-count, #sched-section .fsub-tab-count { color: var(--gray-500) !important; }
#tf-order-now .fsub-tab.active, #sched-section .fsub-tab.active {
  border-color: transparent !important;
  color: var(--op-clr-text, #fff) !important;
}
#tf-order-now .fsub-tab.active .fsub-tab-count, #sched-section .fsub-tab.active .fsub-tab-count { color: var(--op-clr-text, #fff) !important; }

/* ══════════════════════════════════════════════════════════════
   MODAL STATUT COMMANDE (countdown)
══════════════════════════════════════════════════════════════ */
.ors-modal {
  background: linear-gradient(145deg,#0F0A2E 0%,#1A1040 55%,#0D0820 100%) !important;
  border: 1.5px solid rgba(138,99,255,.22) !important;
  border-radius: var(--radius-xl) !important;
  max-width: 400px; width: 100%;
  box-shadow: 0 20px 60px rgba(0,0,0,.6) !important;
}
.ors-header {
  display: flex; flex-direction: column; align-items: center;
  gap: 3px; padding: 16px 20px 0; text-align: center;
}
.ors-header-icon {
  width: 42px; height: 42px; border-radius: 13px;
  background: rgba(138,99,255,.15); border: 1px solid rgba(138,99,255,.3);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.05rem; color: #818cf8; margin-bottom: 2px;
  transition: background .2s, border-color .2s, color .2s;
}
/* Variantes "commande validée" / "commande non validée" — même badge que
   l'état d'attente, juste retinté, pour rester cohérent visuellement. */
.ors-header-icon--ok { background: rgba(34,197,94,.15);  border-color: rgba(34,197,94,.35);  color: #22c55e; }
.ors-header-icon--ko { background: rgba(239,68,68,.15);  border-color: rgba(239,68,68,.35);   color: #ef4444; }
.ors-header-title { font-size: .88rem; font-weight: 900; color: #fff; }
.ors-header-sub   { font-size: .62rem; color: rgba(255,255,255,.4); font-weight: 600; }

/* Countdown ring */
.ors-countdown-wrap { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 12px 20px 2px; }
.ors-countdown-num { font-size: 1.5rem; font-weight: 900; color: #fff; letter-spacing: -.02em; font-variant-numeric: tabular-nums; line-height: 1; }
.ors-countdown-label { font-size: .6rem; color: rgba(255,255,255,.4); font-weight: 700; text-align: center; text-transform: uppercase; letter-spacing: .04em; margin-top: 1px; }

/* Piste linéaire (remplace l'anneau) : une icône avance à mesure que le
   temps s'écoule, plus lisible d'un coup d'œil qu'un pourcentage. */
.ors-track { position: relative; width: 100%; height: 5px; border-radius: 4px; background: rgba(255,255,255,.08); margin-top: 14px; }
.ors-track-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0%; border-radius: 4px; background: linear-gradient(90deg,#7C6CF0,#FF6200); transition: width 1s linear; }
.ors-track-icon {
  position: absolute; left: 0%; top: 50%; transform: translate(-50%,-50%);
  width: 20px; height: 20px; border-radius: 50%;
  background: #FF6200; color: #1A1040;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 4px #1A1040, 0 4px 14px rgba(255,98,0,.5);
  transition: left 1s linear;
}
.ors-track-icon svg { width: 10px; height: 10px; }
.ors-track-labels { display: flex; justify-content: space-between; width: 100%; margin-top: 6px; }
.ors-track-labels span { font-size: .55rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: rgba(255,255,255,.45); }
.ors-track-labels span.on { color: rgba(255,255,255,.45); }

/* Récap rows */
.ors-recap { padding: 10px 20px 0; }
.ors-recap-rows { background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.08); border-radius: 14px; overflow: hidden; }
.ors-recap-row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 6px 14px; border-bottom: 1px solid rgba(255,255,255,.05);
  font-size: .68rem;
}
.ors-recap-row:last-child { border-bottom: none; }
.ors-recap-row span  { color: rgba(255,255,255,.4); font-weight: 600; }
.ors-recap-row strong { color: #fff; font-weight: 900; }
.ors-recap-row--total { background: rgba(255,98,0,.08); }
.ors-recap-row--total strong { color: var(--primary); font-size: .76rem; }

/* Actions */
.ors-actions { display: flex; gap: 8px; padding: 10px 20px 14px; }
.ors-close-btn {
  width: 100%; padding: 10px; border-radius: 99px;
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.1);
  color: rgba(255,255,255,.6); font-size: .74rem; font-weight: 800; cursor: pointer;
  font-family: var(--font); transition: background .15s;
}
.ors-close-btn:hover { background: rgba(255,255,255,.12); }

/* ── Suivi de commande (facture) — frise dérivée de la transaction,
   même thème indigo que .ors-modal ci-dessus. ── */
.otk-tl { padding: 14px 20px 0; }
.otk-tl-row { position: relative; display: flex; gap: 12px; padding-bottom: 16px; }
.otk-tl-row:last-child { padding-bottom: 0; }
.otk-tl-rail { position: relative; flex-shrink: 0; display: flex; flex-direction: column; align-items: center; width: 24px; }
.otk-tl-node {
  width: 24px; height: 24px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.12);
  display: flex; align-items: center; justify-content: center;
  color: rgba(255,255,255,.35); font-size: .6rem;
}
.otk-tl-node--on { background: linear-gradient(135deg,#818cf8,#6366f1); border: none; color: #fff; }
.otk-tl-line { position: absolute; top: 24px; bottom: -16px; left: 50%; width: 2px; background: rgba(255,255,255,.1); transform: translateX(-50%); }
.otk-tl-line--on { background: linear-gradient(#818cf8, rgba(129,140,248,.25)); }
.otk-tl-body { flex: 1; min-width: 0; padding-top: 2px; }
.otk-tl-toprow { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.otk-tl-lbl { font-size: .76rem; font-weight: 800; color: #fff; }
.otk-tl-lbl--pending { color: rgba(255,255,255,.35); }
.otk-tl-time { font-size: .66rem; font-weight: 700; color: rgba(255,255,255,.4); flex-shrink: 0; }
.otk-tl-proof { display: block; width: 100%; max-height: 140px; object-fit: cover; border-radius: 10px; margin-top: 6px; border: 1px solid rgba(255,255,255,.1); }

/* ── Liste des reçus (preuves de paiement) — fond blanc pur, accents
   orange, indépendant du thème indigo sombre des autres modales de suivi
   (.ors-modal) : voir modèle validé "Mes reçus — fond blanc, orange". ── */
.rcl-modal { background: #fff !important; max-width: 400px; width: 100%; padding: 0; overflow: hidden; }
.rcl-header {
  padding: 24px 20px 16px; text-align: center; position: relative;
  background: linear-gradient(145deg,#0F0A2E 0%,#1A1040 55%,#0D0820 100%);
  border-radius: var(--radius-xl) var(--radius-xl) 0 0;
}
.rcl-header::after { content: ''; position: absolute; left: 20px; right: 20px; bottom: 0; height: 1px; background: rgba(255,255,255,.08); }
.rcl-header-icon {
  width: 46px; height: 46px; margin: 0 auto 10px; border-radius: 14px;
  background: linear-gradient(145deg, var(--primary), #CC4E00);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 1.1rem;
  box-shadow: 0 8px 20px -6px rgba(255,98,0,.45);
}
.rcl-header-title { font-size: .95rem; font-weight: 900; color: #fff; }
.rcl-header-sub { font-size: .66rem; color: rgba(255,255,255,.45); font-weight: 600; margin-top: 3px; }

.rcl-list { padding: 10px 14px 4px; display: flex; flex-direction: column; gap: 8px; max-height: 60vh; overflow-y: auto; }
.rcl-day-label { font-size: .58rem; font-weight: 800; text-transform: uppercase; letter-spacing: .05em; color: var(--gray-400, #8A8398); padding: 8px 6px 0; }
.rcl-row {
  display: flex; align-items: center; gap: 10px; padding: 10px;
  background: #fff; border: 1px solid var(--gray-100, #F0EAF5);
  border-radius: 14px; cursor: pointer; transition: border-color .15s, background .15s;
}
.rcl-row:hover { border-color: var(--primary); background: #FFF1E6; }
.rcl-thumb { width: 40px; height: 40px; border-radius: 11px; object-fit: cover; flex-shrink: 0; display: flex; align-items: center; justify-content: center; font-size: .8rem; }
.rcl-thumb--pending { background: #FFF1E6; color: var(--primary); }
.rcl-thumb--ok { background: var(--primary); color: #fff; }
.rcl-row-main { flex: 1; min-width: 0; }
.rcl-row-ref { font-size: .78rem; font-weight: 800; color: #CC4E00; }
.rcl-row-date { font-size: .64rem; font-weight: 600; color: var(--gray-400, #8A8398); margin-top: 1px; }
.rcl-row-status { font-size: .62rem; font-weight: 700; white-space: nowrap; flex-shrink: 0; }
.rcl-row-status--ok { color: var(--primary); }
.rcl-row-status--pending { color: var(--gray-400, #8A8398); }
.rcl-row-chev { color: var(--gray-300, #C9C2D6); font-size: .7rem; flex-shrink: 0; }

.rcl-actions { display: flex; gap: 8px; padding: 14px 20px 20px; }
.rcl-close-btn {
  width: 100%; padding: 12px; border-radius: 99px;
  background: #fff; border: 1px solid var(--gray-100, #F0EAF5);
  color: var(--gray-500, #8A8398); font-size: .78rem; font-weight: 800; cursor: pointer;
  font-family: var(--font); transition: background .15s;
}
.rcl-close-btn:hover { background: var(--gray-50, #F8F9FC); }

.otk-countdown-wrap {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  margin: 14px 20px 0; padding: 9px 12px; border-radius: 12px;
  background: rgba(129,140,248,.1); border: 1px solid rgba(129,140,248,.25);
  color: rgba(255,255,255,.7); font-size: .72rem; font-weight: 600;
}
.otk-countdown-wrap strong { color: #fff; font-variant-numeric: tabular-nums; }

.otk-recla-btn {
  width: calc(100% - 40px); margin: 14px 20px 0; padding: 11px;
  border-radius: 12px; border: 1.5px solid rgba(239,68,68,.35);
  background: rgba(239,68,68,.1); color: #f87171;
  font-size: .78rem; font-weight: 800; cursor: pointer; font-family: var(--font);
  display: flex; align-items: center; justify-content: center; gap: 7px;
  transition: background .15s;
}
.otk-recla-btn:hover { background: rgba(239,68,68,.18); }

/* ══════════════════════════════════════════════════════════════
   RÉCLAMATION — bouton d'entrée (Historique) + hub en interface
   de chat (nouvelle réclamation / en attente / terminées).
══════════════════════════════════════════════════════════════ */
.hxrc-btn-wrap { position: relative; z-index: 1; }
.hxrc-btn {
  display: flex; align-items: center; gap: 11px;
  width: 100%; padding: 9px 14px 9px 9px; border: none; cursor: pointer;
  border-radius: 14px; font-family: var(--font);
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  box-shadow: none;
  transition: opacity .15s;
}
.hxrc-btn:hover { opacity: .92; }
.hxrc-btn-ico {
  flex-shrink: 0; width: 32px; height: 32px; border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,.12); color: #fff; font-size: .82rem;
}
.hxrc-btn-text { flex: 1; min-width: 0; text-align: left; display: flex; flex-direction: column; }
.hxrc-btn-lbl { font-size: .78rem; font-weight: 800; color: #fff; }
.hxrc-btn-sub {
  font-size: .6rem; font-weight: 600; color: rgba(255,255,255,.6); margin-top: 1px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hxrc-btn-chev { flex-shrink: 0; color: rgba(255,255,255,.6); font-size: .7rem; }

/* Autre modèle de "Réclamation" (demande explicite : "propose un autre
   modèle") — carte blanche + icône teintée orange, même famille visuelle
   que "Mes coordonnées"/"Récharge en masse" (.rcp-bulk-card), à la place
   du bloc plein bleu marine (.hxrc-btn ci-dessus, toujours utilisée par
   "Télécharger le reçu"). */
.hxrc-btn-wrap--v2 { margin: 10px 0 14px; }
.hxrc-btn-v2 {
  display: flex; align-items: center; gap: 11px;
  width: 100%; padding: 13px 14px; border: none; cursor: pointer;
  border-radius: 20px; font-family: var(--font);
  background: #FCDFDF; border: 1px solid #F2B8B8;
  box-shadow: none;
  transition: background .15s;
}
.hxrc-btn-v2:hover { background: #F8D2D2; }
.hxrc-btn-v2-ico {
  flex-shrink: 0; width: 36px; height: 36px; border-radius: 12px;
  display: flex; align-items: center; justify-content: center;
  background: #fff; color: #16121F; font-size: .85rem;
}
.hxrc-btn-v2-text { flex: 1; min-width: 0; text-align: left; display: flex; flex-direction: column; }
.hxrc-btn-v2-lbl { font-size: .8rem; font-weight: 400; color: #16121F; }
.hxrc-btn-v2-sub {
  font-size: .62rem; font-weight: 400; color: #16121F; margin-top: 2px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hxrc-btn-v2-chev { flex-shrink: 0; color: var(--gray-400); font-size: .7rem; }

.hxrc-badge {
  position: absolute; top: -6px; right: 10px; z-index: 2;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 20px;
  background: #3b82f6; color: #fff;
  font-size: .62rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 3px 8px rgba(59,130,246,.4), 0 0 0 2.5px #fff;
}

.rclhub-modal { max-width: 480px; width: 100%; padding: 0; overflow: hidden; }
/* Ouverture plein écran (demande explicite) — même patron que
   #modal-contact/#modal-apropos/#modal-partenaires : plus de carte
   centrée avec marge, la modale occupe tout le viewport. */
#modal-reclamation-hub.modal-overlay { padding: 0; }
#modal-reclamation-hub .modal {
  max-width: none; width: 100%; height: 100%; max-height: none;
  border-radius: 0; margin: 0;
  display: flex; flex-direction: column;
}
#modal-reclamation-hub .rh-body { flex: 1; max-height: none; }

.rh-head {
  position: relative; overflow: hidden;
  background: linear-gradient(160deg, #1B3A6B 0%, #0F1E42 55%, #060D24 100%);
  padding: 18px 18px 16px; color: #fff;
  border-radius: 0 0 22px 22px;
}
.rh-head::before {
  content: ''; position: absolute; top: -60px; right: -40px;
  width: 180px; height: 180px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,255,255,.06), transparent 70%);
  pointer-events: none;
}
/* Retour positionné en absolu (demande explicite : "centre l'écriture")
   pour que le titre reste centré sur toute la largeur du bandeau,
   indépendamment de la présence du bouton retour à gauche. */
.rh-head-row { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; min-height: 34px; }
.rh-back {
  position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.16);
  box-shadow: 0 1px 0 rgba(255,255,255,.12) inset;
  color: #fff; font-size: .78rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .15s;
}
.rh-back:hover { background: rgba(255,255,255,.18); }
.rh-title-wrap { display: flex; align-items: center; gap: 10px; text-align: center; }
.rh-title-ico {
  width: 32px; height: 32px; border-radius: 11px; flex-shrink: 0;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.14); box-shadow: none;
  display: flex; align-items: center; justify-content: center; color: #fff; font-size: .82rem;
}
.rh-title { font-size: .84rem; font-weight: 800; letter-spacing: .01em; }
.rh-sub { font-size: .62rem; color: rgba(255,255,255,.7); font-weight: 600; margin-top: 1px; }
/* Modèle simplifié (demande explicite : "un autre modèle plus simple")
   — barre plate sur fond blanc, simple soulignement sous l'onglet
   actif, sans carte ni ombre ni fond coloré. */
.rh-tabs {
  position: relative; z-index: 2; display: flex; gap: 2px;
  background: #fff; padding: 0 14px;
  border-bottom: 1px solid var(--gray-100);
}
.rh-tab {
  flex: 1; text-align: center; padding: 12px 4px; font-size: .68rem; font-weight: 700;
  color: var(--gray-400); border-bottom: 2.5px solid transparent; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 4px;
  transition: color .15s, border-color .15s;
}
.rh-tab.active { color: #16305C; border-bottom-color: #16305C; }
.rh-tab-badge {
  font-size: .56rem; font-weight: 800; background: var(--gray-100); color: var(--gray-500);
  border-radius: 20px; padding: 1px 6px;
}
.rh-tab.active .rh-tab-badge { background: rgba(22,48,92,.12); color: #16305C; }

.rh-body {
  max-height: 82vh; overflow-y: auto;
  padding: 14px 14px calc(16px + env(safe-area-inset-bottom, 0px));
  display: flex; flex-direction: column; gap: 10px;
  background: var(--gray-50, #F8F9FC);
}

/* Modèle "vide" propre à la réclamation (demande explicite : "change
   complètement le modèle") — badge rond illustré à la place de
   l'emoji flottant sur carte blanche, plus spacieux, sans encadré. */
#modal-reclamation-hub .hx-empty {
  background: none; box-shadow: none; padding: 48px 24px 20px;
}
#modal-reclamation-hub .hx-empty-icon {
  width: 72px; height: 72px; margin: 0 auto 16px;
  border-radius: 50%;
  background: rgba(22,48,92,.08);
  border: 1.5px dashed rgba(22,48,92,.25);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.5rem; color: #16305C;
}
#modal-reclamation-hub .hx-empty-title { font-size: .88rem; font-weight: 800; color: #16305C; margin-bottom: 5px; }
#modal-reclamation-hub .hx-empty-sub { font-size: .72rem; color: var(--gray-500); max-width: 220px; margin: 0 auto; }

.rh-msg-row { display: flex; gap: 8px; align-items: flex-end; }
.rh-msg-row.user { flex-direction: row-reverse; }
.rh-msg-avatar {
  width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(150deg, #0d1a3d, #060a1c);
  display: flex; align-items: center; justify-content: center; color: var(--primary); font-size: .58rem;
}
.rh-msg-bubble {
  max-width: 78%; padding: 8px 11px; border-radius: 13px;
  font-size: .86rem; line-height: 1.45; color: var(--gray-800, #12182B);
  background: #fff; border-bottom-left-radius: 4px;
}
.rh-msg-row.user .rh-msg-bubble { background: #E9EEF9; border-bottom-left-radius: 13px; border-bottom-right-radius: 4px; }

.rh-msg-group { display: flex; flex-direction: column; gap: 6px; margin-left: 30px; }

.rh-order-pick {
  display: flex; align-items: center; gap: 10px; width: 100%;
  background: #fff; border: 1.5px solid var(--gray-200, #EEF0F4); border-radius: 13px;
  padding: 9px 11px; cursor: pointer; text-align: left; font-family: var(--font);
}
.rh-order-pick:hover { border-color: #16305C; }
.rh-order-pick-ico {
  width: 28px; height: 28px; border-radius: 9px; flex-shrink: 0;
  background: rgba(22,48,92,.1); color: #16305C;
  display: flex; align-items: center; justify-content: center; font-size: .7rem;
}
.rh-order-pick-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.rh-order-pick-svc { font-size: .7rem; font-weight: 800; color: var(--gray-800, #12182B); }
.rh-order-pick-meta { font-size: .6rem; color: var(--gray-400, #9AA2B4); margin-top: 1px; }
.rh-order-pick-amt { font-size: .7rem; font-weight: 800; color: var(--gray-800, #12182B); font-variant-numeric: tabular-nums; flex-shrink: 0; }

.rh-reason-btn {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: #fff; border: 1.5px solid #16305C; color: #16305C;
  border-radius: 13px; padding: 10px 12px; font-size: .82rem; font-weight: 700;
  text-align: left; cursor: pointer; font-family: var(--font);
}
.rh-reason-btn--wa { border-color: #25D366; color: #128c4a; }

.rh-confirm-bubble {
  display: flex; align-items: center; gap: 8px;
  background: #eafbf1; border: 1px solid #bbf7d0; color: #16a34a;
  border-radius: 13px; padding: 9px 12px; font-size: .72rem; font-weight: 700;
}

.rh-card {
  background: #fff; border: 1.5px solid var(--gray-200, #EEF0F4); border-radius: 13px;
  padding: 11px 12px; display: flex; flex-direction: column; gap: 5px;
  cursor: pointer; transition: border-color .15s;
}
.rh-card:hover { border-color: #16305C; }
.rh-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.rh-card-ref { font-size: .7rem; font-weight: 800; color: var(--gray-800, #12182B); }
.rh-pill { font-size: .58rem; font-weight: 800; padding: 3px 8px; border-radius: 20px; display: flex; align-items: center; gap: 4px; }
.rh-pill--pend { background: #fffbeb; color: #d97706; }
.rh-pill--done { background: #eafbf1; color: #16a34a; }
.rh-pill--refund { background: #f3ebff; color: #7c3aed; }
.rh-card-motif { font-size: .68rem; color: var(--gray-500, #5B6478); font-style: italic; }
.rh-card-date { font-size: .6rem; color: var(--gray-400, #9AA2B4); font-weight: 600; }
.rh-proof-img { width: 100%; max-height: 180px; object-fit: cover; border-radius: 10px; border: 1px solid #bbf7d0; cursor: pointer; margin-top: 2px; }

.rh-thread-back {
  display: flex; align-items: center; gap: 6px;
  background: none; border: none; cursor: pointer;
  font-family: var(--font); font-size: .72rem; font-weight: 700;
  color: var(--gray-500, #5B6478); padding: 0; margin-bottom: 4px;
}
.rh-thread-back:hover { color: var(--primary); }
.rh-thread-img { max-width: 100%; max-height: 200px; border-radius: 10px; cursor: pointer; display: block; }

/* ══════════════════════════════════════════════════════════════
   CABINE — cartes réclamations : carte Premium sombre, frise
   verticale du suivi (signalement client → réponse cabiniste), même
   langage visuel que le modal "Détail de la commande" (.ordet-tl-*).
══════════════════════════════════════════════════════════════ */
.recla-list { display: flex; flex-direction: column; gap: 12px; }

/* État vide — section dédiée (au lieu de .cab-empty-state générique). */
.recla-empty {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 10px; padding: 40px 24px;
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  box-shadow: 0 10px 26px rgba(0,0,0,.06);
  border-radius: 20px;
}
.recla-empty-ico {
  width: 52px; height: 52px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.2rem;
}
.recla-empty--ok .recla-empty-ico { background: rgba(5,150,105,.12); color: #059669; box-shadow: 0 0 0 8px rgba(5,150,105,.06); }
.recla-empty--none .recla-empty-ico { background: var(--gray-100); color: var(--gray-400); }
.recla-empty-title { font-size: .9rem; font-weight: 800; color: #242320; }
.recla-empty-sub { font-size: .72rem; font-weight: 500; color: rgba(36,35,32,.5); line-height: 1.5; max-width: 240px; }

/* Modèle validé sur maquette (Artifact "Carte Réclamation") avant
   implémentation ici, demande explicite : "ramène le modèle que nous
   avons fait" — fond teinté selon le réseau de la commande concernée
   (--recla-op/-bg/-bd posées en style inline par carte, voir
   renderCabReclaList(), js/cabine.js), plus de frise "Signalée par.../
   citation" (retirée sur demande explicite), remplacée par un simple
   message d'état pour les statuts non actionnables. */
.recla-card {
  --recla-op: #6B7280; --recla-op-bg: #F1F3F8; --recla-op-bd: #E4E4E4;
  overflow: hidden; border-radius: 18px;
  background: var(--recla-op-bg); border: 1.5px solid var(--recla-op-bd);
  box-shadow: 0 10px 24px -14px rgba(0,0,0,.25);
  color: #16121F; font-family: var(--font);
}
.recla-hd {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 8px 12px; background: var(--recla-op);
}
.recla-hd-op { color: #fff; font-size: .7rem; font-weight: 900; letter-spacing: .02em; }
.recla-hd-badge {
  font-size: .56rem; font-weight: 800; letter-spacing: .03em; text-transform: uppercase;
  color: var(--recla-op); background: #fff; border-radius: 999px; padding: 3px 9px;
}
.recla-body { padding: 11px; }
.recla-topline { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 9px; }
.recla-reltime { font-size: .62rem; color: rgba(22,18,31,.55); }
.recla-refund-btn {
  display: inline-flex; align-items: center; gap: 4px; flex-shrink: 0;
  font-size: .6rem; font-weight: 800; color: var(--recla-op);
  background: #fff; border: 1.5px solid var(--recla-op-bd); border-radius: 999px;
  padding: 5px 10px; cursor: pointer; font-family: var(--font);
}

/* Encart blanc : référence (copiable), montant, destinataire. */
.recla-info { background: #fff; border: 1px solid var(--recla-op-bd); border-radius: 12px; padding: 10px 12px; margin-bottom: 9px; }
.recla-ref {
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  padding: 3px; border-radius: 8px; transition: background .15s;
}
.recla-ref:active { background: var(--recla-op-bg); }
.recla-ref-txt { font-size: .92rem; font-weight: 900; color: #16121F; letter-spacing: .02em; }
.recla-split { display: flex; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--recla-op-bg); }
.recla-split-col { flex: 1; text-align: center; }
.recla-split-col + .recla-split-col { border-left: 1px solid var(--recla-op-bg); }
.recla-split-lbl { font-size: .52rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: rgba(22,18,31,.5); margin-bottom: 2px; }
.recla-split-val { font-size: .7rem; font-weight: 800; color: #16121F; }
.recla-split-val--amt { color: var(--recla-op); }

.recla-divider { height: 1px; background: var(--recla-op-bd); margin-bottom: 12px; }

/* Formulaire de réponse (statut "en_attente" uniquement). */
.recla-file-input { position: absolute; width: 1px; height: 1px; opacity: 0; overflow: hidden; }
.recla-upload-btn {
  display: flex; align-items: center; justify-content: center; width: 100%;
  border: 1.5px solid var(--recla-op); border-radius: 12px; padding: 9px;
  font-size: .68rem; font-weight: 800; color: var(--recla-op);
  cursor: pointer; background: #fff; font-family: var(--font);
}
.recla-upload-preview {
  width: 100%; max-height: 120px; object-fit: cover;
  border-radius: 8px; border: 1px solid var(--recla-op-bd); margin-top: 8px;
}
.recla-submit-btn {
  display: flex; align-items: center; justify-content: center; width: 100%;
  background: var(--recla-op); color: #fff; border: none; border-radius: 12px;
  padding: 10px; font-size: .72rem; font-weight: 800; margin-top: 7px;
  cursor: pointer; font-family: var(--font);
}

/* Statuts sans action possible (remboursement_demande/remboursée/résolue) —
   simple ligne d'état plutôt qu'un formulaire, plus de frise verticale. */
.recla-status-note {
  display: flex; align-items: center; gap: 7px;
  font-size: .68rem; font-weight: 700; color: var(--recla-op);
}
.recla-proof-link {
  display: flex; align-items: center; gap: 7px; margin-top: 8px;
  font-size: .64rem; font-weight: 700; color: rgba(22,18,31,.6); text-decoration: none;
}
.recla-proof-thumb { width: 26px; height: 26px; border-radius: 6px; object-fit: cover; border: 1px solid var(--recla-op-bd); }

/* ══════════════════════════════════════════════════════════════
   SECTION AVIS CLIENTS (ancien)
══════════════════════════════════════════════════════════════ */
.reviews-score {
  background: linear-gradient(135deg, var(--primary) 0%, #ff8c00 100%);
  border-radius: var(--radius-lg); padding: 20px;
  text-align: center; color: #fff; margin-bottom: 12px;
}
.rev-score-big {
  font-size: 3rem; font-weight: 900; line-height: 1;
  text-shadow: 0 2px 8px rgba(0,0,0,.15);
}
.rev-score-pct { font-size: 1.6rem; vertical-align: middle; }
.rev-score-stars { font-size: 1.1rem; margin: 6px 0 4px; opacity: .9; }
.rev-score-stars .fa-star, .rev-score-stars .fa-star-half-stroke { color: #fff; }
.rev-score-sub { font-size: .76rem; opacity: .8; font-weight: 600; }

.reviews-list { display: flex; flex-direction: column; gap: 10px; }
.review-card {
  background: rgba(255,255,255,.07); border: 1px solid rgba(138,99,255,.15);
  border-radius: var(--radius-lg); padding: 14px 16px;
}
.rev-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.rev-avatar {
  width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;
  background: var(--primary); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; font-weight: 900;
}
.rev-meta { flex: 1; }
.rev-name { font-size: .82rem; font-weight: 900; color: #fff; }
.rev-stars { font-size: .65rem; color: #f59e0b; margin-top: 2px; }
.rev-text {
  font-size: .8rem; color: rgba(255,255,255,.6); line-height: 1.6;
}

/* ══════════════════════════════════════════════════════════════
   CARTE SOLDE INVITÉ — redesign
══════════════════════════════════════════════════════════════ */
.guest-wallet-hero {
  position: relative; overflow: hidden;
  background: linear-gradient(140deg, #FF6200 0%, #ff8c00 55%, #e05d00 100%);
  border-radius: var(--radius-xl); padding: 26px 20px 20px;
  color: #fff; margin-bottom: 0;
}
.gwh-pattern {
  position: absolute; inset: 0; pointer-events: none; overflow: hidden;
  background: repeating-linear-gradient(45deg,
    rgba(255,255,255,.04) 0px, rgba(255,255,255,.04) 1px,
    transparent 1px, transparent 18px);
}
.gwh-top {
  display: flex; align-items: center; gap: 10px; margin-bottom: 20px;
}
.gwh-logo-icon {
  width: 36px; height: 36px; border-radius: 10px;
  background: rgba(255,255,255,.2); border: 1px solid rgba(255,255,255,.3);
  display: flex; align-items: center; justify-content: center; font-size: 1rem;
}
.gwh-tag {
  font-size: .75rem; font-weight: 700; opacity: .85; letter-spacing: .4px;
  text-transform: uppercase;
}
.gwh-amount-row {
  display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px;
}
.gwh-dots {
  font-size: 1.5rem; font-weight: 900; letter-spacing: 6px;
  color: rgba(255,255,255,.55);
}
.gwh-fcfa { font-size: .9rem; font-weight: 700; opacity: .55; }
.gwh-hint {
  font-size: .76rem; opacity: .7; margin-bottom: 18px; font-weight: 500;
}
.gwh-cta {
  width: 100%; padding: 13px; border-radius: 14px;
  background: #fff; color: var(--primary); border: none;
  font-size: .88rem; font-weight: 900; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 10px;
  box-shadow: 0 4px 16px rgba(0,0,0,.15); transition: transform .15s;
  margin-bottom: 18px;
}
.gwh-cta:active { transform: scale(.98); }
.gwh-actions {
  display: flex; justify-content: space-around;
  border-top: 1px solid rgba(255,255,255,.2); padding-top: 16px;
}
.gwh-action {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  cursor: pointer; opacity: .6;
}
.gwh-action-icon {
  width: 40px; height: 40px; border-radius: 12px;
  background: rgba(255,255,255,.15); border: 1px solid rgba(255,255,255,.25);
  display: flex; align-items: center; justify-content: center; font-size: .95rem;
}
.gwh-action span { font-size: .68rem; font-weight: 700; }

/* ══════════════════════════════════════════════════════════════
   PROGRAMME FIDÉLITÉ — redesign
══════════════════════════════════════════════════════════════ */
.fid-hero {
  display: flex; align-items: center; justify-content: space-between;
  background: linear-gradient(135deg, #fff8f0 0%, #fff3e0 100%);
  border: 1.5px solid var(--frame-green);
  border-radius: var(--radius-lg); padding: 16px 18px; margin-bottom: 14px;
}
.fid-hero-left { display: flex; align-items: center; gap: 14px; }
.fid-trophy-wrap { position: relative; }
.fid-trophy-glow {
  position: absolute; inset: -6px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,98,0,.18), transparent 70%);
  animation: fidGlow 2.2s ease-in-out infinite;
}
@keyframes fidGlow {
  0%,100% { opacity: .6; transform: scale(1); }
  50%      { opacity: 1;  transform: scale(1.12); }
}
.fid-trophy-emoji { font-size: 2.6rem; position: relative; z-index: 1; }
.fid-hero-reward-name { font-size: .9rem; font-weight: 900; color: #000; }
.fid-hero-reward-sub  { font-size: .72rem; color: #888; margin-top: 3px; }
.fid-hero-right { text-align: right; }
.fid-hero-count { font-size: 2.2rem; font-weight: 900; color: var(--primary); line-height: 1; }
.fid-hero-goal  { font-size: .85rem; font-weight: 700; color: #aaa; }
.fid-hero-label { font-size: .68rem; color: #bbb; text-transform: uppercase; letter-spacing: .4px; }

.fid-track-wrap { padding: 0 4px; margin-bottom: 12px; }
.fid-track {
  position: relative; height: 12px;
  background: #e8e8e8; border-radius: 20px; overflow: visible;
}
.fid-track-fill {
  height: 100%; border-radius: 20px; width: 0%;
  background: linear-gradient(90deg, var(--primary), #ff8c42);
  transition: width .6s cubic-bezier(.34,1.56,.64,1);
}
.fid-track-ms {
  position: absolute; top: -5px;
  transform: translateX(-50%);
  width: 22px; height: 22px; border-radius: 50%;
  background: #fff; border: 2.5px solid #ddd;
  display: flex; align-items: center; justify-content: center;
  font-size: .6rem; font-weight: 800; color: #aaa;
}
.fid-track-ms.fid-track-goal { border-color: var(--primary); color: var(--primary); font-size: .75rem; }
.fid-track-ms.reached { background: var(--primary); border-color: var(--primary); color: #fff; }
/* ══════════════════════════════════════════════════════════════
   FIDÉLITÉ — Modèle challenge
══════════════════════════════════════════════════════════════ */
.fid-challenge {
  display: flex; flex-direction: column; gap: 6px; padding: 0;
}

.fid-ch-top {
  display: flex; align-items: baseline; justify-content: space-between;
}
.fid-ch-label {
  font-size: .6rem; font-weight: 800; color: #fff;
  text-transform: uppercase; letter-spacing: .8px;
}
.fid-ch-count {
  font-size: .8rem; font-weight: 900; color: #fff;
}
.fid-ch-count span { color: var(--primary); }

.fid-ch-track {
  height: 5px; background: rgba(255,255,255,.08);
  border-radius: 99px; overflow: hidden;
}
.fid-ch-fill {
  height: 100%; width: 0; border-radius: 99px;
  background: linear-gradient(90deg, #FF6200, #FF9500);
  transition: width .7s cubic-bezier(.4,0,.2,1);
  box-shadow: 0 0 8px rgba(255,98,0,.4);
}

.fid-ch-hint {
  font-size: .6rem; color: rgba(255,255,255,.7); font-weight: 600;
}
.fid-ch-hint strong { color: #FF9020; font-weight: 900; }

/* ══════════════════════════════════════════════════════════════
   FIDÉLITÉ — Galaxy dark model
══════════════════════════════════════════════════════════════ */
.fid-gx {
  position: relative; overflow: hidden;
  background: linear-gradient(145deg, #0D0D1A 0%, #16162A 55%, #0A0A14 100%);
  border-radius: var(--radius-lg);
  border: 1px solid rgba(255,180,0,.18);
  padding: 16px 14px 12px;
  display: flex; flex-direction: column; gap: 13px;
  box-shadow: 0 0 0 1px rgba(255,180,0,.06), 0 8px 32px rgba(0,0,0,.4);
}
.fid-gx-orb {
  position: absolute; border-radius: 50%; pointer-events: none;
}
.fid-gx-orb1 {
  width: 180px; height: 180px; top: -70px; right: -50px;
  background: radial-gradient(circle, rgba(255,160,0,.18) 0%, transparent 70%);
}
.fid-gx-orb2 {
  width: 120px; height: 120px; bottom: -40px; left: -30px;
  background: radial-gradient(circle, rgba(255,98,0,.12) 0%, transparent 70%);
}

/* En-tête */
.fid-gx-head {
  display: flex; align-items: center; gap: 8px;
  position: relative; z-index: 1;
}
.fid-gx-star {
  width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;
  background: linear-gradient(135deg, #F59E0B, #D97706);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: .72rem;
  box-shadow: 0 3px 10px rgba(245,158,11,.4);
}
.fid-gx-title {
  font-size: .84rem; font-weight: 900; color: rgba(255,255,255,.88);
}

/* Compteur + barre */
.fid-gx-body {
  display: flex; align-items: center; gap: 12px;
  position: relative; z-index: 1;
}
.fid-gx-count-box {
  display: flex; align-items: baseline; gap: 3px; flex-shrink: 0;
}
.fid-gx-num {
  font-size: 2.2rem; font-weight: 900; color: #fff; line-height: 1;
}
.fid-gx-slash {
  font-size: .72rem; font-weight: 700; color: rgba(255,255,255,.35);
}
.fid-gx-bar-col { flex: 1; }
.fid-gx-track {
  position: relative; height: 7px;
  background: rgba(255,255,255,.08); border-radius: 8px;
}
.fid-gx-fill {
  height: 100%; width: 0; border-radius: 8px;
  background: linear-gradient(90deg, #F59E0B, #FF6200);
  box-shadow: 0 0 10px rgba(245,158,11,.6);
  transition: width .7s cubic-bezier(.4,0,.2,1);
}
.fid-gx-pip {
  position: absolute; top: 50%; transform: translate(-50%,-50%);
  width: 11px; height: 11px; border-radius: 50%;
  background: #1E1E30; border: 2px solid rgba(255,180,0,.3);
}
.fid-gx-bar-labels {
  display: flex; justify-content: space-between;
  font-size: .52rem; font-weight: 700;
  color: rgba(255,255,255,.45); margin-top: 5px;
}

/* Paliers */
.fid-gx-tiers {
  display: flex; gap: 6px;
  position: relative; z-index: 1;
}
.fid-gx-tier {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 5px;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,180,0,.12);
  border-radius: 14px; padding: 10px 4px 8px;
  transition: all .3s cubic-bezier(.34,1.3,.64,1);
}
.fid-gx-tier-ring {
  font-size: 1.4rem; line-height: 1; filter: grayscale(1) opacity(.4);
  transition: filter .3s;
}
.fid-gx-tier-lbl {
  font-size: .52rem; font-weight: 700; color: rgba(255,255,255,.3);
  text-transform: uppercase; letter-spacing: .3px;
}
.fid-gx-tier-num {
  font-size: .7rem; font-weight: 900; color: rgba(255,255,255,.45);
}
/* État atteint */
.fid-gx-tier.reached {
  background: linear-gradient(145deg, rgba(245,158,11,.2), rgba(255,98,0,.15));
  border-color: rgba(245,158,11,.5);
  box-shadow: 0 0 18px rgba(245,158,11,.2) inset, 0 2px 10px rgba(245,158,11,.15);
}
.fid-gx-tier.reached .fid-gx-tier-ring { filter: none; }
.fid-gx-tier.reached .fid-gx-tier-lbl  { color: #FCD34D; }
.fid-gx-tier.reached .fid-gx-tier-num  { color: #F59E0B; }

/* Hint */
.fid-gx-hint {
  font-size: .72rem; font-weight: 600;
  color: rgba(255,255,255,.3);
  text-align: center; padding: 8px;
  background: rgba(255,255,255,.04); border-radius: 10px;
  border: 1px solid rgba(255,255,255,.06);
  display: flex; align-items: center; justify-content: center; gap: 7px;
  position: relative; z-index: 1;
}

/* ══════════════════════════════════════════════════════════════
   FIDÉLITÉ — Ancien modèle (conservé pour référence)
══════════════════════════════════════════════════════════════ */
.fid-card {
  background: linear-gradient(140deg, #FFFBEB 0%, #FEF3C7 60%, #FDE68A 100%);
  border: 1.5px solid rgba(245,158,11,.35);
  border-radius: var(--radius-lg);
  padding: 16px 14px 12px;
  box-shadow: 0 2px 16px rgba(245,158,11,.15);
  display: flex; flex-direction: column; gap: 14px;
}

/* En-tête */
.fid-card-head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 10px;
}
.fid-card-title-wrap { display: flex; align-items: center; gap: 10px; }
.fid-card-icon {
  width: 36px; height: 36px; border-radius: 11px; flex-shrink: 0;
  background: linear-gradient(135deg, #F59E0B, #D97706);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: .9rem;
  box-shadow: 0 3px 10px rgba(245,158,11,.4);
}
.fid-card-title { font-size: .88rem; font-weight: 900; color: #92400E; }
.fid-card-sub   { font-size: .65rem; color: #B45309; font-weight: 500; margin-top: 1px; }

/* Compteur + barre */
.fid-card-progress { display: flex; align-items: center; gap: 12px; }
.fid-card-count-wrap { flex-shrink: 0; text-align: center; }
.fid-card-count {
  font-size: 2rem; font-weight: 900; color: #92400E; line-height: 1;
}
.fid-card-count-lbl {
  font-size: .58rem; font-weight: 700; color: #B45309;
  text-transform: uppercase; letter-spacing: .5px; white-space: nowrap;
}
.fid-card-bar-wrap { flex: 1; }
.fid-card-track {
  position: relative; height: 8px;
  background: rgba(180,83,9,.15); border-radius: 8px; overflow: visible;
}
.fid-card-fill {
  height: 100%; width: 0; border-radius: 8px;
  background: linear-gradient(90deg, #F59E0B, #D97706);
  box-shadow: 0 0 8px rgba(245,158,11,.5);
  transition: width .7s cubic-bezier(.4,0,.2,1);
}
.fid-card-node {
  position: absolute; top: 50%; transform: translate(-50%,-50%);
  width: 14px; height: 14px; border-radius: 50%;
  background: #fff; border: 2px solid rgba(180,83,9,.25);
  display: flex; align-items: center; justify-content: center;
}
.fid-card-node span {
  position: absolute; top: 14px; left: 50%; transform: translateX(-50%);
  font-size: .5rem; font-weight: 700; color: #B45309; white-space: nowrap;
}

/* Paliers */
.fid-card-tiers { display: flex; gap: 6px; }
.fid-tier {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px;
  background: rgba(255,255,255,.5); border: 1px solid rgba(245,158,11,.2);
  border-radius: 12px; padding: 10px 4px 8px;
  transition: all .25s;
}
.fid-tier-ico  { font-size: 1.3rem; line-height: 1; }
.fid-tier-num  { font-size: .72rem; font-weight: 900; color: #92400E; }
.fid-tier-lbl  { font-size: .55rem; font-weight: 700; color: #B45309; text-transform: uppercase; letter-spacing: .3px; }

/* État atteint */
.fid-tier.reached {
  background: linear-gradient(135deg, #F59E0B, #D97706);
  border-color: transparent;
  box-shadow: 0 4px 12px rgba(245,158,11,.35);
}
.fid-tier.reached .fid-tier-num,
.fid-tier.reached .fid-tier-lbl { color: #fff; }

/* Hint */
.fid-card-hint {
  text-align: center; font-size: .73rem; font-weight: 600;
  color: #B45309; background: rgba(255,255,255,.6);
  border-radius: 10px; padding: 8px 12px;
  border: 1px solid rgba(245,158,11,.2);
  display: flex; align-items: center; justify-content: center; gap: 7px;
}
.fid-card-hint i { font-size: .68rem; }

/* ══════════════════════════════════════════════════════════════
   AVIS CLIENTS — redesign
══════════════════════════════════════════════════════════════ */
.rev-hero {
  display: flex; gap: 14px; align-items: flex-start;
  background: #fff; border: 1.5px solid var(--frame-green);
  border-radius: var(--radius-lg); padding: 16px; margin-bottom: 12px;
}
.rev-hero-score { text-align: center; flex-shrink: 0; min-width: 80px; }
.rev-hero-num {
  font-size: 2.4rem; font-weight: 900; color: var(--primary); line-height: 1;
}
.rev-hero-num span { font-size: 1.4rem; }
.rev-hero-stars { font-size: .85rem; color: #f59e0b; margin: 5px 0; }
.rev-hero-label { font-size: .65rem; color: #888; font-weight: 600; }
.rev-hero-bars { flex: 1; display: flex; flex-direction: column; gap: 5px; padding-top: 4px; }
.rev-bar-row {
  display: flex; align-items: center; gap: 7px;
  font-size: .66rem; font-weight: 700; color: #666;
}
.rev-bar {
  flex: 1; height: 6px; background: #eee; border-radius: 4px; overflow: hidden;
}
.rev-bar-fill { height: 100%; border-radius: 4px; background: var(--primary); }

/* ── Avis clients — score bulles épuré ───────────────────── */
.rv3-wrap {
  display: flex; align-items: center; gap: 14px;
  background: #fff; border: 1.5px solid var(--frame-green);
  border-radius: 16px; padding: 14px 16px; margin-bottom: 12px;
}
.rv3-left { display: flex; flex-direction: column; align-items: center; gap: 4px; flex-shrink: 0; }
.rv3-circle {
  width: 64px; height: 64px; border-radius: 50%;
  background: linear-gradient(135deg, #FF6200, #FF9000);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0;
  box-shadow: 0 4px 16px rgba(255,98,0,.3);
}
.rv3-pct { font-size: 1.1rem; font-weight: 900; color: #fff; line-height: 1.1; }
.rv3-pct span { font-size: .7rem; }
.rv3-stars { font-size: .6rem; color: #FFE082; letter-spacing: 1px; }
.rv3-satisfaction { font-size: .6rem; color: #aaa; font-weight: 700; text-transform: uppercase; letter-spacing: .3px; text-align: center; max-width: 64px; }
.rv3-bubbles { flex: 1; display: flex; flex-direction: column; gap: 7px; }
.rv3-bbl {
  display: inline-flex; align-items: center; gap: 8px;
  background: rgba(255,98,0,.07); border: 1px solid rgba(255,98,0,.15);
  border-radius: 30px; padding: 6px 12px;
  font-size: .72rem; color: #555; font-weight: 500;
}
.rv3-bbl i { color: var(--primary); font-size: .7rem; }
.rv3-bbl strong { color: #111; font-weight: 900; }
.rv3-bbl--green { background: rgba(34,197,94,.07); border-color: rgba(34,197,94,.2); }
.rv3-bbl--green i { color: #16a34a; }
.rv3-bbl--blue  { background: rgba(99,102,241,.07); border-color: rgba(99,102,241,.2); }
.rv3-bbl--blue i { color: #6366f1; }

/* Avis vedette */
.rv2-featured {
  position: relative;
  background: #fff; border-radius: 16px; padding: 18px 18px 14px;
  border-left: 4px solid var(--primary);
  box-shadow: 0 2px 16px rgba(0,0,0,.07);
  margin-bottom: 10px;
}
.rv2-ft-open {
  font-size: 3.5rem; color: var(--primary); line-height: .6;
  font-family: Georgia, serif; opacity: .2;
  position: absolute; top: 10px; left: 14px;
}
.rv2-ft-close {
  font-size: 3.5rem; color: var(--primary); line-height: .6;
  font-family: Georgia, serif; opacity: .2;
  position: absolute; bottom: 38px; right: 14px;
}
.rv2-ft-text {
  font-size: .88rem; color: #222; line-height: 1.7;
  font-style: italic; font-weight: 500;
  padding: 10px 4px 14px; position: relative; z-index: 1;
}
.rv2-ft-footer { display: flex; align-items: center; gap: 10px; border-top: 1px solid #f0f0f0; padding-top: 10px; }
.rv2-ft-av {
  width: 38px; height: 38px; border-radius: 50%; flex-shrink: 0;
  color: #fff; font-size: .9rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
}
.rv2-ft-name  { font-size: .82rem; font-weight: 900; color: #111; }
.rv2-ft-stars { font-size: .7rem; color: #f59e0b; margin-top: 2px; }
.rv2-ft-badge {
  margin-left: auto; display: flex; align-items: center; gap: 4px;
  font-size: .65rem; font-weight: 800; color: #16a34a;
  background: #f0fdf4; border: 1px solid #bbf7d0;
  border-radius: 20px; padding: 3px 9px;
}

/* Mini-cartes grille */
.rv2-grid { display: flex; gap: 8px; }
.rv2-mini {
  flex: 1; background: #fff; border-radius: 12px; padding: 12px 12px 10px;
  border: 1.5px solid var(--frame-green);
  box-shadow: 0 1px 8px rgba(0,0,0,.05);
}
.rv2-mini-top { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.rv2-mini-av {
  width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0;
  color: #fff; font-size: .78rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
}
.rv2-mini-name  { font-size: .76rem; font-weight: 900; color: #111; }
.rv2-mini-stars { font-size: .65rem; color: #f59e0b; }
.rv2-mini-text  { font-size: .72rem; color: #555; line-height: 1.55; font-style: italic; }

/* ══════════════════════════════════════════════════════════════
   CARTE WALLET QR CODE — nouveau modèle invité
══════════════════════════════════════════════════════════════ */
.qr-wallet-card {
  background: linear-gradient(135deg, #1E2235 0%, #252A45 60%, #1A1D30 100%);
  border-radius: 20px;
  padding: 18px 16px 14px;
  display: flex; flex-direction: column; gap: 14px;
  border: 1px solid rgba(255,255,255,.06);
  box-shadow: 0 8px 32px rgba(0,0,0,.25);
}

/* En-tête */
.qwc-header {
  display: flex; align-items: center; gap: 10px;
}
.qwc-icon-wrap {
  width: 34px; height: 34px; border-radius: 10px;
  background: var(--primary);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: .9rem; flex-shrink: 0;
}
.qwc-brand-name {
  font-size: .82rem; font-weight: 900; color: #fff; letter-spacing: .3px;
}
.qwc-brand-name span { color: var(--primary); }
.qwc-brand-sub { font-size: .65rem; color: rgba(255,255,255,.4); font-weight: 500; }
.qwc-status-dot {
  position: relative;
  margin-left: auto; width: 9px; height: 9px; border-radius: 50%;
  background: #4ade80;
  box-shadow: 0 0 0 3px rgba(74,222,128,.25);
}
.qwc-status-dot::after {
  content: ''; position: absolute; inset: -3px; border-radius: 50%;
  border: 2px solid rgba(74,222,128,.45);
  animation: qwcPulse 2s ease-out infinite;
}
@keyframes qwcPulse { 0% { transform: scale(.6); opacity: .7; } 100% { transform: scale(1.7); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .qwc-status-dot::after { animation: none; } }

/* Corps */
.qwc-body { display: flex; gap: 14px; align-items: center; }

.qwc-left { flex: 1; display: flex; flex-direction: column; gap: 8px; }
.qwc-balance-row { display: flex; align-items: baseline; gap: 8px; }
.qwc-dots { font-size: 1.1rem; color: rgba(255,255,255,.35); letter-spacing: 4px; }
.qwc-currency { font-size: .72rem; color: rgba(255,255,255,.35); font-weight: 700; }
.qwc-hint {
  font-size: .72rem; color: rgba(255,255,255,.45);
  line-height: 1.55; font-weight: 500;
}
.qwc-login-btn {
  display: flex; align-items: center; gap: 7px;
  background: var(--primary); color: #fff; border: none;
  border-radius: 10px; padding: 9px 14px;
  font-size: .78rem; font-weight: 800;
  cursor: pointer; font-family: var(--font);
  width: fit-content;
  box-shadow: 0 3px 12px rgba(255,98,0,.4);
  transition: transform .12s;
}
.qwc-login-btn:active { transform: scale(.96); }

/* QR code */
.qwc-right { flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 5px; }
.qwc-qr-frame {
  background: #fff; border-radius: 10px; padding: 6px;
  box-shadow: 0 4px 20px rgba(0,0,0,.35);
}
.qwc-qr-svg { width: 78px; height: 78px; display: block; }
.qwc-qr-label {
  font-size: .6rem; color: rgba(255,255,255,.35);
  font-weight: 600; text-align: center;
}

/* Actions bas de carte */
.qwc-actions {
  display: flex; justify-content: space-around;
  border-top: 1px solid rgba(255,255,255,.08);
  padding-top: 12px;
}
.qwc-action {
  display: flex; flex-direction: column; align-items: center; gap: 5px; cursor: pointer;
}
.qwc-action-icon {
  width: 40px; height: 40px; border-radius: 12px;
  background: rgba(255,255,255,.07);
  display: flex; align-items: center; justify-content: center;
  color: rgba(255,255,255,.6); font-size: .9rem;
  transition: background .15s;
}
.qwc-action-icon:hover { background: rgba(255,255,255,.13); }
.qwc-action span { font-size: .65rem; color: rgba(255,255,255,.4); font-weight: 700; }

/* ══════════════════════════════════════════════════════════════
   PREMIUM WALLET CARD — modèle sans QR
══════════════════════════════════════════════════════════════ */
.pw-card {
  position: relative; overflow: hidden;
  background: linear-gradient(135deg, #FF6200 0%, #FF8800 45%, #E54E00 100%);
  border-radius: 22px;
  padding: 22px 20px 18px;
  display: flex; flex-direction: column; gap: 16px;
  box-shadow: 0 12px 40px rgba(255,98,0,.35), 0 3px 10px rgba(0,0,0,.12);
  min-height: 210px;
}
/* Variante invité : teinte légèrement plus sombre */
.pw-card--guest {
  background: linear-gradient(135deg, #CC4E00 0%, #FF6200 50%, #CC4E00 100%);
}

/* ═══════/* ══════════════════════════════════════════════════════════════
   PREMIUM WALLET CARD
══════════════════════════════════════════════════════════════ */
.pgc-sticky-wrap {
  width: 100%; max-width: 720px; margin: 0 auto; min-width: 0;
  box-sizing: border-box;
}

/* ── En-tête bleu uni, coins bas arrondis, plein largeur ──────
   Modèle volontairement SIMPLE : position:sticky (géré nativement par le
   navigateur, aucun JS) plutôt que fixed + réserve d'espace calculée en
   JS + animation de compactage au défilement — l'ancien modèle causait un
   bug persistant (bandeau/carte QR bloqués après un défilement bas puis
   retour en haut, WebView Android/iOS) qui a résisté à plusieurs
   correctifs ciblés. sticky réserve tout seul sa place dans le flux du
   document ; .pgc-qr-card (juste après, flux normal) chevauche son bord
   bas via sa propre marge négative et défile normalement avec le
   contenu — jamais fixe, côté client comme invité. Taille constante,
   plus d'effet "compact" au défilement (source des problèmes,
   simplification délibérée). */
.pgc-hero-card {
  position: sticky; top: 0; z-index: 150;
  width: auto; box-sizing: border-box;
  margin: 0 -20px;
  padding: 46px 20px 120px;
  border-radius: 0 0 28px 28px;
  background: #0F0A2E;
}
@media (max-width: 600px) { .pgc-hero-card { margin: 0 -12px; padding: 42px 16px 110px; } }
/* Format compact une fois repliée en barre flottante (demande explicite :
   "reduit le format de la barre flottant du montant") — voir
   _initPgcStickyWatch(), js/client.js. Seul le haut compte visuellement
   ici : le padding-bottom (120px, réservé pour le QR sur la carte normale
   en haut de page) reste caché sous le contenu qui défile par-dessus,
   inutile de le toucher. */
.pgc-hero-card.pgc-hero-card--stuck { padding-top: 4px; }
.pgc-hero-card--stuck .pgc-menu-wrap { margin-top: 0; }

/* Montant centré pile au-dessus du QR : grille à 3 colonnes symétriques
   (menu | montant | colonne vide) — le sélecteur de langue qui occupait
   la 3e colonne a été supprimé, mais la colonne vide reste nécessaire
   pour garder le montant réellement centré (un simple flex avec un seul
   élément à gauche l'aurait poussé vers la droite). */
.pgc-hero-amount-row {
  display: grid; grid-template-columns: 32px 1fr 32px; align-items: center;
  width: 100%;
  margin-bottom: 0;
}
/* Bouton menu (demande explicite : "ajoute un onglet de trois tirets...")
   à gauche du bandeau solde. Barres épaisses (demande explicite : "je
   veux que les barres soit ainsi et bien grand et visible") plutôt que
   l'icône fa-bars classique à traits fins — passé à 3 barres (au lieu de
   2) sur demande, toujours dans ce même style épais. */
.pgc-menu-wrap { position: relative; flex: 0 0 32px; margin-top: -32px; }
.pgc-menu-btn {
  width: 32px; height: 32px; border-radius: 50%;
  background: none; border: none; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  transition: background .18s;
}
.pgc-menu-btn:hover { background: rgba(255,255,255,.18); }
.pgc-menu-bar { width: 17px; height: 3px; border-radius: 99px; background: #fff; }

/* Tiroir plein écran (demande explicite : reproduire la référence
   fournie) — glisse depuis la gauche par-dessus tout le reste, voile
   sombre derrière, fermeture au clic sur le voile ou le "×". */
.pgc-menu-overlay {
  /* z-index 2400/2401 (pas 900/901) : le menu doit pouvoir s'ouvrir
     PAR-DESSUS une fenêtre modale déjà ouverte (ex. le bouton "trois
     traits" de #modal-contact, voir index.html) — .modal-overlay est à
     2000, donc rester sous 2000 le rendait invisible (ouvert mais caché
     derrière la modale). Reste sous les toasts/alertes critiques
     (3000+). */
  position: fixed; inset: 0; z-index: 2400;
  background: rgba(0,0,0,.5);
  opacity: 0; pointer-events: none;
  transition: opacity .25s ease;
}
.pgc-menu-overlay.open { opacity: 1; pointer-events: auto; }
.pgc-menu-drawer {
  position: fixed; top: 0; left: 0; bottom: 0; z-index: 2401;
  width: 82%; max-width: 340px;
  background: #fff;
  box-shadow: 8px 0 32px rgba(0,0,0,.25);
  transform: translateX(-100%);
  transition: transform .3s cubic-bezier(.32,.72,0,1);
  display: flex; flex-direction: column;
  overflow-y: auto;
}
.pgc-menu-drawer.open { transform: translateX(0); }

/* Bandeau de marque — nouveau modèle (demande explicite du 28/08 :
   "supprime le trait orange et enlève la croix, propose un autre
   modèle") : fond marine uni (plus de dégradé ni de liseré orange),
   sans bouton fermer dédié — le tiroir se ferme déjà au tap sur
   l'overlay (voir .pgc-menu-overlay, index.html). Avatar sur fond
   blanc plein pour se détacher davantage du fond uni. */
.pgc-menu-drawer-banner {
  position: relative; flex-shrink: 0;
  background: #0F0A2E;
  border-radius: 0 0 20px 20px;
  padding: 20px 18px;
}
.pgc-menu-drawer-id {
  display: flex; align-items: center; gap: 12px;
}
.pgc-menu-drawer-avatar {
  width: 42px; height: 42px; border-radius: 12px;
  background: #fff;
  display: flex; align-items: center; justify-content: center; overflow: hidden;
  flex-shrink: 0;
}
.pgc-menu-drawer-avatar img { width: 100%; height: 100%; object-fit: contain; }
.pgc-menu-drawer-initials {
  font-size: .92rem; font-weight: 800; color: #0F0A2E; letter-spacing: .02em;
}
.pgc-menu-drawer-brand-name { font-size: .95rem; font-weight: 800; color: #fff; letter-spacing: .01em; }

/* Bandeau en mode "client connecté" — SANS logo ni avatar (demande du
   2026-09-03) : intitulé « MON COMPTE », puis le SURNOM du client mis en
   avant (grand, resserré, avec un trait orange dessous = accent de marque),
   puis le numéro. Chevron à droite : la zone ouvre la section Profil.
   En invité, le logo + « KBINE PLUS » restent inchangés (voir
   _syncPgcDrawerBanner(), js/client.js). */
.pgc-menu-drawer-id-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pgc-menu-drawer-eyebrow {
  font-size: .52rem; font-weight: 800; letter-spacing: .16em;
  text-transform: uppercase; color: rgba(255,255,255,.42);
}
.pgc-menu-drawer-phone {
  display: flex; align-items: center; gap: 6px;
  font-size: .74rem; font-weight: 500; color: rgba(255,255,255,.62);
  letter-spacing: .03em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-variant-numeric: tabular-nums;
}
.pgc-menu-drawer-phone-ic { font-size: .58rem; color: rgba(255,255,255,.4); flex-shrink: 0; }
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-id { cursor: pointer; }
/* Pas de pastille pour un client connecté : le surnom porte seul. */
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-avatar { display: none; }
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-id-txt { gap: 4px; }
/* Intitulé et numéro en BLANC + GRAS (demande du 2026-09-03) — plus aucun
   texte atténué dans ce bandeau. Flèche retirée (demande du 2026-09-03). */
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-eyebrow {
  margin-bottom: 1px; color: #fff; font-weight: 800;
}
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-phone {
  color: #fff; font-weight: 700;
}
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-phone-ic { color: #fff; }
/* Le surnom : style particulier — grande capitale resserrée, blanc pur,
   souligné d'un court trait orange (accent KBINE PLUS). */
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-brand-name {
  position: relative; display: inline-block;
  font-size: 1.32rem; font-weight: 800; letter-spacing: -.025em; line-height: 1.1;
  color: #fff;
  max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  padding-bottom: 9px;
}
/* Soulignement du surnom : petite vaguelette BLANCHE (trait curviligne),
   même technique SVG que « Reprendre rapidement » / « Questions
   fréquentes » — ici en blanc pour ressortir sur le fond marine. */
.pgc-menu-drawer-banner.is-user .pgc-menu-drawer-brand-name::after {
  content: ""; position: absolute; left: 1px; bottom: 1px;
  width: 34px; height: 6px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='34' height='6' viewBox='0 0 34 6'%3E%3Cpath d='M1 4 Q 5.5 0.6 9 4 T 17 4 T 25 4 T 33 4' fill='none' stroke='white' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat left center;
  background-size: 34px 6px;
}

.pgc-menu-close {
  width: 28px; height: 28px; border-radius: 8px;
  background: rgba(0,0,0,.05); border: none; cursor: pointer;
  color: var(--gray-500); font-size: .78rem;
  display: flex; align-items: center; justify-content: center;
}
.pgc-menu-drawer-body { flex: 1; padding: 20px; display: flex; flex-direction: column; }
.pgc-menu-drawer-label {
  font-size: .66rem; font-weight: 800; color: var(--gray-500);
  text-transform: uppercase; letter-spacing: .08em;
  margin-bottom: 8px;
}
/* Liste : carte teintée + rail bleu marine à gauche pour l'item actif
   (::before), plutôt qu'une pastille pleine — icônes dans un badge rond. */
/* Modèle "carte + chevron" (demande explicite, référence fournie) :
   une seule carte blanche regroupant les 6 lignes, séparées par un
   filet fin, icône sobre + libellé + chevron à droite — remplace le
   modèle "sidebar" précédent (liste nue, badges colorés/monochromes). */
.pgc-menu-drawer-list--card .pgc-menu-drawer-item { border-radius: 0; }
.pgc-menu-drawer-item {
  position: relative;
  display: flex; align-items: center; gap: 12px;
  padding: 13px 4px;
  font-size: .92rem; font-weight: 500; color: #16121F; text-decoration: none;
  transition: background .15s;
}
/* :hover réservé à la souris réelle (demande explicite, bug corrigé) —
   sur tactile, un simple tap sur le bouton "trois traits" pour ouvrir
   ce tiroir simulait un survol qui restait "collé" sur l'item rendu
   sous le point de contact (souvent "Partenaires"/"Accueil" selon la
   position du doigt), donnant l'impression fausse qu'un item était
   sélectionné par défaut à chaque ouverture. Même correctif déjà
   appliqué à .op-card ailleurs dans ce fichier. */
@media (hover: hover) and (pointer: fine) {
  .pgc-menu-drawer-item:hover { background: #F8F9FC; }
}
.pgc-menu-drawer-item:active { background: #F0F2F7; }
.pgc-menu-drawer-item.active { background: #F4F5FA; }
.pgc-menu-drawer-txt { flex: 1; min-width: 0; }
.pgc-menu-drawer-ico {
  width: 20px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
}
.pgc-menu-drawer-ico i { color: #16121F; font-size: .92rem; }
.pgc-menu-drawer-chev { color: rgba(0,0,0,.25); font-size: .68rem; flex-shrink: 0; }

/* Ligne "Pharmacies de garde" — logo croix de pharmacie (img/phamarcie.jpg)
   à la place de l'icône FontAwesome, texte et chevron repris dans le
   même vert que ce logo plutôt que le noir/gris standard des autres
   lignes du tiroir. */
#pgc-drawer-pharmacies .pgc-menu-drawer-ico { width: 22px; height: 22px; }
#pgc-drawer-pharmacies .pgc-drawer-pharma-ico {
  width: 100%; height: 100%; object-fit: contain; border-radius: 4px;
}
#pgc-drawer-pharmacies .pgc-menu-drawer-txt,
#pgc-drawer-pharmacies .pgc-menu-drawer-chev { color: #16342B; }

/* Bloc connexion — bas du tiroir, invité uniquement (demande explicite
   du 25/08 : "ajoute un bouton Se connecter / Ouvrir un compte en
   bas"). margin-top:auto pousse le bloc en bas quand la liste ne
   remplit pas la hauteur disponible, tout en restant scrollable avec
   le reste si le tiroir est bas. */
.pgc-menu-drawer-auth {
  margin-top: auto; padding-top: 18px; border-top: 1px solid var(--gray-200);
  text-align: center;
}
.pgc-menu-drawer-login-btn {
  width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px;
  background: #0F0A2E; border: none; border-radius: 12px; padding: 12px;
  color: #fff; font-size: .8rem; font-weight: 800; font-family: var(--font);
  cursor: pointer; transition: opacity .15s;
}
.pgc-menu-drawer-login-btn:hover { opacity: .88; }
.pgc-menu-drawer-signup {
  margin-top: 12px; font-size: .68rem; color: var(--gray-500);
}
.pgc-menu-drawer-signup a {
  color: #0F0A2E; font-weight: 800; text-decoration: underline; cursor: pointer;
}

/* Déconnexion — même emplacement bas-de-tiroir que .pgc-menu-drawer-auth
   ci-dessus, mutuellement exclusifs (voir openPgcMenu(), js/client.js). */
.pgc-menu-drawer-logout {
  margin-top: auto; padding-top: 10px; border-top: 1px solid var(--gray-200);
}
/* Modèle sobre (demande du 2026-09-03 : "simple et pro") — action
   secondaire : contour discret, texte encre atténué, icône grise, aucun
   fond plein ni ombre. Se déconnecter ne doit pas peser autant qu'une
   action principale. */
.pgc-menu-drawer-item--logout {
  width: auto; margin: 0 auto; gap: 8px; cursor: pointer; justify-content: center;
  font-family: var(--font); text-align: center;
  color: #4A4658; font-weight: 600; font-size: .82rem;
  background: transparent;
  border: 1px solid var(--gray-200, #E5E7EF);
  border-radius: 10px;
  padding: 9px 24px;
  box-shadow: none;
  transition: background .15s, border-color .15s, color .15s, transform .1s;
}
.pgc-menu-drawer-item--logout i { font-size: .76rem; color: #9A96A8; transition: color .15s; }
@media (hover: hover) and (pointer: fine) {
  .pgc-menu-drawer-item--logout:hover {
    background: #FBFBFD; border-color: #D6D3E0; color: #16121F;
  }
  .pgc-menu-drawer-item--logout:hover i { color: #16121F; }
}
.pgc-menu-drawer-item--logout:active { background: #F4F5FA; transform: translateY(1px); }

/* Bouton "Besoin d'aide" flottant — icône seule, coin bas-droit, toujours
   visible (voir index.html, juste avant le tiroir de menu). */
.help-fab {
  position: fixed; right: 16px; bottom: 20px; z-index: 210;
  width: 52px; height: 52px; border-radius: 50%;
  background: linear-gradient(135deg, #1B234F, #0F0A2E);
  border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 1.1rem;
  box-shadow: 0 10px 24px rgba(15,10,46,.4);
  transition: transform .15s ease;
}
.help-fab:active { transform: scale(.94); }

/* Popover d'aide — deux symboles seuls (sans texte), agrandis, empilés
   juste au-dessus du bouton flottant (demande explicite du 25/08). */
.help-fab-popover {
  position: fixed; right: 16px; bottom: 84px; z-index: 211;
  display: flex; flex-direction: column; align-items: center; gap: 14px;
  opacity: 0; transform: translateY(8px) scale(.96);
  pointer-events: none; transition: opacity .18s, transform .18s;
}
.help-fab-popover.open { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
.help-fab-popover-item {
  width: 54px; height: 54px; border-radius: 50%; flex-shrink: 0;
  background: #fff; border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: #0F0A2E; font-size: 1.3rem;
  box-shadow: 0 8px 20px rgba(16,18,31,.2);
  transition: transform .15s;
}
.help-fab-popover-item:active { transform: scale(.92); }
.help-fab-popover-item--green { color: #25D366; }
/* position:relative + œil en position absolue : le chiffre du solde
   reste seul à centrer (le bouton œil, à côté, décalait sinon le
   groupe entier de sa moitié de largeur par rapport au QR en dessous). */
.pgc-hero-amount-wrap {
  position: relative; display: flex; align-items: center; justify-content: center;
  justify-self: center; width: fit-content;
}
.pgc-hero-amount-wrap .pgc-eye-btn {
  position: absolute; left: 100%; margin-left: 8px;
}
.pgc-hero-amount-row .pgc-balance-real {
  color: #fff; font-size: 1.55rem; letter-spacing: -.01em;
  display: inline-flex; align-items: baseline; gap: 4px;
}
/* Police dédiée (demande explicite, capture de référence externe : chiffres
   gras/arrondis) — Poppins 900, chargée à part (voir index.html), le reste
   du site garde Roboto. */
.pgc-hero-amount-row .pgc-amount-num { font-size: 1.55rem; font-weight: 900; font-family: 'Poppins', var(--font); }
.pgc-hero-amount-row .pgc-amount-cur { font-size: .8rem; font-weight: 700; opacity: .8; }
/* Format compact une fois repliée en barre flottante — voir
   .pgc-hero-card--stuck plus haut. Doit rester APRÈS les règles de base
   ci-dessus (même spécificité, l'ordre dans le fichier tranche). */
.pgc-hero-card--stuck .pgc-amount-num { font-size: 1rem; }
.pgc-hero-card--stuck .pgc-amount-cur { font-size: .62rem; }
.pgc-hero-card--stuck .pgc-balance-real { font-size: 1rem; }
/* Invité (voir index.html #hbc-guest) : plus de cadenas à côté des points
   masqués (supprimé, demande explicite), les points seuls sont agrandis
   pour occuper la place. */
#hbc-guest-dots { font-size: 2.1rem; letter-spacing: .08em; }
.pgc-eye-btn {
  flex: none;
  width: 16px; height: 16px; display: flex; align-items: center; justify-content: center;
  background: none; border: none; cursor: pointer; padding: 0;
  color: rgba(255,255,255,.8); font-size: .48rem;
  transition: color .18s;
  border-radius: 50%;
}
.pgc-eye-btn:hover { color: #fff; }
/* Réduit UNIQUEMENT une fois la carte repliée en barre flottante (voir
   _initPgcStickyWatch(), js/client.js) — demande explicite, la taille en
   haut de page normal reste inchangée. */
.pgc-hero-card--stuck .pgc-eye-btn { width: 12px; height: 12px; font-size: .36rem; }

/* ── Carte QR — à cheval sur la frontière bleu/blanc ──────────
   Marge supérieure négative pour chevaucher le bas de .pgc-hero-card ;
   coins arrondis + ombre portée pour donner du relief. */
.pgc-qr-card {
  position: relative; z-index: 160;
  width: fit-content; margin: -75px auto 0;
  padding: 20px;
  background: linear-gradient(135deg, #E4E6F2 0%, #ffffff 100%);
  border-radius: 28px;
  box-shadow: 0 16px 34px rgba(0,0,0,.22), 0 3px 8px rgba(0,0,0,.08);
  /* Même correctif que .pgc-hero-card juste au-dessus (couche de
     composition dédiée) : cette carte chevauche son bord bas via une
     marge négative, donc un glitch de rendu du bandeau après défilement
     l'affectait aussi visuellement. */
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}

/* ── Carte blanche interne : deuxième couche entre le fond teinté de
   .pgc-qr-card et le carré du QR, pour l'effet "carte à double-couche". */
.pgc-qr-inner {
  background: var(--white);
  border-radius: 20px;
  padding: 5px;
  box-shadow: 0 4px 14px rgba(0,0,0,.08);
}

/* ── Barre flottante "solde" — réapparaît en haut de l'accueil quand on
   défile assez loin (voir _initHomeFloatBalance, js/client.js). Cachée
   par défaut (transform + opacity) ; .hfb-visible la fait glisser depuis
   le haut. z-index au-dessus de .pgc-hero-card (150) puisqu'elle doit
   rester visible par-dessus le bandeau sticky une fois qu'on a défilé.
   display:none est géré séparément par showSection() (classe
   .home-only) pour les autres onglets. */
.hfb-bar {
  position: fixed; left: 0; right: 0; top: 0; z-index: 170;
  transform: translateY(-100%); opacity: 0; pointer-events: none;
  display: flex; align-items: center; justify-content: center; gap: 10px;
  background: #0F0A2E; color: #fff;
  padding: 9px 18px calc(9px + env(safe-area-inset-top, 0px));
  border-radius: 0;
  font-size: .9rem; font-weight: 700;
  box-shadow: 0 10px 26px rgba(0,0,0,.35);
  transition: transform .25s ease, opacity .25s ease;
}
.hfb-bar #hfb-amount { font-size: 1.1rem; color: #fff; }
.hfb-bar #hfb-amount .pgc-amount-cur { font-size: .66rem; font-weight: 700; opacity: .8; }
.hfb-bar i { color: rgba(255,255,255,.7); font-size: .85rem; }
.hfb-bar.hfb-visible { transform: translateY(0); opacity: 1; pointer-events: auto; }
.hfb-eye-btn {
  flex: none; width: 15px; height: 15px; display: flex; align-items: center; justify-content: center;
  background: none; border: none; cursor: pointer; padding: 0;
  color: #fff; font-size: .46rem; border-radius: 50%;
  transition: opacity .18s;
}
.hfb-eye-btn:hover { opacity: .75; }

/* ── Barre flottante "solde en attente" / "cabines connectées" /
   "réseaux indisponibles" (cabine) — même principe que .hfb-bar côté
   client : réapparaît en haut de l'écran une fois qu'on a défilé assez
   loin dans l'accueil (voir _initCabFloatBalance(), js/cabine.js).
   Cachée par défaut (transform + opacity) ; .cfb-visible la fait glisser
   depuis le haut. z-index au-dessus de .cab-topnav. */
.cfb-bar {
  position: fixed; left: 0; right: 0; top: 0; z-index: 170;
  transform: translateY(-100%); opacity: 0; pointer-events: none;
  display: flex; align-items: center; justify-content: center; gap: 9px;
  background: linear-gradient(150deg,#0F0A2E 0%,#1A1440 60%,#241C55 100%); color: #fff;
  padding: 10px 14px calc(10px + env(safe-area-inset-top, 0px));
  border-radius: 0;
  font-size: .74rem; font-weight: 700;
  box-shadow: 0 8px 20px rgba(0,0,0,.22);
  transition: transform .25s ease, opacity .25s ease;
  overflow: hidden;
}
.cfb-bar i { color: #fff; font-size: .68rem; }
.cfb-bar.cfb-visible { transform: translateY(0); opacity: 1; pointer-events: auto; }
.cfb-seg { display: flex; align-items: center; gap: 5px; flex-shrink: 0; min-width: 0; }
.cfb-sep { width: 1px; height: 14px; background: rgba(255,255,255,.25); flex-shrink: 0; }
#cfb-amount { font-size: .98rem; color: #fff; }
.cfb-seg--warn { min-width: 0; }
.cfb-seg--warn #cfb-net-text {
  font-size: .62rem; font-weight: 700; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 38vw;
}

.pgc-balance-real {
  font-size: 1.6rem; font-weight: 900; color: var(--gray-800);
  line-height: 1.1; letter-spacing: -.02em;
}

/* Bascule affichage/masquage du solde : le texte réel est remplacé par
   des points nets ("•• ••• FCFA", style app bancaire) — pas de flou.
   Le swap de texte est accompagné d'un petit fondu + zoom via cette
   classe transitoire (ajoutée/retirée en JS autour du changement). */
.pgc-balance-swap { animation: pgcBalanceSwap .32s ease; }
@keyframes pgcBalanceSwap {
  0%   { opacity: 1; transform: scale(1); }
  45%, 55% { opacity: 0; transform: scale(.85); }
  100% { opacity: 1; transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) { .pgc-balance-swap { animation: none; } }

/* ── Code QR, en grand, dans la carte QR ───────────────────── */
.pgc-qr-big-wrap { position: relative; display: inline-block; }
.pgc-qr-big {
  position: relative;
  width: 138px; height: 138px; padding: 5px;
  background: #fff; border: 1px solid var(--gray-200); border-radius: 18px;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; font-family: inherit;
  /* Occupe toute la largeur disponible sur un très petit écran plutôt
     que de dépasser (demande explicite du 25/08 : "adapte-le à un
     téléphone"). */
  max-width: 100%; box-sizing: border-box;
}
.pgc-qr-big-img { width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; }
/* Logo K+ incrusté au centre du QR (ecc=H côté génération pour rester
   scannable malgré la zone couverte). */
.pgc-qr-logo-badge {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 26px; height: 26px; border-radius: 50%;
  background: #fff; padding: 3px;
  box-shadow: 0 1px 5px rgba(0,0,0,.22);
  pointer-events: none;
  display: flex; align-items: center; justify-content: center;
  overflow: hidden;
}
.pgc-qr-logo-badge-img { width: 100%; height: 100%; object-fit: contain; }

/* "À propos"/"Contact"/"Partenaires" du tiroir de menu — plein écran
   (demande explicite) plutôt qu'une carte centrée : .modal-body défile
   seul, même bouton retour flottant "trois traits" (.modal-back-btn) sur
   les trois, aucune n'a de .modal-header.
   z-index abaissé à 1900 (au lieu des 2000 standard) : #modal-partenaires
   déclenche d'autres modales par-dessus lui (ex. #modal-partner-login,
   voir le portail d'accès) — à z-index égal, l'empilement dépendrait de
   l'ordre dans le DOM (fragile). Un z-index strictement inférieur aux
   modales d'action standard (2000) les fait toujours passer au-dessus,
   quel que soit leur ordre dans le document. */
#modal-contact.modal-overlay,
#modal-apropos.modal-overlay,
#modal-partenaires.modal-overlay,
#modal-mes-commandes-programmees.modal-overlay { padding: 0; z-index: 1900; }
#modal-contact .modal,
#modal-apropos .modal,
#modal-partenaires .modal,
#modal-mes-commandes-programmees .modal {
  max-width: none; width: 100%; height: 100%; max-height: none;
  border-radius: 0; margin: 0;
  display: flex; flex-direction: column;
}
#modal-contact .modal-body,
#modal-apropos .modal-body,
#modal-partenaires .modal-body,
#modal-mes-commandes-programmees .modal-body { flex: 1; overflow-y: auto; }

/* "Contact"/"À propos"/"Partenaires" : plus d'en-tête (.modal-header
   supprimé) — bouton retour flottant à la place, posé sur le bandeau
   bleu marine (ou le hero sombre pour Partenaires) en tête de contenu.
   Icône "trois traits" (.pgc-menu-bar, même style que le bouton menu
   principal) plutôt qu'une flèche : ouvre le menu (openPgcMenu()). */
.modal-back-btn {
  position: absolute; top: 24px; left: 16px; z-index: 5;
  width: 34px; height: 34px; border-radius: 50%;
  background: none; border: none;
  color: #fff; font-size: .82rem;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  cursor: pointer;
}

/* #cs-partenaires vivait jusqu'ici dans .client-page (padding 12px 20px,
   max-width 720px) en tant que .cs-section.active (display:flex, gap:20px,
   padding:0) — les deux disparaissent en devenant #modal-partenaires
   .modal-body, donc reproduits ici directement. padding-top 56px pour
   dégager le bouton retour flottant (top:24px + 34px de haut). */
#cs-partenaires {
  max-width: 720px; margin: 0 auto;
  padding: 56px 14px 24px;
  display: flex; flex-direction: column; gap: 20px;
}
@media (max-width: 600px) {
  #cs-partenaires { padding: 56px 10px 24px; }
}

/* Hero en plein bord (demande explicite : "un modèle comme à propos avec
   les trois traits dans la zone bleu marine") — tire la carte hero hors
   du padding de #cs-partenaires (marges négatives exactement égales à ce
   padding) pour qu'elle touche le haut et les côtés, comme le bandeau de
   #modal-contact/#modal-apropos ; le bouton retour flottant se retrouve
   ainsi posé sur le bleu marine plutôt que sur le blanc autour. Coins
   arrondis seulement en bas, comme ce même bandeau. padding calé sur
   celui de #modal-contact (contenu centré, icône ronde + titre +
   sous-titre — voir index.html — donc plus de risque de chevauchement
   avec le bouton "trois traits" en haut à gauche, contrairement à
   l'ancien badge qui y était collé). */
/* Défile avec le reste de #cs-partenaires (demande explicite du 28/08 :
   remplace l'ancien comportement sticky) — une fois hors champ, la
   barre flottante .cs-float-bar--modal ci-dessus prend le relais
   (titre centré + trois traits). Taille réduite (idem
   #cs-historique/#cs-profit/#cs-pharmacies, demande explicite). */
#cs-partenaires > .ph5-hero3:first-child {
  margin: -56px -14px 10px;
  padding: 15px 24px 13px;
  border-radius: 0 0 24px 24px;
  border-left: none; border-right: none; border-top: none;
}
@media (max-width: 600px) {
  #cs-partenaires > .ph5-hero3:first-child { margin: -56px -10px 10px; }
}

/* ── Scanner QR : flux caméra ──────────────────────────────── */
/* ══════════════════════════════════════════════════════════════
   SCANNER QR — viseur "coins en L" + ligne de balayage (thème
   indigo/orange KBINE, remplace l'ancien carré vert plein)
══════════════════════════════════════════════════════════════ */
.qrs-modal {
  background: #ffffff !important;
  border: 1px solid rgba(0,0,0,.08) !important;
  max-width: 300px; width: 100%; padding: 0; overflow: hidden;
}
.qrs-header {
  display: flex; align-items: center; justify-content: center;
  padding: 10px 14px 4px;
}
/* Poignée "bottom-sheet" (ni flèche ni croix, demande explicite) — on tape
   ou on glisse vers le bas dessus pour fermer (voir _qrsHandleSwipe(),
   js/client.js, pour le geste de glissement). */
.qrs-handle {
  width: 38px; height: 5px; border-radius: 3px; border: none; padding: 0;
  background: rgba(0,0,0,.15); cursor: pointer;
  transition: background .15s;
}
.qrs-handle:hover, .qrs-handle:active { background: rgba(0,0,0,.28); }

.qrs-video-wrap {
  position: relative; width: 100%; aspect-ratio: 1/1; max-width: 220px; margin: 14px auto 4px;
  border-radius: 16px; overflow: hidden; background: #000;
}
.qrs-video-wrap video { width: 100%; height: 100%; object-fit: cover; }
.qrs-frame { position: absolute; inset: 16%; pointer-events: none; }
.qrs-corner {
  position: absolute; width: 20px; height: 20px; border: 3px solid #FFCC99; border-radius: 4px;
  filter: drop-shadow(0 0 6px rgba(255,204,153,.6));
}
.qrs-corner--tl { top: 0; left: 0; border-right: none; border-bottom: none; }
.qrs-corner--tr { top: 0; right: 0; border-left: none; border-bottom: none; }
.qrs-corner--bl { bottom: 0; left: 0; border-right: none; border-top: none; }
.qrs-corner--br { bottom: 0; right: 0; border-left: none; border-top: none; }
.qrs-scanline {
  position: absolute; left: 0; right: 0; height: 2px;
  background: linear-gradient(90deg, transparent, #fff 20%, #FFCC99 50%, #fff 80%, transparent);
  box-shadow: 0 0 12px 1px rgba(255,255,255,.6);
  animation: qrs-scan 2.6s cubic-bezier(.45,0,.55,1) infinite;
}
@keyframes qrs-scan {
  0%   { top: 4%;  opacity: 0; }
  8%   { opacity: 1; }
  50%  { top: 96%; opacity: 1; }
  92%  { opacity: 1; }
  100% { top: 4%;  opacity: 0; }
}
.qrs-status { text-align: center; font-size: .7rem; color: rgba(0,0,0,.55); font-weight: 600; margin: 10px 0 2px; }
.qrs-modal .modal-body { padding: 14px 16px 16px; }

/* Séparateur (encore utilisé par d'autres cartes) */
.pgc-sep {
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255,98,0,.42) 25%, rgba(255,150,0,.42) 75%, transparent);
  position: relative; z-index: 1;
}

/* Boutons action (anciens cercles, conservés pour compatibilité) */
.pgc-actions {
  display: flex; justify-content: space-between; align-items: stretch;
  gap: 8px; position: relative; z-index: 1;
}
.pgc-actions--panel { gap: 4px; }

/* ══════════════════════════════════════════════════════════════
   BOUTONS CERCLE — DESIGN MODERNE (orange · vert)
══════════════════════════════════════════════════════════════ */
.pgc-circ-grid {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 2px 0;
}

.pgc-circ-btn {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  background: none; border: none; cursor: pointer;
  padding: 10px 4px 8px; border-radius: 16px;
  font-family: var(--font);
  transition: transform .2s cubic-bezier(.34,1.4,.64,1);
  -webkit-tap-highlight-color: transparent; position: relative;
}
.pgc-circ-btn:hover  { transform: translateY(-4px); }
.pgc-circ-btn:active { transform: scale(.86); }

/* Cercle de base */
.pgc-circ-ico {
  width: 60px; height: 60px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.4rem; color: #fff;
  position: relative; overflow: hidden;
  transition: box-shadow .22s;
}
/* Reflet verre sur moitié haute */
.pgc-circ-ico::before {
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(255,255,255,.28) 0%, transparent 55%);
  border-radius: 50%; pointer-events: none; z-index: 1;
}
/* L'icône passe devant le reflet */
.pgc-circ-ico > i { position: relative; z-index: 2; }

.pgc-circ-lbl {
  font-size: .64rem; font-weight: 900;
  text-align: center; line-height: 1.2;
  max-width: 64px; letter-spacing: .01em;
}

/* ──────────────────────────────────────────────────────────
   COULEURS (parent+enfant → spécificité plus élevée)
   Orange : #FF6200 · #FF9A3C · #FFB830
   Vert   : #009A44 · #34D399 · #20C997
────────────────────────────────────────────────────────── */

/* ORANGE VIF — Recharger */
.pgc-circ-btn--cta .pgc-circ-ico {
  background: linear-gradient(145deg, #FF9A3C, #FF5C00);
  box-shadow: 0 6px 18px rgba(255,92,0,.55), 0 0 0 3px rgba(255,92,0,.22);
}
.pgc-circ-btn--cta .pgc-circ-lbl { color: #FFBE80; }

/* ORANGE-ROUGE — Dépenses */
.pgc-circ-btn--depense .pgc-circ-ico {
  background: linear-gradient(145deg, #FF7B54, #E83A14);
  box-shadow: 0 6px 18px rgba(232,58,20,.5), 0 0 0 3px rgba(232,58,20,.2);
}
.pgc-circ-btn--depense .pgc-circ-lbl { color: #FFB5A0; }

/* VERT ÉMERAUDE — Transférer */
.pgc-circ-btn--transfer .pgc-circ-ico {
  background: linear-gradient(145deg, #42E6A4, #0BA36C);
  box-shadow: 0 6px 18px rgba(11,163,108,.55), 0 0 0 3px rgba(11,163,108,.22);
}
.pgc-circ-btn--transfer .pgc-circ-lbl { color: #7EFAD4; }

/* VERT LIME — Historique */
.pgc-circ-btn--history .pgc-circ-ico {
  background: linear-gradient(145deg, #6EF098, #1A9E40);
  box-shadow: 0 6px 18px rgba(26,158,64,.5), 0 0 0 3px rgba(26,158,64,.2);
}
.pgc-circ-btn--history .pgc-circ-lbl { color: #A4F7BE; }

/* ORANGE DORÉ — Facture */
.pgc-circ-btn--facture .pgc-circ-ico {
  background: linear-gradient(145deg, #FFCB5A, #FF8C00);
  box-shadow: 0 6px 18px rgba(255,140,0,.55), 0 0 0 3px rgba(255,140,0,.22);
}
.pgc-circ-btn--facture .pgc-circ-lbl { color: #FFE3A0; }

/* VERT CLAIR — Recharge UV */
.pgc-circ-btn--uv .pgc-circ-ico {
  background: linear-gradient(145deg, #82F5C8, #12B886);
  box-shadow: 0 6px 18px rgba(18,184,134,.5), 0 0 0 3px rgba(18,184,134,.2);
}
.pgc-circ-btn--uv .pgc-circ-lbl { color: #B2FBE2; }

/* ORANGE FEU — Exchange */
.pgc-circ-btn--exchange .pgc-circ-ico {
  background: linear-gradient(145deg, #FFB366, #F76B1C);
  box-shadow: 0 6px 18px rgba(247,107,28,.55), 0 0 0 3px rgba(247,107,28,.22);
}
.pgc-circ-btn--exchange .pgc-circ-lbl { color: #FFD4A8; }

/* VERT FORÊT — Cadeau */
.pgc-circ-btn--gift .pgc-circ-ico {
  background: linear-gradient(145deg, #4ADEA6, #087852);
  box-shadow: 0 6px 18px rgba(8,120,82,.55), 0 0 0 3px rgba(8,120,82,.22);
}
.pgc-circ-btn--gift .pgc-circ-lbl { color: #8FF5D0; }

/* Cadeau débloqué — pulsation dorée */
.pgc-circ-btn--gift-ready .pgc-circ-ico {
  background: linear-gradient(145deg, #FFE066, #F59E0B) !important;
  box-shadow: 0 6px 22px rgba(245,158,11,.65), 0 0 0 3px rgba(245,158,11,.25) !important;
}
.pgc-circ-btn--gift-ready .pgc-circ-ico::after {
  content:''; position:absolute; inset:-7px; border-radius:50%;
  background: rgba(245,158,11,.18);
  will-change: transform, opacity;
  animation: cadeau-pulse 1.6s ease-in-out infinite;
}
.pgc-circ-btn--gift-ready .pgc-gift-lbl { color:#FFE580 !important; }

/* ── Panel unifié — une seule section ───────────────────── */
/* .pgc-sticky-wrap et .pgc-panel sont maintenant deux enfants directs de
   .cs-section.active (display:flex, gap:20px) — le margin-top négatif
   annule ce gap pour retrouver l'écart de 10px voulu entre les deux.
   Même couleur que .home-section (bloc "Actualités"), pour rester
   cohérent visuellement avec le reste de l'accueil. */
.pgc-panel {
  position: relative; z-index: 1;
  margin: -10px 12px 0;
  padding: 14px 14px 8px;
  background: rgba(255,255,255,.03);
  border: 1.5px solid rgba(255,255,255,.08);
  border-radius: 20px;
  display: flex; flex-direction: column; gap: 10px;
}

/* ── Boutons alignés horizontalement : le conteneur est en ligne
   (flex-direction:row) avec retour à la ligne, chaque bouton est un
   petit bloc icône-au-dessus-du-libellé pour rester compact côte à
   côte (4 par rangée), espacement régulier via gap. */
.pgc-action-list { display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: space-between; gap: 24px 22px; }
.pgc-action-row {
  display: flex; flex-direction: column; align-items: center; gap: 7px;
  flex: 1 1 0; min-width: 0; background: none; border: none; cursor: pointer; font-family: inherit;
  padding: 2px; text-align: center;
  transition: transform .15s;
}
.pgc-action-row:active { transform: scale(.94); }

.pgc-act-ico {
  position: relative; overflow: hidden;
  width: 48px; height: 48px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.3rem;
  border: none;
}
.pgc-act-ico i, .pgc-act-ico svg { position: relative; z-index: 1; }
.pgc-act-lbl { font-size: .72rem; font-weight: 700; color: #000; text-align: center; line-height: 1.25; letter-spacing: .01em; }
/* Adapté aux petits écrans (demande explicite) : icônes/texte légèrement
   réduits pour garder un espacement net entre les 4 boutons plutôt que
   de les tasser bord à bord. */
@media (max-width: 380px) {
  .pgc-act-ico { width: 42px; height: 42px; font-size: .95rem; }
  .pgc-act-lbl { font-size: .66rem; }
}

.pgc-act-ico--green  { background: #E3F9EC; color: #16A34A; }
.pgc-act-ico--orange { background: linear-gradient(145deg, #FF8A3D, #E85400); color: #fff; --act-shadow: rgba(232,84,0,.45); }
.pgc-act-ico--brand  { background: #FFEDE0; color: #E8630D; }
.pgc-act-ico--indigo { background: linear-gradient(145deg, #818CF8, #4338CA); color: #fff; --act-shadow: rgba(67,56,202,.45); }
.pgc-act-ico--amber  { background: linear-gradient(145deg, #FBBF24, #B45309); color: #fff; --act-shadow: rgba(180,83,9,.45); }
.pgc-act-ico--pink   { background: linear-gradient(145deg, #F472B6, #BE185D); color: #fff; --act-shadow: rgba(190,24,93,.45); }
.pgc-act-ico--blue   { background: #EEF0FF; color: #6366F1; }

/* Séparateur central avec badge */
.pgc-panel-sep {
  display: flex; align-items: center; gap: 8px;
  margin: 10px 0;
}
.pgc-panel-sep-line {
  flex: 1; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.1));
}
.pgc-panel-sep-line:last-child {
  background: linear-gradient(270deg, transparent, rgba(255,255,255,.1));
}
.pgc-panel-sep-badge {
  display: flex; align-items: center; gap: 5px;
  background: linear-gradient(135deg, rgba(245,158,11,.18), rgba(251,191,36,.08));
  border: 1px solid rgba(245,158,11,.28);
  border-radius: 20px;
  padding: 3px 10px;
  font-size: .55rem; font-weight: 800; color: #fbbf24;
  letter-spacing: .06em; white-space: nowrap;
}
.pgc-panel-sep-badge i { font-size: .5rem; color: #f59e0b; }
.pgc-panel-sep-badge span {
  background: rgba(245,158,11,.25); border-radius: 8px;
  padding: 1px 5px; font-size: .5rem; color: #fde68a;
}

/* Carte encadrée autour de chaque bouton */
.pgc-circ {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px;
  background: none;
  border: none;
  border-radius: 0; padding: 10px 4px 8px;
  cursor: pointer; font-family: var(--font);
  transition: transform .18s;
  -webkit-tap-highlight-color: transparent;
}
.pgc-circ:hover { transform: translateY(-3px); }
.pgc-circ:active { transform: scale(.92); }

.pgc-circ-ico {
  width: 52px; height: 52px; border-radius: 50%;
  background: rgba(255,255,255,.07);
  border: 1.5px solid rgba(255,255,255,.12);
  display: flex; align-items: center; justify-content: center;
  font-size: .95rem; color: rgba(255,255,255,.7);
  transition: all .22s cubic-bezier(.34,1.56,.64,1);
  box-shadow: 0 2px 8px rgba(0,0,0,.2);
}
.pgc-circ:hover .pgc-circ-ico { transform: scale(1.06); }
.pgc-circ span {
  font-size: .55rem; font-weight: 700; color: rgba(255,255,255,.45); letter-spacing: .2px;
}

.pgc-circ--cta .pgc-circ-ico {
  background: linear-gradient(135deg, #FF6200, #FF9500);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(255,98,0,.5);
}
.pgc-circ--cta span { color: #FFB060; }
.pgc-circ--cta:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(255,98,0,.65); }

.pgc-circ--transfer .pgc-circ-ico {
  background: linear-gradient(135deg, #6366f1, #8b5cf6);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(99,102,241,.45);
}
.pgc-circ--transfer span { color: #a78bfa; }
.pgc-circ--transfer:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(99,102,241,.65); }

.pgc-circ--facture .pgc-circ-ico {
  background: linear-gradient(135deg, #f59e0b, #d97706);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(245,158,11,.45);
}
.pgc-circ--facture span { color: #fbbf24; }
.pgc-circ--facture:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(245,158,11,.65); }

.pgc-circ--uv .pgc-circ-ico {
  background: linear-gradient(135deg, #06b6d4, #0284c7);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(6,182,212,.45);
}
.pgc-circ--uv span { color: #67e8f9; }
.pgc-circ--uv:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(6,182,212,.65); }

.pgc-circ--exchange .pgc-circ-ico {
  background: linear-gradient(135deg, #8b5cf6, #6d28d9);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(139,92,246,.45);
}
.pgc-circ--exchange span { color: #c4b5fd; }
.pgc-circ--exchange:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(139,92,246,.65); }

.pgc-circ--gift .pgc-circ-ico {
  background: linear-gradient(135deg, #ec4899, #be185d);
  border-color: transparent; color: #fff;
  box-shadow: 0 4px 18px rgba(236,72,153,.45);
}
.pgc-circ--gift span { color: #f9a8d4; }
.pgc-circ--gift:hover .pgc-circ-ico { box-shadow: 0 6px 24px rgba(236,72,153,.65); }

/* Cadeau débloqué : bouton doré + pulsation GPU */
.pgc-circ--gift-ready .pgc-circ-ico {
  background: linear-gradient(135deg, #f59e0b, #fbbf24) !important;
  box-shadow: 0 4px 18px rgba(251,191,36,.55) !important;
  position: relative; overflow: visible;
}
.pgc-circ--gift-ready .pgc-circ-ico::after {
  content: ''; position: absolute; inset: -4px; border-radius: 50%;
  background: rgba(251,191,36,.28);
  will-change: transform, opacity;
  animation: cadeau-pulse 1.6s ease-in-out infinite;
}
.pgc-circ--gift-ready .pgc-gift-lbl { color: #fde68a !important; font-weight: 800 !important; }
@keyframes cadeau-pulse {
  0%,100% { opacity: .3; transform: scale(1); }
  50%      { opacity: .7; transform: scale(1.25); }
}

/* ── Modal Cadeau récompense ─────────────────────────────── */

/* Vue progression — anneau bleu/navy avec badge cadeau au centre, titre
   souligné, barre avec libellé "X/100" incrusté, et statistiques du bas
   regroupées dans une pastille navy (demande explicite, sur le modèle
   d'une capture de référence). */
.cadeau-prog-wrap { display:flex; flex-direction:column; align-items:center; padding:8px 0 4px; text-align:center; }
.cadeau-prog-ring-wrap { position:relative; width:140px; height:140px; margin-bottom:18px; }
.cadeau-prog-spark { position:absolute; color:#93c5fd; font-size:.55rem; }
.cadeau-prog-spark--1 { top:6px;  left:14px; }
.cadeau-prog-spark--2 { top:22px; right:2px; font-size:.4rem; }
.cadeau-prog-spark--3 { bottom:16px; left:0; font-size:.42rem; }
.cadeau-prog-dot-pivot { position:absolute; inset:0; transition: transform .6s ease; }
.cadeau-prog-dot {
  position:absolute; top:1px; left:50%; transform:translateX(-50%);
  width:13px; height:13px; border-radius:50%; background:#0a1330;
  box-shadow: 0 0 0 3px #fff, 0 2px 8px rgba(10,19,48,.4);
}
.cadeau-prog-center {
  position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
}
.cadeau-prog-gift-badge {
  width:30px; height:30px; border-radius:50%; margin-bottom:2px;
  background:rgba(10,19,48,.06); color:#0a1330;
  display:flex; align-items:center; justify-content:center; font-size:.85rem;
}
.cadeau-prog-num  { font-size:1.7rem; font-weight:900; color:#0A0A0F; line-height:1; }
.cadeau-prog-num-lbl { font-size:.6rem; color:rgba(0,0,0,.4); font-weight:700; text-transform:uppercase; letter-spacing:.03em; }
.cadeau-prog-title {
  font-size:1rem; font-weight:900; color:#0A0A0F; margin-bottom:8px; position:relative; display:inline-block;
}
.cadeau-prog-title-line {
  display:block; width:36px; height:3px; border-radius:2px; margin:6px auto 0;
  background: linear-gradient(90deg,#60a5fa,#0a1330);
}
.cadeau-prog-sub  { font-size:.75rem; color:rgba(0,0,0,.45); line-height:1.5; margin-bottom:16px; max-width:260px; }
.cadeau-prog-sub strong { color:rgba(0,0,0,.8); }
.cadeau-prog-bar-wrap {
  position:relative; width:100%; height:26px; background:#0a1330; border-radius:999px;
  overflow:hidden; margin-bottom:14px; display:flex; align-items:center;
}
.cadeau-prog-bar {
  position:absolute; inset:0; height:100%; border-radius:999px;
  background: linear-gradient(90deg,#1e3a8a,#3b82f6,#60a5fa);
  transition:width .6s ease;
}
.cadeau-prog-bar-label {
  position:relative; z-index:1; padding-left:14px;
  font-size:.7rem; font-weight:800; color:#fff;
}
.cadeau-prog-stats {
  display:flex; align-items:center; justify-content:center; gap:14px; width:100%;
  background:#0a1330; border-radius:999px; padding:10px 16px;
}
.cadeau-prog-stat {
  flex:1; display:flex; align-items:center; justify-content:center; gap:6px;
  font-size:.66rem; font-weight:700; color:rgba(255,255,255,.85);
}
.cadeau-prog-stat i { color:#60a5fa; font-size:.7rem; }
.cadeau-prog-stat-sep { width:1px; height:16px; background:rgba(255,255,255,.15); flex-shrink:0; }
.cadeau-prog-cycle {
  margin-top:12px; padding:5px 12px;
  background:rgba(251,191,36,.1); border:1px solid rgba(251,191,36,.3); border-radius:20px;
  font-size:.6rem; color:#b45309; font-weight:700;
}

/* Vue débloquée */
.cadeau-unlock-wrap { display:flex; flex-direction:column; align-items:center; padding:10px 0; text-align:center; }
.cadeau-confetti {
  display:flex; gap:8px; align-items:center; margin-bottom:8px;
  will-change: transform, opacity;
  animation:cadeau-stars .8s ease both;
}
@keyframes cadeau-stars {
  from { opacity:0; transform:scale(.5) translateY(8px); }
  to   { opacity:1; transform:scale(1)  translateY(0);   }
}
.cadeau-unlock-icon {
  font-size:3rem; margin-bottom:8px;
  will-change: transform;
  animation:cadeau-bounce .7s ease .3s both;
}
@keyframes cadeau-bounce {
  0%   { transform:scale(.6);  }
  70%  { transform:scale(1.15);}
  100% { transform:scale(1);   }
}
.cadeau-unlock-title {
  font-size:1.2rem; font-weight:900; color:#0A0A0F;
  background: linear-gradient(135deg,#f59e0b,#ec4899);
  -webkit-background-clip:text; -webkit-text-fill-color:transparent;
  margin-bottom:6px;
}
.cadeau-unlock-sub { font-size:.75rem; color:rgba(0,0,0,.5); line-height:1.5; margin-bottom:18px; }
.cadeau-unlock-sub strong { color:rgba(0,0,0,.8); }
.cadeau-scratch-wrap {
  position: relative; width: 100%; margin-bottom: 18px;
  border-radius: 14px; overflow: hidden;
}
.cadeau-reward-card {
  display:flex; align-items:center; gap:14px;
  background:linear-gradient(135deg,rgba(245,158,11,.12),rgba(251,191,36,.06));
  border:1.5px solid rgba(245,158,11,.3); border-radius:14px;
  padding:16px 22px; width:100%; box-sizing: border-box;
}
.cadeau-reward-amount { font-size:1.3rem; font-weight:900; color:#b45309; }
.cadeau-reward-label  { font-size:.62rem; color:rgba(0,0,0,.45); font-weight:600; }
/* Carte à gratter par-dessus .cadeau-reward-card — voir _initCadeauScratch(),
   js/client.js, qui dessine la texture argentée et efface au doigt/à la
   souris (globalCompositeOperation:'destination-out'). */
.cadeau-scratch-canvas {
  position: absolute; inset: 0;
  border-radius: 14px;
  cursor: grab; touch-action: none;
}
.cadeau-scratch-canvas:active { cursor: grabbing; }
.cadeau-claim-btn {
  width:100%; padding:14px; border:none; border-radius:12px; cursor:pointer;
  background:linear-gradient(135deg,#f59e0b,#ec4899);
  color:#fff; font-size:.9rem; font-weight:800;
  display:flex; align-items:center; justify-content:center; gap:10px;
  box-shadow: 0 6px 24px rgba(236,72,153,.4);
  transition:opacity .2s, transform .2s;
}
.cadeau-claim-btn:hover { opacity:.9; transform:translateY(-2px); }

/* ── Styles modals nouveaux services ───────────────────────── */
.svc-modal { background: #2B3A55; border-radius: 20px; max-height: 92vh; overflow-y: auto; padding: 0; }
/* Facture/Recharge UV/Exchange (espace client uniquement — jamais
   #modal-cab-uv côté cabine) : même dégradé violet/marine + bordure
   orange que la vitrine KBINE PLUS/carte "Invitez vos amis"/modales
   Recharger/Transférer. */
#modal-facture .svc-modal,
#modal-exchange .svc-modal {
  background: linear-gradient(145deg, #17103a 0%, #1e1248 55%, #120c2c 100%);
  border: 1.5px solid rgba(255,98,0,.22);
  border-top: 2px solid rgba(255,98,0,.45);
  box-shadow: 0 20px 60px rgba(0,0,0,.5), 0 0 0 1px rgba(255,98,0,.08) inset;
}
.svc-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 18px 12px; border-bottom: 1px solid rgba(255,255,255,.07); }
.svc-modal-title { display: flex; align-items: center; gap: 10px; font-size: .9rem; font-weight: 800; color: #fff; }
.svc-modal-title i { font-size: 1rem; }
.svc-modal-close { width: 32px; height: 32px; border-radius: 50%; background: rgba(255,255,255,.08); border: none; color: rgba(255,255,255,.6); cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: .85rem; }
.svc-modal-body { padding: 16px; }

/* Modale Cadeau : seule instance de .svc-modal en fond blanc/texte foncé
   (demande explicite) — Facture/Recharge UV/Exchange gardent le dégradé
   sombre ci-dessus, partagé entre elles trois uniquement. */
#modal-cadeau .svc-modal {
  background: #ffffff;
  border: none;
  box-shadow: 0 20px 60px rgba(0,0,0,.18);
}
/* Poignée "bottom-sheet" (ni flèche ni croix, demande explicite) — même
   patron que .qrs-handle (scanner QR) : on tape ou on glisse vers le bas
   dessus pour fermer. */
.cadeau-handle {
  display: block; width: 38px; height: 5px; border-radius: 3px;
  border: none; padding: 0; margin: 12px auto 0;
  background: rgba(0,0,0,.15); cursor: pointer; transition: background .15s;
}
.cadeau-handle:hover, .cadeau-handle:active { background: rgba(0,0,0,.28); }

/* Modale Recharge UV : même traitement que Cadeau ci-dessus (demande
   explicite), mais ses 6 étapes réutilisent les classes .svc-* GÉNÉRIQUES
   partagées avec Facture/Exchange (qui gardent leur fond sombre) — chaque
   override est donc scopé à #modal-uv plutôt que d'être posé sur la classe
   de base, pour ne jamais affecter les deux autres modales. */
#modal-uv .svc-modal {
  background: #ffffff;
  border: 1.5px solid rgba(255,98,0,.22);
  border-top: 2px solid rgba(255,98,0,.45);
  box-shadow: 0 20px 60px rgba(0,0,0,.18), 0 0 0 1px rgba(255,98,0,.08) inset;
}
#modal-uv .svc-modal-header { border-bottom-color: rgba(0,0,0,.07); }
#modal-uv .svc-modal-close  { background: rgba(0,0,0,.05); color: rgba(0,0,0,.5); }
#modal-uv .svc-frais-badge  { background: rgba(245,158,11,.12); color: #b45309; border-color: rgba(245,158,11,.35); }
#modal-uv .svc-stepper-dot  { color: rgba(0,0,0,.35); background: #F1F3F8; border-color: #E0E4EC; }
#modal-uv .svc-stepper-line { background: #E8ECF4; }
#modal-uv .svc-step-head-title { color: #0A0A0F; }
#modal-uv .svc-field .svc-label,
#modal-uv .svc-label { color: rgba(0,0,0,.55); }
#modal-uv .svc-input {
  background: #F8F9FC; border-color: #E0E4EC; color: #0A0A0F;
}
#modal-uv .svc-input:focus { background: #fff; }
#modal-uv .svc-input::placeholder { color: rgba(0,0,0,.3); }
#modal-uv .svc-net-btn      { background: #F8F9FC; }
#modal-uv .svc-net-btn:hover { background: #F1F3F8; }
#modal-uv .svc-net-btn.active { background: #F1F3F8; }
#modal-uv .svc-net-btn-check { background: rgba(0,0,0,.1); }
#modal-uv .svc-back-btn { border-color: #E0E4EC; color: rgba(0,0,0,.5); }
#modal-uv .svc-back-btn:hover { background: #F1F3F8; color: rgba(0,0,0,.8); }
#modal-uv .tf-recap-timer { background: #F1F3F8; color: rgba(0,0,0,.55); }
#modal-uv .svc-recap-rows { background: #F8F9FC; border-color: #E8ECF4; }
#modal-uv .svc-recap-row  { border-bottom-color: #EEF1F6; }
#modal-uv .svc-recap-row span { color: rgba(0,0,0,.5); }
#modal-uv .svc-recap-row strong { color: #0A0A0F; }
#modal-uv .svc-recap-row--total span { color: rgba(0,0,0,.7); }
#modal-uv .svc-confirm-title { color: #0A0A0F; }
/* Transfert client à client (page #cs-transferer) — même fond blanc que
   #modal-uv, mêmes composants partagés (.svc-back-btn/.svc-recap-row)
   donc mêmes surcharges nécessaires pour ne pas laisser le texte blanc
   par défaut illisible sur fond clair. */
#cs-transferer .svc-back-btn { border-color: #E0E4EC; color: rgba(0,0,0,.5); }
#cs-transferer .svc-back-btn:hover { background: #F1F3F8; color: rgba(0,0,0,.8); }
#cs-transferer .svc-recap-rows { background: #F8F9FC; border-color: #E8ECF4; }
#cs-transferer .svc-recap-row  { border-bottom-color: #EEF1F6; }
#cs-transferer .svc-recap-row span { color: rgba(0,0,0,.5); }
#cs-transferer .svc-recap-row strong { color: #0A0A0F; }
#cs-transferer .svc-recap-row--total span { color: rgba(0,0,0,.7); }
#modal-uv .svc-confirm-sub   { color: rgba(0,0,0,.5); }
/* Éléments en style inline dans index.html (champ numéro étape 2, montant
   étape 2, note "solde disponible" étape 4, en-tête récap étape 5) —
   inline, donc pas atteignables depuis une classe : voir index.html. */

/* Progression (étapes) — pastilles numérotées reliées */
.svc-stepper { display: flex; align-items: center; margin-bottom: 22px; padding: 4px 2px; }
.svc-stepper-dot {
  width: 25px; height: 25px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .64rem; font-weight: 800; font-family: var(--font);
  color: rgba(255,255,255,.35); background: rgba(255,255,255,.05);
  border: 2px solid rgba(255,255,255,.12);
  position: relative; z-index: 1;
  transition: background .3s, border-color .3s, color .3s, box-shadow .3s, transform .3s;
}
.svc-stepper-dot.current {
  background: linear-gradient(145deg, #FF9A3C, #FF6200);
  border-color: transparent; color: #fff;
  box-shadow: 0 0 0 4px rgba(255,98,0,.2), 0 4px 14px rgba(255,98,0,.45);
  transform: scale(1.15);
}
.svc-stepper-dot.done {
  background: linear-gradient(145deg, #FF9A3C, #FF6200);
  border-color: transparent; color: #fff; font-size: .58rem;
  box-shadow: 0 2px 8px rgba(255,98,0,.3);
}
.svc-stepper-line {
  flex: 1; height: 3px; border-radius: 3px;
  background: rgba(255,255,255,.1); margin: 0 -1px;
  transition: background .35s;
}
.svc-stepper-line.done { background: linear-gradient(90deg, #FF6200, #FF9A3C); }

/* En-tête d'étape — icône + titre, sans encadré */
.svc-step-head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.svc-step-head-ico {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  background: rgba(255,98,0,.12); border: 1px solid rgba(255,146,0,.3);
  display: flex; align-items: center; justify-content: center;
  color: var(--primary); font-size: .95rem;
}
.svc-step-head-title { font-size: .85rem; font-weight: 800; color: #fff; }

/* Grille services */
/* Icône en pastille pleine couleur + pilule nom, même modèle que
   .svc-net-btn ci-dessus — teinte propre à chaque service via --sc. */
.fact-services-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
.fact-svc-card {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  background: rgba(255,255,255,.04);
  border: 1.5px solid color-mix(in srgb, var(--sc, #fff) 40%, transparent);
  border-radius: 16px; padding: 14px 8px; text-align: center; cursor: pointer; transition: all .2s;
}
.fact-svc-card:hover { background: rgba(255,255,255,.08); transform: translateY(-2px); }
.fact-svc-card i {
  width: 38px; height: 38px; border-radius: 12px; margin: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem; background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,.25);
}
.fact-svc-card span {
  background: #fff; color: #1a1a2e;
  font-size: .58rem; font-weight: 900;
  padding: 5px 9px; border-radius: 999px;
  white-space: nowrap; display: block;
  box-shadow: 0 2px 6px rgba(0,0,0,.15);
}
.fact-svc-card.cie { --sc:#FF9500; } .fact-svc-card.cie i { color: #FF9500; }
.fact-svc-card.sodeci { --sc:#0066CC; } .fact-svc-card.sodeci i { color: #38bdf8; }
.fact-svc-card.canal { --sc:#C8A600; } .fact-svc-card.canal i { color: #fbbf24; }
.fact-svc-card.sotra { --sc:#22c55e; } .fact-svc-card.sotra i { color: #22c55e; }
.fact-svc-card.active {
  border-color: var(--sc, #FF6200);
  background: rgba(255,255,255,.06);
  box-shadow: 0 0 0 1px var(--sc, #FF6200);
}
.fact-svc-card.active span { color: var(--sc, #FF6200); }

.svc-field { margin-bottom: 14px; }
.svc-label { font-size: .72rem; font-weight: 700; color: rgba(255,255,255,.55); margin-bottom: 6px; display: block; }
.svc-input { width: 100%; background: rgba(255,255,255,.06); border: 1.5px solid rgba(255,255,255,.12); border-radius: 10px; padding: 11px 14px; color: #fff; font-size: .85rem; outline: none; box-sizing: border-box; }
.svc-input:focus { border-color: rgba(255,98,0,.5); background: rgba(255,255,255,.08); }
.svc-input::placeholder { color: rgba(255,255,255,.45); }

/* Boutons réseau — pastille logo carrée + pilule nom, teintés en
   permanence par leur couleur de marque (--net-clr, posée en inline-style
   sur chaque bouton), intensifiés à la sélection. Même modèle que
   .op-card/.rch-mth/.pm-row. */
.svc-net-row { display: flex; gap: 8px; }
.svc-net-btn {
  position: relative;
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px;
  background: rgba(255,255,255,.04);
  border: 1.5px solid color-mix(in srgb, var(--net-clr, #fff) 40%, transparent);
  border-radius: 16px; padding: 12px 6px; cursor: pointer; transition: all .2s;
}
.svc-net-btn:hover { background: rgba(255,255,255,.08); transform: translateY(-2px); }
.svc-net-btn.active {
  border-color: var(--net-clr, #FF6200);
  background: rgba(255,255,255,.06);
  box-shadow: 0 0 0 1px var(--net-clr, #FF6200);
  animation: svcNetPop .35s cubic-bezier(.34,1.56,.64,1);
}
/* Petit "pop" à l'activation d'un réseau + pastille qui respire en
   continu tant qu'il reste actif (voir .svc-net-btn-check::after) —
   même langage d'animation que .cab-online-dot/.net-chip-pulse ailleurs
   dans l'app. */
@keyframes svcNetPop {
  0%   { transform: scale(1); }
  45%  { transform: scale(1.06); }
  100% { transform: scale(1); }
}
.svc-net-btn-check {
  position: absolute; top: 6px; right: 6px;
  width: 16px; height: 16px; border-radius: 50%;
  background: rgba(255,255,255,.15); color: transparent;
  display: flex; align-items: center; justify-content: center;
  font-size: .48rem; transition: var(--transition);
}
.svc-net-btn.active .svc-net-btn-check { background: var(--net-clr, #FF6200); color: #fff; }
.svc-net-btn-check::after {
  content: ''; position: absolute; inset: -3px; border-radius: 50%;
  border: 1.5px solid var(--net-clr, #FF6200);
  opacity: 0; pointer-events: none;
}
.svc-net-btn.active .svc-net-btn-check::after {
  opacity: 1; animation: svcNetCheckPulse 1.8s ease-out infinite;
}
@keyframes svcNetCheckPulse {
  0%   { transform: scale(1); opacity: .6; }
  100% { transform: scale(1.9); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .svc-net-btn.active { animation: none; }
  .svc-net-btn.active .svc-net-btn-check::after { animation: none; }
}
.svc-net-btn img {
  width: 38px; height: 38px; object-fit: cover; border-radius: 12px;
  background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,.25);
}

/* Recadrage/zoom des logos de la ligne de paiement Facture uniquement —
   certains fichiers logo (orange.png, mtn.jpg, djamo.png) ont plus de
   marge intégrée que wave.png, donc paraissent plus petits une fois
   simplement affichés dans le même cercle. Le wrapper masque le
   débordement pendant que l'image agrandie (scale) "zoome" dessus, pour
   un rendu visuellement homogène avec le logo Wave (non zoomé, référence). */
.fact-logo-crop {
  width: 38px; height: 38px; border-radius: 12px; overflow: hidden;
  background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,.25);
  display: flex; align-items: center; justify-content: center;
}
.fact-logo-crop img {
  width: 100%; height: 100%; object-fit: cover;
  border-radius: 0; background: none; box-shadow: none;
}
.svc-net-btn > i {
  display: flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border-radius: 12px;
  background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,.25);
}
.svc-net-btn span {
  background: #fff; color: #1a1a2e;
  font-size: .56rem; font-weight: 900;
  padding: 5px 8px; border-radius: 999px;
  white-space: nowrap;
  box-shadow: 0 2px 6px rgba(0,0,0,.15);
}
.svc-net-btn.active span { color: var(--net-clr, #FF6200); }

/* Grille offres */
.svc-offers-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.svc-offer-card { background: rgba(255,255,255,.04); border: 1.5px solid rgba(255,255,255,.1); border-radius: 10px; padding: 12px; cursor: pointer; transition: all .2s; }
.svc-offer-card:hover { background: rgba(255,255,255,.08); }
.svc-offer-card.selected, .svc-offer-card.active { border-color: #FF6200; background: rgba(255,98,0,.1); }
.svc-offer-name { font-size: .78rem; font-weight: 800; color: #fff; margin-bottom: 4px; }
.svc-offer-price { font-size: .68rem; color: #FF6200; font-weight: 700; }

/* Boutons durée */
.svc-dur-row { display: flex; gap: 8px; }
.svc-dur-btn { flex: 1; padding: 8px 4px; background: rgba(255,255,255,.05); border: 1.5px solid rgba(255,255,255,.1); border-radius: 8px; color: rgba(255,255,255,.6); font-size: .7rem; font-weight: 700; cursor: pointer; text-align: center; transition: all .2s; }
.svc-dur-btn:hover { background: rgba(255,255,255,.1); }
.svc-dur-btn.selected, .svc-dur-btn.active { border-color: #FF6200; background: rgba(255,98,0,.12); color: #FF6200; }

/* Bouton continuer */
.svc-continue-btn { width: 100%; padding: 14px; background: linear-gradient(135deg,#FF6200,#FF9500); border: none; border-radius: 12px; color: #fff; font-size: .88rem; font-weight: 800; cursor: pointer; margin-top: 16px; display: flex; align-items: center; justify-content: center; gap: 8px; }
.svc-continue-btn:hover { opacity: .9; transform: translateY(-1px); }
.svc-back-btn { display: flex; align-items: center; gap: 6px; background: none; border: 1.5px solid rgba(255,255,255,.12); border-radius: 8px; color: rgba(255,255,255,.5); font-size: .75rem; font-weight: 600; cursor: pointer; padding: 7px 14px; margin-bottom: 14px; }
.svc-back-btn:hover { background: rgba(255,255,255,.06); color: rgba(255,255,255,.8); }

/* Récap */
.svc-recap-rows { background: rgba(255,255,255,.03); border: 1px solid rgba(255,255,255,.08); border-radius: 12px; overflow: hidden; margin-bottom: 16px; }
.svc-recap-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid rgba(255,255,255,.06); font-size: .8rem; }
.svc-recap-row:last-child { border-bottom: none; }
.svc-recap-row span { color: rgba(255,255,255,.45); }
.svc-recap-row strong { color: #fff; font-weight: 700; }
.svc-recap-row--total { background: rgba(255,98,0,.08); }
.svc-recap-row--total span { color: rgba(255,255,255,.7); font-weight: 700; }
.svc-recap-row--total strong { color: #FF6200; font-size: .9rem; }
.svc-frais-badge { display: inline-block; background: rgba(245,158,11,.15); color: #fbbf24; border: 1px solid rgba(245,158,11,.3); border-radius: 6px; padding: 2px 8px; font-size: .62rem; font-weight: 700; margin-bottom: 10px; }
#modal-facture .svc-frais-badge { color: #fff; }
.svc-validate-btn { width: 100%; padding: 14px; background: linear-gradient(135deg,#22c55e,#16a34a); border: none; border-radius: 12px; color: #fff; font-size: .88rem; font-weight: 800; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; }
.svc-validate-btn:hover { opacity: .9; }

/* ── Confirmation + suivi (services facture) ─────────────────── */
.svc-confirm-ico { width: 56px; height: 56px; border-radius: 50%; margin: 4px auto 12px; background: rgba(34,197,94,.14); border: 1px solid rgba(34,197,94,.3); color: #22c55e; font-size: 1.5rem; display: flex; align-items: center; justify-content: center; }
.svc-confirm-title { font-size: 1rem; font-weight: 900; color: #fff; text-align: center; }
.svc-confirm-sub { font-size: .74rem; color: rgba(255,255,255,.45); text-align: center; margin: 4px 0 16px; }
.svc-track-btn {
  width: 100%; padding: 13px; margin-bottom: 8px;
  background: rgba(255,98,0,.1); border: 1.5px solid rgba(255,98,0,.35);
  border-radius: 12px; color: #FF9500; font-size: .84rem; font-weight: 800; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  font-family: var(--font); transition: background .15s;
}
.svc-track-btn:hover { background: rgba(255,98,0,.18); }

/* Modal types UI */
.cadeau-type-row { display: flex; gap: 10px; margin-bottom: 14px; }
.cadeau-type-btn { flex: 1; padding: 12px; background: rgba(255,255,255,.04); border: 1.5px solid rgba(255,255,255,.1); border-radius: 10px; color: rgba(255,255,255,.6); font-size: .78rem; font-weight: 700; cursor: pointer; text-align: center; transition: all .2s; }
.cadeau-type-btn:hover { background: rgba(255,255,255,.08); }
.cadeau-type-btn.active { border-color: #ec4899; background: rgba(236,72,153,.1); color: #f9a8d4; }
.cadeau-type-btn i { display: block; font-size: 1.1rem; margin-bottom: 5px; }

/* Sélecteur couleur */
.pgc-colors {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  padding-top: 6px; position: relative; z-index: 1;
}
.pgc-color-dot {
  width: 14px; height: 14px; border-radius: 50%; cursor: pointer;
  border: 2px solid rgba(255,255,255,.12);
  transition: transform .2s, border-color .2s; flex-shrink: 0;
}
.pgc-color-dot:hover { transform: scale(1.2); border-color: rgba(255,255,255,.45); }
.pgc-color-dot--active { border-color: rgba(255,255,255,.85) !important; transform: scale(1.25); box-shadow: 0 0 0 2px rgba(255,255,255,.2); }
/* ── Page "Envoyer de l'argent" (transfert client-à-client) ───────
   Convertie en page intégrée (.cs-section#cs-transferer) plutôt qu'en
   fenêtre popup — voir loadTransfererSection()/_ctpSetHeader(),
   js/client.js, calquée sur un modèle de référence fourni par le client
   (flèche retour + titre, recherche, actions rapides, Favoris). */
.ctp-header {
  display: flex; align-items: center; gap: 4px;
  padding: 4px 0 18px;
}
.ctp-back {
  width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0;
  background: none; box-shadow: none; border: none; outline: none;
  color: rgba(0,0,0,.85); cursor: pointer; font-size: .9rem;
  display: flex; align-items: center; justify-content: center;
}
.ctp-back:hover, .ctp-back:focus, .ctp-back:active { background: none; color: #ef4444; outline: none; }
.ctp-title { font-size: 1.05rem; font-weight: 900; color: #0A0A0F; }

/* Recherche destinataire (filtre les Favoris uniquement — voir
   ctpFilterFavoris(), pas de recherche serveur par nom). Barre arrondie
   avec loupe, plutôt qu'un simple trait souligné. */
/* Champ "À" — saisie directe du destinataire, souligné (modèle d'après
   capture de référence), remplace l'ancienne barre "Rechercher dans les
   favoris". Filtre toujours la liste Favoris pendant la frappe. */
.ctp-to-field { margin: 4px 0 24px; }
.ctp-to-lbl {
  display: block; margin-bottom: 4px;
  font-family: var(--font); font-size: .74rem; font-weight: 800;
  letter-spacing: .04em; color: #0F0A2E;
}
.ctp-to-input {
  width: 100%; box-sizing: border-box;
  background: none; border: none; border-bottom: 2px solid #0F0A2E;
  outline: none; padding: 8px 2px;
  font-family: var(--font); font-size: 1.1rem; font-weight: 700; color: #0A0A0F;
}
.ctp-to-input::placeholder { color: rgba(0,0,0,.3); font-weight: 500; }

/* Actions rapides — icône ronde colorée + libellé, en ligne pleine
   largeur (même esprit que .pgc-action-row mais horizontal). */
/* Cartes d'action "Bénéficiaire" — modèle horizontal empilé (icône à
   gauche, libellé à droite), fond bleu marine clair (demande explicite). */
.ctp-action-grid {
  display: flex; flex-direction: column; gap: 10px;
  margin: 4px 0 22px;
}
.ctp-action-card {
  display: flex; flex-direction: row; align-items: center; gap: 16px;
  width: 100%;
  background: transparent; border: none; border-radius: 14px;
  padding: 14px 16px; cursor: pointer; text-align: left;
  font-family: var(--font); transition: transform .15s, background .15s;
}
.ctp-action-card:hover { background: rgba(15,10,46,.05); transform: none; }
.ctp-action-card:active { transform: scale(.98); }
.ctp-action-ico {
  width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.2rem;
}
/* "+" : rond bleu vif plein, icône blanche ; QR : icône bleu vif sans fond
   (modèle d'après capture). */
.ctp-action-ico--blue { background: #0F0A2E; color: #fff; }
.ctp-action-ico--cyan { background: transparent; color: #0F0A2E; font-size: 1.55rem; }
.ctp-action-lbl { font-size: 1.1rem; font-weight: 800; color: #0A0A0F; line-height: 1.3; }

/* Favoris — même format que les cartes d'action "Nouveau destinataire" /
   "Scanner pour transférer" (demande explicite). */
.ctp-fav-head {
  display: flex; align-items: center; justify-content: space-between;
  background: transparent; border-radius: 14px;
  padding: 14px 16px; margin: 10px 0;
}
.ctp-fav-title { font-size: 1.1rem; font-weight: 800; color: #0A0A0F; line-height: 1.3; }
.ctp-fav-add {
  display: flex; align-items: center; gap: 5px;
  background: none; border: none; cursor: pointer; font-family: var(--font);
  color: #0a1330; font-size: .74rem; font-weight: 800;
}
.ctp-fav-list { display: flex; flex-direction: column; }
.ctp-fav-empty {
  text-align: center; padding: 34px 20px; margin-top: 6px;
  background: #fff; border-radius: 16px;
}
.ctp-fav-empty-title { font-size: .82rem; font-weight: 800; color: #374151; }
.ctp-fav-row { display: flex; align-items: center; gap: 6px; }
.ctp-fav-main {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 14px;
  background: none; border: none; padding: 10px 0; cursor: pointer;
  text-align: left; font-family: var(--font);
}
.ctp-fav-avatar {
  width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0;
  background: #E8ECF4; color: rgba(0,0,0,.4);
  display: flex; align-items: center; justify-content: center; font-size: 1.05rem;
}
.ctp-fav-info { min-width: 0; }
.ctp-fav-name { font-size: .88rem; font-weight: 800; color: #0A0A0F; }
.ctp-fav-num  { font-size: .74rem; color: rgba(0,0,0,.4); margin-top: 1px; }
.ctp-fav-del {
  background: none; border: none; color: rgba(239,68,68,.6);
  padding: 10px; cursor: pointer; flex-shrink: 0;
}
.ctp-fav-del:hover { color: #ef4444; }

/* Carte unique regroupant destinataire + montant (au lieu de deux champs
   flottant séparément sur le fond) — réorganisation explicite, sur le
   modèle d'une capture de référence. */
.ct-form-card {
  background: #fff; border-radius: var(--radius-lg);
  padding: 18px 16px; margin-bottom: 6px;
  box-shadow: none;
}

/* Label de section — bulle */
.ct-field-label {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: .6rem; font-weight: 900; color: #0A0A0F;
  text-transform: uppercase; letter-spacing: .7px;
  margin-bottom: 10px;
}

/* Input bulle */
/* Modèle sans fond (demande explicite : "propose un modèle sans
   fonds") — juste le contour, plus de remplissage gris. */
.ct-input-pill {
  display: flex; align-items: center; gap: 10px;
  background: none; border: 1.5px solid rgba(255,146,0,.3);
  border-radius: 99px; padding: 12px 18px; margin-bottom: 6px;
  transition: border-color .2s, box-shadow .2s;
}
.ct-input-pill:focus-within {
  border-color: #FF9500;
  box-shadow: 0 0 0 3px rgba(255,98,0,.12);
}
.ct-flag { font-size: .72rem; font-weight: 900; color: #0A0A0F; white-space: nowrap; }
.ct-pill-sep { width: 1px; height: 18px; background: rgba(255,146,0,.25); flex-shrink: 0; }
.ct-pill-suffix { color: rgba(0,0,0,.5); font-size: .72rem; font-weight: 800; flex-shrink: 0; }
.ct-input-ico { color: #FF9500; font-size: .85rem; flex-shrink: 0; }
.ct-input {
  flex: 1; background: none !important; border: none; outline: none;
  color: #0A0A0F; font-size: .9rem; font-weight: 800; font-family: var(--font);
  min-width: 0;
}
.ct-input::placeholder { color: rgba(0,0,0,.3); font-weight: 500; }
.ct-input:-webkit-autofill,
.ct-input:-webkit-autofill:hover,
.ct-input:-webkit-autofill:focus,
.ct-input:-webkit-autofill:active {
  -webkit-text-fill-color: #0A0A0F;
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  box-shadow: 0 0 0 1000px #fff inset;
  caret-color: #0A0A0F;
  transition: background-color 9999s ease-in-out 0s;
}

/* Aperçu destinataire */
.ct-recipient-preview {
  display: flex; align-items: center; gap: 12px;
  background: rgba(34,197,94,.08); border: 1.5px solid rgba(34,197,94,.25);
  border-radius: 16px; padding: 12px 14px; margin-bottom: 6px;
}
.ct-rcp-avatar {
  width: 42px; height: 42px; border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), #FF9500);
  display: flex; align-items: center; justify-content: center;
  font-size: 1rem; font-weight: 900; color: #fff; flex-shrink: 0;
  box-shadow: 0 4px 12px rgba(255,98,0,.4);
}
.ct-rcp-info { flex: 1; }
.ct-rcp-name { font-size: .82rem; font-weight: 900; color: #0A0A0F; }
.ct-rcp-tag  { font-size: .62rem; color: #16a34a; font-weight: 700; margin-top: 2px; display: flex; align-items: center; gap: 4px; }
.ct-rcp-check {
  width: 28px; height: 28px; border-radius: 50%;
  background: rgba(34,197,94,.15); border: 1.5px solid #22c55e;
  display: flex; align-items: center; justify-content: center;
  color: #16a34a; font-size: .7rem;
}
/* "Changer" — étape 2 du sous-écran "Nouveau destinataire" (demande
   explicite, d'après capture de référence), ramène à l'étape 1 sans
   effacer le numéro (voir ctpManualChangeRecipient(), js/client.js). */
.ctp-manual-change-btn {
  flex-shrink: 0; background: none; border: none; cursor: pointer;
  font-family: var(--font); font-size: .68rem; font-weight: 800;
  color: var(--primary);
}

/* Solde hint */
.ct-solde-hint {
  font-size: .6rem; color: rgba(0,0,0,.45); margin-top: 4px;
  font-weight: 700; padding-left: 8px;
}

/* Bouton confirmer */
.ct-confirm-btn {
  width: 80%; padding: 15px; border-radius: 99px; margin: 20px auto 0;
  background: linear-gradient(135deg, var(--primary), #FF9500);
  border: none; color: #fff;
  font-size: .9rem; font-weight: 900; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 9px;
  font-family: var(--font);
  box-shadow: 0 6px 24px rgba(255,98,0,.45);
  transition: transform .22s cubic-bezier(.34,1.56,.64,1), box-shadow .2s;
}
.ct-confirm-btn:hover { transform: translateY(-3px) scale(1.01); box-shadow: 0 12px 32px rgba(255,98,0,.55); }
.ct-confirm-btn:active { transform: scale(.98); }
.ct-confirm-btn:disabled {
  background: #D8DCE6; color: rgba(0,0,0,.35);
  box-shadow: none; cursor: not-allowed;
}
.ct-confirm-btn:disabled:hover { transform: none; box-shadow: none; }

/* Erreur */
.ct-error {
  background: rgba(239,68,68,.1); border: 1.5px solid rgba(239,68,68,.3);
  border-radius: 12px; padding: 10px 14px;
  font-size: .78rem; color: #ef4444; font-weight: 700;
  margin-bottom: 14px;
}

/* Cercles décoratifs */
.pw-deco {
  position: absolute; border-radius: 50%;
  background: rgba(255,255,255,.1); pointer-events: none;
}
.pw-deco-1 { width: 200px; height: 200px; top: -80px; right: -60px; }
.pw-deco-2 { width: 120px; height: 120px; bottom: -50px; left: -30px; background: rgba(255,255,255,.07); }
.pw-deco-3 { width: 70px;  height: 70px;  top: 50px; right: 90px; background: rgba(255,255,255,.06); }

/* En-tête */
.pw-top {
  display: flex; align-items: center; justify-content: space-between;
  position: relative; z-index: 1;
}
.pw-brand {
  display: flex; align-items: center; gap: 8px;
  font-size: .82rem; font-weight: 900; color: #fff;
  letter-spacing: .3px;
}
.pw-brand span { opacity: .85; }
.pw-brand i { font-size: .85rem; opacity: .9; }
.pw-badge {
  display: flex; align-items: center; gap: 5px;
  background: rgba(255,255,255,.22); color: #fff;
  border: 1px solid rgba(255,255,255,.3);
  border-radius: 20px; padding: 3px 10px;
  font-size: .68rem; font-weight: 800;
}
.pw-badge--guest { background: rgba(0,0,0,.15); border-color: rgba(255,255,255,.15); }

/* Solde */
.pw-center {
  display: flex; flex-direction: column; gap: 4px;
  position: relative; z-index: 1;
}
.pw-label {
  font-size: .68rem; color: rgba(255,255,255,.7);
  font-weight: 600; text-transform: uppercase; letter-spacing: .8px;
}
.pw-amount {
  font-size: 2rem; font-weight: 900; color: #fff;
  line-height: 1.1; letter-spacing: -.5px;
  text-shadow: 0 2px 8px rgba(0,0,0,.15);
}
.pw-amount--masked {
  font-size: 1.3rem; letter-spacing: 6px; opacity: .6;
}
.pw-sub {
  font-size: .68rem; color: rgba(255,255,255,.65); font-weight: 500;
}

/* Séparateur */
.pw-divider {
  height: 1px; background: rgba(255,255,255,.18);
  position: relative; z-index: 1;
}

/* Actions */
.pw-actions {
  display: flex; justify-content: space-around;
  position: relative; z-index: 1;
}
.pw-action {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  background: none; border: none; cursor: pointer; font-family: var(--font);
  padding: 0;
}
.pw-action-icon {
  width: 42px; height: 42px; border-radius: 14px;
  background: rgba(255,255,255,.2);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: .95rem;
  transition: background .15s, transform .12s;
  border: 1px solid rgba(255,255,255,.15);
}
.pw-action:active .pw-action-icon { transform: scale(.93); background: rgba(255,255,255,.3); }
.pw-action-icon--primary {
  background: rgba(255,255,255,.95); color: var(--primary);
}
.pw-action span {
  font-size: .65rem; color: rgba(255,255,255,.8); font-weight: 700;
}

/* ══════════════════════════════════════════════════════════════
   ESPACE CABINE — mobile-first
══════════════════════════════════════════════════════════════ */

/* ── Wrapper principal ─────────────────────────────────────── */
.cab-app {
  display: flex;
  flex-direction: column;
  height: 100dvh;
  width: 100%;
  background: var(--light-bg);
  position: relative;
  overflow: hidden;
  transition: background .25s;
}

/* ── Bandeau impersonation admin (partagé cabine/client) ─────── */
.impersonation-banner {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 16px;
  background: linear-gradient(90deg, #B45309, #92400E);
  color: #fff; font-size: .74rem; font-weight: 700;
}
.impersonation-banner i { font-size: .85rem; }
.impersonation-banner strong { font-weight: 900; }
.impersonation-banner button {
  margin-left: auto; padding: 6px 12px; border-radius: 99px;
  background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.3);
  color: #fff; font-size: .68rem; font-weight: 800; cursor: pointer;
  font-family: var(--font); display: flex; align-items: center; gap: 6px;
  transition: background .15s;
}
.impersonation-banner button:hover { background: rgba(255,255,255,.28); }

/* Bandeau "Hors ligne" — Espace Cabine, voir cabine.html/_initCabOfflineBanner()
   (js/cabine.js). Barre fine à liseré (maquette "Modèle 3"), sous la barre
   du haut plutôt qu'au-dessus — signale sans ambiguïté que les données à
   l'écran ne sont plus garanties à jour tant que la connexion n'est pas
   revenue, sans bloc plein largeur trop appuyé. */
.cab-offline-banner {
  display: flex; align-items: center; gap: 9px;
  /* 62px = hauteur totale de .cab-topnav (désormais en position:absolute,
     hors du flux — voir plus bas), pour ne pas apparaître caché dessous
     (ce bandeau n'a pas de z-index propre). */
  margin: 72px 14px 0;
  padding: 9px 12px;
  background: #DC2626;
  border-left: 3px solid #7F1D1D;
  border-radius: 9px;
}
.cab-offline-ico { color: #fff; font-size: .85rem; flex-shrink: 0; }
.cab-offline-title { color: #fff; font-weight: 800; font-size: .68rem; }
.cab-offline-sub { color: #fff; font-size: .6rem; margin-top: 1px; line-height: 1.4; }

/* Carte de maintenance globale — voir renderGlobalMaintenanceBanner()
   (js/client.js) et Admin › Maintenance (js/admin.js). Réutilise .netm-card
   (même identité visuelle que la modale "Perturbation réseau"/"Service
   indisponible", css ci-dessus), déplacée en JS juste avant .pgc-qr-card
   pour occuper exactement sa place dans le flux : même chevauchement du
   bas de .pgc-hero-card (margin-top -145px, voir .pgc-qr-card ci-dessus),
   mais beaucoup plus large (le QR, lui, reste width:fit-content). */
.gmc-inline {
  position: relative; z-index: 165; /* au-dessus de .pgc-qr-card (160) */
  width: 92%; max-width: 640px;
  margin: -122px auto 16px;
  box-sizing: border-box;
}
/* Masque complètement les boutons d'action (Recharger/Dépenses/...) tant
   que la maintenance globale est active — !important pour primer sur le
   style inline posé par renderSidebar() (affiché/masqué selon connexion),
   sans qu'il faille dupliquer cette logique ici : on retire juste la
   classe une fois la maintenance terminée et son affichage d'origine
   reprend la main tel quel. */
.gmc-hidden { display: none !important; }

/* Sort le bandeau du flux normal, sur client.html uniquement (scopé via
   .client-page pour ne rien changer sur cabine.html/admin.html), pour
   qu'il reste au-dessus des sections plein écran (.cs-section.active,
   position:fixed; z-index:100) — même mécanisme que .bottom-nav (déjà
   fixed, z-index:200) — sinon le bouton "Retour à l'administration"
   devient invisible dès qu'on quitte l'onglet Accueil. */
.client-page > #impersonation-banner {
  position: fixed; top: 0; left: 0; right: 0; z-index: 200;
}
/* Compense la perte de la réservation d'espace en flux normal : sans
   ça, le contenu démarre caché sous le bandeau. Hauteur exacte posée
   en variable CSS par _refreshImpersonationBanner() (js/client.js), le
   texte pouvant passer sur 2 lignes selon la longueur du nom admin. */
body.impersonating.on-home .client-page { padding-top: var(--imp-banner-h, 0px); }
body.impersonating:not(.on-home) .cs-section.active { padding-top: calc(20px + var(--imp-banner-h, 0px)); }

/* ── Widget flottant : minuteur de réclamation (voir showReclaFloatWidget
   dans js/client.js) — au-dessus de la barre de navigation basse, visible
   quelle que soit la section active. ── */
/* Bouton "retour en haut" flottant (demande explicite) — masqué tant
   qu'on n'a pas assez défilé, réapparaît en fondu (voir
   _btTopHandleScroll(), js/client.js). */
.back-to-top-btn {
  position: fixed; left: 16px; bottom: calc(24px + env(safe-area-inset-bottom, 0px));
  z-index: 400;
  width: 46px; height: 46px; border-radius: 50%;
  background: #0F0A2E; border: 1.5px solid rgba(255,255,255,.12);
  color: #fff; font-size: 1rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; font-family: inherit; padding: 0;
  box-shadow: 0 8px 22px rgba(0,0,0,.3);
  opacity: 0; transform: translateY(12px) scale(.9); pointer-events: none;
  transition: opacity .25s ease, transform .25s ease, background .18s;
}
.back-to-top-btn.visible { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
.back-to-top-btn:hover { background: #171045; }
.back-to-top-btn:active { transform: scale(.92); }

.recla-float-widget {
  position: fixed; left: 50%; bottom: calc(84px + env(safe-area-inset-bottom, 0px));
  transform: translateX(-50%);
  width: calc(100% - 32px); max-width: 380px;
  z-index: 500;
  cursor: grab; touch-action: none;
}
.recla-float-widget.dragging { cursor: grabbing; }
.recla-float-inner {
  position: relative;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  padding: 11px 36px 11px 16px; border-radius: 16px;
  box-shadow: 0 14px 34px -10px rgba(0,0,0,.45);
  font-size: .72rem; font-weight: 700; text-align: center;
  animation: recla-float-in .25s ease;
}
@keyframes recla-float-in { from { opacity:0; transform: translateY(10px); } to { opacity:1; transform: translateY(0); } }
.recla-float-inner--wait {
  background: #FF6200;
  color: #fff; border: 1px solid rgba(255,255,255,.25);
}
.recla-float-inner--wait strong { color: #fff; font-variant-numeric: tabular-nums; }
.recla-float-inner--ready {
  background: linear-gradient(135deg,#FF8A3D,#FF6200);
  color: #fff; border: 1px solid rgba(255,255,255,.25);
}
.recla-float-inner span { line-height: 1.35; }
.recla-float-close {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.18); border: none; color: inherit;
  font-size: .6rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}

/* ── Bandeau blocage réclamation (cabine) — posé sous le tableau de
   solde, même format "carte" que .cab-suspension-banner juste au-dessus
   (coins arrondis, fond teinté léger, bordure), en orange plutôt qu'en
   rouge : c'est un blocage temporaire de réception de commandes, pas une
   suspension du compte. ─────────────── */
.recla-block-banner {
  display: flex; align-items: flex-start; gap: 10px; flex-wrap: wrap;
  margin-top: 12px; padding: 14px;
  border-radius: 14px; background: linear-gradient(135deg, #FF8A3D, #FF6200);
  border: 1px solid rgba(255,255,255,.25);
  box-shadow: 0 8px 20px rgba(255,98,0,.3);
}
@keyframes recla-block-icon-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: .45; }
}
.recla-block-banner i { color: #fff; font-size: 1rem; margin-top: 2px; flex-shrink: 0; animation: recla-block-icon-pulse 1.6s ease-in-out infinite; }
.recla-block-text-wrap { flex: 1; min-width: 180px; }
.recla-block-title { font-size: .8rem; font-weight: 900; color: #fff; margin-bottom: 3px; }
#recla-block-text { font-size: .72rem; color: rgba(255,255,255,.9); line-height: 1.5; }
.recla-block-banner button {
  margin-left: auto; padding: 6px 12px; border-radius: 99px;
  background: #fff; border: 1px solid #fff;
  color: #CC4E00; font-size: .68rem; font-weight: 800; cursor: pointer;
  font-family: var(--font); display: flex; align-items: center; gap: 6px;
  transition: background .15s;
}
.recla-block-banner button:hover { background: rgba(255,255,255,.85); }

/* ── Top nav ───────────────────────────────────────────────── */
/* position:absolute (plutôt qu'un item flex normal) : c'est ce qui rend
   le chevauchement possible. En flex normal, .cab-content ne peut que
   démarrer APRÈS la top nav, et une carte remontée par une marge
   négative au-delà de son propre bord (celui de .cab-content) y est
   purement rognée par overflow-y:auto — pas de chevauchement possible.
   En sortant la top nav du flux, .cab-content peut désormais démarrer à
   0 et recevoir un padding-top compensatoire (voir .cab-content plus
   bas) : la carte d'accueil, avec moins de padding que les autres
   sections, remonte alors réellement sous la zone orange, sans être
   rognée. */
/* Modèle "carte claire lavande" (référence externe fournie par
   l'utilisateur) : dégradé blanc/lavande, motif de points décoratif,
   avatar rond + salutation sur 2 lignes, séparateur vertical avant le
   badge "cabines connectées" — remplace la barre plate blanche à liseré
   marine utilisée jusqu'ici. */
.cab-topnav {
  position: absolute; top: 0; left: 0; right: 0; overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px 16px 15px;
  /* Même découpe asymétrique que le bandeau de la carte quota (.cqt-band,
     référence fournie), mais teinte moins violette, plus bleu marine pur
     (demande explicite : "diminue le fond violet") — .cqt-band garde sa
     propre teinte d'origine, non touchée ici. */
  background: linear-gradient(120deg, #141B45 0%, #0A0A22 100%);
  border-bottom: none;
  border-radius: 0 0 100% 0 / 0 0 40px 0;
  box-shadow: 0 10px 26px rgba(15,10,46,.35);
  z-index: 5;
  transition: transform .6s cubic-bezier(.22,.61,.36,1), opacity .6s ease;
}
/* Rentre (se masque) une fois le tableau de solde défilé hors champ —
   même seuil de scroll que .cfb-bar (voir _initCabFloatBalance(),
   js/cabine.js), pour éviter le doublon avatar/puces + barre flottante
   affichés en même temps. Entrée/sortie progressive (transition longue
   ci-dessus, demande explicite), pas un simple basculement instantané. */
.cab-topnav--hidden { transform: translateY(-100%); opacity: 0; pointer-events: none; }
.cab-topnav::before {
  content: ''; position: absolute; top: 8px; right: 96px; width: 64px; height: 42px;
  background-image: radial-gradient(rgba(255,255,255,.18) 1.3px, transparent 1.3px);
  background-size: 9px 9px;
  pointer-events: none;
}
.cab-tnav-left, .cab-tnav-right { position: relative; flex: 1; display: flex; align-items: center; gap: 8px; }
.cab-tnav-avatar {
  position: relative; flex-shrink: 0;
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(255,255,255,.16);
  display: flex; align-items: center; justify-content: center;
}
.cab-tnav-avatar img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }
.cab-tnav-avatar-fallback {
  font-size: .62rem; font-weight: 800; color: #fff;
}
.cab-tnav-avatar-dot {
  position: absolute; top: -1px; right: -1px; width: 8px; height: 8px; border-radius: 50%;
  background: #4ADE80; border: 2px solid #1E1656;
}
.cab-tnav-greeting { display: flex; flex-direction: column; gap: 0; font-family: inherit; min-width: 0; }
.cab-tnav-greeting-hi { font-size: .68rem; font-weight: 500; color: rgba(255,255,255,.55); }
.cab-tnav-greeting-name {
  font-size: .84rem; font-weight: 800; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cab-tnav-divider { width: 1px; height: 24px; background: rgba(255,255,255,.18); flex-shrink: 0; }
/* .cab-online-badge (voir plus bas) est pensé pour un fond clair (tinte
   verte très légère) — sur ce fond marine, ce même tint devenait presque
   invisible ; pastille blanche translucide + vert clair ici, comme
   .cqt-expiry-chip (référence "modèle dégradé"). */
.cab-topnav .cab-online-badge { background: rgba(255,255,255,.14); color: #4ADE80; }
.cab-topnav .cab-online-badge:hover { background: rgba(255,255,255,.2); }
.cab-topnav .cab-online-badge i { color: #4ADE80; }
.cab-topnav .cab-online-dot { border-color: #1E1656; }

/* .cab-topnav réduite à la taille de .cfb-bar (demande explicite) : plus
   de zone décorative à chevaucher, donc plus de marge négative ici — la
   carte démarre normalement, juste sous la top nav désormais compacte.
   z-index conservé au-dessus de .cab-topnav (5) par simple précaution
   (aucun chevauchement attendu avec ce format). */
.cbc-hero-overlap { position: relative; z-index: 11; }
.cab-tnav-right { justify-content: flex-end; }

/* Puce utilisateur */
.cab-user-chip { display: flex; align-items: center; gap: 7px; }
.cab-chip-avatar {
  width: 32px; height: 32px; border-radius: 50%;
  background: linear-gradient(135deg, #FF6200, #FF9A3C);
  display: flex; align-items: center; justify-content: center;
  font-size: .65rem; font-weight: 900; color: #fff;
  flex-shrink: 0;
}
.cab-chip-name { font-size: .72rem; font-weight: 800; color: #fff; line-height: 1.2; }
.cab-chip-sub  { font-size: .58rem; color: rgba(255,255,255,.45); }

/* Compteur de cabines connectées en temps réel (topnav droite) — pastille
   verte avec le point de vie en badge flottant au coin (référence
   fournie), au lieu d'un point simplement aligné avant l'icône. */
.cab-online-badge {
  position: relative;
  flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; gap: 5px;
  background: rgba(5,150,105,.12); border: none;
  padding: 7px 12px; border-radius: 999px;
  font-size: .84rem; font-weight: 800; color: #059669;
  font-family: inherit; cursor: pointer;
  transition: opacity .18s, background .18s;
}
.cab-online-badge:hover { opacity: .85; background: rgba(5,150,105,.18); }
.cab-online-badge:active { transform: scale(.96); }
.cab-online-badge i { font-size: .76rem; color: #059669; }
.cab-online-dot {
  position: absolute; top: -2px; right: -2px;
  width: 9px; height: 9px; border-radius: 50%;
  background: #059669; border: 2px solid #fff; flex-shrink: 0;
}
.cab-online-dot::after {
  content: ''; position: absolute; inset: -3px; border-radius: 50%;
  border: 2px solid rgba(5,150,105,.5);
  animation: cabOnlinePulse 2s ease-out infinite;
}
@media (prefers-reduced-motion: reduce) { .cab-online-dot::after { animation: none; } }
@keyframes cabOnlinePulse {
  0%   { transform: scale(.4); opacity: .8; }
  100% { transform: scale(1.6); opacity: 0; }
}

/* Bouton icône nav */
.cab-nav-icon-btn {
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.12);
  color: rgba(255,255,255,.65); font-size: .9rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; position: relative;
  transition: background .2s, color .2s;
}
.cab-nav-icon-btn:hover { background: rgba(52,211,153,.2); color: #34D399; }
.cab-nav-dot {
  position: absolute; top: 5px; right: 5px;
  width: 8px; height: 8px; border-radius: 50%;
  background: #FF6200; border: 2px solid #0A0F0A;
}

/* ── Zone de contenu scrollable ────────────────────────────── */
.cab-content {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  /* 62px = hauteur totale de .cab-topnav (désormais réduite à la taille
     de .cfb-bar, en position:absolute hors du flux) — compense pour
     qu'aucune section ne démarre cachée dessous (ce conteneur n'a pas de
     z-index propre). */
  padding-top: 62px;
  padding-bottom: 70px;
  background: var(--light-bg);
  transition: background .25s;
}
.cab-content::-webkit-scrollbar { display: none; }

/* ── Sections ──────────────────────────────────────────────── */
.cab-section { display: none; padding: 12px 12px 8px; }
.cab-section.active { display: block; }

/* ── Carte solde abonnement ────────────────────────────────── */
/* ── Carte de solde — palette pilotée par variables CSS, un jeu de
   valeurs par palier d'abonnement (voir modificateurs plus bas). La
   classe est posée dynamiquement par loadCabBalanceCard() (cabine.js)
   selon user.abonnement. */
/* Bandeau de suspension — sous le tableau de solde (voir
   _refreshSuspensionBanner dans js/cabine.js). Visible dès la connexion
   même si le compte est suspendu (voir Auth.login()), auto ou manuelle. */
.cab-suspension-banner {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 12px 0; padding: 14px;
  border-radius: 14px; background: rgba(220,38,38,.1);
  border: 1px solid rgba(220,38,38,.3);
}
.cab-suspension-banner i { color: #dc2626; font-size: 1rem; margin-top: 2px; flex-shrink: 0; }
.cab-suspension-title { font-size: .8rem; font-weight: 900; color: #dc2626; margin-bottom: 3px; }
.cab-suspension-text { font-size: .72rem; color: var(--gray-700); line-height: 1.5; }
#cab-suspension-until { font-weight: 700; margin-top: 8px; }

/* Réabonnement (accordéon Profil cabine) — modèle "onglets + panneau de
   détail unique" : les 3 formules restent en permanence côte à côte dans
   une piste type interrupteur (.cab-reabo-tabs/.cab-reabo-tab), prix/quota
   ne s'affichent qu'une fois pour la formule cliquée, dans
   .cab-reabo-summary juste en dessous (déjà existant, une ligne "Quota"
   ajoutée). Remplace l'ancien modèle à 3 grandes cartes empilées
   (.cab-reabo-card, réutilisant .cbc-card--*) — .cbc-card lui-même reste
   utilisé tel quel par la carte de solde (#cbc-card, loadCabBalanceCard()). */
.cab-reabo-intro { font-size: .78rem; color: rgba(244,233,222,.6); line-height: 1.5; margin: 0 0 14px; }
.cab-reabo-tabs { display: flex; gap: 4px; background: rgba(255,255,255,.06); border-radius: 999px; padding: 4px; }
.cab-reabo-tab {
  flex: 1; position: relative; border: none; background: transparent; cursor: pointer; font-family: inherit;
  border-radius: 999px; padding: 9px 6px; font-size: .74rem; font-weight: 800; color: rgba(244,233,222,.55);
  transition: background .15s, color .15s;
}
.cab-reabo-tab--sel { background: rgba(255,255,255,.14); color: #fff; }
.cab-reabo-tab-star { margin-left: 4px; font-size: .6rem; color: #FFE9A8; }

.cab-reabo-summary {
  margin-top: 16px; padding: 14px; border-radius: 16px;
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.08);
}
.cab-reabo-summary-row { display: flex; align-items: center; justify-content: space-between; font-size: .82rem; padding: 6px 0; }
.cab-reabo-summary-row span { color: rgba(244,233,222,.5); }
.cab-reabo-summary-row strong { color: #fff; }
.cab-reabo-summary-warning {
  display: flex; align-items: flex-start; gap: 8px; margin: 10px 0;
  padding: 10px 12px; border-radius: 12px;
  background: rgba(245,158,11,.1); border: 1px solid rgba(245,158,11,.3);
  color: #FCD34D; font-size: .76rem; line-height: 1.4;
}
.cab-reabo-summary-warning i { margin-top: 1px; }

/* ── Carte de solde (.cbc-card) — modèle "blanc + violet" (référence
   externe fournie par l'utilisateur) : fond clair, forme violette
   décorative, logo carré à dégradé, badges en contour, 2 tuiles KPI
   teintées violet/vert. Rupture totale avec les registres "carte sombre"
   essayés précédemment sur cette même carte. ── */
.cbc-card {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(15,10,46,.08);
  box-shadow: 0 10px 22px rgba(124,58,237,.1);
  padding: 16px 14px 14px;
  margin: 0;
  border-radius: 16px;
}

/* Tous paliers confondus (Premium/VIP/VVIP) — même carte, seul le libellé
   du badge (VIP/VVIP, voir loadCabBalanceCard()) change. */
.cbc-card--premium, .cbc-card--vip, .cbc-card--vvip {}

.cbc-v2-blob {
  position: absolute; top: -20%; right: -30%; width: 75%; height: 140%;
  background: linear-gradient(155deg, #1E1656 0%, #0F0A2E 100%);
  border-radius: 50% 0 0 45% / 55% 0 0 45%;
  z-index: 0; pointer-events: none;
}
.cbc-eye-btn {
  position: relative; z-index: 1;
  width: 20px; height: 20px; border-radius: 50%;
  background: rgba(15,10,46,.06); border: 1px solid rgba(15,10,46,.1);
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.cbc-eye-btn i { color: rgba(15,10,46,.6); font-size: .54rem; }
.cbc-eye-btn--v2 { position: absolute; top: 14px; right: 14px; z-index: 2; background: #fff; border: none; box-shadow: 0 4px 12px rgba(0,0,0,.12); }
.cbc-eye-btn--v2 i { color: rgba(15,10,46,.5); }

.cbc-v2-head { position: relative; z-index: 1; display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.cbc-v2-logo {
  flex-shrink: 0; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
}
.cbc-v2-logo img { width: 28px; height: 28px; object-fit: contain; }
.cbc-v2-id { min-width: 0; }
.cbc-kicker-text { font-size: .52rem; font-weight: 700; color: #8B5CF6; text-transform: uppercase; letter-spacing: .12em; }

.cbc-header-row { display: flex; align-items: center; gap: 5px; margin-top: 1px; }
.cbc-name {
  font-weight: 900; color: #16121F;
  letter-spacing: -.01em; line-height: 1.15;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cbc-name--v2 { font-size: .88rem; }
.cab-prof-badge--v2 { background: #2563EB; }

.cbc-v2-badges { position: relative; z-index: 1; display: flex; align-items: center; gap: 6px; margin-bottom: 10px; }
.cbc-subs-pill--outline {
  background: none !important; color: #C9971F !important;
  border: 1.5px solid rgba(201,151,31,.5) !important;
}
.cbc-v2-status-pill {
  display: inline-flex; align-items: center; gap: 4px;
  background: none; border: 1.5px solid rgba(5,150,105,.4);
  border-radius: 999px; padding: 2.5px 8px 2.5px 7px;
  font-size: .6rem; font-weight: 900; color: #059669; letter-spacing: .03em;
}
.cbc-v2-status-dot { width: 5px; height: 5px; border-radius: 50%; background: #059669; }

.cbc-perf { position: relative; z-index: 1; height: 1px; margin: 0 0 10px; background: rgba(15,10,46,.08); }

/* 2 tuiles KPI teintées (violet/vert) au lieu de neutres — registre
   "indicateurs clés" avec icône, demande explicite (référence fournie). */
.cbc-kpi-row { display: flex; align-items: stretch; gap: 8px; position: relative; z-index: 1; }
.cbc-kpi-tile {
  position: relative; overflow: hidden;
  flex: 1; min-width: 0; text-align: left;
  border: none; border-radius: 12px; padding: 9px 10px;
  font-family: inherit; cursor: default;
}
.cbc-kpi-tile--btn { cursor: pointer; }
.cbc-kpi-tile--purple { background: #F3EEFD; }
.cbc-kpi-tile--green { background: #EAFBF3; }
.cbc-kpi-ico {
  display: flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 50%; margin-bottom: 6px; font-size: .62rem;
}
.cbc-kpi-tile--purple .cbc-kpi-ico { background: rgba(124,58,237,.14); color: #7C3AED; }
.cbc-kpi-tile--green .cbc-kpi-ico { background: rgba(5,150,105,.14); color: #059669; }
.cbc-amount-lbl {
  display: flex; align-items: center; gap: 3px;
  font-size: .52rem; font-weight: 700; color: rgba(22,18,31,.5);
  text-transform: uppercase; letter-spacing: .02em;
}
.cbc-amount-val { font-size: .95rem; font-weight: 900; color: #7C3AED; margin-top: 3px; letter-spacing: -.02em; }
.cbc-amount-val--paid { color: #059669; }

.cbc-quickrow { display: flex; justify-content: center; gap: 12px; padding: 8px 16px 12px; }
.cbc-quickbtn {
  flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 5px;
  background: none; border: none; cursor: pointer; font-family: inherit; padding: 2px;
  transition: transform .15s ease;
}
.cbc-quickbtn:active { transform: scale(.94); }
.cbc-quick-ico {
  position: relative;
  width: 38px; height: 38px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .88rem; color: #fff; border: none;
  transition: background .2s ease;
}
.cbc-quick-ico--indigo { background: #6366F1; }
.cbc-quick-lbl { font-size: .62rem; font-weight: 900; color: #000; text-align: center; line-height: 1.25; letter-spacing: .01em; }

/* État actif (en pause) : petit badge rouge sur l'icône grise plutôt que
   l'ancien anneau rouge autour de toute la pilule. */
.cqk-btn--paused .cbc-quick-ico { background: #4B5563; }
.cqk-btn--paused .cbc-quick-ico::after {
  content: ''; position: absolute; top: -1px; right: -1px;
  width: 13px; height: 13px; border-radius: 50%;
  background: #DC2626; border: 2px solid #fff;
}
/* Icône « actualiser » : rotation au clic */
.cqk-spin { animation: cqkSpin .6s linear infinite; }
@keyframes cqkSpin { to { transform: rotate(360deg); } }

/* Barre de chargement fine, plein écran (voir refreshCabPage()/
   _showCabLoadbar(), js/cabine.js) — modèle minimal pour le bouton
   "Actualiser" cabine : pas de logo/anneau, juste une ligne qui s'étire. */
#cab-loadbar {
  position: fixed; top: 0; left: 0; height: 3px; width: 0%;
  background: linear-gradient(90deg, #FF6200, #FF9A3C);
  z-index: 300; opacity: 0; pointer-events: none;
  transition: width 1.2s cubic-bezier(.2,.6,.3,1), opacity .25s ease;
}
#cab-loadbar.cab-loadbar--active { opacity: 1; width: 78%; }
#cab-loadbar.cab-loadbar--done   { width: 100%; transition: width .2s ease, opacity .25s ease .15s; opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  #cab-loadbar { transition: opacity .2s ease; }
}
.cbc-orb { position: absolute; border-radius: 50%; pointer-events: none; }
.cbc-orb-1 {
  width: 180px; height: 180px; top: -70px; right: -50px;
  background: radial-gradient(circle, rgba(18,184,134,.3) 0%, transparent 70%);
}
.cbc-orb-2 {
  width: 120px; height: 120px; bottom: -40px; left: -30px;
  background: radial-gradient(circle, rgba(255,98,0,.2) 0%, transparent 70%);
}
.cbc-shine {
  position: absolute; inset: 0;
  background: linear-gradient(125deg, transparent 40%, rgba(255,255,255,.025) 50%, transparent 60%);
  pointer-events: none;
}

/* Top de la carte */
.cbc-top {
  display: flex; align-items: center; justify-content: space-between;
  position: relative; z-index: 1; margin-bottom: 12px;
}
.cbc-subs-pill {
  display: inline-flex; align-items: center; gap: 4px;
  background: rgba(255,98,0,.18); border: 1px solid rgba(255,98,0,.35);
  border-radius: 20px; padding: 4px 10px;
  font-size: .7rem; font-weight: 900; color: #FF9A3C;
  letter-spacing: .04em;
}
.cbc-subs-pill i { font-size: .64rem; }
.cbc-subs-pill--vip {
  background: rgba(167,139,250,.18); border-color: rgba(167,139,250,.35);
  color: #C4B5FD;
}
.cbc-subs-pill--vvip {
  background: rgba(251,191,36,.18); border-color: rgba(251,191,36,.35);
  color: #FDE68A;
}
.cbc-partner-tag {
  font-size: .6rem; font-weight: 700; color: rgba(52,211,153,.7);
  letter-spacing: .06em;
}

/* Soldes */
.cbc-balances {
  display: flex; align-items: stretch;
  position: relative; z-index: 1;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 12px;
  margin-bottom: 12px;
}
.cbc-bal-col {
  flex: 1; padding: 10px 12px;
  display: flex; flex-direction: column; align-items: center; text-align: center;
}
.cbc-bal-sep {
  width: 1px;
  background: linear-gradient(180deg, transparent, rgba(255,255,255,.12), transparent);
}
.cbc-bal-lbl {
  font-size: .55rem; font-weight: 700; color: rgba(255,255,255,.4);
  text-transform: uppercase; letter-spacing: .1em; margin-bottom: 4px;
}
.cbc-bal-val {
  font-size: 1.05rem; font-weight: 900; color: #fff;
  letter-spacing: -.5px;
}
.cbc-bal-val--paid { color: #34D399; }

/* Boutons d'action */
.cbc-actions {
  display: flex; gap: 8px; position: relative; z-index: 1;
}
.cbc-act-btn {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 7px;
  padding: 10px 8px; border-radius: 10px; border: none; cursor: pointer;
  font-size: .75rem; font-weight: 800; letter-spacing: .02em;
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.12);
  color: rgba(255,255,255,.8);
  transition: background .2s, transform .15s;
}
.cbc-act-btn:hover { background: rgba(255,255,255,.12); }
.cbc-act-btn:active { transform: scale(.95); }
.cbc-act-btn i { font-size: .85rem; }
.cbc-act-btn--uv {
  background: rgba(255,98,0,.15); border-color: rgba(255,98,0,.3);
  color: #FF9A3C;
}
.cbc-act-btn--uv:hover { background: rgba(255,98,0,.25); }

/* ── Bande des 5 cercles stats ─────────────────────────────── */
.cab-stats-strip {
  display: flex; gap: 6px; justify-content: space-between;
  margin-bottom: 12px;
  overflow-x: auto; padding-bottom: 4px;
}
.cab-stats-strip::-webkit-scrollbar { display: none; }

.css-circ {
  display: flex; flex-direction: column; align-items: center;
  flex: 0 0 calc(20% - 5px); min-width: 58px;
}
.css-circ-ico {
  width: 54px; height: 54px; border-radius: 50%;
  background: linear-gradient(145deg, color-mix(in srgb, var(--cc-clr) 70%, #fff 30%), var(--cc-clr));
  box-shadow: 0 4px 14px color-mix(in srgb, var(--cc-clr) 50%, transparent);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem; color: #fff;
  position: relative; overflow: hidden;
  margin-bottom: 6px;
}
.css-circ-ico::before {
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(255,255,255,.25) 0%, transparent 55%);
  border-radius: 50%;
}
.css-circ-val {
  font-size: .72rem; font-weight: 900; color: #1a1a2e;
  text-align: center; line-height: 1.1; margin-bottom: 3px;
}
.css-circ-val--sm { font-size: .6rem; }
.css-circ-lbl {
  font-size: .5rem; font-weight: 700; color: #6b7280;
  text-align: center; line-height: 1.3; letter-spacing: .02em;
}

/* ── Module réseaux — habillage clair, cartes carrées horizontales ── */
/* ── Transférer à un cabiniste — carte bleu marine, même identité que
   .rh2-card ("Historique des retraits") juste en dessous sur cette
   même page. ── */
/* En-tête "Historique des retraits" — carte marine, même identité que
   les en-têtes du client (dégradé + halo orange), avec mini-récap
   (nombre de retraits / total retiré) intégré. Classes préfixées
   "rh2-" pour éviter toute collision avec .rh-* du hub réclamation
   client (.rclhub-modal), qui est un composant totalement différent. */
/* Carte blanche sans bordure marine (retirée, demande explicite). */
.rh2-card {
  position: relative;
  background: #fff; box-shadow: 0 8px 20px rgba(0,0,0,.05);
  padding: 14px 16px;
  margin-bottom: 16px;
  border-radius: 16px;
}
.rh2-row { position: relative; z-index: 1; display: flex; align-items: center; gap: 12px; }
.rh2-back {
  width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0;
  background: var(--gray-100, #f2f2f0); border: 1px solid rgba(0,0,0,.08); color: #242320;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  font-size: .68rem; transition: background .15s, transform .15s;
}
.rh2-back:hover { background: var(--gray-200, #e8e8e5); transform: translateX(-1px); }
.rh2-ico {
  width: 40px; height: 40px; border-radius: 13px; flex-shrink: 0;
  background: rgba(255,98,0,.1); box-shadow: inset 0 0 0 1.5px rgba(255,98,0,.25);
  display: flex; align-items: center; justify-content: center; color: #FF6200; font-size: .92rem;
}
.rh2-title { font-size: .88rem; font-weight: 800; color: #242320; }
.rh2-sub { font-size: .68rem; font-weight: 500; color: rgba(36,35,32,.5); margin-top: 2px; }

/* Fond blanc + écritures noires (demande explicite) — .rh2-stat était en
   blanc translucide pensé pour un fond sombre, devenu invisible depuis que
   .rh2-card est passée en carte blanche (modèle "contour bleu marine"). */
.rh2-stats { position: relative; z-index: 1; display: flex; gap: 8px; margin-top: 16px; }
.rh2-stat { flex: 1; background: #fff; border: 1px solid rgba(15,10,46,.1); border-radius: 12px; padding: 9px 10px; box-shadow: 0 4px 10px rgba(0,0,0,.04); }
.rh2-stat-val { font-size: .82rem; font-weight: 900; color: #000; font-variant-numeric: tabular-nums; }
.rh2-stat-lbl { font-size: .55rem; font-weight: 700; color: rgba(0,0,0,.55); text-transform: uppercase; letter-spacing: .06em; margin-top: 2px; }

/* ── Carte "Rang" — modèle "professionnel" ──────────────────────────
   Registre sobre, type widget de tableau de bord d'entreprise : petit
   en-tête d'étiquette, 3 indicateurs alignés séparés par des filets fins,
   palette restreinte (blanc/gris/bleu marine) — demande explicite ("un
   modèle plus professionnel"), en rupture avec le registre décoratif du
   modèle narratif précédent. */
.cab-rank-card {
  /* Fond blanc, écritures noir/bleu marine (demande explicite) — remplace
     le dégradé vert précédent, même motif "carte blanche" que le reste de
     l'espace partenaire. */
  background: #fff;
  border: 1px solid rgba(15,10,46,.08);
  border-radius: 16px;
  padding: 14px 16px 16px;
  margin-bottom: 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.cab-rank-pro-head {
  display: flex; align-items: center; gap: 6px;
  font-size: .64rem; font-weight: 700; color: #0F0A2E;
  text-transform: uppercase; letter-spacing: .04em;
  margin-bottom: 12px;
}
.cab-rank-pro-body { display: flex; align-items: stretch; }
.cab-rank-pro-item { flex: 1; min-width: 0; text-align: center; }
.cab-rank-pro-sep { width: 1px; background: rgba(15,10,46,.1); margin: 2px 4px; }
.cab-rank-pro-val { font-size: .92rem; font-weight: 800; color: #000; white-space: nowrap; }
.cab-rank-pro-val--accent {
  display: inline-block; background: rgba(15,10,46,.06); color: #0F0A2E;
  border-radius: 7px; padding: 1px 9px; margin-bottom: 1px;
}
.cab-rank-pro-lbl { font-size: .56rem; font-weight: 600; color: rgba(15,10,46,.55); margin-top: 4px; line-height: 1.25; }

.cab-net-card {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(15,10,46,.08);
  border-radius: 12px;
  padding: 8px;
  margin-bottom: 8px;
  box-shadow: none;
}
.cab-net-header {
  position: relative;
  display: flex; align-items: center; gap: 4px;
  font-size: .52rem; font-weight: 800; color: #0F0A2E;
  text-transform: uppercase; letter-spacing: .04em;
  margin-bottom: 6px;
}
.cab-net-header i { color: #059669; font-size: .58rem; }

/* Fond retiré (.cab-net-card) : .svc-net-btn reprend son habillage clair
   (tuile grise au lieu du léger voile blanc translucide, pensé pour un
   fond sombre, sinon quasi invisible sur fond clair). */
.cab-net-card .svc-net-btn {
  padding: 8px 5px; gap: 5px;
  background: #F7F7F5;
  border-color: rgba(0,0,0,.08);
}
.cab-net-card .svc-net-btn:hover { background: #EDEDEA; }
.cab-net-card .svc-net-btn.active {
  background: #FFF6EE;
  border-color: var(--net-clr, #FF6200);
  box-shadow: 0 0 0 1px var(--net-clr, #FF6200);
}
.cab-net-card .svc-net-btn-check { background: rgba(0,0,0,.08); }
.cab-net-card .svc-net-btn img { width: 30px; height: 30px; }
.cab-net-card .svc-net-btn span { font-size: .5rem; padding: 4px 7px; }

/* Cartes réseau — tuiles pleines couleur par opérateur, alignées horizontalement */
.cab-net-list {
  position: relative;
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px;
  margin-bottom: 3px;
}
.cab-net-line {
  position: relative;
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 4px;
  border: none; border-radius: 10px; padding: 8px 4px 7px;
  justify-content: center;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  user-select: none;
  transition: box-shadow .2s, transform .12s, filter .2s;
}
.cab-net-line:hover   { filter: brightness(1.05); }
.cab-net-line:active  { transform: scale(.96); }

.cab-net-line--orange { background: linear-gradient(150deg, #FF8A3D, #FF6200); }
.cab-net-line--moov   { background: linear-gradient(150deg, #1D7AE0, #0066CC); }
.cab-net-line--mtn    { background: linear-gradient(150deg, #FFDA4D, #FFCC00); }

/* Icône dans un badge rond — désormais utilisé uniquement par la liste
   USSD (3 tuiles carrées, .cab-net-list) ; le module réseaux de l'accueil
   utilise le modèle .svc-net-btn (logo + pilule) à la place. */
.cab-net-ico-badge {
  width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,.25);
  transition: background .2s;
}
.cab-net-ico {
  color: #fff; font-size: .58rem; pointer-events: none;
}
.cab-net-line--mtn .cab-net-ico { color: #7a5c00; }

.cab-net-name {
  font-size: .54rem; font-weight: 900; letter-spacing: .03em;
  color: #fff; pointer-events: none;
}
.cab-net-line--mtn .cab-net-name { color: #3d2e00; }

/* Toggle réseau — switch iOS centré sous le nom, purement indicatif */
.cab-toggle {
  width: 25px; height: 14px; border-radius: 999px;
  background: rgba(255,255,255,.3); border: none; cursor: pointer;
  flex-shrink: 0; pointer-events: none;
  display: flex; align-items: center;
  padding: 2px;
  transition: background .25s;
}
.cab-toggle-knob {
  width: 10px; height: 10px; border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,.3);
  transform: translateX(0);
  transition: transform .25s cubic-bezier(.4,0,.2,1);
}
.cab-net-line:active .cab-toggle-knob { transform: scale(.85) translateX(0); }
.cab-toggle.active { background: rgba(255,255,255,.55); }
.cab-toggle.active .cab-toggle-knob { transform: translateX(11px); }
.cab-net-line:active .cab-toggle.active .cab-toggle-knob { transform: scale(.85) translateX(11px); }

/* ── Section dédiée : recherche de commande — carte Premium sombre,
   assortie à .cqt-wrapper / .cst-group-card / .cab-net-card. ── */
.cab-search-card {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(15,10,46,.08);
  border-radius: 16px;
  padding: 14px;
  margin-bottom: 12px;
  box-shadow: 0 10px 26px rgba(0,0,0,.06);
}
.cab-search-header {
  position: relative;
  display: flex; align-items: center; gap: 6px;
  font-size: .68rem; font-weight: 800; color: #0F0A2E;
  text-transform: uppercase; letter-spacing: .04em;
  margin-bottom: 10px;
}

/* Barre de recherche */
.cab-search-wrap {
  position: relative;
  display: flex; align-items: center; gap: 8px;
  background: var(--gray-100);
  border: 1px solid var(--gray-200);
  border-radius: 10px; padding: 9px 12px;
}
.cab-search-ico { color: #059669; font-size: .8rem; flex-shrink: 0; }
.cab-search-input {
  flex: 1; background: none; border: none; outline: none;
  color: #242320; font-size: .78rem;
}
.cab-search-input::placeholder { color: var(--gray-400); }
.cab-search-clear {
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--gray-200); border: none;
  color: #059669; font-size: .65rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; flex-shrink: 0;
}

/* Résultat automatique de la recherche par ID (voir _cabRenderSearchResult(),
   js/cabine.js) — apparaît sous la barre dès qu'une seule commande
   correspond, sans qu'il faille cliquer dessus. */
.cab-search-empty {
  display: flex; align-items: center; gap: 8px;
  margin-top: 10px; padding: 10px 12px;
  background: rgba(0,0,0,.03); border-radius: 10px;
  font-size: .72rem; font-weight: 600; color: var(--gray-500);
}
.cab-search-empty i { color: var(--gray-400); font-size: .8rem; }

.cab-search-result-card {
  margin-top: 10px; padding: 12px;
  background: #fff; border: 1px solid rgba(0,0,0,.06);
  border-radius: 12px;
}
.csr-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 8px; padding-bottom: 8px;
  border-bottom: 1px solid var(--gray-100);
}
.csr-id { font-size: .72rem; font-weight: 800; color: #242320; letter-spacing: .01em; }
.csr-open-btn {
  display: flex; align-items: center; gap: 5px;
  background: none; border: none; cursor: pointer;
  color: #059669; font-size: .66rem; font-weight: 700;
  padding: 0;
}
.csr-open-btn i { font-size: .58rem; }
.csr-row {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; padding: 4px 0;
}
.csr-lbl { font-size: .66rem; color: var(--gray-500); font-weight: 600; flex-shrink: 0; }
.csr-val { font-size: .72rem; color: #242320; font-weight: 700; text-align: right; }
.csr-val--pending { color: #B45309; font-weight: 700; }

/* ── Filtres commandes ─────────────────────────────────────── */
.cab-filter-row {
  display: flex; gap: 6px; margin-bottom: 10px;
}
.cab-ftab {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 5px;
  padding: 8px 6px; border-radius: 10px;
  background: #f3f4f6;
  border: 1px solid rgba(0,0,0,.08);
  color: #6b7280;
  font-size: .68rem; font-weight: 800;
  cursor: pointer; position: relative;
  transition: background .2s, color .2s, border-color .2s;
}
.cab-ftab.active {
  background: rgba(18,184,134,.12); border-color: rgba(18,184,134,.3);
  color: #059669;
}
.cab-ftab-dot {
  position: absolute; top: 5px; right: 5px;
  width: 6px; height: 6px; border-radius: 50%;
  background: #FF6200; display: inline-block;
}

/* ── Carte commande ────────────────────────────────────────── */
.cab-order-card {
  background: var(--white);
  border-radius: 14px;
  margin-bottom: 8px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0,0,0,.08);
}
.coc-bar { height: 3px; }
.coc-body {
  display: flex; align-items: center; gap: 10px;
  padding: 12px 14px 8px;
}
.coc-op-badge {
  width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: .65rem; font-weight: 800;
}
.coc-info { flex: 1; min-width: 0; }
.coc-top-row {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 4px;
}
.coc-ref   { font-size: .8rem; font-weight: 700; color: var(--gray-800); }
.coc-amount { font-size: .9rem; font-weight: 900; color: var(--gray-800); }
.coc-bot-row {
  display: flex; align-items: center; justify-content: space-between;
}
.coc-client { display: flex; align-items: center; gap: 5px; }
.coc-avatar {
  width: 20px; height: 20px; border-radius: 50%;
  background: #FF6200; display: flex; align-items: center; justify-content: center;
  font-size: .52rem; font-weight: 800; color: #fff; flex-shrink: 0;
}
.coc-client span { font-size: .68rem; color: var(--gray-600); }
.coc-status {
  font-size: .62rem; font-weight: 700;
  padding: 2px 8px; border-radius: 20px;
}
.coc-footer {
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 6px;
  padding: 7px 14px 10px;
  border-top: 1px solid var(--gray-200);
}
.coc-date  { font-size: .6rem; color: var(--gray-500); }
.coc-comm  { font-size: .7rem; font-weight: 800; color: #16a34a; }
.coc-btns  { display: flex; gap: 6px; width: 100%; }
.coc-btn {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 5px;
  padding: 8px 10px; border-radius: 8px; border: none; cursor: pointer;
  font-size: .72rem; font-weight: 800; transition: opacity .18s, transform .15s;
}
.coc-btn:active { transform: scale(.95); }
.coc-btn--accept { background: #16a34a; color: #fff; }
.coc-btn--accept:hover { background: #15803d; }
.coc-btn--refuse { background: #f3f4f6; color: #dc2626; }
.coc-btn--refuse:hover { background: #fee2e2; }

/* ── Section retour (retraits) ─────────────────────────────── */
.cab-back-header {
  display: flex; align-items: center; gap: 10px; margin-bottom: 12px;
}
.cab-back-btn {
  width: 34px; height: 34px; border-radius: 50%;
  background: #f3f4f6; border: 1px solid rgba(0,0,0,.1);
  color: #374151; font-size: .85rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; flex-shrink: 0;
  transition: background .2s;
}
.cab-back-btn:hover { background: #e5e7eb; }
.cab-back-title {
  font-size: .95rem; font-weight: 800; color: #1a1a2e; margin: 0;
}

/* ── En-têtes sections internes ────────────────────────────── */
.cab-sec-title-bar {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 12px;
}
.cab-sec-h2 {
  font-size: .9rem; font-weight: 800; color: #1a1a2e; margin: 0;
  display: flex; align-items: center; gap: 7px;
}
.cab-sec-h2 i { color: #12B886; font-size: .95rem; }
.cab-sec-btn {
  display: flex; align-items: center; gap: 5px;
  background: #f3f4f6; border: 1px solid rgba(0,0,0,.09);
  border-radius: 8px; padding: 5px 10px;
  color: #6b7280; font-size: .65rem; font-weight: 700;
  cursor: pointer;
}

/* ── Recherche instantanée (numéro de téléphone / ID) — l'input porte
   directement le dégradé Premium sombre (comme le header au-dessus) :
   contrairement à .cab-search-wrap sur l'accueil, ce champ n'a pas de
   carte enveloppante, donc le fond translucide seul le rendait illisible
   posé sur le blanc de .cab-content. ── */
.ccm-search-wrap { position: relative; margin-bottom: 12px; }
.ccm-search-ico {
  position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
  font-size: .78rem; color: rgba(36,35,32,.4); pointer-events: none;
}
.ccm-search-input {
  width: 100%; box-sizing: border-box;
  padding: 11px 14px 11px 36px;
  background: var(--gray-100);
  border: 1px solid var(--gray-200);
  border-radius: 12px; font-size: .78rem; font-weight: 600; color: #242320;
  box-shadow: none;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.ccm-search-input::placeholder { color: rgba(36,35,32,.4); font-weight: 500; }

/* Puces de dates rapides ("Cumul commandes"/"Cumul commissions", demande
   explicite : plus soigné qu'un input type="date" natif, dont l'icône
   calendrier du navigateur doublonnait avec la nôtre). */
.cab-date-chips {
  display: flex; gap: 8px; justify-content: center; overflow-x: auto; -webkit-overflow-scrolling: touch;
  margin-bottom: 12px; padding: 3px 2px 8px;
}
.cab-date-chip {
  flex-shrink: 0; white-space: nowrap;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 10px 18px; border-radius: 999px;
  background: var(--gray-100); border: 1px solid var(--gray-100);
  box-shadow: none;
  font-size: .76rem; font-weight: 700; color: rgba(36,35,32,.6);
  font-family: inherit; cursor: pointer;
  transition: background .18s, border-color .18s, color .18s, box-shadow .18s, transform .12s;
}
.cab-date-chip i { font-size: .76rem; color: rgba(36,35,32,.35); transition: color .18s; }
.cab-date-chip:hover { border-color: rgba(15,10,46,.2); }
.cab-date-chip.active {
  background: #0F0A2E;
  border-color: #0F0A2E; color: #fff;
  box-shadow: none;
}
.cab-date-chip:active { transform: scale(.96); }

/* "Autre date" : 3 sélecteurs Jour/Mois/Année (demande explicite, remplace
   l'input type="date" natif — rendu incohérent selon l'appareil). */
.cab-date3-wrap { display: flex; gap: 8px; margin-bottom: 12px; }
.cab-date3-select {
  flex: 1; min-width: 0; box-sizing: border-box;
  padding: 10px 8px;
  background: var(--gray-100);
  border: 1px solid var(--gray-200);
  border-radius: 12px; font-size: .74rem; font-weight: 600; color: #242320;
  font-family: inherit;
}
.ccm-search-input:focus {
  outline: none; border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(255,98,0,.18);
}

/* ── Liste des commissions — cartes orange clair avec mini-timeline ── */
.ccm-list { display: flex; flex-direction: column; gap: 8px; }
.ccm-card {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 14px; padding: 12px 14px; cursor: pointer;
  transition: border-color .15s;
}
.ccm-card:hover { border-color: #CC4E00; }
.ccm-card-top {
  position: relative;
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 10px; margin-bottom: 12px; padding-bottom: 10px;
  border-bottom: 1px solid rgba(36,35,32,.08);
}
.ccm-card-info { display: flex; flex-direction: column; gap: 3px; }
.ccm-op { font-size: .74rem; font-weight: 800; color: #242320; }
.ccm-id { font-size: .62rem; color: #CC4E00; }
.ccm-amounts { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; }
.ccm-montant { font-size: .74rem; font-weight: 700; color: #242320; }
.ccm-comm { font-size: .74rem; font-weight: 900; color: #CC4E00; }

/* Frise horaire : Créée → Assignée → Validée */
.ccm-timeline { position: relative; display: flex; align-items: flex-start; }
.ccm-tl-step { display: flex; flex-direction: column; align-items: center; gap: 4px; flex-shrink: 0; }
.ccm-tl-dot {
  width: 9px; height: 9px; border-radius: 50%;
  background: rgba(36,35,32,.14); border: 2px solid #fff;
}
.ccm-tl-dot--on { background: #059669; }
.ccm-tl-time { font-size: .64rem; font-weight: 800; color: #242320; }
.ccm-tl-lbl  { font-size: .54rem; font-weight: 600; color: rgba(36,35,32,.5); }
.ccm-tl-bar {
  flex: 1; height: 2px; background: rgba(36,35,32,.1);
  margin: 4px -2px 0; border-radius: 2px;
}
.ccm-tl-bar--on { background: #059669; }

/* ── Sélecteur assistant WhatsApp — Modèle B : liste type messagerie,
   avatar avec pastille "en ligne". Classes "cwa-" scopées à cette seule
   modale : ne touche pas .contact-item/.contacts-list réutilisés
   ailleurs dans l'app (admin.html, client.html). ── */
.cwa-list { display: flex; flex-direction: column; }
.cwa-row {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 18px; cursor: pointer; transition: background .15s;
}
.cwa-row:hover { background: var(--gray-100); }
.cwa-avatar {
  position: relative; flex-shrink: 0;
  width: 44px; height: 44px; border-radius: 50%;
  background: var(--gray-100); color: #25D366;
  display: flex; align-items: center; justify-content: center; font-size: 1.1rem;
}
.cwa-dot {
  position: absolute; bottom: 0; right: 0;
  width: 12px; height: 12px; border-radius: 50%;
  background: #25D366; border: 2px solid #fff;
}
.cwa-txt { flex: 1; min-width: 0; }
.cwa-name { font-size: .84rem; font-weight: 800; color: #21201C; }
.cwa-sub { font-size: .72rem; color: var(--gray-500); margin-top: 1px; }
.cwa-chev { color: var(--gray-300); font-size: .7rem; flex-shrink: 0; }

/* ── Détail d'une commande (modal) — carte Premium sombre, frise
   verticale façon suivi de livraison. Scopé à #modal-cab-order-detail
   pour ne pas toucher .modal/.modal-header/... utilisées par les autres
   modales de l'app. ── */
#modal-cab-order-detail .modal {
  background: linear-gradient(165deg, #2B3A55 0%, #16202F 100%);
  border: 1px solid rgba(255,255,255,.14);
  border-top: 2.5px solid #FF9A3C;
  box-shadow: 0 24px 54px rgba(10,20,35,.4);
  color: #F4E9DE;
}
#modal-cab-order-detail .modal-header {
  justify-content: flex-start; gap: 11px;
  padding: 18px 18px 14px; border-bottom: none;
}
#modal-cab-order-detail .modal-title { color: #fff; font-size: .92rem; }
#modal-cab-order-detail .modal-close { margin-left: auto; flex-shrink: 0; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1); color: rgba(244,233,222,.6); }
#modal-cab-order-detail .modal-close:hover { background: rgba(255,255,255,.1); color: #fff; }
#modal-cab-order-detail .modal-body { padding: 0 0 4px; }

.ordet-head-ico {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  background: rgba(255,154,60,.14); color: #FF9A3C;
  display: flex; align-items: center; justify-content: center; font-size: .95rem;
}
.ordet-head-text { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ordet-head-sub { font-size: .64rem; font-weight: 600; color: rgba(244,233,222,.45); margin-top: 2px; }

/* Bandeau ID compact */
.ordet-strip {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin: 0 18px 14px;
  background: rgba(255,255,255,.045);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 12px;
  padding: 9px 8px 9px 12px;
}
.ordet-strip-id { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.ordet-strip-id-lbl { font-size: .58rem; font-weight: 700; color: rgba(244,233,222,.4); }
.ordet-strip-id-val { font-size: .8rem; font-weight: 800; color: #fff; font-variant-numeric: tabular-nums; }
.ordet-copy-btn {
  flex-shrink: 0; width: 26px; height: 26px; border-radius: 8px;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1);
  color: rgba(244,233,222,.6); font-size: .62rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background .15s, color .15s, border-color .15s;
}
.ordet-copy-btn:hover { background: rgba(255,255,255,.1); border-color: rgba(255,255,255,.2); color: #FFB25E; }

/* Numéros — liste compacte à 2 lignes */
.ordet-nums { margin: 0 18px 18px; border: 1px solid rgba(255,255,255,.08); border-radius: 12px; overflow: hidden; }
.ordet-num-line { display: flex; align-items: center; gap: 9px; padding: 9px 12px; background: rgba(255,255,255,.03); }
.ordet-num-line + .ordet-num-line { border-top: 1px solid rgba(255,255,255,.07); }
.ordet-num-ico {
  width: 24px; height: 24px; border-radius: 7px; flex-shrink: 0;
  background: rgba(255,255,255,.06); color: rgba(244,233,222,.55);
  display: flex; align-items: center; justify-content: center; font-size: .62rem;
}
.ordet-num-text { min-width: 0; flex: 1; }
.ordet-num-lbl { font-size: .56rem; font-weight: 700; color: rgba(244,233,222,.4); text-transform: uppercase; letter-spacing: .04em; }
.ordet-num-val { font-size: .78rem; font-weight: 800; color: #fff; font-variant-numeric: tabular-nums; }
.ordet-num-copy {
  flex-shrink: 0; width: 22px; height: 22px; border-radius: 7px;
  background: none; border: none;
  color: rgba(244,233,222,.4); font-size: .6rem; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.ordet-num-copy:hover { color: #FFB25E; }

/* Lien USSD cliquable (composition directe depuis le téléphone du partenaire) */
.ordet-ussd { margin: 0 18px 18px; }
.ordet-ussd-link {
  display: flex; align-items: center; gap: 10px;
  text-decoration: none;
  background: rgba(255,146,0,.08); border: 1px solid rgba(255,146,0,.25);
  border-radius: 12px; padding: 10px 12px;
  transition: background .18s, border-color .18s;
}
.ordet-ussd-link:hover { background: rgba(255,146,0,.14); border-color: rgba(255,146,0,.4); }
.ordet-ussd-ico {
  width: 30px; height: 30px; border-radius: 9px; flex-shrink: 0;
  background: rgba(255,98,0,.15); border: 1px solid rgba(255,146,0,.3);
  color: #FF9500; font-size: .8rem;
  display: flex; align-items: center; justify-content: center;
}
.ordet-ussd-text { min-width: 0; flex: 1; }
.ordet-ussd-lbl { font-size: .58rem; font-weight: 700; color: rgba(244,233,222,.45); text-transform: uppercase; letter-spacing: .04em; }
.ordet-ussd-val { font-size: .78rem; font-weight: 800; color: #fff; font-variant-numeric: tabular-nums; word-break: break-all; }
.ordet-ussd-arrow { color: rgba(255,146,0,.4); font-size: .65rem; flex-shrink: 0; }
.ordet-ussd-warn {
  display: flex; align-items: center; gap: 6px;
  font-size: .62rem; font-weight: 700; color: #FBBF24;
  margin-top: 6px; padding: 0 2px;
}

/* Frise verticale — façon suivi de livraison */
.ordet-tl-wrap { margin: 0 18px 18px; }
.ordet-tl-title { font-size: .6rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: rgba(244,233,222,.4); margin-bottom: 12px; }
.ordet-tl-row { position: relative; display: flex; gap: 12px; padding-bottom: 20px; }
.ordet-tl-row:last-child { padding-bottom: 0; }
.ordet-tl-rail { position: relative; flex-shrink: 0; display: flex; flex-direction: column; align-items: center; width: 26px; }
.ordet-tl-node {
  width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0;
  background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.12);
  display: flex; align-items: center; justify-content: center;
  color: rgba(244,233,222,.35); font-size: .68rem;
}
.ordet-tl-node--on {
  background: linear-gradient(135deg,#34D399,#0EA672);
  border: none; color: #0B1F17;
  box-shadow: 0 0 0 4px rgba(52,211,153,.14);
}
.ordet-tl-line { position: absolute; top: 26px; bottom: -20px; left: 50%; width: 2px; background: rgba(255,255,255,.1); transform: translateX(-50%); }
.ordet-tl-line--on { background: linear-gradient(#34D399, rgba(52,211,153,.25)); }
.ordet-tl-row:last-child .ordet-tl-line { display: none; }
.ordet-tl-body { flex: 1; min-width: 0; padding-top: 3px; }
.ordet-tl-toprow { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.ordet-tl-lbl { font-size: .78rem; font-weight: 800; color: #fff; }
.ordet-tl-lbl--pending { color: rgba(244,233,222,.4); }
.ordet-tl-time { font-size: .76rem; font-weight: 800; color: rgba(244,233,222,.7); flex-shrink: 0; font-variant-numeric: tabular-nums; }
.ordet-tl-note { font-size: .64rem; color: rgba(244,233,222,.4); margin-top: 2px; }
.ordet-tl-note b { color: #FFB25E; font-weight: 800; }

/* "Signaler un problème" (voir _cabOrderDetailReclaHtml(), js/cabine.js) —
   commande auto-créée par le partenaire lui-même uniquement. */
.ordet-recla-btn {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  width: calc(100% - 36px); margin: 0 18px 18px; padding: 10px;
  border-radius: 10px; border: 1px solid rgba(239,68,68,.35);
  background: rgba(239,68,68,.1); color: #FCA5A5;
  font-size: .74rem; font-weight: 700; font-family: inherit; cursor: pointer;
}
.ordet-recla-btn:hover { background: rgba(239,68,68,.16); }
.ordet-recla-note {
  display: flex; align-items: center; gap: 7px;
  margin: 0 18px 18px; padding: 9px 12px;
  border-radius: 10px; background: rgba(255,255,255,.06);
  color: rgba(244,233,222,.6); font-size: .68rem; font-weight: 600;
}

/* ── Détail par jour (cumul commissions / commandes) — regroupé par
   mois, façon accordéon blanc : un en-tête par mois (replié par défaut,
   sauf le plus récent) affichant le total + variation % vs le mois
   précédent, qui se déplie sur une courbe comparative des jours du mois
   puis les lignes de jours elles-mêmes. ── */
.grpB {
  margin-bottom: 12px; border-radius: 16px; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
/* "Cumul commandes"/"Cumul commissions" : puces + liste réunies dans UNE
   seule carte (demande explicite, plus cohérent que 2 blocs séparés) — les
   groupes de mois (.grpB) perdent leur propre encadrement/ombre pour ne
   pas doublonner celui de la carte enveloppante, séparés par un simple
   trait entre eux s'il y en a plusieurs. */
.cab-daily-card {
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 16px;
  padding: 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.cab-daily-card .cab-date-chips { margin-bottom: 10px; padding: 3px 2px 4px; }
.cab-daily-card .cab-date3-wrap { margin-bottom: 10px; }
.cab-daily-card .grpB {
  margin-bottom: 0; border-radius: 0; overflow: visible;
  background: none; border: none; box-shadow: none;
  border-top: 1px solid rgba(0,0,0,.08);
}
.cab-daily-card .grpB:first-child { border-top: none; }
.cab-daily-card .grpB-head { padding: 10px 2px; }
.cab-daily-card .grpB-body { padding: 8px 0 0; }
/* Modèle "très simple" (demande explicite) : plus d'accordéon repli/déplié
   ni de variation % vs le mois précédent — juste le titre du mois et le
   total, toujours visibles, suivis des jours en lignes plates. */
.grpB-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 13px;
}
.grpB-title { font-size: .82rem; font-weight: 800; color: #242320; }
/* Menu déroulant "choisir le mois" (demande explicite) — remplace le titre
   fixe quand plusieurs mois sont disponibles (voir _cabDailyAccordion(),
   js/cabine.js). */
.grpB-month-select {
  font-size: .82rem; font-weight: 800; color: #242320;
  background: none; border: none; padding: 0 18px 0 0;
  font-family: inherit; cursor: pointer;
  -webkit-appearance: none; appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5L6 8l3.5-3.5' stroke='%23242320' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right center; background-size: 11px;
}
.grpB-total { font-size: .74rem; font-weight: 900; color: #242320; white-space: nowrap; }
.grpB-body { border-top: 1px solid rgba(0,0,0,.06); padding: 10px 12px; }

/* Modèle "plus simple" (demande explicite) : une seule ligne de texte
   courant (date · valeur), plus de disposition en colonnes. */
.rowB { display: flex; align-items: baseline; flex-wrap: wrap; gap: 5px; padding: 8px 1px; }
.rowB:not(:last-child) { border-bottom: 1px solid rgba(0,0,0,.05); }
.rowB-day { font-size: .74rem; font-weight: 800; color: #242320; }
.rowB-day span { color: rgba(36,35,32,.4); font-weight: 600; }
.rowB-sep { color: rgba(36,35,32,.3); font-size: .7rem; }
.rowB-sub { font-size: .68rem; font-weight: 600; color: rgba(36,35,32,.4); }
.pillB { font-size: .74rem; font-weight: 800; color: #242320; white-space: nowrap; }

.cab-empty-state--light { color: var(--gray-500); }
.cab-empty-state--light i { color: var(--gray-300); }

/* ── Table commissions ─────────────────────────────────────── */
.cab-table-scroll { overflow-x: auto; border-radius: 12px; }
.cab-table {
  width: 100%; border-collapse: collapse;
  font-size: .72rem;
  background: var(--white);
  border: 1px solid var(--gray-300);
  border-radius: 12px; overflow: hidden;
}
.cab-table th {
  padding: 9px 10px; text-align: left;
  background: var(--gray-100);
  color: var(--gray-500); font-weight: 800;
  font-size: .6rem; text-transform: uppercase; letter-spacing: .06em;
}
.cab-table td {
  padding: 9px 10px;
  color: var(--gray-600);
  border-top: 1px solid var(--gray-200);
}
.cab-td-center { text-align: center; color: var(--gray-500); padding: 20px; }

/* ── Profil cabine — carte Premium sombre, format carte de membre
   horizontale (avatar + identité côte à côte, "Membre depuis" / "Statut"
   en mini-tuiles) plutôt que bannière pleine largeur + avatar centré. ── */
/* Modèle "hero orange centré" (demande explicite : complètement différent
   des versions blanche/marine essayées jusqu'ici) — dégradé orange plein,
   contenu centré, avatar au-dessus du nom plutôt qu'à côté. */
.cab-prof-card {
  position: relative; overflow: hidden;
  background: #fff;
  border: 1px solid rgba(15,10,46,.1);
  border-radius: 22px;
  padding: 20px 18px;
  margin-bottom: 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
  text-align: left;
}
.cab-prof-top { position: relative; display: flex; flex-direction: row; align-items: center; gap: 14px; margin-bottom: 16px; }
.cab-prof-avatar {
  flex-shrink: 0; width: 58px; height: 58px; border-radius: 50%;
  background: linear-gradient(160deg, #1B1450 0%, #0F0A2E 100%);
  border: 2.5px solid #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.1rem; font-weight: 900; color: #fff;
  box-shadow: 0 8px 18px rgba(15,10,46,.25);
}
.cab-prof-id { min-width: 0; flex: 1; display: flex; flex-direction: column; align-items: flex-start; }
.cab-prof-name-row { display: flex; align-items: center; gap: 6px; width: 100%; }
.cab-prof-badge {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 16px; height: 16px; border-radius: 50%;
  background: #0F0A2E; color: #fff; font-size: .5rem;
}
.cab-prof-name {
  flex: 1; min-width: 0;
  font-size: 1rem; font-weight: 800; color: #000; letter-spacing: -.005em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.cab-prof-stats { position: relative; display: flex; gap: 8px; }
.cab-prof-stat {
  flex: 1; min-width: 0;
  background: rgba(15,10,46,.04);
  border: 1px solid rgba(15,10,46,.1);
  border-radius: 14px; padding: 10px 11px;
  text-align: center;
}
.cab-prof-stat-lbl {
  display: flex; align-items: center; justify-content: center; gap: 4px;
  font-size: .48rem; font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  color: #0F0A2E; margin-bottom: 4px;
}
.cab-prof-stat-lbl i { color: #0F0A2E; font-size: .5rem; }
.cab-prof-stat-val {
  font-size: .68rem; font-weight: 800; color: #000;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ── Réglages profil — Modèle A : groupes par catégorie, une seule
   carte par groupe avec médaillons colorés (remplace les accordéons
   empilés un-par-un). ── */
.cab-settings-eyebrow {
  font-size: .62rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  color: rgba(36,35,32,.45); margin: 0 0 8px 4px;
}
.cab-settings-group {
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 16px;
  overflow: hidden;
  margin-bottom: 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.cab-settings-row {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; gap: 11px;
  width: 100%; padding: 13px 14px;
  font-family: var(--font);
}
.cab-settings-row:not(:first-child) { border-top: 1px solid rgba(0,0,0,.06); }
.cab-settings-row .ph5-why-icon { color: rgba(36,35,32,.35); flex-shrink: 0; }
.cab-settings-row-ic {
  width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .7rem;
}
.cab-settings-row-ic--lg { width: 32px; height: 32px; border-radius: 9px; font-size: .8rem; }
.cab-settings-row-ic--blue   { background: rgba(59,130,246,.12); color: #2563EB; }
.cab-settings-row-ic--red    { background: rgba(220,38,38,.1);   color: #DC2626; }
.cab-settings-row-ic--green  { background: rgba(5,150,105,.1);   color: #059669; }
.cab-settings-row-ic--purple { background: rgba(124,58,237,.1);  color: #7C3AED; }
.cab-settings-row-ic--orange { background: rgba(255,98,0,.1);    color: #FF6200; }
.cab-settings-row-lbl { flex: 1; min-width: 0; font-size: .82rem; font-weight: 700; color: #242320; }
.cab-settings-row-badge {
  flex-shrink: 0; min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: 999px; background: #DC2626; color: #fff;
  font-size: .62rem; font-weight: 800; line-height: 18px; text-align: center;
}

/* ── Formulaires ───────────────────────────────────────────── */
.cab-form-block {
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 14px;
  padding: 14px;
  margin-bottom: 10px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.cab-form-block-title {
  font-size: .78rem; font-weight: 800; color: #242320;
  margin-bottom: 12px; display: flex; align-items: center; gap: 7px;
}
.cab-form-block-title i { color: #059669; }

/* En-tête cliquable "Informations personnelles" — même comportement
   d'accordéon que côté client (voir .ph5-why-icon/.open et
   toggleCabPersonalInfo()), adapté à la carte blanche. */
.cab-pinfo-head {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between;
  width: 100%; padding: 14px;
  font-size: .78rem; font-weight: 800; color: #242320;
  font-family: var(--font);
}
.cab-pinfo-head-label { display: flex; align-items: center; gap: 7px; }
.cab-pinfo-head-label i { color: #059669; }
.cab-pinfo-head .ph5-why-icon { color: rgba(36,35,32,.45); }
.cab-form-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.cab-fgroup { margin-bottom: 10px; }
.cab-flabel {
  display: block; font-size: .65rem; font-weight: 700;
  color: rgba(36,35,32,.55); margin-bottom: 5px;
}
.cab-finput {
  width: 100%; background: var(--gray-100);
  border: 1.5px solid var(--gray-200);
  border-radius: 10px; padding: 10px 12px;
  color: #242320; font-size: .82rem; outline: none;
  box-sizing: border-box; transition: border-color .2s;
}
.cab-finput:focus { border-color: #059669; }
.cab-finput::placeholder { color: rgba(36,35,32,.35); }
.cab-finput:disabled { opacity: .5; cursor: not-allowed; }

/* Boutons form */
.cab-btn-primary {
  width: 100%; padding: 12px; border: none; border-radius: 10px; cursor: pointer;
  background: linear-gradient(135deg, #12B886, #059669);
  color: #fff; font-size: .82rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  transition: opacity .2s, transform .15s;
}
.cab-btn-primary:hover { opacity: .9; transform: translateY(-1px); }
.cab-btn-secondary {
  width: 100%; padding: 12px; border: none; border-radius: 10px; cursor: pointer;
  background: linear-gradient(135deg, #3B82F6, #2563EB);
  color: #fff; font-size: .82rem; font-weight: 800;
  display: flex; align-items: center; justify-content: center; gap: 6px;
}
.cab-btn-danger {
  padding: 11px 24px; border: none; border-radius: 10px; cursor: pointer;
  background: rgba(220,38,38,.08); border: 1px solid rgba(220,38,38,.3);
  color: #DC2626; font-size: .82rem; font-weight: 800;
  display: inline-flex; align-items: center; gap: 6px;
}
.cab-btn-danger:hover { background: rgba(220,38,38,.14); }

/* Bloc "Déconnexion" — Modèle D : carte neutre, langage des lignes de
   réglage (médaillon + libellé + chevron) — registre sobre, palette
   restreinte (blanc/gris), seule l'icône garde une teinte rouge discrète
   pour signaler l'action. Remplace le modèle C (carte teintée rouge pâle),
   demande explicite ("un modèle plus professionnel"). */
.cab-logout-row {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; gap: 12px; width: 100%;
  background: #fff;
  border: 1px solid var(--gray-200);
  border-radius: 14px; padding: 14px 16px;
  font-family: var(--font); margin-bottom: 24px;
}
.cab-logout-row-ic {
  width: 38px; height: 38px; border-radius: 11px; flex-shrink: 0;
  background: rgba(220,38,38,.08); color: #DC2626;
  display: flex; align-items: center; justify-content: center; font-size: .85rem;
}
.cab-logout-row-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.cab-logout-row-lbl { font-size: .82rem; font-weight: 800; color: #242320; }
.cab-logout-row-sub { font-size: .66rem; color: var(--gray-500); margin-top: 2px; }
.cab-logout-row-chev {
  width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0;
  background: var(--gray-100); color: var(--gray-400);
  display: flex; align-items: center; justify-content: center; font-size: .62rem;
}

/* ── Mes appareils connectés ───────────────────────────────── */
.cab-devices-hint { font-size: .64rem; color: rgba(36,35,32,.5); line-height: 1.45; margin-bottom: 12px; }
.cab-device-row {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 0; border-top: 1px solid rgba(0,0,0,.06);
}
.cab-device-row:first-child { border-top: none; padding-top: 0; }
.cab-device-ico {
  width: 34px; height: 34px; border-radius: 10px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(204,78,0,.1); color: #CC4E00; font-size: .8rem;
}
.cab-device-info { min-width: 0; flex: 1; }
.cab-device-label { font-size: .72rem; font-weight: 800; color: #242320; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.cab-device-here {
  font-size: .55rem; font-weight: 800; text-transform: uppercase; letter-spacing: .04em;
  color: #059669; background: rgba(5,150,105,.1); border-radius: 6px; padding: 2px 6px;
}
.cab-device-sub { font-size: .62rem; color: rgba(36,35,32,.5); margin-top: 3px; }
.cab-device-disconnect {
  all: unset; box-sizing: border-box; cursor: pointer; flex-shrink: 0;
  width: 28px; height: 28px; border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(220,38,38,.08); color: #DC2626; font-size: .68rem;
  transition: background .15s;
}
.cab-device-disconnect:hover { background: rgba(220,38,38,.16); }
.cab-devices-empty { font-size: .66rem; color: rgba(36,35,32,.45); text-align: center; padding: 8px 0; }

/* ── Champ info lecture seule (profil partenaire) ──────────── */
.cab-info-field {
  width: 100%; background: var(--gray-100);
  border: 1.5px solid var(--gray-200);
  border-radius: 10px; padding: 10px 12px;
  color: rgba(36,35,32,.75); font-size: .82rem;
  min-height: 40px; display: flex; align-items: center;
  font-weight: 600;
}

/* Surcharges des widgets Retrait/Réabonnement, partagés avec client.html
   (.prg-pay-card / .cab-reabo-intro / .cab-reabo-tabs / .cab-reabo-summary
   — fond sombre par défaut) — scopées à #cab-sec-profile pour ne pas
   toucher client.html. */
#cab-sec-profile .cab-reabo-intro { color: rgba(36,35,32,.55); font-size: .7rem; margin-bottom: 10px; }
#cab-sec-profile .prg-pay-card {
  background: var(--gray-100); border-color: var(--gray-200); color: rgba(36,35,32,.6);
}
#cab-sec-profile .prg-pay-card:hover  { background: rgba(255,98,0,.06); border-color: rgba(255,98,0,.3); }
#cab-sec-profile .prg-pay-card--sel   { background: rgba(255,98,0,.08); border-color: #FF6200; color: #242320; }
#cab-sec-profile .cab-reabo-tabs { background: var(--gray-100); }
#cab-sec-profile .cab-reabo-tab { color: rgba(36,35,32,.5); }
#cab-sec-profile .cab-reabo-tab--sel { background: #fff; color: #CC4E00; box-shadow: 0 1px 4px rgba(0,0,0,.1); }
#cab-sec-profile .cab-reabo-tab-star { color: #FF6200; }
#cab-sec-profile .cab-reabo-summary { background: var(--gray-100); border: 1px solid var(--gray-200); }
#cab-sec-profile .cab-reabo-summary-row span { color: rgba(36,35,32,.5); }
#cab-sec-profile .cab-reabo-summary-row strong { color: #242320; }
#cab-sec-profile .cab-reabo-summary-warning { color: #92400E; }

/* ── Bottom nav — même identité que le bottom nav client (.bottom-nav/
   .bn-item) : fond marine, bulles pastel par item, actif en orange. ── */
/* Pas de "section"/pilule visible : juste le bouton "Plus" (et les
   onglets repliés qu'il révèle) flottant directement sur le contenu,
   sans fond/bordure/ombre partagés — chaque bulle (.cab-bnav-ico) porte
   déjà son propre habillage. */
.cab-bottom-nav {
  position: fixed; bottom: 0; left: 0; right: 0; z-index: 200;
  width: 100%; max-width: none;
  background: none; border: none; box-shadow: none;
  display: flex; align-items: center; justify-content: flex-end;
  padding: 0 16px calc(14px + env(safe-area-inset-bottom, 0px));
  gap: 14px;
  text-decoration: none;
  overflow: visible;
  transition: opacity .2s ease, transform .25s ease;
}
/* Masquée pendant le défilement, réapparaît à l'arrêt (voir cabine.js) */
.cab-bottom-nav.cab-bottom-nav--scroll-hidden {
  opacity: 0;
  transform: translateY(14px) scale(.96);
  pointer-events: none;
}

.cab-bnav-tab {
  flex: 0 0 auto; min-width: 0; display: flex; flex-direction: column; align-items: center;
  justify-content: flex-start; gap: 5px;
  padding: 0;
  background: none; border: none; cursor: pointer;
  color: rgba(36,35,32,.6);
  font-size: .6rem; font-weight: 600; letter-spacing: .1px;
  line-height: 1.15; text-align: center; text-decoration: none;
  transition: color .25s; position: relative; z-index: 1;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
}

/* Cercle autour de l'icône — même langage que le bottom nav client
   (.bn-item) : pastel discret par défaut, orange vif + surélevé
   quand actif, plutôt qu'une bulle orange permanente. Passage à l'état
   actif instantané (pas de transition) — demande explicite : le clic doit
   basculer en orange sans animation. */
/* Modèle "premier" rétabli (demande explicite) : bulles pleines colorées,
   comme avant les essais contour/monochrome/plat. */
.cab-bnav-ico {
  position: relative;
  font-size: 1.15rem;
  width: 46px; height: 46px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: rgba(36,35,32,.55);
  background: #fff;
  border: none;
  box-shadow: 0 4px 14px rgba(0,0,0,.16);
  transition: none;
}
.cab-bnav-ico i { position: relative; z-index: 1; }

/* Une couleur par fonction (demande explicite) : indigo Historique, ambre
   Réclamations (même teinte "alerte" que .cs-sec-bar-ico--recla ailleurs
   dans l'app), violet Profil — plus de vert partagé entre les deux. */
/* Fond bleu marine de marque (#0F0A2E) — toutes les bulles de la nav
   cabine, cohérent avec le bouton "…" (.cab-bnav-ico--more) déjà marine. */
.cab-bnav-ico--teal { background: #0F0A2E; color: #fff; }
.cab-bnav-ico--violet { background: #0F0A2E; color: #fff; }
.cab-bnav-ico--indigo { background: #0F0A2E; color: #fff; }
.cab-bnav-ico--rose { background: #0F0A2E; color: #fff; }
.cab-bnav-ico--gold { background: #0F0A2E; color: #fff; }

/* Actif : couleur d'origine assombrie (demande explicite, remplace
   l'anneau bleu marine) — même teinte, juste plus foncée, quelle que soit
   la couleur de la bulle. Aucune transition/animation (voir
   transition:none sur .cab-bnav-ico ci-dessus). */
.cab-bnav-tab.active { color: #0F0A2E; }
.cab-bnav-tab.active .cab-bnav-ico {
  filter: brightness(.78);
}
.cab-bnav-lbl { display: none; }
.cab-bnav-tab::after { display: none; }
.cab-bnav-tab::before { display: none; }

/* Onglet "Assistant WhatsApp" — bulle verte pleine, comme le modèle
   d'origine. */
.cab-bnav-tab--wa { color: rgba(36,35,32,.6); }
.cab-bnav-tab--wa .cab-bnav-ico {
  color: #fff;
  background: #0F0A2E;
  border-color: transparent;
  box-shadow: 0 4px 14px rgba(0,0,0,.16);
}

/* Badge numérique (Réclamations) — ancré sur la bulle */
.cab-bnav-badge {
  position: absolute; top: -5px; right: -5px;
  min-width: 16px; height: 16px;
  background: #C25B5B; border-radius: 8px;
  font-size: .52rem; font-weight: 900; color: #fff;
  display: flex; align-items: center; justify-content: center;
  padding: 0 3px;
  border: 2px solid #fff;
  z-index: 2;
}

/* Étiquette "NEW" — pastille rectangulaire, coin haut-droit de la bulle */
.cab-bnav-new {
  position: absolute; top: -8px; right: -10px;
  background: linear-gradient(135deg, #E0A166, #D07C43);
  color: #fff; font-size: .42rem; font-weight: 900; letter-spacing: .04em;
  padding: 2px 5px; border-radius: 5px;
  box-shadow: 0 2px 6px rgba(180,90,30,.28);
  z-index: 2;
}

/* Bouton "Actualiser" flottant et déplaçable — hors de .cab-bottom-nav
   (voir cabine.html, juste après). Position pilotée en JS via left/top
   (_initCabRefreshDrag(), js/cabine.js) plutôt que right/bottom fixes,
   pour pouvoir le faire glisser librement ; sans transition sur ces deux
   propriétés pour qu'il suive le doigt/curseur sans latence pendant le
   glissement. */
/* Modèle "contour" (demande explicite) — fond transparent, juste un
   contour + icône bleu marine, se fond davantage dans la page derrière. */
.cab-refresh-fab {
  position: fixed; z-index: 250;
  width: 46px; height: 46px; border-radius: 50%;
  background: rgba(255,255,255,.6);
  border: 1.5px solid #0F0A2E; color: #0F0A2E; font-size: 1rem;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 8px 20px rgba(0,0,0,.15);
  cursor: grab; touch-action: none; -webkit-user-select: none; user-select: none;
  transition: box-shadow .15s ease, transform .15s ease;
}
.cab-refresh-fab:disabled { opacity: .7; cursor: default; }
.cab-refresh-fab--dragging {
  cursor: grabbing;
  box-shadow: 0 12px 28px rgba(0,0,0,.3);
  transform: scale(1.08);
}
@media (prefers-reduced-motion: reduce) {
  .cab-refresh-fab { transition: none; }
}

/* Onglet "Plus" — seul bouton toujours visible (plus de barre/section
   derrière), les autres onglets (.cab-bnav-tab--extra) repliés par
   défaut et révélés à côté de lui, au clic (voir toggleCabBnavMore(),
   js/cabine.js). La bulle pivote (icône ellipsis → croix) pour indiquer
   l'état déplié. */
.cab-bnav-ico--more { background: #0F0A2E; color: #fff; }
.cab-bnav-ico--more i { transition: transform .25s ease; }
.cab-bnav-tab--more.expanded .cab-bnav-ico {
  background: #242320;
  color: #fff;
}
.cab-bnav-tab--more.expanded .cab-bnav-ico--more i { transform: rotate(45deg); }

/* Popup vertical (demande explicite du 26/08) : les onglets repliés
   s'empilent verticalement au-dessus du déclencheur "Plus" (à droite),
   au lieu d'apparaître en ligne dans la barre — animation d'apparition
   volontairement absente (comme avant), juste display none/flex. */
.cab-bnav-popup {
  display: none;
  position: absolute; right: 16px; bottom: calc(100% + 14px);
  flex-direction: column; align-items: center; gap: 11px;
}
.cab-bottom-nav.cab-bnav--expanded .cab-bnav-popup { display: flex; }

/* ── État vide ─────────────────────────────────────────────── */
/* Couleur par défaut pensée pour un fond clair : la plupart des usages
   (réclamations, retraits, transferts, notifications) sont posés
   directement sur le fond blanc de .cab-content, sans carte enveloppante.
   .cof-list-wrapper et --light ci-dessous redéfinissent leur propre
   teinte pour leurs contextes spécifiques. */
.cab-empty-state {
  text-align: center; padding: 32px 16px;
  color: var(--gray-400); font-size: .8rem;
}

/* ── Historique des transferts cabine-à-cabine (loadCabTransferHistory) ──
   Toujours utilisé par cette liste-là ; l'historique des retraits (plus
   bas, .rgroup/.rrow) a son propre design dédié. */
.cab-retrait-group { margin-bottom: 18px; }
.cab-retrait-group-title {
  font-size: .65rem; font-weight: 800; color: var(--gray-500);
  text-transform: uppercase; letter-spacing: .1em;
  margin-bottom: 8px; padding: 0 2px;
}
.cab-retrait-group-list { display: flex; flex-direction: column; gap: 6px; }
.cab-retrait-row {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  background: #fff; border: 1px solid var(--gray-200);
  border-radius: 12px; padding: 10px 12px;
  box-shadow: 0 2px 8px rgba(0,0,0,.04);
}
.cab-retrait-row-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cab-retrait-row-amount { font-size: .92rem; font-weight: 800; color: var(--gray-800); }
.cab-retrait-row-meta { font-size: .68rem; color: var(--gray-500); }
.cab-retrait-row-status {
  font-size: .62rem; font-weight: 700; padding: 4px 9px; border-radius: 99px;
  background: rgba(52,211,153,.14); color: #0f9d63; white-space: nowrap; flex-shrink: 0;
}
.cab-retrait-row-status--pending { background: rgba(245,158,11,.16); color: #b45309; }

/* ── Historique des retraits — groupes par méthode, cartes détaillées ── */
.rgroup { margin-bottom: 18px; }
.rgroup-head { display: flex; align-items: center; gap: 8px; margin-bottom: 9px; padding: 0 2px; }
.rgroup-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.rgroup-name { font-size: .66rem; font-weight: 800; color: var(--gray-600); text-transform: uppercase; letter-spacing: .07em; }
.rgroup-count { font-size: .6rem; font-weight: 700; color: var(--gray-400); margin-left: auto; }
.rgroup-list { display: flex; flex-direction: column; gap: 8px; }

.rrow {
  display: flex; align-items: center; gap: 12px;
  background: var(--white); border: 1px solid var(--gray-200);
  border-radius: 16px; padding: 12px 14px;
  box-shadow: 0 8px 20px rgba(20,15,10,.05);
  transition: transform .18s ease, box-shadow .18s ease;
  animation: rrowIn .3s ease backwards;
}
.rrow:hover { transform: translateY(-2px); box-shadow: 0 12px 26px rgba(20,15,10,.09); }
@keyframes rrowIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) { .rrow { animation: none; } }

.rrow-ico {
  width: 38px; height: 38px; border-radius: 12px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center; font-size: .8rem; color: #fff;
}
.rrow-main { flex: 1; min-width: 0; }
.rrow-amount { font-size: .92rem; font-weight: 900; color: var(--gray-800); letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
.rrow-meta { display: flex; align-items: center; gap: 5px; font-size: .62rem; font-weight: 600; color: var(--gray-400); margin-top: 3px; }
.rrow-meta span:not(:last-child)::after { content: '·'; margin-left: 5px; color: var(--gray-300); }

.rrow-status {
  flex-shrink: 0; display: flex; align-items: center; gap: 4px;
  padding: 5px 10px; border-radius: 20px; font-size: .62rem; font-weight: 800;
}
.rrow-status i { font-size: .58rem; }
.rrow-status--done    { background: rgba(18,184,134,.1); color: #12B886; }
.rrow-status--pending { background: rgba(245,158,11,.12); color: #D97706; }
.rrow-status--sanction { background: rgba(239,68,68,.1); color: #DC2626; }

/* Sanctions (voir DB.business.refundTransaction, type: 'sanction') —
   prélèvement imposé suite au remboursement d'une commande marquée
   "Terminée" à tort, distinct visuellement des retraits normaux. */
.rrow--sanction { border-color: rgba(239,68,68,.25); }
.rrow-ico--sanction { background: linear-gradient(150deg,#FCA5A5,#EF4444); }
.rrow-amount--sanction { color: #DC2626; }
.rrow-motif { font-size: .62rem; font-weight: 600; color: var(--gray-400); margin-top: 4px; line-height: 1.4; }

/* ── Radio réseau (modal UV) ───────────────────────────────── */
.cab-net-radio {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 5px;
  padding: 10px 6px;
  background: rgba(255,255,255,.04);
  border: 1.5px solid rgba(255,255,255,.1);
  border-radius: 10px; cursor: pointer;
  font-size: .65rem; font-weight: 700; color: rgba(255,255,255,.6);
  transition: all .2s;
}
.cab-net-radio:has(input:checked) {
  border-color: #FF6200;
  background: rgba(255,98,0,.12);
  color: #FF9A3C;
}
.cab-net-radio input { display: none; }
.cab-net-radio img { width: 26px; height: 26px; object-fit: contain; border-radius: 5px; }



/* ═══════════════════════════════════════════════════════════════════
   ESPACE CLIENT — Headers de section (cs-sec-bar)
   ═══════════════════════════════════════════════════════════════════ */

.cs-sec-bar {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 10px 4px 12px;
  margin-bottom: 4px;
}

.cs-sec-back {
  width: 27px; height: 27px;
  border-radius: 50%;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.12);
  color: rgba(255,255,255,.75);
  font-size: .68rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  flex-shrink: 0;
  transition: background .2s, transform .15s;
}
.cs-sec-back:hover { background: rgba(255,255,255,.14); transform: scale(1.07); }

.cs-sec-bar-ico {
  width: 32px; height: 32px; border-radius: 11px;
  display: flex; align-items: center; justify-content: center;
  font-size: .85rem; flex-shrink: 0;
}
.cs-sec-bar-ico--hist  { background: rgba(52,211,153,.15); color: #34D399; }
.cs-sec-bar-ico--dep   { background: rgba(239,68,68,.15);  color: #F87171; }
.cs-sec-bar-ico--wallet{ background: rgba(255,154,60,.15); color: #FF9A3C; }
.cs-sec-bar-ico--prof  { background: rgba(139,92,246,.15); color: #A78BFA; }

/* ── En-tête "Mon profil" : carte bleu marine, sur le modèle du bandeau
   identité de "À propos" (#modal-apropos, voir index.html) — icône/titre/
   sous-titre centrés en colonne plutôt qu'alignés en ligne, avec le
   bouton retour replacé en badge absolu dans le coin. Scopée à
   #cs-profit uniquement — les autres sections gardent leur cs-sec-bar
   transparente/en ligne standard. ── */
/* #cs-profit n'a pas de padding propre : il hérite tel quel de
   body:not(.on-home) .cs-section.active (20px 20px 110px, ou 16px 12px
   110px sous 600px). padding-top mis à 0 ici plutôt que d'essayer de
   l'annuler avec un margin négatif sur la carte ci-dessous — cette
   section défile (overflow-y:auto) et un margin négatif vertical
   n'annule pas de façon fiable le padding-top d'un conteneur qui scrolle
   (liseré blanc résiduel persistant même une fois "annulé sur le
   papier"). Seule une marge négative HORIZONTALE reste nécessaire sur la
   carte pour toucher les bords latéraux. */
#cs-profit.active { padding-top: 0; }
#cs-profit .cs-sec-bar {
  position: relative; overflow: hidden;
  flex-direction: column; align-items: center; text-align: center;
  gap: 5px;
  padding: 15px 20px 13px; margin: 0 -20px 10px;
  border-radius: 0 0 20px 20px;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  box-shadow: 0 10px 24px rgba(6,10,28,.32), 0 1px 0 rgba(255,255,255,.04) inset;
  /* Couche de composition dédiée (même correctif que .pgc-hero-card) —
     bandeau sur fond dégradé, sujet au même glitch de rendu. */
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
@media (max-width: 600px) {
  #cs-profit .cs-sec-bar { margin: 0 -12px 10px; }
}
#cs-profit .cs-sec-bar::after {
  content: ''; position: absolute; top: -20px; left: 50%; transform: translateX(-50%);
  width: 120px; height: 120px; border-radius: 50%;
  background: rgba(255,255,255,.05);
  pointer-events: none;
}
#cs-profit .cs-sec-bar-info,
#cs-profit .cs-sec-bar-ico { position: relative; z-index: 1; }
#cs-profit .cs-sec-bar-ico--prof {
  width: 38px; height: 38px; border-radius: 12px;
  background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.18);
  font-size: .95rem; color: #fff;
  margin-bottom: 1px;
}
#cs-profit .cs-sec-bar-info { align-items: center; }
#cs-profit .cs-sec-bar-title { font-size: .95rem; }
#cs-profit .cs-sec-bar-sub {
  font-size: .62rem; color: #8FA0C6;
  text-transform: uppercase; letter-spacing: .04em;
}

/* ── En-tête "Pharmacies de garde" — même patron que #cs-profit
   ci-dessus (bandeau sticky bleu marine, icône/titre/sous-titre
   centrés), depuis la conversion de cette page de modale en section
   plein écran de l'espace client. ── */
#cs-pharmacies.active { padding-top: 0; }
#cs-pharmacies .cs-sec-bar {
  position: relative; overflow: hidden;
  flex-direction: row; align-items: center; justify-content: space-between; text-align: left;
  gap: 14px;
  height: 100px;
  padding: 0 22px 0 58px; margin: 0 -20px 10px;
  border-radius: 0 0 20px 20px;
  background: linear-gradient(150deg, #2A6D5C 0%, #1F5C4D 55%, #163F35 100%);
  box-shadow: 0 10px 24px rgba(10,40,32,.32), 0 1px 0 rgba(255,255,255,.06) inset;
  transform: translateZ(0);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
@media (max-width: 600px) {
  #cs-pharmacies .cs-sec-bar { margin: 0 -12px 10px; }
}
#cs-pharmacies .cs-sec-bar::after {
  content: ''; position: absolute; top: -34px; left: -24px;
  width: 140px; height: 140px; border-radius: 50%;
  background: rgba(255,255,255,.04);
  pointer-events: none;
}
#cs-pharmacies .cs-sec-bar-info,
#cs-pharmacies .cs-sec-bar-ico { position: relative; z-index: 1; }
#cs-pharmacies .cs-sec-bar-info {
  order: 1; align-items: center; align-self: center;
  flex: 1; min-width: 0; justify-content: center;
  text-align: center;
}
#cs-pharmacies .cs-sec-bar-ico--pharma {
  order: 2; flex-shrink: 0;
  width: 64px; height: 64px; border-radius: 50%;
  background: #fff; padding: 9px; box-sizing: border-box;
  border: 2px solid rgba(255,255,255,.9);
  box-shadow: 0 0 0 2px rgba(255,255,255,.35), 0 6px 16px rgba(6,10,28,.35);
  overflow: hidden;
}
#cs-pharmacies .cs-sec-bar-pharma-img {
  width: 100%; height: 100%; object-fit: contain; border-radius: 0;
}
#cs-pharmacies .cs-sec-bar-title {
  font-size: .95rem;
}
#cs-pharmacies .cs-sec-bar-sub { display: none; }

/* Barre flottante compacte (demande explicite du 28/08) — apparaît une
   fois le bandeau bleu marine (.cs-sec-bar, ci-dessus) scrollé hors
   champ : titre centré + bouton menu "trois traits", posée en
   position:fixed par-dessus le contenu qui défile. Visibilité pilotée
   par _csFloatBarInit() (js/client.js) via la classe .show. */
.cs-float-bar {
  position: fixed; top: 0; left: 0; right: 0; z-index: 40;
  max-width: 720px; margin: 0 auto;
  height: 50px; padding: 0 16px;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  box-shadow: 0 6px 16px rgba(6,10,28,.3);
  transform: translateY(-100%);
  transition: transform .16s ease-out;
  pointer-events: none;
  will-change: transform;
}
.cs-float-bar.show { transform: translateY(0); pointer-events: auto; }
#cs-pharmacies-floatbar {
  background: linear-gradient(150deg, #2A6D5C 0%, #1F5C4D 55%, #163F35 100%);
  box-shadow: 0 6px 16px rgba(10,40,32,.3);
}
/* Variante pour les fenêtres modales (Contact/À propos/Partenaires) :
   sticky à l'intérieur de .modal-body (qui défile sur lui-même, voir
   #modal-contact/#modal-apropos/#modal-partenaires .modal-body plus
   bas) plutôt que fixed sur tout le viewport — sinon la barre se
   détacherait visuellement du cadre de la modale. sticky reste dans le
   flux normal (contrairement à fixed) : masquer via transform seul
   laissait un bandeau blanc vide (sa hauteur réservée) au-dessus du
   bandeau bleu marine — hauteur ET transform ramenés à 0 ensemble pour
   corriger (bug remonté le 28/08). */
.cs-float-bar--modal {
  position: sticky; max-width: none; border-radius: 0;
  height: 0; overflow: hidden; transform: none;
  transition: height .14s ease-out;
}
.cs-float-bar--modal.show { height: 50px; }
.cs-float-bar-menu {
  position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
  width: 30px; height: 30px; border-radius: 50%;
  background: none; border: none; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
}
.cs-float-bar-title { font-size: .82rem; font-weight: 800; color: #fff; }

.cs-sec-bar-info { display: flex; flex-direction: column; gap: 2px; }

.cs-sec-bar-title {
  font-size: .78rem; font-weight: 800;
  color: rgba(255,255,255,.92);
  letter-spacing: .01em;
}

.cs-sec-bar-sub {
  font-size: .6rem; font-weight: 500;
  color: rgba(255,255,255,.45);
}

/* ── Variantes icônes cs-sec-bar pour l'espace cabine ── */
.cs-sec-bar-ico--ret   { background: rgba(255,98,0,.15);   color: #FF6200; }
.cs-sec-bar-ico--comm  { background: rgba(251,191,36,.15); color: #FBBF24; }
.cs-sec-bar-ico--recla { background: rgba(245,158,11,.15); color: #F59E0B; }
.cs-sec-bar-ico--notif { background: rgba(99,102,241,.15); color: #818CF8; }

/* ── Surcharges cs-sec-bar dans l'espace cabine (fond blanc/sombre) ── */
.cab-section .cs-sec-bar-title { color: var(--gray-800); }
.cab-section .cs-sec-bar-sub   { color: var(--gray-600); }

/* En-tête de section cabine : carte à contour bleu marine + bouton retour
   blanc (flèche marine). */
.cab-section .cs-sec-bar {
  background: #fff;
  border: 1.5px solid #0F2350;
  border-radius: 14px;
  padding: 10px 12px;
  gap: 10px;
  margin-bottom: 12px;
}
.cab-section .cs-sec-back {
  background: #fff;
  border-color: #0F2350;
  color: #0F2350;
}
.cab-section .cs-sec-back:hover { background: #F1F4FA; }

/* Bouton action dans cs-sec-bar (ex: "Tout lire") */
.cs-sec-action {
  margin-left: auto; flex-shrink: 0;
  display: flex; align-items: center; gap: 5px;
  padding: 5px 10px; border-radius: 20px;
  background: rgba(255,255,255,.06);
  border: 1px solid rgba(255,255,255,.1);
  color: rgba(255,255,255,.55);
  font-size: .65rem; font-weight: 700;
  cursor: pointer; transition: background .2s, color .2s;
}
.cs-sec-action:hover { background: rgba(255,255,255,.12); color: #fff; }

/* ── En-têtes "Mes commissions" / "Réclamations clients" / "Mon profil" /
   "Cumul commissions" / "Cumul commandes" : carte Premium sombre, même
   recette que .cqt-wrapper / .cst-group-card / .cab-net-card — scopées
   par ID, comme #cs-profit ci-dessus, pour ne pas affecter les autres
   .cs-sec-bar (Notifications…) qui gardent leur variante blanche standard. ── */
#cab-sec-commissions .cs-sec-bar,
#cab-sec-comm-daily .cs-sec-bar,
#cab-sec-cmd-daily .cs-sec-bar {
  position: relative; overflow: hidden;
  gap: 12px;
  padding: 14px 16px; margin: 0 0 12px;
  border-radius: 18px;
  background: linear-gradient(150deg, #2B3A55 0%, #16202F 100%);
  border: 1px solid rgba(255,255,255,.12);
  box-shadow: 0 10px 26px rgba(10,20,35,.3);
}
#cab-sec-commissions .cs-sec-bar::after,
#cab-sec-comm-daily .cs-sec-bar::after,
#cab-sec-cmd-daily .cs-sec-bar::after {
  content: ''; position: absolute; top: -40%; right: -14%;
  width: 120px; height: 120px; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,154,60,.22), transparent 70%);
  pointer-events: none;
}
#cab-sec-commissions .cs-sec-bar-info,
#cab-sec-commissions .cs-sec-bar-ico,
#cab-sec-comm-daily .cs-sec-bar-info,
#cab-sec-comm-daily .cs-sec-bar-ico,
#cab-sec-cmd-daily .cs-sec-bar-info,
#cab-sec-cmd-daily .cs-sec-bar-ico { position: relative; z-index: 1; }
#cab-sec-commissions .cs-sec-bar-title,
#cab-sec-comm-daily .cs-sec-bar-title,
#cab-sec-cmd-daily .cs-sec-bar-title { color: #fff; }
#cab-sec-commissions .cs-sec-bar-sub,
#cab-sec-comm-daily .cs-sec-bar-sub,
#cab-sec-cmd-daily .cs-sec-bar-sub { color: rgba(244,233,222,.55); }

/* "Historique" : fond blanc (demande explicite, après avoir essayé le
   dégradé sombre partagé ci-dessus) — garde la même structure de carte
   (icône, padding, coins arrondis) mais en clair. */
#cab-sec-historique .cs-sec-bar {
  background: #fff;
  border-radius: 18px;
  padding: 14px 16px; margin: 0 0 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
#cab-sec-historique .cs-sec-bar-title { color: #242320; }
#cab-sec-historique .cs-sec-bar-sub { color: rgba(36,35,32,.5); }

/* "Mon profil" : même modèle blanc + accent que Historique/Réclamations
   (demande explicite, remplace le fond uni foncé d'avant). */
#cab-sec-profile .cs-sec-bar {
  background: #fff;
  border-radius: 18px;
  padding: 14px 16px; margin: 0 0 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
#cab-sec-profile .cs-sec-bar::after { display: none; }
#cab-sec-profile .cs-sec-bar-title { color: #242320; }
#cab-sec-profile .cs-sec-bar-sub { color: rgba(36,35,32,.5); }
#cab-sec-profile .cs-sec-back {
  background: var(--gray-100, #f2f2f0); border-color: rgba(0,0,0,.08); color: #242320;
}
#cab-sec-profile .cs-sec-back:hover { background: var(--gray-200, #e8e8e5); }
#cab-sec-comm-daily .cs-sec-back,
#cab-sec-cmd-daily .cs-sec-back {
  position: relative; z-index: 1;
  background: rgba(255,255,255,.07); border-color: rgba(255,255,255,.12); color: rgba(255,255,255,.75);
}
#cab-sec-comm-daily .cs-sec-back:hover,
#cab-sec-cmd-daily .cs-sec-back:hover { background: rgba(255,255,255,.14); }


/* "Cumul commandes"/"Cumul commissions"/"Réclamations clients" : modèle
   "carte blanche + accent" (demande explicite, style tableau de bord) —
   fond blanc, fine barre bleu marine sur le bord gauche, texte foncé,
   plus de dégradé/halo. */
#cab-sec-cmd-daily .cs-sec-bar,
#cab-sec-comm-daily .cs-sec-bar,
#cab-sec-reclamations .cs-sec-bar {
  background: #fff;
  border: none;
  border-radius: 18px;
  padding: 14px 16px; margin: 0 0 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
#cab-sec-cmd-daily .cs-sec-bar::after,
#cab-sec-comm-daily .cs-sec-bar::after,
#cab-sec-reclamations .cs-sec-bar::after { display: none; }
#cab-sec-cmd-daily .cs-sec-bar-title,
#cab-sec-comm-daily .cs-sec-bar-title,
#cab-sec-reclamations .cs-sec-bar-title { color: #242320; }
#cab-sec-cmd-daily .cs-sec-bar-sub,
#cab-sec-comm-daily .cs-sec-bar-sub,
#cab-sec-reclamations .cs-sec-bar-sub { color: rgba(36,35,32,.5); }
#cab-sec-cmd-daily .cs-sec-back,
#cab-sec-comm-daily .cs-sec-back,
#cab-sec-reclamations .cs-sec-back {
  background: var(--gray-100, #f2f2f0); border-color: rgba(0,0,0,.08); color: #242320;
}
#cab-sec-cmd-daily .cs-sec-back:hover,
#cab-sec-comm-daily .cs-sec-back:hover,
#cab-sec-reclamations .cs-sec-back:hover { background: var(--gray-200, #e8e8e5); }

/* ── TOUS les en-têtes de section de l'Espace Cabine : section blanche
   unie, sans dégradé sombre ni ombre bleutée (demande explicite : "crée
   une section blanche… fais pareil pour les autres onglets"). Surcharge
   finale, après toutes les variantes ci-dessus. ── */
#cab-sec-home .cs-sec-bar,
#cab-sec-retraits .cs-sec-bar,
#cab-sec-historique .cs-sec-bar,
#cab-sec-commissions .cs-sec-bar,
#cab-sec-comm-daily .cs-sec-bar,
#cab-sec-cmd-daily .cs-sec-bar,
#cab-sec-reclamations .cs-sec-bar,
#cab-sec-notifications .cs-sec-bar,
#cab-sec-profile .cs-sec-bar {
  background: #ffffff;
  border: 1px solid #EFF0F3;
  border-radius: 16px;
  box-shadow: none;
}
#cab-sec-home .cs-sec-bar::after,
#cab-sec-retraits .cs-sec-bar::after,
#cab-sec-historique .cs-sec-bar::after,
#cab-sec-commissions .cs-sec-bar::after,
#cab-sec-comm-daily .cs-sec-bar::after,
#cab-sec-cmd-daily .cs-sec-bar::after,
#cab-sec-reclamations .cs-sec-bar::after,
#cab-sec-notifications .cs-sec-bar::after,
#cab-sec-profile .cs-sec-bar::after { display: none; }
#cab-sec-commissions .cs-sec-bar-title,
#cab-sec-comm-daily .cs-sec-bar-title,
#cab-sec-cmd-daily .cs-sec-bar-title,
#cab-sec-reclamations .cs-sec-bar-title { color: #242320; }
#cab-sec-commissions .cs-sec-bar-sub,
#cab-sec-comm-daily .cs-sec-bar-sub,
#cab-sec-cmd-daily .cs-sec-bar-sub,
#cab-sec-reclamations .cs-sec-bar-sub { color: rgba(36,35,32,.5); }
#cab-sec-commissions .cs-sec-back,
#cab-sec-comm-daily .cs-sec-back,
#cab-sec-cmd-daily .cs-sec-back,
#cab-sec-reclamations .cs-sec-back {
  background: var(--gray-100, #f2f2f0); border-color: rgba(0,0,0,.08); color: #242320;
}
#cab-sec-commissions .cs-sec-back:hover,
#cab-sec-comm-daily .cs-sec-back:hover,
#cab-sec-cmd-daily .cs-sec-back:hover,
#cab-sec-reclamations .cs-sec-back:hover { background: var(--gray-200, #e8e8e5); }

/* Format réduit (demande explicite) sur ces deux mêmes sections. */
#cab-sec-cmd-daily .cs-sec-bar,
#cab-sec-comm-daily .cs-sec-bar { padding: 9px 12px; gap: 9px; margin-bottom: 8px; }
#cab-sec-cmd-daily .cs-sec-back,
#cab-sec-comm-daily .cs-sec-back { width: 26px; height: 26px; font-size: .68rem; }
#cab-sec-cmd-daily .cs-sec-bar-title,
#cab-sec-comm-daily .cs-sec-bar-title { font-size: .78rem; }
#cab-sec-cmd-daily .cs-sec-bar-sub,
#cab-sec-comm-daily .cs-sec-bar-sub { font-size: .6rem; }

/* ── Tableau de solde — section spéciale ───────────────────── */
.cbs-wrapper {
  background: rgba(18,184,134,.04);
  border: 1px solid rgba(52,211,153,.14);
  border-radius: 22px;
  padding: 14px 12px 12px;
  margin-bottom: 14px;
}
/* Pas de cadre derrière : utilisé pour les sections qui portent déjà
   leur propre fond (ex: le segmented control orange). */
.cbs-wrapper--bare {
  background: none; border: none; padding: 0; box-shadow: none;
}
/* Rangée d'actions rapides — sans fond, rapprochée du tableau de solde
   juste au-dessus (voir cabine.html) en réduisant la marge par défaut de
   .cbs-wrapper. */
.cbc-quickrow-wrap { margin-top: -12px; }

/* Cadre blanc plein (au lieu du fond verdâtre par défaut) : utilisé
   derrière le tableau de solde. Pas de marge interne sur le wrapper —
   c'est .cbc-card qui porte sa propre marge horizontale (voir plus
   haut), pour rester plus étroite que la zone. */
.cbs-wrapper--white {
  background: #fff;
  border: 1px solid var(--gray-200);
  box-shadow: 0 4px 18px rgba(0,0,0,.06);
  padding: 0;
}

.cbs-wrapper .cs-sec-bar {
  padding-bottom: 12px;
  margin-bottom: 12px;
  border-bottom: 1px solid rgba(52,211,153,.1);
}

.cs-sec-bar-ico--solde {
  background: rgba(52,211,153,.15);
  color: #34D399;
}

/* Indicateur "En ligne" */
.cbs-live-dot {
  margin-left: auto;
  display: flex; align-items: center; gap: 5px;
  font-size: .62rem; font-weight: 700;
  color: rgba(52,211,153,.8);
}
.cbs-live-dot span {
  position: relative;
  width: 7px; height: 7px; border-radius: 50%;
  background: #12B886;
  box-shadow: 0 0 0 3px rgba(18,184,134,.25);
  flex-shrink: 0;
}
.cbs-live-dot span::after {
  content: ''; position: absolute; inset: -3px; border-radius: 50%;
  border: 2px solid rgba(18,184,134,.4);
  animation: livePulse 2s ease-out infinite;
}
@media (prefers-reduced-motion: reduce) { .cbs-live-dot span::after { animation: none; } }
@keyframes livePulse { 0% { transform: scale(.6); opacity: .7; } 100% { transform: scale(1.8); opacity: 0; } }

/* Badge « En pause depuis HH:MM » — sous la ligne "Pause" du profil
   (groupe "Statut", voir cabine.html). */
.cqk-pause-status {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  margin: -4px 0 12px;
  font-size: .64rem; font-weight: 700; color: #DC2626;
  background: rgba(220,38,38,.08); border: 1px solid rgba(220,38,38,.18);
  border-radius: 20px; padding: 5px 12px;
}
.cqk-pause-status i { font-size: .7rem; }

/* Avertissement en haut de la modale de mise en pause */
.cqk-pause-warning {
  display: flex; align-items: flex-start; gap: 8px;
  background: rgba(245,158,11,.08); border: 1px solid rgba(245,158,11,.25);
  border-radius: 10px; padding: 10px 12px;
  margin-bottom: 16px;
  font-size: .72rem; font-weight: 600; color: #92400e;
  line-height: 1.45;
}
.cqk-pause-warning i { color: #F59E0B; font-size: .8rem; margin-top: 1px; flex-shrink: 0; }

/* Alerte "réseaux indisponibles" — puce compacte dans la top nav (entre
   l'avatar et le badge cabines connectées), qui se déplie au tap pour
   lister le détail (voir toggleMissingNetworksDetail() dans cabine.js). */
.cab-tnav-network-wrap { position: relative; margin-right: auto; min-width: 0; flex-shrink: 1; }
.net-chip {
  display: flex; align-items: center; gap: 5px;
  background: none; border: none;
  border-radius: 8px; padding: 4px 8px 4px 6px;
  font-family: var(--font); max-width: 100%;
}
.net-chip-pulse { position: relative; width: 6px; height: 6px; flex-shrink: 0; }
.net-chip-pulse::before, .net-chip-pulse::after {
  content: ''; position: absolute; inset: 0; border-radius: 50%; background: #F5B84C;
}
.net-chip-pulse::before { animation: netPulse 1.8s ease-out infinite; }
@keyframes netPulse { 0% { transform: scale(1); opacity: .55; } 100% { transform: scale(2.6); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .net-chip-pulse::before { animation: none; } }
.net-chip-text { font-size: .64rem; font-weight: 800; color: #F5B84C; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Sélecteur de motif (modal pause) — menu déroulant sobre */
.cqk-reason-select { cursor: pointer; font-weight: 600; }
.cqk-reason-select:focus { box-shadow: 0 0 0 3px rgba(239,68,68,.12); border-color: #EF4444; }

.cqk-reason-list {
  display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
  margin-bottom: 14px;
}
.cqk-reason-row {
  display: flex; align-items: center; gap: 8px;
  padding: 11px 10px; border-radius: 12px; cursor: pointer;
  background: var(--gray-100); border: 1.5px solid var(--gray-200);
  color: #1a1a2e; font-size: .7rem; font-weight: 700;
  transition: background .18s, border-color .18s, color .18s;
}
.cqk-reason-row:hover { background: var(--gray-200); }
.cqk-reason-row i { font-size: .8rem; color: rgba(26,26,46,.4); transition: color .18s; flex-shrink: 0; }
.cqk-reason-row.sel {
  background: rgba(255,98,0,.1); border-color: var(--primary); color: var(--primary);
}
.cqk-reason-row.sel i { color: var(--primary); }
.cqk-reason-row--wide { grid-column: 1 / -1; }

/* Retire le margin-bottom de la carte à l'intérieur du wrapper */
.cbs-wrapper .cbc-card,
.cbs-wrapper .cqt-wrapper { margin-bottom: 0; }

/* ── Quota de commission du forfait (cqt) — modèle "bandeau incurvé"
   (référence externe fournie par l'utilisateur) : bandeau indigo dégradé
   en haut à gauche, découpé par une courbe plutôt qu'une ligne droite,
   pastille d'expiration blanche flottante à droite, icône décorative. ── */
.cqt-wrapper {
  position: relative;
  overflow: hidden;
  background: #fff;
  border: 1px solid rgba(15,10,46,.1);
  border-radius: 14px;
  padding: 0 10px 10px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
  color: #000;
}

/* Bandeau incurvé (dégradé bleu marine, découpe via border-radius
   asymétrique plutôt qu'un simple rectangle) portant l'icône couronne +
   le libellé de palier. */
.cqt-band {
  position: relative; z-index: 1;
  display: flex; align-items: center; gap: 6px;
  margin: 0 -10px 10px; padding: 9px 14px 16px 10px;
  background: linear-gradient(120deg, #141B45 0%, #0A0A22 100%);
  border-radius: 14px 14px 100% 0 / 14px 14px 36px 0;
}
.cqt-band-ico {
  flex-shrink: 0; width: 21px; height: 21px; border-radius: 50%;
  background: rgba(255,255,255,.22); color: #fff;
  display: flex; align-items: center; justify-content: center; font-size: .6rem;
}
.cqt-band-text { font-size: .68rem; font-weight: 800; color: #fff; letter-spacing: .01em; }

.cqt-expiry-chip {
  position: absolute; top: 9px; right: 9px; z-index: 2;
  flex-shrink: 0;
  display: flex; align-items: center; gap: 4px;
  font-size: .52rem; font-weight: 700; color: #0F0A2E;
  background: #fff; border: 1px solid rgba(15,10,46,.15);
  border-radius: 999px; padding: 4px 9px;
  white-space: nowrap; box-shadow: 0 4px 10px rgba(0,0,0,.06);
}
.cqt-expiry-chip i { font-size: .5rem; }

/* Corps : montants en grand + barre de progression horizontale (plus
   d'arc circulaire — modèle proposé/validé pour remplacer l'ancien
   .cqt-ring). Le badge de pourcentage flotte à l'extrémité du
   remplissage plutôt qu'au centre d'un anneau. */
.cqt-body { position: relative; margin-bottom: 7px; }
.cqt-nums-lbl {
  font-size: .52rem; font-weight: 700; color: #0F0A2E;
  text-transform: uppercase; letter-spacing: .06em; margin-bottom: 4px;
}
.cqt-nums-amt { font-size: 1.05rem; font-weight: 900; color: #16121F; letter-spacing: -.02em; margin-bottom: 9px; }
.cqt-nums-amt span { font-size: .68rem; font-weight: 700; color: rgba(22,18,31,.45); margin-left: 2px; }

/* Bouton et icône purement décoratifs (voir cabine.html) — pas de
   fonction câblée, fidèles à la référence fournie. */
.cqt-bar-track {
  position: relative;
  width: 100%; height: 6px; border-radius: 999px;
  background: #EEEDF5;
}
.cqt-bar-fill {
  position: relative;
  height: 100%; min-width: 8px; border-radius: 999px;
  width: calc(var(--pct) * 1%);
  background: linear-gradient(90deg, #FF9A3C, #FF6200);
  transition: width .4s ease;
}
.cqt-bar-badge {
  position: absolute; top: 50%; right: 0; transform: translate(50%, -50%);
  background: #FF6200; color: #fff;
  font-size: .52rem; font-weight: 900; white-space: nowrap;
  padding: 2px 6px; border-radius: 999px;
  box-shadow: 0 3px 8px rgba(255,98,0,.4);
}

/* Bandeau d'alerte, sur fond ambre — même convention que .badge-pending
   ailleurs dans l'app, lisible sur fond clair (contrairement au texte
   pêche pâle d'origine, pensé pour la carte sombre précédente). */
.cqt-note {
  position: relative;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-size: .56rem; font-weight: 500; line-height: 1.4; text-align: center;
  background: rgba(245,158,11,.12);
  border: 1px solid rgba(245,158,11,.3);
  border-radius: 10px;
  padding: 7px 9px;
  color: #92400E;
}
.cqt-note i { color: #D97706; font-size: .6rem; flex-shrink: 0; }
.cqt-note--warn { background: rgba(245,158,11,.16); border-color: rgba(245,158,11,.4); color: #7A3406; }
.cqt-note--full { background: rgba(220,38,38,.12); border-color: rgba(220,38,38,.35); color: #991B1B; font-weight: 700; }
.cqt-note--full i { color: #DC2626; }


/* ── Statistiques — modèle "4 cartes KPI" (référence fournie) : 4 cartes
   séparées, icône ronde colorée, gros chiffre, pied de carte teinté avec
   chevron. Libellés de pied statiques ("Aujourd'hui"/"Abonnement en
   cours") pour les 4 cartes — jamais de pourcentage inventé. Regroupées
   dans une section blanche commune (.cse-kpi-section) et rétrécies
   (demande explicite) plutôt que flottantes séparément sur le fond de
   page. ── */
.cse-kpi-section {
  background: #fff; border: 1px solid rgba(15,10,46,.08);
  border-radius: 16px; padding: 10px;
  margin-bottom: 10px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.cse-kpi-note {
  display: flex; align-items: center; gap: 6px;
  font-size: .6rem; font-weight: 800; color: var(--gray-500);
  text-transform: uppercase; letter-spacing: .03em;
  background: var(--gray-100); border-radius: 8px;
  padding: 6px 9px; margin-bottom: 8px; line-height: 1.3;
}
.cse-kpi-note i { color: var(--primary); font-size: .64rem; flex-shrink: 0; }
.cse-kpi-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.cse-kpi-card {
  all: unset; box-sizing: border-box; cursor: default; display: block;
  background: #F9F9FB; border: 1px solid rgba(15,10,46,.06);
  border-radius: 12px; overflow: hidden;
  animation: cseFadeUp .45s ease both;
}
button.cse-kpi-card { cursor: pointer; font-family: inherit; }
button.cse-kpi-card:active { transform: scale(.98); }
@keyframes cseFadeUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) { .cse-kpi-card { animation: none; } }
.cse-kpi-head { display: flex; align-items: center; gap: 6px; padding: 9px 9px 0; }
.cse-kpi-ico {
  flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center; font-size: .6rem;
}
.cse-kpi-ico--orange { background: rgba(232,82,0,.1); color: #E85200; }
.cse-kpi-ico--green  { background: rgba(5,150,105,.1); color: #059669; }
.cse-kpi-ico--purple { background: rgba(124,58,237,.1); color: #7C3AED; }
.cse-kpi-ico--blue   { background: rgba(37,99,235,.1); color: #2563EB; }
.cse-kpi-title {
  font-size: .54rem; font-weight: 700; color: rgba(36,35,32,.6);
  text-transform: uppercase; letter-spacing: .02em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cse-kpi-val {
  display: block;
  font-size: 1rem; font-weight: 900; letter-spacing: -.01em;
  text-align: center;
  padding: 5px 9px 8px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cse-kpi-val--orange,
.cse-kpi-val--green,
.cse-kpi-val--purple,
.cse-kpi-val--blue { color: #16121F; }
.cse-kpi-foot {
  display: flex; align-items: center; justify-content: space-between;
  padding: 5px 9px; font-size: .56rem; font-weight: 700;
}
.cse-kpi-foot i { font-size: .6rem; opacity: .6; }
.cse-kpi-foot--orange,
.cse-kpi-foot--green,
.cse-kpi-foot--purple,
.cse-kpi-foot--blue { background: rgba(15,10,46,.05); color: #16121F; }

.cs-sec-bar-ico--orders { background: rgba(52,211,153,.15); color: #34D399; }

/* ── Statistiques temps réel : 4 colonnes chiffre + libellé séparées par
   des filets verticaux (demande explicite : "supprime les cercles" — les
   anneaux SVG de progression, devenus vides une fois leur icône retirée,
   ont été enlevés entièrement plutôt que laissés vides). Le remplissage
   éventuel géré par updateRealtimeRings() (js/cabine.js) ne s'applique
   donc plus à rien ici (fonction devenue sans effet, jamais supprimée —
   inoffensive). ── */
.crg-card {
  background: #fff;
  border: 1px solid rgba(15,10,46,.06);
  border-radius: 16px;
  padding: 14px 6px;
  margin-bottom: 10px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}
.crg-row { display: flex; align-items: center; }
.crg-item { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 8px; }
.crg-item:not(:first-child) { border-left: 1px solid rgba(15,10,46,.08); }
.crg-text { min-width: 0; text-align: center; }
.crg-num {
  font-size: 1.05rem; font-weight: 900; letter-spacing: -.01em;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.crg-lbl {
  font-size: .5rem; font-weight: 800; text-transform: uppercase; letter-spacing: .03em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 1px;
}
.crg-item:nth-child(1) .crg-num, .crg-item:nth-child(1) .crg-lbl { color: #FACC15; }
.crg-item:nth-child(2) .crg-num, .crg-item:nth-child(2) .crg-lbl { color: #059669; }
.crg-item:nth-child(3) .crg-num, .crg-item:nth-child(3) .crg-lbl { color: #DC2626; }
.crg-item:nth-child(4) .crg-num, .crg-item:nth-child(4) .crg-lbl { color: #8B5CF6; }

/* ── Section spécialisée : filtre par statut — même modèle "tuile
   service" que .cab-net-card/.svc-net-btn (État des réseaux, plus
   haut dans la page) : logo dans un badge blanc, pastille grise en
   haut à droite de la tuile, libellé dans une pilule blanche. Actif =
   tuile teintée + contour coloré (vert par défaut, orange pour les
   onglets marqués data-thumb="orange"), plus de curseur partagé qui
   glisse — chaque tuile porte directement son propre état. ── */
.cof-filter-card {
  background: #fff;
  border: 1px solid rgba(15,10,46,.06);
  border-radius: 16px;
  padding: 10px;
  margin-bottom: 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.05);
}

/* Modèle simplifié (demande explicite : "un modèle plus simple") : une
   seule piste grise, l'onglet actif devient un bloc plein coloré (façon
   sélecteur iOS) — plus de carte/bordure par onglet inactif, plus de
   pastille coche animée en coin. */
.cof-tabs {
  position: relative;
  display: flex; gap: 4px;
  background: var(--gray-100);
  border-radius: 12px;
  padding: 4px;
}

.cof-ctab {
  position: relative;
  flex: 1;
  display: flex; align-items: center; justify-content: center;
  min-height: 38px;
  background: none;
  border: none;
  border-radius: 9px;
  padding: 8px 6px;
  cursor: pointer; font-family: inherit;
  transition: background .2s ease;
  -webkit-tap-highlight-color: transparent;
}
.cof-ctab:active { transform: scale(.97); }
.cof-ctab.active { background: #12B886; }
.cof-ctab[data-thumb="orange"].active { background: #FF6200; }

.cof-ctab-lbl {
  position: relative;
  color: var(--gray-500);
  font-size: .8rem; font-weight: 700;
  text-align: center; line-height: 1.15;
  transition: color .2s ease;
}
.cof-ctab.active .cof-ctab-lbl { color: #fff; }

/* Onglets "Tout / Transferts envoyés / Commandes" (section Historique
   cabine) : libellé plus long ("Transferts envoyés") — réduit ici
   seulement, les autres .cof-tabs de la page gardent leur taille standard. */
#cab-sec-historique .cof-tabs { padding: 3px; gap: 3px; }
#cab-sec-historique .cof-ctab { min-height: 32px; padding: 5px 4px; }
#cab-sec-historique .cof-ctab-lbl { font-size: .66rem; line-height: 1.1; }

/* Badge numérique (nombre de commandes en cours), posé sur le libellé */
.cof-ctab-badge {
  position: absolute; top: -9px; right: -14px;
  min-width: 15px; height: 15px; padding: 0 3px;
  border-radius: 8px;
  background: #EF4444; color: #fff;
  font-size: .48rem; font-weight: 900;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 2px 6px rgba(239,68,68,.5);
  z-index: 2;
}

/* ── Conteneur de la liste des commandes — carte Premium sombre,
   assortie au filtre segmenté (.cof-filter-card) juste au-dessus. Les
   cartes commande (.cov-card) gardent leur propre fond pastel par
   opérateur : elles se lisent comme des reçus posés sur un plateau sombre. ── */
.cof-list-wrapper {
  background: #fff;
  border: 1px solid rgba(0,0,0,.08);
  border-radius: 16px;
  padding: 14px 12px;
  box-shadow: 0 10px 26px rgba(0,0,0,.06);
}
.cof-list-wrapper .cab-empty-state { color: var(--gray-400); }

/* Lien vers l'historique complet (au-delà des 30 commandes validées
   affichées dans "Toutes") — voir loadCabOrders() dans js/cabine.js. */
.cab-orders-history-link {
  all: unset; box-sizing: border-box; cursor: pointer;
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; margin-top: 10px; padding: 12px;
  border-radius: 12px; border: 1px dashed rgba(0,0,0,.14);
  background: rgba(255,154,60,.06);
  color: #ff9a3c; font-size: .72rem; font-weight: 800;
  font-family: var(--font); text-align: center;
  transition: background .15s;
}
.cab-orders-history-link:hover { background: rgba(255,154,60,.12); }


/* ═══════════════════════════════════════════════════════════════════
   CARTE COMMANDE CABINE — nouveau modèle expansé (cov)
   ═══════════════════════════════════════════════════════════════════ */
.cov-card {
  background: var(--white);
  border-radius: 14px;
  /* Couleur posée en inline selon l'étape de la commande (voir stBorder,
     js/cabine.js) : gris foncé assignée, bleu ciel clair réservée
     ("Conserver 5min"), vert olive terminée. #D2B48C ici en simple repli. */
  border: 4px solid #D2B48C;
  overflow: hidden;
  margin-bottom: 12px;
  box-shadow: 0 2px 14px rgba(0,0,0,.07);
}

/* ── Ligne statut + ref ── */
.cov-top {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 14px 6px;
}
.cov-status-row { display: flex; align-items: center; gap: 7px; }
.cov-dot {
  width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0;
}
.cov-status-lbl { font-size: .75rem; font-weight: 900; letter-spacing: .06em; }
.cov-ref {
  font-size: .75rem; font-weight: 700; color: var(--gray-600);
  background: var(--gray-100); border-radius: 20px; padding: 3px 12px;
  cursor: pointer;
}

/* ── Numéro destinataire — section spéciale bleu marine, barre réduite
   (demande explicite) : moins de padding, chiffres et bouton copier plus
   petits pour rester proportionnés à la barre plus fine. ── */
.cov-num-row {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  margin: 8px 14px;
  padding: 7px 12px;
  background: linear-gradient(150deg, #0d1a3d 0%, #0a1330 55%, #060a1c 100%);
  border-radius: 10px;
}
.cov-num { font-size: .88rem; font-weight: 900; color: #fff; letter-spacing: .06em; }
.cov-num--dial { cursor: pointer; transition: color .15s; }
.cov-num--dial:hover, .cov-num--dial:active { color: #FF9500; }
.cov-copy-btn {
  width: 22px; height: 22px; border-radius: 7px;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.18);
  color: #fff; font-size: .65rem;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; flex-shrink: 0;
  transition: background .15s;
}
.cov-copy-btn:hover { background: rgba(255,255,255,.2); }

/* ── Méta : opérateur / service / client ── */
.cov-meta-row { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 14px 10px; }
.cov-meta-tag {
  font-size: .66rem; font-weight: 700; color: var(--gray-600);
  background: var(--gray-100); border: 1px solid var(--gray-200);
  border-radius: 20px; padding: 3px 10px;
}

/* Descriptif du forfait souscrit (nom + volume/validité), sous les tags —
   voir js/cabine.js (t.details.forfait_nom / forfait_detail). */
.cov-forfait-detail {
  display: flex; align-items: baseline; gap: 6px;
  padding: 0 14px 10px;
  font-size: .68rem; font-weight: 600; color: var(--gray-600); line-height: 1.35;
}
.cov-forfait-detail i { color: var(--gray-500); font-size: .62rem; }

/* ── Montant ── */
.cov-amount-row {
  display: flex; align-items: baseline; gap: 10px;
  padding: 8px 14px 10px;
  border-top: 1px solid var(--gray-100);
}
.cov-amount { font-size: 1.3rem; font-weight: 900; color: #16a34a; }
.cov-comm { font-size: .7rem; font-weight: 700; color: var(--gray-600); }

/* ── Pied : heure (statut déjà affiché en haut de carte) ── */
.cov-inner-foot {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 14px 12px;
  border-top: 1px solid var(--gray-100);
}
.cov-inner-time { font-size: .72rem; color: #9ca3af; font-weight: 600; }

/* Décompte du délai de 3 min avant réattribution auto (voir
   _startOrderCountdownTick dans js/cabine.js) — distinct du hold "Garder
   5min" qui a son propre affichage dans le bouton. */
.cov-countdown {
  font-size: .62rem; font-weight: 700; color: #b45309;
  display: flex; align-items: center; gap: 4px;
  font-variant-numeric: tabular-nums;
}
.cov-countdown i { font-size: .6rem; }
.cov-countdown--queued { color: var(--gray-400); }

/* ── Boutons action ── */
.cov-actions { padding: 10px 12px 12px; display: flex; flex-direction: column; gap: 8px; }
.cov-actions-row { display: flex; gap: 8px; }
.cov-btn {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 7px;
  padding: 13px 12px; border-radius: 14px; border: none; cursor: pointer;
  font-size: .78rem; font-weight: 800;
  transition: opacity .18s, transform .12s;
}
.cov-btn:active { transform: scale(.97); }
/* Couleurs recalées sur le sens de chaque action plutôt que sur l'identité
   de l'app — Conserver (patiente/attention) en orange, Ramener (action
   négative/retour) en rouge, Terminer (succès) en vert : les 3 se
   distinguent d'un coup d'œil sans lire le texte. Couleur pleine + ombre
   douce assortie, pas de bordure/dégradé — demande explicite d'un rendu
   simple. */
.cov-btn--hold {
  background: #FF6200; color: #fff;
  box-shadow: 0 4px 12px rgba(255,98,0,.28);
}
.cov-btn--hold:hover { background: #CC4E00; }
.cov-btn--hold:disabled { opacity: .55; cursor: not-allowed; }
.cov-btn--refuse {
  background: #DC2626; color: #fff;
  box-shadow: 0 4px 12px rgba(220,38,38,.28);
}
.cov-btn--refuse:hover { background: #B91C1C; }
.cov-btn--done {
  width: 100%; background: #16a34a; color: #fff;
  font-size: .85rem;
  box-shadow: 0 4px 12px rgba(22,163,74,.28);
}
.cov-btn--done:hover { background: #15803d; }

/* ── Preuve de paiement (commande facture) — zone bleu marine vif,
   bien distincte du reste de la carte pour que le cabiniste la voie
   clairement. Classes dédiées ("factp-") : ne jamais réutiliser celles
   de la carte réclamation (.recla-upload-btn etc.), qui vivent sur un
   fond différent et ont déjà changé de couleur plusieurs fois. ── */
.factp-wrap {
  display: flex; flex-direction: column; gap: 10px;
  padding: 14px; border-radius: 14px;
  background: linear-gradient(150deg, #14295E 0%, #0A1730 100%);
  border: 1px solid rgba(255,255,255,.14);
  box-shadow: 0 8px 20px rgba(10,20,35,.35);
}
.factp-file-input { position: absolute; width: 1px; height: 1px; opacity: 0; overflow: hidden; }
.factp-upload-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  padding: 12px 14px; border-radius: 12px;
  border: 1.5px dashed rgba(255,255,255,.45); background: rgba(255,255,255,.08);
  color: #fff; font-size: .78rem; font-weight: 700;
  cursor: pointer; transition: border-color .15s, background .15s;
}
.factp-upload-btn:hover { border-color: rgba(255,255,255,.75); background: rgba(255,255,255,.15); }
.factp-upload-preview {
  width: 100%; max-height: 160px; object-fit: cover;
  border-radius: 10px; border: 1px solid rgba(255,255,255,.25);
}
.factp-submit-btn {
  width: 100%; padding: 13px 14px; border-radius: 12px;
  background: linear-gradient(135deg, #34D399, #059669);
  border: none; color: #fff; font-size: .85rem; font-weight: 800;
  cursor: pointer; font-family: var(--font);
  display: flex; align-items: center; justify-content: center; gap: 8px;
  box-shadow: 0 6px 16px rgba(5,150,105,.35); transition: transform .15s;
}
.factp-submit-btn:hover { transform: translateY(-1px); }

/* ── Onglet "TABLEAU" (super admin) ───────────────────────────────────
   Même modèle/fond/couleurs que l'onglet Tableau de bord (.db-bubbles,
   .stat-card/.stats-grid, .dash-section-title, .table-wrapper — voir
   admin.html) : demande explicite, pas d'identité visuelle à part. Seuls
   les boutons d'action rapide par ligne ci-dessous sont propres à cet
   onglet (pas d'équivalent existant à réutiliser). */
.tbl-row-actions { display: flex; gap: 4px; }
.tbl-row-actions button {
  width: 28px; height: 28px; border-radius: 8px; border: 1px solid var(--gray-200);
  background: var(--gray-100); color: var(--gray-500); cursor: pointer;
  display: flex; align-items: center; justify-content: center; font-size: .68rem;
  transition: background .15s, color .15s;
}
.tbl-row-actions button:hover { background: rgba(255,98,0,.1); color: var(--primary); }

.tbl-reassign-row {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px; border: 1px solid var(--gray-200); border-radius: 8px;
  font-size: .74rem; cursor: pointer;
}
.tbl-reassign-row:hover { background: var(--gray-100); }
