/* ═══════════════════════════════════════════════════════════════════════════
   ch.251 — Responsive mobile/tablette (application R5). MEDIA QUERIES UNIQUEMENT.
   ⛔ ZÉRO règle au niveau racine. Desktop ≥1025px = AUCUNE règle ne s'applique.
   TEST BINAIRE : commenter le <link> de ce fichier → CRM desktop strictement identique.
   Chargé EN DERNIER. Seuils : compact ≤1024px · phone ≤767px.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ══════════ MODE COMPACT ≤1024px : drawer off-canvas + hamburger ══════════ */
@media (max-width: 1024px) {

  /* Hamburger (injecté display:none en dur) → révélé ici uniquement */
  #rsp-hamburger { display: inline-flex !important; }

  /* Sidebar existante → panneau off-canvas (sort du flux flex → main reprend tout) */
  .crm-sidebar {
    position: fixed !important;
    top: 0; left: 0;
    height: 100dvh; height: 100vh;
    width: min(280px, 82vw) !important;
    z-index: 1450 !important;
    transform: translateX(-100%);
    transition: transform .28s ease;
    overflow-y: auto;
    will-change: transform;
  }
  .crm-sidebar.rsp-open { transform: translateX(0); }

  /* Overlay (injecté display:none en dur) — sous les modals (≥9200), au-dessus du contenu */
  #rsp-overlay {
    display: none;
    position: fixed; inset: 0;
    background: rgba(0,0,0,.75);
    -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
    z-index: 1400;
  }
  #rsp-overlay.rsp-open { display: block !important; }

  /* Scroll de page bloqué quand le drawer est ouvert */
  body.rsp-drawer-open { overflow: hidden !important; }

  /* Anti débordement horizontal de page */
  body { overflow-x: hidden; }

  /* ── Module ASSISTANTS — tablette (768–1024) : 3 zones côte à côte, largeurs rétrécies ── */
  #agentLayout > [data-zone="agents"] { width: 30% !important; min-width: 140px !important; max-width: 200px !important; }
  #agentLayout > [data-zone="infos"]  { width: 34% !important; min-width: 200px !important; }

  /* ── FIX 1 (ch.256) — Topbar SUPPRIMÉE ≤1024px : le header est COLLAPSÉ (height:0 + overflow:visible) plutôt
        que display:none, pour que le panneau notifications (descendant, position:absolute) reste affichable en
        overlay via le drawer. Le hamburger FLOTTE (position:fixed). Tout le reste de la topbar (titre, date,
        pastilles, cloche, menu user) est masqué. L'ENVIRONNEMENT (R7/ch.232 — jamais supprimé) est RELOCALISÉ
        en tête de drawer. Notifications + Déconnexion atteignables depuis le drawer. */
  #rsp-topbar { height: 0 !important; min-height: 0 !important; padding: 0 !important; border: 0 !important; overflow: visible !important; }
  #pageTitle, #currentDate, #sb-tiles-wrap, #topbar-phone-btn, #director-agent-indicators, #env-pill-slot, #user-menu-wrapper, #notif-bell { display: none !important; }
  /* ch.258 D1 — hamburger flottant haut-gauche. z-index 990 : AU-DESSUS du contenu (~0) mais SOUS tous les
     modals (les plus bas = z-1000 : devis/factures) → ne flotte plus par-dessus un modal ouvert (celui-ci a
     sa propre croix ≥44px, aucun cul-de-sac). Sous le drawer 1450 (le drawer le recouvre à l'ouverture). */
  #rsp-hamburger { position: fixed !important; top: 8px; left: 8px; z-index: 990; background: #FFFFFF !important; border: 1px solid #E2E8F0 !important; box-shadow: 0 2px 8px rgba(0,0,0,.14); }
  /* ch.258 D1 — le contenu de page RÉSERVE la gouttière VERTICALE du hamburger (56px > bas du hamburger à 52px)
     → le titre h1 de page démarre SOUS le hamburger, jamais recouvert. */
  #pageContent { padding-top: 56px !important; }

  /* ch.258 D3 — Modals de détail (body-mount) : grilles internes en 1 COLONNE + largeurs fixes (min-width px)
     NEUTRALISÉES → fin du chevauchement des tuiles CLIENT/DEVIS/HISTORIQUE et du défilement HORIZONTAL interne.
     Scopé aux modals ouverts (position:fixed au niveau body) → n'affecte aucune grille de page. */
  body > div[style*="position:fixed"] [style*="display:grid"] { grid-template-columns: 1fr !important; }
  body > div[style*="position:fixed"] [style*="min-width:"] { min-width: 0 !important; }
  body > div[style*="position:fixed"] { overflow-x: hidden !important; }

  /* ch.260 D2 — VRAIS onglets « Liste » | « Création » (Devis + Factures) : la barre révélée (display:none en dur)
     PILOTE le switchTab existant (aucun 2e chemin de navigation). La tuile « Nouveau devis/facture » et le bouton
     « ← Retour à la liste » (redondants sous 1024px) sont MASQUÉS ; le bouton « Synchronisation » reste. */
  .rsp-page-tabs { display: flex !important; }
  .rsp-desktop-only { display: none !important; }

  /* ch.263 — Banque : onglets « KPI » | « Transactions » (même patron .rsp-page-tabs). Les zones sont basculées
     par la classe .bqtab-* portée par .bq-root (JS _setBqTab, sans re-render → l'onglet survit au rafraîchissement). */
  .bq-root.bqtab-kpi > [data-zone="tx"]  { display: none !important; }
  .bq-root.bqtab-tx  > [data-zone="kpi"] { display: none !important; }
  /* FIX 2 — tuiles KPI : 2 colonnes 768–1024 (1 colonne ≤767 dans le bloc ci-dessous). Montants non tronqués. */
  #bq-kpis { grid-template-columns: 1fr 1fr !important; }
  /* FIX 3 — filtres : les selects (nom de compte long) ne débordent jamais du viewport ; graphe et pager bornés. */
  #bq-account, #bq-period { max-width: 100% !important; }
  #bq-chart { max-width: 100% !important; overflow-x: hidden; }
  #bq-pager button { min-height: 44px; }

  /* ═══ ch.264 FIX 1 — barre d'outils Banque ICONIFIÉE sur une ligne. Le TEXTE est masqué par media query
     (font-size:0), l'icône réaffichée via ::before ; les boutons gardent aria-label+title (indevinable sinon).
     Cible ≥44px conservée (on réduit le chrome, pas la cible). Selects compacts, compte LISIBLE (exception). ═══ */
  #bq-reload { font-size: 0 !important; min-width: 44px; min-height: 44px; padding: 8px !important; }
  #bq-reload::before { content: "⟳"; font-size: 17px; }
  #bq-account { max-width: 42vw !important; font-size: 12px !important; padding: 8px !important; min-height: 44px; }
  #bq-period  { max-width: 26vw !important; font-size: 12px !important; padding: 8px !important; min-height: 44px; }
  #bq-batch, #bq-multi, #bq-settings { min-width: 44px; min-height: 44px; padding: 8px !important; }
  /* ch.266 — l'ancien bouton « Synchronisation » (tile row) est masqué sur mobile (.rsp-desktop-only) ; l'icône ⚙️
     sync vit désormais dans la ligne des onglets (.rsp-tools-icon). L'iconification ch.264 openSyncModal est retirée. */

  /* ch.264 FIX 4 — pastilles de filtre compactes (2 lignes max ; cible ≥44px conservée) */
  [data-status-pill] { padding: 4px 12px !important; font-size: 12px !important; min-height: 44px; display: inline-flex; align-items: center; }

  /* ch.264 FIX 3 — modals de détail densifiés (police de base réduite ; 1-colonne + croix ≥44px du ch.258 conservés) */
  body > div[style*="position:fixed"] { font-size: 13px; }

  /* ═══ ch.265 — En-tête compacté : recherche repliable + pastilles sur une ligne + marges réduites (Devis+Factures) ═══ */
  /* FIX 2 — recherche repliable : loupe visible (aria-label+title), le CHAMP est display:none en dur → révélé au
     tap via .rsp-open (window.RSP_toggleSearch). ⛔ la logique de filtrage (oninput) est inchangée. Loupe .rsp-active
     (fond vert) si une recherche est active → ne laisse pas croire à une liste complète. */
  .rsp-search-toggle { display: inline-flex !important; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; padding: 0 !important; border: 1px solid #E2E8F0; border-radius: 10px; background: #F1F5F9; font-size: 16px; cursor: pointer; flex-shrink: 0; }
  .rsp-search-toggle.rsp-active { background: #34D399; }
  .rsp-search-field { display: none !important; }
  .rsp-search-field.rsp-open { display: block !important; width: 100% !important; order: 99; }
  /* ch.266 — pastilles TOUTES VISIBLES (⛔ plus de défilement horizontal du ch.265 : Anis veut VOIR, pas balayer).
     flex-wrap AUTORISÉ (2 lignes max). Le flex:1 fautif de Factures (empilement colonne) RESTE neutralisé
     (flex-basis:100% → la barre prend sa propre ligne pleine largeur, les pastilles y wrappent horizontalement). */
  .rsp-filter-pills { flex: 1 1 100% !important; flex-wrap: wrap !important; overflow: visible !important; gap: 5px !important; min-width: 0; }
  /* ch.266 — VALEURS EXACTES pastilles : 11.5px / 6px 10px / 30px / radius 15px. Cible tactile ≥44px par
     pseudo-élément (chrome 30px, zone d'appui étendue ±7px), sans agrandir la boîte visible. */
  [data-status-pill] { font-size: 11.5px !important; padding: 6px 10px !important; height: 30px !important; min-height: 30px !important; border-radius: 15px !important; position: relative; display: inline-flex; align-items: center; flex-shrink: 0; }
  [data-status-pill]::after { content: ''; position: absolute; left: 0; right: 0; top: -7px; bottom: -7px; }
  /* ch.266 FIX 1 — marges verticales de l'en-tête ≤ 8px (titre → onglets+outils → pastilles → liste) */
  .rsp-page-tabs { margin-bottom: 8px !important; align-items: center; }
  .rsp-filter-pills { margin-bottom: 8px; }
  /* ch.266 — VALEURS EXACTES onglets : 13px/600, 8px 14px, height 36px, flex:0 1 auto (PAS étirés). Cible ≥44px
     par pseudo (chrome 36px). Les onglets réunis ≤55% → place pour les icônes à droite. */
  .rsp-page-tabs > button[onclick*="switchTab"] { flex: 0 1 auto !important; font-size: 13px !important; font-weight: 600 !important; padding: 8px 14px !important; height: 36px !important; min-height: 36px !important; position: relative; max-width: 27%; }
  .rsp-page-tabs > button[onclick*="switchTab"]::after { content: ''; position: absolute; left: 0; right: 0; top: -4px; bottom: -4px; }
  /* ch.266 — icônes d'outils SUR LA MÊME LIGNE que les onglets (déplacées dans .rsp-page-tabs par le renderer).
     36×36 visuel, 16px, poussées à droite par un spacer flex. Cible ≥44px par pseudo. */
  .rsp-tools-spacer { flex: 1 1 auto; }
  .rsp-tools-icon, .rsp-page-tabs .rsp-search-toggle { display: inline-flex !important; align-items: center; justify-content: center; width: 36px !important; min-width: 36px !important; height: 36px !important; min-height: 36px !important; padding: 0 !important; border: 1px solid #E2E8F0; border-radius: 9px; background: #F1F5F9; font-size: 16px !important; cursor: pointer; flex-shrink: 0; position: relative; }
  .rsp-tools-icon::after, .rsp-page-tabs .rsp-search-toggle::after { content: ''; position: absolute; left: -4px; right: -4px; top: -4px; bottom: -4px; }
  .rsp-page-tabs .rsp-search-toggle.rsp-active { background: #34D399; }
  /* environnement relocalisé (slot drawer) + entrées drawer Notifications/Déconnexion */
  #rsp-drawer-env { display: block !important; }
  #rsp-drawer-notifications, #rsp-drawer-logout { display: flex !important; }
  /* panneau notifications utilisable sur mobile : overlay plein largeur (le #notif-bell est masqué, le drawer le déclenche) */
  #notif-panel { position: fixed !important; top: 56px !important; left: 8px !important; right: 8px !important; width: auto !important; max-width: none !important; z-index: 1200 !important; }

  /* ── FIX 2 (ch.253) — Bouton d'appel flottant vs composer : l'offset serait FRAGILE (composer variable,
        textarea jusqu'à 120px, agents.js:2636) et le panneau softphone (320×520) est inutilisable sur un
        téléphone. On MASQUE le pill flottant en mode compact (la Téléphonie reste accessible via le drawer). */
  #softphone-pill { display: none !important; }
}

/* ══════════ PALIER PHONE ≤767px : Assistants en ONGLETS + chat plein écran ══════════ */
@media (max-width: 767px) {

  /* Barre d'onglets (injectée display:none en dur) → révélée ici uniquement */
  #rsp-agent-tabs { display: flex !important; }

  /* Layout Assistants en colonne, remplit la hauteur sous la barre d'onglets (#pageContent = flex-col) */
  #agentLayout {
    flex-direction: column !important;
    gap: 0 !important;
    flex: 1 1 auto !important;
    min-height: 0 !important;
  }

  /* Chaque zone prend toute la largeur, largeurs fixes neutralisées */
  #agentLayout > [data-zone] {
    width: 100% !important;
    min-width: 0 !important;
    max-width: none !important;
  }

  /* Une seule zone visible selon la classe active portée par #agentLayout */
  #agentLayout.rtab-agents > [data-zone]:not([data-zone="agents"]),
  #agentLayout.rtab-infos  > [data-zone]:not([data-zone="infos"]),
  #agentLayout.rtab-chat   > [data-zone]:not([data-zone="chat"]) { display: none !important; }

  /* Zone active → occupe toute la hauteur dispo */
  #agentLayout.rtab-agents > [data-zone="agents"],
  #agentLayout.rtab-infos  > [data-zone="infos"],
  #agentLayout.rtab-chat   > [data-zone="chat"] {
    flex: 1 1 auto !important;
    min-height: 0 !important;
  }

  /* Chat plein écran : messages scrollables (flex:1 min-h:0), composer NON fixe sous le clavier */
  #agentLayout > [data-zone="chat"] { display: flex; flex-direction: column; }
  #chatMessages { flex: 1 1 auto !important; min-height: 0 !important; }
  .ag-input-bar { padding-bottom: calc(10px + env(safe-area-inset-bottom)) !important; }

  /* ── FIX 3 (ch.253) — Bandeau agent : #chatHeader est un flex-shrink:0 (frère de #chatMessages, NON sticky
        → aucun overlap par construction). On le rend COMPACT (gain de hauteur utile) et on garantit une marge
        haute du 1er message. Le bandeau n'est jamais supprimé (identité agent = info utile). */
  #chatHeader { padding-top: 8px !important; padding-bottom: 8px !important; }
  #chatHeader .text-2xl { font-size: 1.25rem !important; }
  #chatMessages { padding-top: 12px !important; }

  /* Onglet actif (aria-selected) — charte claire */
  #rsp-agent-tabs [data-rtab] { color: #64748B; background: #F1F5F9; }
  #rsp-agent-tabs [data-rtab][aria-selected="true"] { color: #0F172A; background: #FFFFFF; border-bottom-color: #34D399 !important; }

  /* Bulles chat : jamais de largeur fixe, wrap autorisé */
  .chat-msg-user > div, .chat-msg-assistant > div { max-width: 92% !important; }

  /* Blocs interactifs ch.130 : les boutons wrappent déjà (crmBlocks inline flex-wrap). On CAPPE toute largeur
     fixe (ex. carte max-width:340px) et on enveloppe les tables larges → jamais de débordement horizontal. */
  #chatMessages > * { max-width: 100% !important; box-sizing: border-box; }
  #chatMessages [style*="max-width:340px"] { max-width: 100% !important; }
  #chatMessages table { display: block; overflow-x: auto; max-width: 100%; }

  /* Sécurité : conteneur de page sans scroll horizontal */
  #pageContent { overflow-x: hidden; }

  /* ═══ ch.257 LOT 2 — Listes en CARTES (patron UNIQUE, tables .rsp-cardify : devis/factures/dépenses) ═══
     Chaque <tr> = carte ; chaque <td> = ligne « LABEL : valeur » (label = data-label). AUCUNE colonne perdue,
     n° JAMAIS cassé, 0 défilement horizontal. */
  .rsp-cardify { display: block !important; width: 100% !important; }
  .rsp-cardify thead { display: none !important; }
  .rsp-cardify tbody { display: block !important; }
  .rsp-cardify tr { display: block !important; border: 1px solid #E2E8F0 !important; border-radius: 12px; margin-bottom: 10px; background: #fff; padding: 8px 12px; }
  .rsp-cardify td { display: flex !important; justify-content: space-between; align-items: baseline; gap: 12px; padding: 5px 0 !important; text-align: right !important; border: none !important; max-width: none !important; white-space: normal !important; overflow: visible !important; }
  .rsp-cardify td::before { content: attr(data-label); font-weight: 600; color: #64748B; font-size: 11px; text-transform: uppercase; letter-spacing: .3px; flex-shrink: 0; text-align: left; }
  .rsp-cardify td.rsp-hide-mobile { display: none !important; }
  .rsp-cardify td[data-label="Réf"], .rsp-cardify td[data-label="N° Facture"] { font-weight: 700; }
  /* Actions : label au-dessus, boutons pleine largeur empilables (jamais tronqués) */
  .rsp-cardify td.rsp-actions { display: block !important; text-align: left !important; }
  .rsp-cardify td.rsp-actions::before { display: block; margin-bottom: 6px; }
  .rsp-cardify td.rsp-actions > div { justify-content: flex-start !important; flex-wrap: wrap !important; }
  /* la carte cliquable (ouvre le détail) garde le curseur */
  .rsp-cardify tr[onclick] { cursor: pointer; }

  /* ch.260 D4 — Banque : la LISTE des transactions est une GRILLE de <div> (pas une <table>), largeurs px fixes
     (572px+ → débordait). Même principe data-label : chaque ligne .rsp-cardify-grid → carte, cellules empilées
     « LABEL : valeur ». Le montant garde sa couleur crédit/débit (inline). ZÉRO défilement horizontal en 375px. */
  .bq-tx-header { display: none !important; }
  .rsp-cardify-grid { display: block !important; grid-template-columns: none !important; border: 1px solid #E2E8F0 !important; border-radius: 12px; margin: 0 12px 10px !important; padding: 8px 12px !important; }
  .rsp-cardify-grid > div { display: flex !important; justify-content: space-between; align-items: baseline; gap: 12px; padding: 4px 0 !important; text-align: left !important; min-width: 0 !important; white-space: normal !important; }
  .rsp-cardify-grid > div::before { content: attr(data-label); font-weight: 600; color: #64748B; font-size: 11px; text-transform: uppercase; letter-spacing: .3px; flex-shrink: 0; }
  .rsp-cardify-grid > div[data-label=""]::before { content: none; }
  .rsp-cardify-grid > div.rsp-grid-actions { justify-content: flex-end; }
  /* ch.264 FIX 2 — libellé bancaire tronqué à 2 LIGNES (intégral dans le modal de détail) : à lui seul ~4 lignes
     gagnées par carte (le brut « VIR INST RE … DE: … DATE: … REF: … » s'étalait sur 6 lignes). */
  .rsp-cardify-grid > div[data-label="Libellé"] > div { display: -webkit-box !important; -webkit-line-clamp: 2 !important; -webkit-box-orient: vertical !important; overflow: hidden !important; white-space: normal !important; }
  /* ch.263 FIX 2 — tuiles KPI Banque en 1 colonne ≤767px (2 colonnes 768–1024 dans le bloc ≤1024). */
  #bq-kpis { grid-template-columns: 1fr !important; }

  /* ch.264 FIX 2 — DENSIFICATION des cartes (patron partagé rsp-cardify + rsp-cardify-grid) : padding/police
     réduits + labels REDONDANTS masqués (Date, Montant/Total TTC = valeur auto-explicite). ⛔ aucune DONNÉE
     retirée (seuls des labels). Objectif : ≥2 documents visibles en 375px. Bordure gauche par statut (ch.261)
     pourra s'ajouter sans refonte (padding/marge laissés compatibles). */
  .rsp-cardify tr, .rsp-cardify-grid { padding: 6px 10px !important; margin-bottom: 8px !important; }
  .rsp-cardify td, .rsp-cardify-grid > div { padding: 3px 0 !important; font-size: 12px !important; }
  .rsp-cardify td::before, .rsp-cardify-grid > div::before { font-size: 10px !important; }
  .rsp-cardify td[data-label="Date"]::before, .rsp-cardify td[data-label="Total TTC"]::before,
  .rsp-cardify-grid > div[data-label="Date"]::before, .rsp-cardify-grid > div[data-label="Montant"]::before { content: none !important; }
  /* montant proéminent (garde sa couleur crédit/débit ou statut, source inline existante) */
  .rsp-cardify td[data-label="Total TTC"], .rsp-cardify-grid > div[data-label="Montant"] { font-weight: 700; font-size: 14px !important; }

  /* ═══ ch.261 — BORDURE GAUCHE colorée par STATUT. La couleur vient de la SOURCE UNIQUE (STATUS_MAP devis/factures,
     STATUS_COLORS dépenses, crédit/débit banque) via la variable inline `--rsp-sc` posée par le renderer.
     ⛔ responsive.css ne redéclare AUCUNE couleur de statut en dur (grep --rsp-sc / #hex à l'appui). Repli NEUTRE
     #E2E8F0 si `--rsp-sc` absente → un statut inconnu n'emprunte jamais une couleur trompeuse. Deux statuts
     différents = deux bordures distinctes, reconnaissables sans lire le badge. Densité ch.264 intacte. ═══ */
  .rsp-cardify tr, .rsp-cardify-grid { border-left: 4px solid var(--rsp-sc, #E2E8F0) !important; box-shadow: 0 2px 8px rgba(0,0,0,.08); }

  /* ═══ ch.257 LOT 3 — Barres de filtres / boutons : wrap propre (fin des pastilles empilées en colonne +
     bouton « ＋ Facture d'acompte » qui recouvre « Payées part. »). Le wrap est sûr (n'empêche jamais l'affichage). ═══ */
  #pageContent [style*="display:flex"][style*="gap"] { flex-wrap: wrap; }

  /* ═══ ch.257 LOT 4 — Modals de détail (body-mount) : grilles internes en 1 colonne, jamais de scroll H.
     Scopé aux modals ouverts (position:fixed au niveau body) → n'affecte aucune grille de page. ═══ */
  body > div[style*="position:fixed"] [style*="display:grid"] { grid-template-columns: 1fr !important; }
  body > div[style*="position:fixed"] { overflow-x: hidden; }

  /* ch.254 PWA/LOT 4 — en standalone il n'y a plus de « retour » navigateur : la croix ✕ de la visionneuse
     PDF interne doit être une cible tactile ≥44px (le bouton existe déjà, header top-right). */
  #crm-file-viewer-modal button { min-width: 44px !important; min-height: 44px !important; }
}

/* ── ch.416 B.4 — MARCHÉ & TARIFS : 11 → 14 pastilles de filtre ──────────────────────────
   ⚠️ MESURÉ : le conteneur porte DÉJÀ `flex-wrap: wrap` (tarifs.js:243) ⇒ ⛔ aucun
   débordement horizontal n'est possible, même à 14 pastilles. Ce bloc ne corrige donc pas
   un défaut : il COMPACTE, pour que 14 pastilles n'occupent pas la moitié de l'écran sur
   un téléphone. ⛔ Pas de variable CSS (règle du projet), @media uniquement. */
@media (max-width: 480px) {
  .tar-filtre-btn { padding: 4px 9px; font-size: 10px; }
}
@media (max-width: 375px) {
  .tar-filtre-btn { padding: 3px 8px; font-size: 9.5px; letter-spacing: -0.1px; }
}

/* ── ch.429 — MODAL « ✨ Améliorations proposées » (Alex Réviseur) ────────────────────────
   ⛔ LA CAUSE DU DÉFAUT N'EST PAS ICI : elle était `min-height:auto` sur la colonne de droite
   (un item de grille ne peut pas rétrécir sous son contenu), corrigée EN LIGNE dans
   `devis.js` — MESURÉ AVANT : colonne 1227 px dans un panneau de 810 px, corps qui ne
   scrollait jamais, pied 349 px SOUS le panneau, bouton « Appliquer » HORS ÉCRAN.

   Ce bloc ne fait que COMPACTER sur petit écran, pour qu'une SEULE proposition ⛔ ne
   déclenche PAS de barre de scroll inutile (mesuré à 375 px : 11 px de débordement dus au
   `min-height:200px` du corps et au pied de 172 px une fois les boutons empilés).
   ⚠️ `responsive.css` est une feuille STATIQUE chargée par `index.html:76` : ⛔ aucun risque
   du motif ch.384 (classe injectée au runtime qui ne style rien). @media UNIQUEMENT ⇒ le
   rendu desktop des autres écrans ⛔ ne bouge pas. ⛔ Aucune variable CSS. */
@media (max-width: 480px) {
  #dv-review-modal #dv-rev-body { min-height: 120px !important; padding: 14px 16px !important; }
  #dv-review-modal #dv-rev-foot { padding: 10px 16px !important; gap: 8px !important; }
  #dv-review-modal .dv-rev-grid > div:first-child { padding: 10px 16px !important; gap: 10px !important; }
  #dv-review-modal #dv-rev-photo { width: 44px !important; height: 44px !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════
   ch.455 C — CARNET D'ADRESSES PARTAGÉ (#crmContactPickerOverlay)
   ⛔ MEDIA QUERIES UNIQUEMENT : le rendu DESKTOP est défini EN LIGNE dans ContactPicker.js
      et ⛔ n'est PAS touché ici — commenter ce bloc rend le desktop strictement identique.
   ⛔ Les zones tactiles sont déjà ≥44px en ligne (cases, boutons, croix) ⇒ ⛔ rien à corriger
      ici pour le tactile : on ne fait que la MISE EN PAGE.
   ═══════════════════════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
  /* Plein écran utile : une boîte centrée de 900px n'a aucun sens sous 768px. */
  #crmContactPickerOverlay { padding: 8px !important; align-items: stretch !important; }
  #crmContactPickerOverlay #cpkBoite {
    width: 100% !important;
    max-height: 100% !important;
    border-radius: 12px !important;
  }
  /* ⛔ AUCUN débordement horizontal : l'adresse passe SOUS son libellé au lieu de pousser. */
  #crmContactPickerOverlay #cpkListe label > span { display: block; }
  #crmContactPickerOverlay #cpkListe label > span > span { display: block; word-break: break-all; }
  /* Les deux boutons du pied occupent la largeur, côte à côte, sans jamais déborder. */
  #crmContactPickerOverlay #cpkAnnuler,
  #crmContactPickerOverlay #cpkAjouter { flex: 1 1 0; min-width: 0; }
}

@media (max-width: 420px) {
  /* Retrait de la ligne d'adresse réduit : sur 375px, 22px de marge coûtent trop cher. */
  #crmContactPickerOverlay #cpkListe label { padding-left: 12px !important; }
  #crmContactPickerOverlay #cpkBoite > div:first-child { padding: 12px 12px !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════
   ch.456 — MailEditor : lignes CC / Cci (sélecteur d'ajout + bouton carnet)
   ⛔ MEDIA QUERIES UNIQUEMENT — le desktop est défini EN LIGNE dans MailEditor.js et ⛔ n'est
      PAS touché ici. Commenter ce bloc rend le rendu desktop strictement identique.
   ⚠️ Sous 768px, un <select> à max-width:190px à côté d'un champ texte et d'un bouton 44px
      déborde : on fait passer le sélecteur SOUS le champ plutôt que de rétrécir la zone tactile.
   ═══════════════════════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
  .me-fields > div { flex-wrap: wrap !important; }
  /* ⚠️ ch.458 — RÈGLE DU ch.457 SUPPRIMÉE, et c'est un CORRECTIF, pas un nettoyage : elle
     forçait le sélecteur à 26px (le chevron bleu). Depuis le ch.458 c'est un <select> NATIF
     en pleine largeur DANS la boîte ⇒ la garder l'aurait écrasé à 26px sur mobile.
     ⛔ Une règle CSS périmée est aussi dangereuse qu'une ligne de code morte (R60).
     Les trois sélecteurs (À, CC, Cci) n'ont besoin d'AUCUNE règle responsive : `flex:1 0 100%`
     les met déjà en pleine largeur à toutes les tailles. */
  /* Les pastilles passent à la ligne plutôt que de pousser la boîte hors écran. */
  .me-fields div[id$="-box"] { flex-wrap: wrap !important; }
  /* ⚠️ ch.457 — ARBITRAGE DÉCLARÉ : la croix d'une pastille fait 22px sur desktop (souris).
     Une cible de 44px y rendrait chaque pastille aussi haute qu'une ligne entière et la boîte
     deviendrait illisible dès 2 adresses. ⇒ Sur TACTILE on l'agrandit à 32px, et on l'ESPACE :
     c'est un compromis MESURÉ, ⛔ pas un oubli. La cible principale (le carnet) reste à 44px. */
  .me-fields [data-email] { padding: 4px 4px 4px 10px !important; }
  .me-fields [data-email] > button { width: 32px !important; height: 32px !important; font-size: 18px !important; }
  /* ⛔ La zone tactile des boutons carnet reste 44px : ⛔ on ne rétrécit JAMAIS une cible. */
  .me-fields button[id$="-carnet"],
  .me-fields button[id$="-carnet-cc"],
  .me-fields button[id$="-carnet-bcc"] { width: 44px !important; height: 44px !important; }
}
