/* ============================================================================
   RELIEO — app2.css · surcouche d'interface v8.33
   ============================================================================
   DOCTRINE, en trois phrases.

   1. Ce fichier ne remplace pas app.css : il se charge APRÈS lui et surcharge.
      Aucune règle existante n'est modifiée ni supprimée. On peut le retirer du
      <head> et le produit revient exactement à la v8.32.
   2. Toute règle est préfixée `html[data-ui="v2"]`. Sous `data-ui="v1"`, ce
      fichier est inerte : c'est ce qui rend la bascule Ctrl+Alt+D instantanée.
   3. Rien ici ne masque une fonctionnalité. Les seules choses qui deviennent
      invisibles au repos sont des actions révélées au survol ET au focus
      clavier ET toujours visibles en tactile (voir § 14). Déplacer n'est pas
      supprimer ; masquer sans porte de sortie serait supprimer.

   LISTE BLANCHE — sélecteurs auxquels ce fichier ne touche JAMAIS, parce que
   leur bordure ou leur couleur porte du sens et non de la décoration :
     :focus-visible
     .noeud-ligne.drop-into / .drop-avant / .drop-apres / .en-deplacement
     .bloc-drop-avant / .bloc-drop-apres / .col-drop-avant / .col-drop-apres
     .tab-drop-haut / .tab-drop-bas / .tab-drop-gauche / .tab-drop-droite
     .ligne-drop-avant / .ligne-drop-apres / .depot-avant / .depot-apres
     .drop-racine / .cc-redim-en-cours / .bloc-cible / .msg-cible
     .presence-rond / .presence-rond-ici / .presence-pill / .bloc-occupe
     .cellule-occupee / .cellule-brouillon-conflit / .annul-barriere
     .action-impossible (le bouton refusé reste VISIBLE et désactivé)
     tout ce qui est sous @media print
   ============================================================================ */


/* ==========================================================================
   1. LES JETONS
   L'existant a 26 tailles de police, 20 rayons et zéro jeton d'espace.
   Ici : 6 tailles, 3 rayons, une échelle d'espace de 4 px, 2 densités.
   ========================================================================== */
html[data-ui="v2"]{
  /* --- Surfaces. La palette Relieo ne change pas : seul le papier blanchit,
         parce qu'un fond teinté sur toute la surface fait « application »
         quand un fond blanc fait « document ». --- */
  --paper:#ffffff;
  --card:#ffffff;
  --sunk:#f6f7f6;          /* survol, en-tête de tableau, surfaces enfoncées */
  --sunk-2:#eff1ef;        /* pastilles, boutons fantômes au survol */
  --side-bg:#f8f9f8;       /* la navigation, seule surface légèrement teintée */
  --input-bg:#ffffff;

  --ink:#182b3a;
  --ink-2:#53636f;
  --ink-3:#64727d;   /* V8.57 — voir app.css : 3,07:1 était sous le seuil AA */

  --line:#e4e8e5;
  --line-soft:#eff1ef;

  --accent:#0f7583;
  --accent-fonce:#0b5a65;
  --accent-pale:#e2eff0;
  --danger:#a03d2c;
  --danger-pale:#f8ece8;
  --ok:#3d7a46;
  --ok-pale:#e4f0e6;
  --warn:#8a6a16;
  --warn-pale:#f7f0dd;
  --live:#2f9e5c;                    /* présence : quelqu'un est là maintenant */

  --topbar:#16242e;
  --topbar-txt:#e4ecef;

  /* --- Typographie : 6 marches, écarts francs, rien entre --- */
  --t-xs:11.5px;    /* mention discrète — plancher absolu, jamais moins */
  --t-sm:13px;      /* label, texte secondaire */
  --t-md:14.5px;    /* TEXTE COURANT */
  --t-lg:17px;      /* titre de carte */
  --t-xl:21px;      /* titre de section */
  --t-2xl:27px;     /* titre de page */
  --t-3xl:33px;     /* titre de fiche */

  /* --- Espace : un pas de 4, six valeurs, rien d'autre.
         C'est l'absence de cette échelle qui produit les « trucs collés ». --- */
  --e1:4px; --e2:8px; --e3:12px; --e4:16px; --e5:24px; --e6:32px;

  /* --- Formes : trois rayons. `--r` est conservé pour l'existant. --- */
  --r:8px;
  --r-sm:5px; --r-md:8px; --r-lg:12px;

  /* --- Densité : réglage utilisateur, pas arbitrage de designer.
         Voir js/ui.js — data-densite="confort" sur <html>. --- */
  --dense:1;

  --ombre:0 1px 2px rgba(24,43,58,.05);
  --ombre-flot:0 8px 28px rgba(24,43,58,.14);
}
html[data-ui="v2"][data-densite="confort"]{ --dense:1.4; }

/* --- Thème sombre. N'existait pas : deux correctifs partiels seulement.
       Il ne redéfinit que des JETONS, donc tout ce qui suit le suit. --- */
html[data-ui="v2"][data-theme="sombre"]{
  --paper:#12191e; --card:#12191e; --sunk:#1a2229; --sunk-2:#202931;
  --side-bg:#0e1519; --input-bg:#0e1519;
  --ink:#e7edf0; --ink-2:#a5b3bc; --ink-3:#8b9ca5;   /* V8.57 — 4,2:1 sur --sunk était sous le seuil ; 5,67:1 maintenant */
  --line:#26313a; --line-soft:#1e272e;
  --accent:#3aa5b2; --accent-fonce:#61c5d1; --accent-pale:#14313a;
  --danger:#e2907c; --danger-pale:#3a231d;
  --ok:#72bd80; --ok-pale:#1c3022;
  --warn:#d5b05a; --warn-pale:#332a11;
  --live:#5cc487;
  --topbar:#0a1015; --topbar-txt:#dce5e9;
  --st-ouvert:#d5b05a; --st-actif:#61c5d1; --st-resolu:#72bd80;
  --st-abandonne:#d59a86; --st-remplace:#8f9aa3;
  --ombre:0 1px 2px rgba(0,0,0,.45); --ombre-flot:0 12px 34px rgba(0,0,0,.6);

  /* V8.57 — les jetons ajoutés à app.css pour que le balayage des couleurs en
     dur ait où se raccrocher. Le bandeau (`--topbar*`) posait
     `background: var(--ink)` : l'encre devenant CLAIRE ici, le bandeau virait
     au blanc — voir le bloc V8.57 en tête d'app.css. */
  --topbar-ligne:#1e2a33; --topbar-attenue:#7c8b95; --topbar-vif:#61c5d1;
  /* Le remplissage des boutons pleins DESCEND quand l'accent monte : sur
     `--accent` éclairci (#3aa5b2), le texte blanc ne fait que 2,9:1. Ici,
     4,8:1 — au-dessus du seuil AA pour du texte courant. Voir le commentaire
     de `--accent-plein` dans app.css. */
  --accent-plein:#147d8b; --sur-accent:#ffffff;
  --prive:#b39ddb; --prive-pale:#241f30;

  /* ⚠ SANS CETTE LIGNE, LE THÈME S'ARRÊTE AUX BORDS DE NOTRE CSS. Le menu
     déroulant d'un `<select>` ouvert, les ascenseurs, le curseur de saisie,
     l'autofill et les cases à cocher sont dessinés par le NAVIGATEUR, qui ne
     lit pas nos jetons — il ne lit que `color-scheme`. C'est la ligne qui
     coûte le moins et qui se voit le plus. */
  color-scheme: dark;

  /* V8.54 — LA FAMILLE AMBRE MANQUAIT ICI, ET ÇA SE VOYAIT.
     Ce bloc ne redéfinit que des jetons ; ceux du commentaire (app.css,
     `--com*`) n'en faisaient pas partie et gardaient donc leurs valeurs
     CLAIRES. En thème sombre, `--com-pale: #fdf3dc` faisait de mes propres
     messages et de la conversation ouverte les seules surfaces crème d'un
     écran marine — éblouissantes, et à peine lisibles puisque le texte y
     restait pâle. Même cause pour `::highlight(commentaire)`, jaune vif sous
     du texte clair. On garde le RÔLE (chaud = commentaire) en descendant la
     clarté au niveau des autres fonds du thème. */
  --com:#d9ad55; --com-pale:#2e2513; --com-surlignage:#4a3a12;
  --msg-moi:#1b242b; --msg-moi-bord:#2b3740;
}


/* ==========================================================================
   2. BASE
   ========================================================================== */
html[data-ui="v2"] body{
  font-size:var(--t-md);
  line-height:1.55;
  /* le fond quadrillé décoratif (une ligne tous les 32 px) disparaît :
     il ne servait rien et datait la page */
  background-image:none;
  -webkit-font-smoothing:antialiased;
}
html[data-ui="v2"] a{ text-decoration:none }
html[data-ui="v2"] a:hover{ text-decoration:underline }

/* --- Les icônes ---
   On ne crée AUCUN nouveau jeu : js/icones.js fournit déjà 51 pictogrammes
   Lucide et la fonction icone(nom, taille). ui.js en ajoute 22 au même
   registre. Ici on ne fait que changer le GABARIT : 16 px au lieu de 15,
   trait 1,6 au lieu de 2, alignement optique. Les attributs width/height
   posés en ligne par icone() sont surchargés par ces règles.
   Le glyphe Unicode d'un appel non encore migré continue de s'afficher :
   les deux cohabitent, la migration se fait au fil de l'eau. */
html[data-ui="v2"] .cc-icone{
  width:16px;height:16px;stroke-width:1.6;vertical-align:-3px;flex:none;
}
html[data-ui="v2"] .btn-mini .cc-icone,
html[data-ui="v2"] .btn-lien.btn-mini .cc-icone,
html[data-ui="v2"] .note-actions .cc-icone,
html[data-ui="v2"] .cellule-actions .cc-icone{ width:14px;height:14px }
html[data-ui="v2"] .topbar .cc-icone{ width:17px;height:17px }


/* ==========================================================================
   3. BANDEAU SUPÉRIEUR
   ========================================================================== */
html[data-ui="v2"] .topbar{
  height:50px;
  padding:0 var(--e4);
  gap:var(--e3);
  border-bottom:none;            /* le contraste marine/blanc sépare déjà */
}
/* V8.55 — même correction qu'en v1 : `letter-spacing:-.2px` à 14,5 px, ce sont
   trois traits verticaux (l·i·e) resserrés jusqu'à se confondre en un seul
   signe. Le resserrement d'un mot-marque vaut en capitales ou en grand corps,
   pas en bas-de-casse à quinze pixels sur fond sombre — où le texte clair bave
   déjà optiquement vers l'extérieur. On remonte d'un point et on rend l'air. */
html[data-ui="v2"] .topbar .marque{
  display:flex;align-items:center;gap:9px;font-size:15.5px;letter-spacing:0;
}
/* Pastille de marque : uniquement quand l'espace n'a PAS son propre logo.
   Le nom du site et le logo sont saisis par le client (.marque-logo) ; poser
   un « R » Relieo à côté de son logo lui met deux marques dans le bandeau. */
html[data-ui="v2"] .topbar .marque:not(:has(.marque-logo))::before{
  content:"R";width:24px;height:24px;border-radius:6px;flex:none;
  display:grid;place-items:center;font-family:var(--mono);font-weight:800;
  font-size:12px;color:#08171b;background:linear-gradient(140deg,#5fd3de,#0f7583);
}
/* Le logo du client et le nom du site sont deux marques distinctes : ils ont
   besoin d'air entre eux. app.css:1663 posait 6 px, ce qui suffisait à 20 px
   de haut ; à 22 px et avec un logo qui porte déjà un mot, il en faut 10.
   Le gap de .marque ne s'applique pas : logo et nom sont dans le même <a>. */
html[data-ui="v2"] .topbar .marque-logo{ margin-right:10px;vertical-align:-3px }
html[data-ui="v2"] .topbar img.marque-logo{ height:22px;width:auto;border-radius:5px }
html[data-ui="v2"] .topbar .marque .cap{ margin-left:0 }
html[data-ui="v2"] .topbar .recherche-globale{ max-width:440px }
html[data-ui="v2"] .topbar .recherche-globale input{
  padding:7px 10px 7px 32px;
  border:1px solid transparent;
  background:rgba(255,255,255,.08);
  border-radius:var(--r-md);
  font-size:var(--t-sm);
}
html[data-ui="v2"] .topbar .recherche-globale input:focus{
  border-color:rgba(255,255,255,.28);background:rgba(255,255,255,.13);
}
html[data-ui="v2"] .topbar .recherche-globale::before{ top:7px;left:11px }
html[data-ui="v2"] .topbar .btn-quitter,
html[data-ui="v2"] .topbar .btn-lien-topbar{
  border-color:transparent;background:none;color:#b9c8d0;
  border-radius:var(--r-md);padding:6px 10px;font-size:var(--t-sm);
}
html[data-ui="v2"] .topbar .btn-quitter:hover,
html[data-ui="v2"] .topbar .btn-lien-topbar:hover{
  background:rgba(255,255,255,.1);color:#fff;border-color:transparent;
}
html[data-ui="v2"] .btn-compte{ border-radius:99px }


/* ==========================================================================
   4. BARRE LATÉRALE
   ========================================================================== */
html[data-ui="v2"] .sidebar{
  background:var(--side-bg);
  border-right:1px solid var(--line);
}
html[data-ui="v2"] .sidebar-tete{
  padding:var(--e3) var(--e3) var(--e1);
  border-bottom:none;                       /* l'espace sépare, pas le trait */
}
/* l'étiquette de section quitte le monospace capitales : elle criait plus fort
   que les noms de collections qu'elle surplombe */
html[data-ui="v2"] .sidebar-tete .eyebrow{
  font-family:var(--sans);font-size:var(--t-xs);font-weight:700;
  letter-spacing:.06em;color:var(--ink-3);
}
html[data-ui="v2"] .arbre{ padding:0 var(--e2) var(--e5) }
html[data-ui="v2"] .noeud-ligne{
  padding:calc(5px * var(--dense)) var(--e2) calc(5px * var(--dense)) 0;
  border-radius:var(--r-sm);
  border-color:transparent;
  font-size:var(--t-sm);
  color:var(--ink-2);
}
html[data-ui="v2"] .noeud-ligne:hover{ background:var(--sunk-2) }
html[data-ui="v2"] .noeud-ligne.actif{
  background:var(--accent-pale);border-color:transparent;
}
html[data-ui="v2"] .noeud-nom{ font-size:var(--t-sm) }
html[data-ui="v2"] .noeud-badge{
  font-family:var(--mono);font-size:var(--t-xs);background:none;color:var(--ink-3);
}
html[data-ui="v2"] .arbre ul{ border-left-color:var(--line-soft) }
html[data-ui="v2"] .sidebar-pied{
  padding:var(--e3);border-top:1px solid var(--line-soft);font-size:var(--t-xs);
}
/* les micro-mentions légales du pied : lisibles, ou pas là */
html[data-ui="v2"] .sidebar-pied a{ font-size:var(--t-xs);color:var(--ink-3) }
html[data-ui="v2"] .sidebar-pied a:hover{ color:var(--ink-2) }


/* ==========================================================================
   5. ZONE DE CONTENU ET TITRES
   ========================================================================== */
html[data-ui="v2"] .contenu{ padding:var(--e6) var(--e6) 96px }
html[data-ui="v2"] .cap-chemin{
  font-family:var(--sans);font-size:var(--t-sm);color:var(--ink-3);
  margin-bottom:var(--e2);
}
html[data-ui="v2"] .titre-page{ font-size:var(--t-2xl);letter-spacing:-.6px;line-height:1.2 }
html[data-ui="v2"] .titre-page input{
  font-size:inherit;font-weight:inherit;letter-spacing:inherit;
  padding:2px 6px;margin-left:-6px;border-radius:var(--r-sm);border-color:transparent;
}
html[data-ui="v2"] .titre-page input:hover{ background:var(--sunk) }
html[data-ui="v2"] .titre-page input:focus{
  background:var(--sunk);box-shadow:0 0 0 2px var(--accent-pale);
}
html[data-ui="v2"] .sous-titre{ font-size:var(--t-sm);color:var(--ink-3) }

/* l'étiquette monospace reste un marqueur d'identité, mais elle cesse d'être
   le titre de tout : au-dessus d'un contenu, c'est un titre normal qu'il faut */
html[data-ui="v2"] .carte h3 .eyebrow,
html[data-ui="v2"] h3 > .eyebrow{
  font-family:var(--sans);font-size:var(--t-sm);font-weight:600;
  letter-spacing:0;text-transform:none;color:var(--ink-2);
}
/* elle est conservée telle quelle là où elle est vraiment une étiquette :
   fil d'Ariane technique, types de relation, badges, en-têtes de tableau */
html[data-ui="v2"] .cc-ref .eyebrow,
html[data-ui="v2"] .cc-rel-pred,
html[data-ui="v2"] .rattachement-bloc .chemin{
  font-family:var(--mono);font-size:var(--t-xs);
}


/* ==========================================================================
   6. BOUTONS
   Une seule action primaire par écran. Tout le reste est discret.
   ========================================================================== */
html[data-ui="v2"] .btn{
  font-size:var(--t-sm);
  font-weight:500;
  padding:calc(7px * var(--dense)) calc(13px * var(--dense));
  border-radius:var(--r-md);
  border:1px solid transparent;
  background:none;
  color:var(--ink-2);
  line-height:1.3;
  display:inline-flex;align-items:center;gap:6px;
  transition:background .12s,color .12s,border-color .12s;
}
html[data-ui="v2"] .btn:hover{
  background:var(--sunk-2);color:var(--ink);border-color:transparent;
}
/* le bouton « secondaire encadré » : celui qui garde un contour.
   ⚠ V8.35 — `:not(.btn-primaire):not(.btn-danger)` AJOUTÉ, ET C'EST UN
   CORRECTIF, PAS UN RAFFINEMENT. Cette règle désigne une POSITION (« le
   premier de la rangée ») ; `.btn-primaire` et `.btn-danger` désignent un
   SENS. La position pesait plus lourd — 0,0,3,2 contre 0,0,2,1 — donc toute
   action primaire se trouvant en tête d'une `.ligne-actions` perdait son fond
   teal et se repeignait en bouton neutre, et tout « Supprimer » en tête de
   rangée perdait son rouge. Le sens était écrasé par le rang, en silence.
   Même famille que la régression `.fiche-grille` de la V8.34 : une règle
   involontairement plus spécifique qui neutralise celle qui porte l'intention.
   Un secondaire encadré est, par définition, ni primaire ni destructeur. */
html[data-ui="v2"] .btn.btn-cadre,
html[data-ui="v2"] .ligne-actions > .btn:first-child:not(.btn-primaire):not(.btn-danger),
html[data-ui="v2"] .barre-outils > .btn:first-child:not(.btn-primaire):not(.btn-danger){
  border-color:var(--line);background:var(--card);color:var(--ink);
}
html[data-ui="v2"] .btn.btn-cadre:hover{ border-color:var(--ink-3);background:var(--card) }

/* V8.57 — `--accent-plein` et non `--accent` : cette règle passait DEVANT
   celle d'app.css (spécificité de `html[data-ui="v2"]`) et ramenait donc
   l'accent clair sous du texte blanc — 2,9:1 en thème sombre, sous le seuil.
   Le correctif d'app.css seul n'aurait rien changé à l'écran : c'est le genre
   de surcouche qui fait croire une correction faite alors qu'elle est
   recouverte. Le survol descend d'un cran de plus (`--accent-fonce`), qui en
   sombre est plus CLAIR que l'accent — d'où `--accent-plein` là aussi, avec
   un éclaircissement obtenu par mélange plutôt qu'un cinquième jeton. */
html[data-ui="v2"] .btn-primaire{
  background:var(--accent-plein);border-color:var(--accent-plein);color:var(--sur-accent);font-weight:600;
  box-shadow:var(--ombre);
}
html[data-ui="v2"] .btn-primaire:hover{
  background:color-mix(in srgb, var(--accent-plein) 86%, var(--ink));
  border-color:color-mix(in srgb, var(--accent-plein) 86%, var(--ink));
  color:var(--sur-accent);
}

/* Le rouge plein est réservé à la confirmation elle-même. Dans une barre,
   « Supprimer » est un bouton discret rouge — pas un bouton d'alerte. */
html[data-ui="v2"] .btn-danger{
  color:var(--danger);border-color:transparent;background:none;
}
html[data-ui="v2"] .btn-danger:hover{ background:var(--danger-pale);color:var(--danger) }
html[data-ui="v2"] .modal .btn-danger,
html[data-ui="v2"] .popover .confirm-suppr + .btn-danger{
  background:var(--danger);color:#fff;font-weight:600;border-color:var(--danger);
}

html[data-ui="v2"] .btn-mini{
  padding:calc(4px * var(--dense)) calc(9px * var(--dense));
  font-size:var(--t-xs);border-radius:var(--r-sm);
}
html[data-ui="v2"] .btn-lien{
  font-size:var(--t-sm);color:var(--accent-fonce);font-weight:500;
}
html[data-ui="v2"] .btn-lien.btn-mini{
  font-size:var(--t-sm);padding:5px;border-radius:var(--r-sm);color:var(--ink-3);
}
html[data-ui="v2"] .btn-lien.btn-mini:hover{ background:var(--sunk-2);color:var(--ink) }

/* Cible tactile : les boutons-icône descendaient à 20 px de haut. */
@media (hover:none){
  html[data-ui="v2"] .btn,
  html[data-ui="v2"] .btn-mini,
  html[data-ui="v2"] .btn-lien.btn-mini{ min-height:40px;min-width:40px }
}

/* Le bouton refusé RESTE visible et désactivé, avec sa raison en infobulle.
   Ne jamais le masquer : un bouton absent n'explique rien. */
html[data-ui="v2"] .action-impossible > .btn:disabled{ opacity:.45 }


/* ==========================================================================
   7. ONGLETS → contrôle segmenté
   On ne montre plus une rangée de dix onglets soulignés dont quatre sont des
   actions : les modes de consultation deviennent un choix unique et visible.
   Le regroupement des ACTIONS sous « ⋯ » est côté JS (couche B) ; ici on ne
   fait que la forme. Aucun onglet n'est masqué par ce fichier.
   ========================================================================== */
html[data-ui="v2"] .onglets{
  display:inline-flex;gap:2px;border-bottom:none;
  background:var(--sunk);border:1px solid var(--line-soft);
  border-radius:var(--r-md);padding:3px;margin:var(--e4) 0 var(--e3);
  flex-wrap:wrap;
}
html[data-ui="v2"] .onglet{
  padding:calc(5px * var(--dense)) calc(12px * var(--dense));
  font-size:var(--t-sm);border-radius:var(--r-sm);
  border-bottom:none;margin-bottom:0;color:var(--ink-2);
}
html[data-ui="v2"] .onglet:hover{ color:var(--ink) }
html[data-ui="v2"] .onglet.actif{
  background:var(--card);color:var(--ink);font-weight:600;
  border-bottom-color:transparent;box-shadow:var(--ombre);
}
/* les onglets qui sont en réalité des actions gardent leur place tant que la
   couche B n'est pas passée — mais ils sortent du groupe, visuellement */
html[data-ui="v2"] .onglet-config,
html[data-ui="v2"] .onglets > .btn{
  background:none;box-shadow:none;color:var(--ink-3);
}


/* ==========================================================================
   8. CARTES ET PANNEAUX
   Purge des bordures : carte OU section, jamais les deux. On sépare par
   l'espace et par une variation de fond, pas par un trait de plus.
   ========================================================================== */
html[data-ui="v2"] .carte{
  border-radius:var(--r-lg);
  overflow-wrap:anywhere;
  padding:var(--e4) var(--e5);
  margin-bottom:var(--e5);
  border-color:var(--line);
}
html[data-ui="v2"] .carte h3{
  font-size:var(--t-lg);margin:0 0 var(--e3);letter-spacing:-.2px;
}
/* une carte dans une carte : la fille perd son cadre */
html[data-ui="v2"] .carte .carte,
html[data-ui="v2"] .carte .rattachement-bloc,
html[data-ui="v2"] .carte .form-sous-bloc{
  border:none;background:none;padding:0;
}
html[data-ui="v2"] .rattachement-bloc{
  border:none;padding:0;margin-bottom:var(--e5);
}
html[data-ui="v2"] .rattachement-bloc + .rattachement-bloc{
  padding-top:var(--e4);border-top:1px solid var(--line-soft);
}
html[data-ui="v2"] .carte-meta{ font-size:var(--t-sm) }
html[data-ui="v2"] .carte-meta .meta-libelle{
  font-family:var(--sans);font-size:var(--t-sm);text-transform:none;
  letter-spacing:0;width:112px;
}
html[data-ui="v2"] .carte-meta .meta-ligne{
  padding:3px var(--e2);margin-left:calc(var(--e2) * -1);border-radius:var(--r-sm);
}
html[data-ui="v2"] .carte-meta .meta-ligne:hover{ background:var(--sunk) }
html[data-ui="v2"] .vide-etat{
  font-size:var(--t-sm);padding:var(--e4) 0;color:var(--ink-3);
}
html[data-ui="v2"] .grille-contexte{ gap:var(--e4) }


/* ==========================================================================
   9. TABLEAUX
   ========================================================================== */
html[data-ui="v2"] .enveloppe-tableau{
  border-radius:var(--r-lg);border-color:var(--line);
}
html[data-ui="v2"] table.base th,
html[data-ui="v2"] table.base td{
  border-right:none;                        /* la grille complète faisait tableur */
  border-bottom:1px solid var(--line-soft);
  padding:calc(9px * var(--dense)) var(--e3);
  font-size:var(--t-md);
  vertical-align:middle;
}
html[data-ui="v2"] table.base th{
  background:var(--sunk);
  font-family:var(--sans);
  font-size:var(--t-xs);
  font-weight:600;
  letter-spacing:0;
  text-transform:none;
  color:var(--ink-3);
  border-bottom:1px solid var(--line);
  padding:var(--e2) var(--e3);
}
html[data-ui="v2"] table.base tbody tr:hover{ background:var(--sunk) }
/* une seule couche de couleur : la ligne. Jamais la cellule. */
html[data-ui="v2"] table.base tbody tr:hover td{ background:none }
html[data-ui="v2"] .cellule-titre{ font-weight:600;color:var(--ink) }
/* les nombres se comparent verticalement */
html[data-ui="v2"] table.base td.num,
html[data-ui="v2"] table.base th.num,
html[data-ui="v2"] .cellule-formule,
html[data-ui="v2"] .cellule-id{
  font-variant-numeric:tabular-nums;
}
html[data-ui="v2"] .cellule-formule{
  background:none;                          /* le fond de colonne créait un damier */
  color:var(--accent-fonce);
  white-space:nowrap;
}
html[data-ui="v2"] .pagination,
html[data-ui="v2"] .sel-pagination{ font-size:var(--t-sm) }
html[data-ui="v2"] .nb-resultats{ font-size:var(--t-sm);color:var(--ink-3) }
html[data-ui="v2"] .chip-filtre{
  border-color:var(--line);background:var(--card);color:var(--ink-2);
  border-radius:99px;padding:4px 6px 4px 10px;font-size:var(--t-xs);gap:8px;
}


/* ==========================================================================
   10. FORMULAIRES
   Trois causes précises aux « cases collées » :
     — le label était plus près du champ du DESSUS que du sien
       (margin: 12px 0 4px, soit l'inverse de ce qu'il faut) ;
     — le champ faisait 28 px de haut (padding: 4-5 px) ;
     — rien ne regroupait les champs.
   ========================================================================== */
/* flex-wrap : un champ dont la valeur porte un suffixe long (le verdict
   « GTIN-13 / GLN » d'un code GS1, une mention de scénario, une unité) doit
   pouvoir passer à la ligne plutôt que déborder de la carte. .gln-verdict est
   en white-space:nowrap et sortait du panneau, en v8.32 comme en v8.33. */
html[data-ui="v2"] .champ-ligne{
  display:flex;align-items:baseline;gap:var(--e3);flex-wrap:wrap;
  margin:0;padding:calc(6px * var(--dense)) var(--e2);
  margin-left:calc(var(--e2) * -1);border-radius:var(--r-sm);
}
html[data-ui="v2"] .champ-ligne:hover{ background:var(--sunk) }
html[data-ui="v2"] .champ-ligne label{
  width:112px;font-size:var(--t-sm);color:var(--ink-3);
}
html[data-ui="v2"] .champ-ligne > *:not(label){ min-width:0;max-width:100% }
html[data-ui="v2"] .gln-verdict,
html[data-ui="v2"] .scen-mention{ flex:1 1 100%;margin-left:calc(112px + var(--e3)) }
html[data-ui="v2"] .champ-ligne input,
html[data-ui="v2"] .champ-ligne select,
html[data-ui="v2"] .champ-ligne textarea{
  font-size:var(--t-md);
  padding:calc(7px * var(--dense)) calc(10px * var(--dense));
  border-radius:var(--r-md);
  border-color:transparent;
  background:none;
}
html[data-ui="v2"] .champ-ligne input:hover,
html[data-ui="v2"] .champ-ligne select:hover{ border-color:var(--line) }
html[data-ui="v2"] .champ-ligne input:focus,
html[data-ui="v2"] .champ-ligne select:focus,
html[data-ui="v2"] .champ-ligne textarea:focus{
  border-color:var(--accent);background:var(--card);
  box-shadow:0 0 0 3px var(--accent-pale);outline:none;
}

/* Formulaires en pile : le label colle à SON champ (6 px), l'écart entre deux
   champs est trois fois plus grand (24 px). C'est la loi de proximité, pas
   de la décoration. */
/* ⚠ `:not(.case)` est INDISPENSABLE. Une ligne de case à cocher est un
   <label class="case"> qui contient l'input : lui appliquer le rythme d'un
   label de formulaire (display:block + 24 px de marge haute) transforme une
   liste de 6 interrupteurs en une colonne de 400 px de haut. app.css:1778
   prend déjà la même précaution sur .form-empile — c'est un piège connu. */
html[data-ui="v2"] .export-form label.bloc,
html[data-ui="v2"] .boite-connexion label:not(.case),
html[data-ui="v2"] .popover label:not(.case),
html[data-ui="v2"] .form-champ-ligne label:not(.case),
html[data-ui="v2"] .form-equipe label:not(.case){
  display:block;margin:var(--e5) 0 var(--e2);
  font-size:var(--t-sm);font-weight:600;color:var(--ink);
}
html[data-ui="v2"] .export-form label.bloc:first-child,
html[data-ui="v2"] .boite-connexion label:not(.case):first-of-type,
html[data-ui="v2"] .popover label:not(.case):first-child{ margin-top:0 }

/* --- Listes d'options : compactes, cliquables sur toute la ligne ---
   Une liste de réglages n'est pas un formulaire : ses lignes se parcourent du
   regard, elles n'ont pas besoin de respirer entre elles. 6 px suffisent. */
html[data-ui="v2"] .popover .case,
html[data-ui="v2"] .role-liste .case,
html[data-ui="v2"] .cfg-vue-ligne .case,
html[data-ui="v2"] .graphe-outils .case,
html[data-ui="v2"] .popover-graphe label.case{
  margin:0;
  padding:calc(5px * var(--dense)) var(--e2);
  margin-left:calc(var(--e2) * -1);
  border-radius:var(--r-sm);
  font-weight:400;
  cursor:pointer;
}
html[data-ui="v2"] .popover .case:hover,
html[data-ui="v2"] .role-liste .case:hover,
html[data-ui="v2"] .cfg-vue-ligne .case:hover{ background:var(--sunk) }
/* le sous-titre d'un groupe d'options, quand il y en a plusieurs */
html[data-ui="v2"] .popover label:not(.case) + .case{ margin-top:var(--e1) }

html[data-ui="v2"] .boite-connexion input,
html[data-ui="v2"] .export-form input,
html[data-ui="v2"] .export-form select,
html[data-ui="v2"] .popover input[type=text],
html[data-ui="v2"] .popover input[type=url],
html[data-ui="v2"] .popover input[type=email],
html[data-ui="v2"] .popover input[type=number],
html[data-ui="v2"] .popover input[type=date],
html[data-ui="v2"] .popover select,
html[data-ui="v2"] .popover textarea,
html[data-ui="v2"] .form-note input,
html[data-ui="v2"] .form-note select,
html[data-ui="v2"] .form-equipe input,
html[data-ui="v2"] .form-equipe select{
  font-size:var(--t-md);
  padding:calc(9px * var(--dense)) calc(12px * var(--dense));
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--input-bg);
  color:var(--ink);
}
html[data-ui="v2"] .popover input:focus,
html[data-ui="v2"] .popover select:focus,
html[data-ui="v2"] .popover textarea:focus,
html[data-ui="v2"] .boite-connexion input:focus,
html[data-ui="v2"] .form-note input:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-pale);outline:none;
}
/* --- Remplissage automatique du navigateur ---
   Chrome peint un fond bleu ou jaune sur un champ qu'il a rempli, et ce fond
   ne se surcharge PAS par `background`. Le seul levier est une ombre interne
   opaque. Sans ça, le champ « Mot de passe actuel » ressort en bleu vif au
   milieu d'un formulaire blanc et donne l'impression que la valeur vient du
   serveur — ce qui n'est jamais le cas : elle vient du trousseau local. */
html[data-ui="v2"] input:-webkit-autofill,
html[data-ui="v2"] input:-webkit-autofill:hover,
html[data-ui="v2"] input:-webkit-autofill:focus{
  -webkit-box-shadow:0 0 0 1000px var(--input-bg) inset;
  box-shadow:0 0 0 1000px var(--input-bg) inset;
  -webkit-text-fill-color:var(--ink);
  caret-color:var(--ink);
  transition:background-color 9999s ease-out;
}
html[data-ui="v2"] input:-webkit-autofill:focus{
  -webkit-box-shadow:0 0 0 1000px var(--input-bg) inset,0 0 0 3px var(--accent-pale);
  box-shadow:0 0 0 1000px var(--input-bg) inset,0 0 0 3px var(--accent-pale);
}

/* --- Champ mot de passe : l'œil ne mord plus sur le texte --- */
html[data-ui="v2"] .champ-mdp{ display:block;position:relative }
html[data-ui="v2"] .champ-mdp input{ width:100%;padding-right:42px }
html[data-ui="v2"] .btn-oeil{
  position:absolute;right:5px;top:50%;transform:translateY(-50%);
  width:32px;height:32px;display:grid;place-items:center;
  border:none;background:none;color:var(--ink-3);border-radius:var(--r-sm);
  opacity:1;font-size:15px;line-height:1;
}
html[data-ui="v2"] .btn-oeil:hover{ background:var(--sunk-2);color:var(--ink) }

/* le texte d'aide passe SOUS le champ, jamais à côté du label */
html[data-ui="v2"] .aide-modal,
html[data-ui="v2"] .aide-inline,
html[data-ui="v2"] .prive-case-aide,
html[data-ui="v2"] .form-mode-aide{
  display:block;font-size:var(--t-xs);color:var(--ink-3);
  line-height:1.45;margin-top:var(--e1);
}
html[data-ui="v2"] .form-section{ margin-top:var(--e6) }
html[data-ui="v2"] .form-note{
  gap:var(--e2);margin-top:var(--e4);flex-wrap:wrap;align-items:center;
}
html[data-ui="v2"] .form-note-extras{ display:inline-flex;gap:var(--e2);align-items:center }
html[data-ui="v2"] .form-edition .actions{
  margin-top:var(--e5);padding-top:var(--e4);
  border-top:1px solid var(--line-soft);gap:var(--e2);
}
html[data-ui="v2"] .form-edition .actions .btn{ padding:9px 18px;font-size:var(--t-md) }
html[data-ui="v2"] .case{ display:flex;align-items:flex-start;gap:var(--e2);padding:5px 0 }
/* ⛔ NE JAMAIS POSER width/height SUR input[type=checkbox].
   La V8.24 a transformé les 97 cases du produit en INTERRUPTEURS : la case
   native est stylée en piste de 32×18 avec une pastille en ::after. Lui
   imposer 15×15 écrase la piste, ne laisse voir que la pastille ronde, et
   toutes les cases du produit — réglages de colonne, kanban des tâches,
   options de partage — deviennent des ronds illisibles.
   Une case à cocher ne se restyle pas ici : app.css:3014 fait autorité. */
html[data-ui="v2"] input[type=radio]{ accent-color:var(--accent) }
html[data-ui="v2"] label.case,
html[data-ui="v2"] .case{ gap:var(--e2);font-size:var(--t-sm);align-items:center }


/* ==========================================================================
   11. POPOVERS ET MODALES
   ========================================================================== */
html[data-ui="v2"] .popover{
  border-radius:var(--r-lg);
  box-shadow:var(--ombre-flot);
  padding:var(--e3);
  min-width:250px;
  font-size:var(--t-sm);
}
html[data-ui="v2"] .popover .actions{
  margin-top:var(--e4);padding-top:var(--e3);
  border-top:1px solid var(--line-soft);gap:var(--e2);
}
html[data-ui="v2"] .option-ligne,
html[data-ui="v2"] .choix-cherchable-item,
html[data-ui="v2"] .bloc-menu-item,
html[data-ui="v2"] .cc-popup-item{
  padding:7px 10px;border-radius:var(--r-sm);font-size:var(--t-sm);
}
html[data-ui="v2"] .option-ligne:hover,
html[data-ui="v2"] .choix-cherchable-item:hover,
html[data-ui="v2"] .bloc-menu-item:hover{ background:var(--sunk-2) }
html[data-ui="v2"] .modal{
  border-radius:var(--r-lg);max-width:480px;box-shadow:var(--ombre-flot);
}
html[data-ui="v2"] .modal-tete{
  padding:var(--e4) var(--e5);border-bottom:none;font-size:var(--t-lg);font-weight:700;
}
html[data-ui="v2"] .modal-corps{ padding:0 var(--e5) var(--e4);font-size:var(--t-md) }
html[data-ui="v2"] .modal .actions{ padding:var(--e4) var(--e5);gap:var(--e2) }


/* ==========================================================================
   12. ÉTATS, PASTILLES, BANDEAUX
   ========================================================================== */
html[data-ui="v2"] .chip{
  border-color:transparent;background:var(--sunk-2);color:var(--ink-2);
  font-size:var(--t-xs);font-weight:600;padding:3px 9px;
}
html[data-ui="v2"] .badge-type{
  font-family:var(--sans);font-size:var(--t-xs);font-weight:700;
  letter-spacing:0;text-transform:none;padding:2px 8px;border-radius:var(--r-sm);
  min-width:88px;text-align:center;
}
html[data-ui="v2"] .badge-statut{
  font-family:var(--sans);font-size:var(--t-xs);font-weight:600;
}
html[data-ui="v2"] .etiquette,
html[data-ui="v2"] .etiquette-ok,
html[data-ui="v2"] .etiquette-alerte{ border-radius:99px;font-size:var(--t-xs) }

/* Les bandeaux perdent leur liseré latéral épais — c'est le marqueur le plus
   reconnaissable d'une interface générée — et gardent leur couleur de fond. */
html[data-ui="v2"] .bandeau-partage,
html[data-ui="v2"] .bandeau-prive,
html[data-ui="v2"] .bandeau-equipe{
  border:none;border-left:none;
  border-radius:var(--r-md);
  padding:var(--e2) var(--e3);
  font-size:var(--t-sm);
  margin:0 0 var(--e4);
  display:flex;align-items:center;gap:var(--e3);flex-wrap:wrap;
}
html[data-ui="v2"] .bandeau-partage .partage-titre,
html[data-ui="v2"] .bandeau-prive .prive-titre{ font-size:var(--t-sm);font-weight:600 }
html[data-ui="v2"] .bandeau-licence,
html[data-ui="v2"] .bandeau-maintenance{
  border-radius:0;font-size:var(--t-sm);border-left:none;
}
html[data-ui="v2"] .bandeau-maj{ border-radius:99px;box-shadow:var(--ombre-flot) }
html[data-ui="v2"] .toast{
  border-radius:99px;box-shadow:var(--ombre-flot);font-size:var(--t-sm);
  padding:9px 18px;font-weight:500;
}


/* ==========================================================================
   13. NOTES (SUIVI), FORMULES, SCÉNARIOS
   ========================================================================== */
html[data-ui="v2"] .notes-outils{
  display:flex;align-items:center;gap:var(--e2);flex-wrap:wrap;margin-bottom:var(--e3);
}
html[data-ui="v2"] .notes-onglets{ gap:var(--e1) }
html[data-ui="v2"] .note-onglet{
  border:none;background:none;border-radius:99px;
  padding:4px 11px;font-size:var(--t-sm);color:var(--ink-2);
}
html[data-ui="v2"] .note-onglet:hover{ background:var(--sunk);border-color:transparent }
html[data-ui="v2"] .note-onglet.actif{
  background:var(--sunk-2);border-color:transparent;color:var(--ink);font-weight:600;
}
html[data-ui="v2"] .note-onglet-nb{ font-family:var(--mono);font-size:var(--t-xs);color:var(--ink-3) }
html[data-ui="v2"] .note-recherche{
  font-size:var(--t-sm);padding:6px 10px;border-radius:var(--r-md);
  border:1px solid var(--line);margin-left:auto;
}
html[data-ui="v2"] .note-item{
  gap:var(--e3);padding:var(--e3) var(--e2);align-items:flex-start;
  margin-left:calc(var(--e2) * -1);border-radius:var(--r-md);
  border-bottom:1px solid var(--line-soft);
}
html[data-ui="v2"] .note-item:hover{ background:var(--sunk) }
html[data-ui="v2"] .note-contenu{ font-size:var(--t-md);line-height:1.55;color:var(--ink) }
html[data-ui="v2"] .note-date,
html[data-ui="v2"] .note-assigne,
html[data-ui="v2"] .note-echeance,
html[data-ui="v2"] .note-source,
html[data-ui="v2"] .note-extras{ font-size:var(--t-xs);color:var(--ink-3) }
html[data-ui="v2"] .note-echeance.retard{ color:var(--danger);font-weight:600 }
html[data-ui="v2"] .note-reponse{
  font-size:var(--t-sm);color:var(--ink-2);margin-top:var(--e2);
  padding-left:var(--e3);border-left:2px solid var(--line);max-width:70ch;
}
html[data-ui="v2"] .note-actions select{
  font-size:var(--t-xs);font-weight:600;border:1px solid var(--line);
  border-radius:99px;padding:3px 8px;background:var(--card);color:var(--ink-2);
}
/* les commandes d'une note n'apparaissent qu'au survol — le statut, lui,
   reste toujours visible : c'est une information autant qu'un contrôle */
html[data-ui="v2"] .note-actions .btn-lien.btn-mini{ opacity:0;transition:opacity .12s }
html[data-ui="v2"] .note-item:hover .note-actions .btn-lien.btn-mini,
html[data-ui="v2"] .note-item:focus-within .note-actions .btn-lien.btn-mini{ opacity:1 }
@media (hover:none){
  html[data-ui="v2"] .note-actions .btn-lien.btn-mini{ opacity:1 }
}

/* Formules et scénarios : les cartes restent (c'est le bon patron, façon
   tableau de bord), mais le titre quitte le monospace capitales et le
   résultat prend la taille d'un chiffre clé. */
html[data-ui="v2"] .formules-noeud,
html[data-ui="v2"] .scenarios-noeud{ margin:0 0 var(--e4) }
html[data-ui="v2"] .formules-entete{ gap:var(--e2);margin-bottom:var(--e3) }
html[data-ui="v2"] .formules-toggle{ font-size:var(--t-sm);font-weight:600;color:var(--ink-2) }
html[data-ui="v2"] .formules-cartes,
html[data-ui="v2"] .scenarios-cartes{ gap:var(--e3) }
html[data-ui="v2"] .formule-carte,
html[data-ui="v2"] .scenario-carte{
  border-radius:var(--r-lg);padding:var(--e3) var(--e4);
  min-width:158px;max-width:330px;border-color:var(--line);
}
html[data-ui="v2"] .formule-titre{
  font-family:var(--sans);font-size:var(--t-xs);font-weight:600;
  letter-spacing:0;text-transform:none;color:var(--ink-3);
}
html[data-ui="v2"] .formule-resultat{
  font-size:26px;font-weight:700;letter-spacing:-1px;margin-top:var(--e1);
}
html[data-ui="v2"] .scen-ctrl select,
html[data-ui="v2"] .scen-ctrl input{
  font-size:var(--t-md);font-weight:600;border:1px solid var(--line);
  border-radius:var(--r-md);padding:6px 9px;background:var(--card);color:var(--ink);
}
/* la surcharge personnelle se lit sur la VALEUR, pas sur un liseré de carte :
   un bord accentué sur un côté est le tell le plus reconnaissable */
html[data-ui="v2"] .scenario-carte.surcharge{
  border-left:1px solid var(--line);background:var(--card);
}
html[data-ui="v2"] .scenario-carte.surcharge .scen-ctrl select,
html[data-ui="v2"] .scenario-carte.surcharge .scen-ctrl input{
  border-color:var(--accent);background:var(--accent-pale);color:var(--accent-fonce);
}
html[data-ui="v2"] .scen-bornes{ font-size:var(--t-xs);color:var(--ink-3) }
html[data-ui="v2"] .scen-orphelin,
html[data-ui="v2"] .scen-a-parametrer{ font-size:var(--t-xs);font-style:italic }
html[data-ui="v2"] .scen-mention{
  display:block;font-size:var(--t-xs);color:var(--ink-3);margin-top:1px;
}
html[data-ui="v2"] .valeur-formule{ font-variant-numeric:tabular-nums }
/* le « ƒ » sort de l'infobulle : on doit voir qu'une valeur est calculée */
html[data-ui="v2"] .valeur-formule::after{
  content:"ƒ";font-family:var(--mono);font-size:9px;margin-left:5px;
  border:1px solid var(--line);border-radius:3px;padding:0 3px;
  color:var(--ink-3);vertical-align:1px;
}
html[data-ui="v2"] .mini-graphe-barre{ border-radius:3px }
html[data-ui="v2"] .mini-graphe-label{ font-size:var(--t-xs) }


/* --- Composeur de message et de commentaire ---
   Une zone de texte à trois lignes collée au bord, une poignée de
   redimensionnement native visible, et deux boutons de poids égal : ça faisait
   « champ de formulaire », pas « écrire à quelqu'un ». */
html[data-ui="v2"] .msg-composeur,
html[data-ui="v2"] .com-actions{
  gap:var(--e2);align-items:flex-end;padding-top:var(--e3);margin-top:var(--e3);
  border-top:1px solid var(--line-soft);
}
html[data-ui="v2"] .com-champ{
  font-size:var(--t-md);line-height:1.55;
  padding:calc(9px * var(--dense)) calc(12px * var(--dense));
  border:1px solid var(--line);border-radius:var(--r-lg);
  background:var(--input-bg);color:var(--ink);
  min-height:42px;resize:none;                 /* grandit tout seul, pas de poignée */
  field-sizing:content;                        /* navigateurs récents */
  max-height:40vh;overflow-y:auto;
}
html[data-ui="v2"] .com-champ:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-pale);outline:none;
}
html[data-ui="v2"] .com-champ::placeholder{ color:var(--ink-3) }
html[data-ui="v2"] .msg-composeur .btn{ align-self:flex-end }
html[data-ui="v2"] .msg-bulle{ border-radius:var(--r-lg);padding:var(--e2) var(--e3) }
html[data-ui="v2"] .msg-tete{ font-size:var(--t-xs) }


/* ==========================================================================
   14. RÉVÉLATION AU SURVOL
   Règle : tout ce qui est révélé au survol l'est AUSSI au focus clavier, et
   reste visible en tactile. Sans ces deux garde-fous, « désencombrer »
   revient à supprimer pour une partie des utilisateurs.
   ========================================================================== */
html[data-ui="v2"] .cellule-actions .btn-lien,
html[data-ui="v2"] .cellule-actions .btn-mini,
html[data-ui="v2"] .lien-item .btn-lien.btn-mini,
html[data-ui="v2"] .fichier-item .btn-lien.btn-mini{
  opacity:0;transition:opacity .12s;
}
html[data-ui="v2"] tr:hover .cellule-actions .btn-lien,
html[data-ui="v2"] tr:hover .cellule-actions .btn-mini,
html[data-ui="v2"] tr:focus-within .cellule-actions .btn-lien,
html[data-ui="v2"] tr:focus-within .cellule-actions .btn-mini,
html[data-ui="v2"] .lien-item:hover .btn-lien.btn-mini,
html[data-ui="v2"] .lien-item:focus-within .btn-lien.btn-mini,
html[data-ui="v2"] .fichier-item:hover .btn-lien.btn-mini,
html[data-ui="v2"] .fichier-item:focus-within .btn-lien.btn-mini{
  opacity:1;
}
@media (hover:none){
  html[data-ui="v2"] .cellule-actions .btn-lien,
  html[data-ui="v2"] .cellule-actions .btn-mini,
  html[data-ui="v2"] .lien-item .btn-lien.btn-mini,
  html[data-ui="v2"] .fichier-item .btn-lien.btn-mini,
  html[data-ui="v2"] .col-menu-btn,
  html[data-ui="v2"] .col-grip,
  html[data-ui="v2"] .formule-editer,
  html[data-ui="v2"] .poignee-ligne,
  html[data-ui="v2"] .com-menu-btn,
  html[data-ui="v2"] .react-ajouter{ opacity:1 !important }
}


/* ==========================================================================
   15. ÉDITEUR DE BLOCS — le rythme vertical
   « Les titres et les puces sont collés » : ce n'est pas une valeur de marge,
   c'est une échelle de proximité. Un titre appartient à ce qui le SUIT.
   ========================================================================== */
html[data-ui="v2"] .blocs-editeur{ font-size:var(--t-md);line-height:1.7 }
html[data-ui="v2"] .bloc-ligne{ border-radius:var(--r-sm);margin-top:var(--e3) }
html[data-ui="v2"] .bloc-ligne:first-child{ margin-top:0 }
html[data-ui="v2"] .bloc-ligne:hover{ background:var(--sunk) }
html[data-ui="v2"] .bloc-corps{ padding:2px 0 }
html[data-ui="v2"] .bloc-texte{ max-width:74ch }
html[data-ui="v2"] .bloc-titre1{ font-size:var(--t-xl);margin-top:var(--e6);line-height:1.3 }
html[data-ui="v2"] .bloc-titre2{ font-size:var(--t-lg);margin-top:var(--e5);line-height:1.35 }
html[data-ui="v2"] .bloc-titre3{ font-size:var(--t-md);margin-top:var(--e4);font-weight:700 }
/* ce qui suit immédiatement un titre s'en rapproche */
html[data-ui="v2"] .bloc-titre1 + .bloc-ligne,
html[data-ui="v2"] .bloc-ligne:has(.bloc-titre1) + .bloc-ligne,
html[data-ui="v2"] .bloc-ligne:has(.bloc-titre2) + .bloc-ligne,
html[data-ui="v2"] .bloc-ligne:has(.bloc-titre3) + .bloc-ligne{ margin-top:var(--e2) }
/* deux puces consécutives se serrent */
html[data-ui="v2"] .bloc-ligne:has(.bloc-liste-ligne) + .bloc-ligne:has(.bloc-liste-ligne),
html[data-ui="v2"] .bloc-ligne:has(.bloc-cases-ligne) + .bloc-ligne:has(.bloc-cases-ligne){
  margin-top:var(--e1);
}
html[data-ui="v2"] .bloc-callout{ border-radius:var(--r-lg);padding:var(--e3) var(--e4) }
html[data-ui="v2"] .bloc-citation{
  border-left:2px solid var(--line);padding-left:var(--e4);color:var(--ink-2);
}
html[data-ui="v2"] .bloc-code-enveloppe{ border-radius:var(--r-lg) }
html[data-ui="v2"] .bloc-marge{ width:34px }
html[data-ui="v2"] .detail-long textarea{ font-size:var(--t-md);line-height:1.7 }


/* ==========================================================================
   16. FICHE
   ========================================================================== */
/* ⚠ V8.34 — CETTE RÈGLE A ÉTÉ LA PIRE RÉGRESSION DE LA V8.33, ET ELLE ÉTAIT
   SILENCIEUSE AU BUREAU. app.css:541 replie la fiche en UNE colonne sous
   1050 px — mais cette ligne-ci, plus spécifique (`html[data-ui="v2"]` vaut
   deux crans de plus qu'une simple classe) et posée SANS media query, gagnait
   à TOUTES les largeurs. Une media query ne change pas la spécificité : elle
   n'est qu'une condition. Sur un téléphone de 390 px, la piste 340 px était
   servie d'abord et `minmax(0, 1fr)` recevait ce qui restait, gap déduit :
   2 px MESURÉS. La colonne principale — titre, description, blocs,
   discussions — rendait alors une lettre par ligne. La v1 n'avait jamais eu
   ce défaut ; la surcouche l'a introduit en la débordant.
   RÈGLE À RETENIR : une surcharge non conditionnelle plus spécifique qu'une
   règle sous @media DÉSACTIVE cette media query. Toute piste en pixels posée
   ici doit donc porter son propre repli — voir § 17. */
html[data-ui="v2"] .fiche-grille{ gap:var(--e6);grid-template-columns:minmax(0,1fr) 340px }
@media (max-width:1050px){
  html[data-ui="v2"] .fiche-grille{ grid-template-columns:minmax(0,1fr) }
}
html[data-ui="v2"] .desc-courte-cellule,
/* ⚠ V8.44b — CETTE RÈGLE CASSAIT UN INVARIANT ÉCRIT NOIR SUR BLANC.
   app.css:2919, V8.21 : « Le textarea d'édition et la div de lecture doivent
   partager EXACTEMENT les mêmes métriques : sans cela, à contenu égal, les
   lignes se coupent différemment et la boîte change de hauteur au moment
   précis où l'on clique pour corriger un mot. »
   La V8.33 a posé ici `font-size:16px`, `line-height:1.65` et `max-width:68ch`
   sur la div de LECTURE seule. Le textarea, lui, restait à 14px/1.6 et sans
   plafond de largeur. D'où ce qu'on voit à l'usage : la description courte
   occupe une demi-colonne au repos, et s'étale sur toute la largeur au clic.
   Ce n'est pas la V8.21 qui a échoué — c'est la surcouche qui l'a défaite,
   exactement comme elle avait défait le repli de `.fiche-grille` (V8.34, § 1).
   Même remède : ce que la règle applique à la lecture, elle doit l'appliquer
   à l'écriture. Les deux sélecteurs partagent donc le même bloc, ce qui rend
   la divergence impossible à réintroduire par distraction.
   ⚠ La règle générique `.cc-texte-lecture` sert AUSSI aux notes et aux
     commentaires (cf. app.css:2363) : le plafond de largeur n'est posé que
     dans une `.carte-texte`, là où il y a un textarea en face. Ailleurs, la
     lecture garde le comportement de la V8.33. */
html[data-ui="v2"] .cc-texte-lecture{ font-size:16px;line-height:1.65 }

/* ⚠ V8.46 — PAS DE PLAFOND DE LARGEUR DANS UNE `.carte-texte`, ET C'EST UNE
   QUESTION D'AFFORDANCE, PAS DE TYPOGRAPHIE.
   `.cc-texte-lecture.editable:hover` grise le fond et pose un liseré : c'est
   ce qui dit « cliquez ici pour écrire ». Avec `max-width:68ch`, cette
   surface s'arrêtait au milieu de la carte — donc la moitié droite d'une
   carte entièrement cliquable n'avait plus l'air de l'être. La règle des 68
   caractères sert la LECTURE d'un texte long ; ici elle décidait de la taille
   d'un BOUTON, ce qu'elle n'a jamais eu vocation à faire.
   Et une description courte tient sur une ou deux lignes : la mesure de
   lecture n'y change rien, alors qu'une zone cliquable amputée, si.
   Le plafond reste où il sert : `.desc-courte-cellule` (cellule de tableau) et
   `.cc-texte-lecture` hors carte (notes, commentaires) — cf. la règle
   juste au-dessus, inchangée depuis la V8.33.
   ⚠ Les DEUX sélecteurs gardent le même bloc : c'est l'invariant de la V8.21
     (app.css:2919), et c'est lui qui empêche le saut au clic. */
html[data-ui="v2"] .carte-texte > .cc-texte-lecture,
html[data-ui="v2"] .carte-texte > textarea{
  font-size:16px;line-height:1.65;max-width:none;
}
html[data-ui="v2"] .lien-item,
html[data-ui="v2"] .fichier-item{
  padding:calc(6px * var(--dense)) var(--e2);margin-left:calc(var(--e2) * -1);
  border-radius:var(--r-sm);font-size:var(--t-sm);border:none;
}
html[data-ui="v2"] .lien-item:hover,
html[data-ui="v2"] .fichier-item:hover{ background:var(--sunk) }
html[data-ui="v2"] .valeur-rel,
html[data-ui="v2"] .cc-valeur{ font-size:var(--t-sm) }
/* champ vide : afficher l'ACTION, pas un tiret */
html[data-ui="v2"] .champ-ligne input::placeholder{ color:var(--ink-3) }


/* ==========================================================================
   16 bis. LA COQUE — V8.34
   Deux défauts de coque, tous deux invisibles au bureau et pénibles au doigt.
   ========================================================================== */

/* 1) LE BANDEAU MESURE 50 px DEPUIS LA V8.33, PAS 52. app.css réserve 52 px en
   quatre endroits (barre latérale, contenu, surcouche de recherche) — des
   nombres écrits à la main, que la surcouche a rendus faux sans les toucher.
   Résultat : une bande de 2 px de fond nu sous le bandeau, et une zone de
   contenu 2 px plus haute que la place disponible. On ne corrige pas les
   quatre nombres de app.css (la v1 a bien un bandeau de 52 px) : on redit ici,
   sous v2 seulement, la mesure qui est vraie ici. */
html[data-ui="v2"]{ --topbar-h:50px }
html[data-ui="v2"] .sidebar,
html[data-ui="v2"] .contenu{ margin-top:var(--topbar-h) }
html[data-ui="v2"] .topbar.rech-ouverte .recherche-globale{ top:var(--topbar-h) }

/* 2) `100vh` MENT SUR TÉLÉPHONE. Sur iOS et Android, `vh` vaut la hauteur de
   l'écran BARRE D'ADRESSE MASQUÉE — la plus grande des deux. La coque de
   l'app (#app, .contenu) ne défile pas elle-même : elle est haute de
   100vh et c'est .contenu qui défile à l'intérieur. Le bas de cette zone —
   donc la fin de toute page, boutons d'action compris — passait sous la barre
   du navigateur et restait INATTEIGNABLE tant qu'on ne faisait pas défiler la
   barre elle-même, ce que la page ne permet justement pas.
   `dvh` est la hauteur RÉELLE, à l'instant. La ligne `vh` reste au-dessus
   comme repli pour les navigateurs qui ignorent `dvh`. */
html[data-ui="v2"] #app{ height:100vh;height:100dvh }
html[data-ui="v2"] .sidebar,
html[data-ui="v2"] .contenu{
  height:calc(100vh - var(--topbar-h));
  height:calc(100dvh - var(--topbar-h));
}


/* ==========================================================================
   17. RESPONSIVE — trois paliers nommés, et eux seuls
   ========================================================================== */
/* 720–1180 : deux colonnes, le panneau de propriétés passe sous le contenu
   (le transformer en tiroir demande du JS : couche B). */
@media (max-width:1180px){
  html[data-ui="v2"] .contenu{ padding:var(--e4) var(--e4) 96px }
  html[data-ui="v2"] .fiche-grille{ gap:var(--e5) }
}
/* < 720 : une colonne. Le tableau RESTE un tableau, avec défilement
   horizontal — l'empiler en cartes détruit l'alignement des colonnes, qui
   est la seule raison d'avoir un tableau. */
@media (max-width:720px){
  /* V8.34 — les 96 px de réserve en bas étaient calculés pour une fenêtre de
     bureau. Sur iPhone, la barre de gestes mange encore ~34 px sous la zone
     utile : sans `env()`, la dernière ligne de toute page se lit à travers
     elle. `env(...,0px)` vaut zéro partout ailleurs — la règle est sans effet
     hors des écrans concernés. */
  html[data-ui="v2"] .contenu{
    padding:var(--e4) var(--e3) calc(96px + env(safe-area-inset-bottom, 0px));
  }
  html[data-ui="v2"] .titre-page{ font-size:var(--t-xl) }
  html[data-ui="v2"] .enveloppe-tableau{
    margin-left:calc(var(--e3) * -1);margin-right:calc(var(--e3) * -1);
    border-radius:0;border-left:none;border-right:none;
  }
  html[data-ui="v2"] table.base th{ padding:var(--e2);font-size:11.5px }
  html[data-ui="v2"] table.base td{ padding:calc(11px * var(--dense)) var(--e2);font-size:var(--t-sm) }
  html[data-ui="v2"] .onglets{ overflow-x:auto;flex-wrap:nowrap;max-width:100%;
    scrollbar-width:none }
  html[data-ui="v2"] .onglets::-webkit-scrollbar{ display:none }
  html[data-ui="v2"] .barre-outils{ overflow-x:auto;flex-wrap:nowrap;
    scrollbar-width:none;padding-bottom:var(--e1) }
  html[data-ui="v2"] .barre-outils::-webkit-scrollbar{ display:none }
  html[data-ui="v2"] .barre-outils > *{ flex:none }
  html[data-ui="v2"] .champ-ligne{ flex-direction:column;align-items:stretch;gap:var(--e1) }
  html[data-ui="v2"] .champ-ligne label{ width:auto }
  html[data-ui="v2"] .formule-carte,
  html[data-ui="v2"] .scenario-carte{ max-width:none;flex:1 1 100% }
}


/* ==========================================================================
   18. IMPRESSION — on ne touche à rien, la v1 sait déjà faire.
   Rappel : @media print de app.css masque topbar, sidebar, onglets et boutons.
   Ce fichier n'ajoute aucune règle d'impression exprès : toute modification
   ici casserait des exports qui fonctionnent.
   ========================================================================== */


/* ==========================================================================
   19. MOUVEMENT — court et discret. 120 ms, un pixel.
   ========================================================================== */
html[data-ui="v2"] .btn,
html[data-ui="v2"] .onglet,
html[data-ui="v2"] .noeud-ligne,
html[data-ui="v2"] .note-item,
html[data-ui="v2"] .champ-ligne{ transition:background .12s,color .12s,border-color .12s }
@media (prefers-reduced-motion:reduce){
  html[data-ui="v2"] *{ transition:none !important;animation:none !important }
}


/* ==========================================================================
   20. LE MENU ⋯ DE LA COUCHE B — V8.35
   Voir ccMenuActions() dans js/ui.js. Ce bloc n'habille QUE le popover que
   cette fonction produit : `.popover.cc-menu-pop`. Aucun autre popover du
   produit n'est touché, et sous data-ui="v1" rien de tout ceci n'existe —
   la couche B ne construit pas de menu dans ce mode.
   ========================================================================== */
html[data-ui="v2"] .popover.cc-menu-pop{ padding:var(--e1);min-width:250px;max-width:300px }
html[data-ui="v2"] .cc-menu-titre{
  font-size:var(--t-xs);color:var(--ink-3);padding:6px 10px 3px;
}
html[data-ui="v2"] .cc-menu-sep{ height:1px;background:var(--line-soft);margin:var(--e1) 6px }

/* Les items SONT les boutons d'origine, déplacés. On leur retire le châssis de
   bouton — bordure, fond, rayon — et on garde tout le reste : leur couleur
   (le rouge de « Supprimer » vient de .btn-danger), leur état, leur title.
   D'où `background:none` et non `background:var(--card)` : une valeur explicite
   écraserait le fond que .btn-danger pose au survol. */
html[data-ui="v2"] .cc-menu-pop .cc-menu-item{
  display:flex;align-items:center;gap:var(--e2);width:100%;
  padding:8px 10px;border:none;background:none;border-radius:var(--r-sm);
  font-size:var(--t-sm);font-weight:500;text-align:left;color:var(--ink-2);
  letter-spacing:0;text-transform:none;
}
html[data-ui="v2"] .cc-menu-pop .cc-menu-item:hover:not(:disabled){
  background:var(--sunk-2);color:var(--ink);border-color:transparent;
}
html[data-ui="v2"] .cc-menu-pop .cc-menu-item.btn-danger{ color:var(--danger);border:none }
html[data-ui="v2"] .cc-menu-pop .cc-menu-item.btn-danger:hover:not(:disabled){
  background:var(--danger-pale);color:var(--danger);
}
/* ⚠ UN ITEM DÉSACTIVÉ RESTE LISIBLE. `opacity:.45`, réflexe habituel, rendrait
   illisible la seule chose qui compte ici : le libellé de ce qu'on ne peut pas
   faire. On le grise franchement, on lui met le curseur qui dit « non », et sa
   RAISON reste dans le title (ccRefusSuppression). Un item absent n'explique
   rien ; celui-ci explique. */
html[data-ui="v2"] .cc-menu-pop .cc-menu-item:disabled{
  color:var(--ink-3);cursor:not-allowed;background:none;
}
html[data-ui="v2"] .cc-menu-pop .cc-menu-item.btn-danger:disabled{ color:var(--ink-3) }
html[data-ui="v2"] .cc-menu-pop .cc-menu-item .cc-icone{ flex:none;color:var(--ink-3) }

/* Le déclencheur : un bouton fantôme, carré, qui ne pèse pas dans la rangée. */
html[data-ui="v2"] .cc-menu-decl{
  display:inline-flex;align-items:center;justify-content:center;gap:5px;
  border-color:transparent;background:none;color:var(--ink-2);
  padding:0 7px;min-height:30px;min-width:30px;border-radius:var(--r-md);
}
html[data-ui="v2"] .cc-menu-decl:hover,
html[data-ui="v2"] .cc-menu-decl[aria-expanded="true"]{
  background:var(--sunk-2);color:var(--ink);border-color:transparent;
}
/* Au doigt, 30 px ne suffisent pas : la doc fixe la cible à 40 px, et c'est ce
   bouton-là qui donne accès à tout ce qui a été rangé. */
@media (hover:none){
  html[data-ui="v2"] .cc-menu-decl{ min-height:40px;min-width:40px }
  html[data-ui="v2"] .cc-menu-pop .cc-menu-item{ padding:11px 10px }
}


/* ==========================================================================
   21. FICHE — BARRE D'ACTIONS ET FIL (couche B, chantier 4) — V8.35
   ========================================================================== */
/* Le fil d'Ariane accueille la remontée : « ← Retour au tableau » n'est plus
   un bouton dans une rangée d'actions destructrices, c'est une navigation, et
   elle a la discrétion d'un lien. */
html[data-ui="v2"] .cc-fil-ligne{
  display:flex;align-items:center;gap:var(--e3);flex-wrap:wrap;
  margin-bottom:var(--e2);
}
html[data-ui="v2"] .cc-fil-ligne .cap-chemin{ margin-bottom:0 }
html[data-ui="v2"] .cc-retour{
  border-color:transparent;background:none;color:var(--ink-3);
  padding:2px 0;font-size:var(--t-sm);font-weight:500;
}
html[data-ui="v2"] .cc-retour:hover{
  border-color:transparent;background:none;color:var(--accent-fonce);
  text-decoration:underline;
}
/* Au doigt, un lien de 18 px de haut n'est pas une cible. On lui rend sa
   hauteur sans lui rendre son cadre. */
@media (hover:none){
  html[data-ui="v2"] .cc-retour{ min-height:40px;display:inline-flex;align-items:center }
}

/* La rangée ne contient plus que la primaire et le ⋯ : elle n'a plus besoin
   de se serrer. */
html[data-ui="v2"] .cc-barre-fiche{ gap:var(--e2) }

/* L'état « publiée », à côté du titre, avec le cadenas du privé — même
   endroit, même question : qui d'autre voit ça ? Discret par construction :
   c'est un fait sur la fiche, pas une alerte. */
html[data-ui="v2"] .cc-badge-publie{
  display:inline-flex;align-items:center;gap:5px;
  margin-left:var(--e2);padding:2px 9px;border-radius:99px;
  background:var(--accent-pale);color:var(--accent-fonce);
  font-family:var(--sans);font-size:var(--t-xs);font-weight:600;
  letter-spacing:0;text-decoration:none;vertical-align:middle;white-space:nowrap;
}
html[data-ui="v2"] .cc-badge-publie::before{
  content:"";width:7px;height:7px;border-radius:50%;background:var(--accent);flex:none;
}
html[data-ui="v2"] .cc-badge-publie:hover{ background:var(--accent);color:#fff }
html[data-ui="v2"] .cc-badge-publie:hover::before{ background:#fff }
/* `hidden` doit gagner contre `display:inline-flex` — sans quoi un badge non
   confirmé par le serveur s'afficherait vide. */
html[data-ui="v2"] .cc-badge-publie[hidden]{ display:none }

/* V8.35b — la rangée de badges d'état, sous le titre (cf. maquette
   relieo_fiche_7.html, `.badges`). Elle se replie à zéro quand elle est vide :
   `:has()` évite de réserver une gouttière pour une fiche non publiée, et les
   navigateurs qui l'ignorent voient 6 px de marge, pas un trou. */
/* ⚠ V8.36b — MARGE EN HAUT ET EN BAS. Elle n'était posée qu'en haut : le badge
   se retrouvait collé à ce qui suit — la carte « Contexte » sur une
   collection, la description courte sur une fiche. Une pastille à 8 px du
   bouton au-dessus et à 0 px de la carte en dessous se lit comme l'en-tête de
   cette carte, ce qu'elle n'est pas : elle qualifie la PAGE. Le bas est plus
   généreux que le haut, exprès — le badge appartient au groupe titre/actions,
   il doit s'en détacher moins que du contenu. */
html[data-ui="v2"] .cc-badges{
  display:flex;align-items:center;gap:var(--e2);flex-wrap:wrap;
  margin:var(--e2) 0 var(--e4);
}
html[data-ui="v2"] .cc-badges:not(:has(> :not([hidden]))){ margin:0 }
html[data-ui="v2"] .cc-badges .cc-badge-publie{ margin-left:0 }
/* Avec plusieurs liens, le badge n'est plus un <a href> mais un déclencheur de
   popover : il doit rester visiblement cliquable, et son anneau de focus est
   ce qui dit au clavier qu'il est atteignable. */
html[data-ui="v2"] .cc-badge-publie[role="button"]{ cursor:pointer }

/* Sur téléphone, l'en-tête d'une fiche empile déjà remontée, fil, titre,
   badges et barre : chaque interligne de trop repousse d'autant le premier
   contenu utile. On resserre, sans rien retirer. */
@media (max-width:720px){
  html[data-ui="v2"] .cc-fil-ligne{ gap:0 var(--e3);row-gap:0 }
  html[data-ui="v2"] .cc-badges{ margin-top:var(--e1) }
}


/* ==========================================================================
   22. COLLECTION — BARRE D'ACTIONS ET RÉGLAGES (chantiers 1 et 2) — V8.36
   ========================================================================== */
html[data-ui="v2"] .cc-barre-noeud{ gap:var(--e2) }

/* « Supprimer » refusé arrive dans le ⋯ enveloppé d'un <span
   class="action-impossible"> qui PORTE l'infobulle — un <button disabled> ne
   reçoit pas les événements de souris sous Chrome, son propre `title` ne
   s'afficherait jamais (cf. app.css / V8.26). L'enveloppe devient donc la
   ligne de menu, et le bouton qu'elle contient l'occupe entièrement : sans
   ça, la zone qui déclenche l'infobulle serait plus petite que la ligne, et
   la raison resterait introuvable au survol. */
html[data-ui="v2"] .cc-menu-pop .cc-menu-item.action-impossible{
  display:block;padding:0;background:none;
}
html[data-ui="v2"] .cc-menu-pop .action-impossible > .btn{
  display:flex;align-items:center;gap:var(--e2);width:100%;
  padding:8px 10px;border:none;background:none;border-radius:var(--r-sm);
  font-size:var(--t-sm);font-weight:500;text-align:left;
  color:var(--ink-3);cursor:not-allowed;
}

/* Le popover ⚙ : un intertitre pour « Affichage », un dépli pour la
   configuration de départ. Le dépli n'est pas un masquage — <summary> est
   focalisable, annoncé, et trouvable au Ctrl+F. */
html[data-ui="v2"] .cc-groupe-titre{
  font-size:var(--t-xs);font-weight:700;color:var(--ink-3);
  letter-spacing:.06em;margin:var(--e3) 0 var(--e1);
}
html[data-ui="v2"] .cc-dépli{ margin-top:var(--e3);border-top:1px solid var(--line-soft);padding-top:var(--e2) }
html[data-ui="v2"] .cc-dépli > summary{
  cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;
  font-size:var(--t-xs);font-weight:700;color:var(--ink-3);letter-spacing:.06em;
  padding:4px 0;border-radius:var(--r-sm);
}
html[data-ui="v2"] .cc-dépli > summary::-webkit-details-marker{ display:none }
html[data-ui="v2"] .cc-dépli > summary::before{
  content:"›";display:inline-block;transition:transform .12s;font-weight:400;font-size:14px;
}
html[data-ui="v2"] .cc-dépli[open] > summary::before{ transform:rotate(90deg) }
html[data-ui="v2"] .cc-dépli > summary:hover{ color:var(--ink-2) }
html[data-ui="v2"] .cc-dépli-corps{ padding-top:var(--e1) }


/* ==========================================================================
   23. DÉBORDEMENT DES ONGLETS (chantier 3) — V8.37
   ========================================================================== */
/* Le « +N ⌄ » n'est pas une vue : il ne prend jamais l'état actif, et il se
   distingue des onglets par sa sobriété plutôt que par une couleur — une
   pastille de plus dans une rangée qu'on vient justement d'alléger. */
html[data-ui="v2"] .onglet-deborde{
  color:var(--ink-3);font-weight:600;gap:3px;
}
html[data-ui="v2"] .onglet-deborde:hover,
html[data-ui="v2"] .onglet-deborde[aria-expanded="true"]{ color:var(--ink) }
html[data-ui="v2"] .onglet-deborde .cc-icone{ opacity:.7 }

html[data-ui="v2"] .popover.cc-deborde-pop{ padding:var(--e1);min-width:230px }
html[data-ui="v2"] .cc-deborde-titre{
  font-size:var(--t-xs);color:var(--ink-3);padding:6px 10px 4px;
}
/* Chaque ligne porte DEUX gestes : ouvrir la vue (le gros de la ligne) et la
   remettre dans la rangée (l'épingle, à droite). Ils sont séparés parce qu'ils
   ne s'annulent pas de la même façon : ouvrir ne change rien pour personne,
   épingler change la rangée de toute l'équipe. */
html[data-ui="v2"] .cc-deborde-ligne{
  display:flex;align-items:stretch;border-radius:var(--r-sm);
}
html[data-ui="v2"] .cc-deborde-ligne:hover{ background:var(--sunk-2) }
html[data-ui="v2"] .cc-deborde-item{
  display:flex;align-items:flex-start;gap:var(--e2);flex:1;min-width:0;
  padding:7px 10px;border:none;background:none;border-radius:var(--r-sm);
  text-align:left;color:var(--ink-2);cursor:pointer;
}
html[data-ui="v2"] .cc-deborde-ligne:hover .cc-deborde-item{ color:var(--ink) }
html[data-ui="v2"] .cc-deborde-epingle{
  flex:none;border:none;background:none;padding:0 9px;border-radius:var(--r-sm);
  color:var(--ink-3);cursor:pointer;opacity:0;transition:opacity .12s;
}
html[data-ui="v2"] .cc-deborde-ligne:hover .cc-deborde-epingle,
html[data-ui="v2"] .cc-deborde-epingle:focus-visible{ opacity:1 }
html[data-ui="v2"] .cc-deborde-epingle:hover{ background:var(--accent-pale);color:var(--accent-fonce) }
/* Au doigt, le survol n'existe pas : l'épingle est toujours là. */
@media (hover:none){
  html[data-ui="v2"] .cc-deborde-epingle{ opacity:.6;padding:0 12px }
}
html[data-ui="v2"] .cc-deborde-item .cc-icone{ flex:none;margin-top:2px;color:var(--ink-3) }
html[data-ui="v2"] .cc-deborde-item strong{
  display:block;font-size:var(--t-sm);font-weight:600;color:inherit;
}
/* La condition qui rend cette vue possible. Écrite en clair et non en
   infobulle : c'est le seul endroit du produit où le système de vues
   conditionnelles se lit, et une infobulle ne se lit que si l'on a déjà eu
   l'idée de survoler. */
html[data-ui="v2"] .cc-deborde-item small{
  display:block;font-size:var(--t-xs);color:var(--ink-3);margin-top:1px;
}
@media (hover:none){
  html[data-ui="v2"] .cc-deborde-item{ padding:11px 10px }
  html[data-ui="v2"] .onglet-deborde{ min-height:40px }
}


/* ==========================================================================
   24. COLONNES — MENU D'EN-TÊTE ET CRÉATEUR (chantiers 5 et 6) — V8.39
   ========================================================================== */
html[data-ui="v2"] .popover.cc-colmenu-pop{ padding:var(--e2);min-width:250px;max-width:290px }
html[data-ui="v2"] .cc-colmenu > input{
  width:100%;border:1px solid var(--line);border-radius:var(--r-md);
  padding:6px 9px;font-size:var(--t-sm);font-weight:600;background:var(--input-bg);color:var(--ink);
}
html[data-ui="v2"] .cc-colmenu > input:focus{ outline:none;border-color:var(--accent) }
/* Le type se LIT ici et se change dans les options complètes : il ressemble
   donc à une ligne d'information cliquable, pas à un champ de saisie. */
html[data-ui="v2"] .cc-colmenu-type{
  display:flex;align-items:center;gap:var(--e2);width:100%;margin-top:var(--e1);
  padding:6px 9px;border:none;background:none;border-radius:var(--r-sm);
  font-size:var(--t-sm);color:var(--ink-2);cursor:pointer;text-align:left;
}
html[data-ui="v2"] .cc-colmenu-type:hover{ background:var(--sunk-2);color:var(--ink) }
html[data-ui="v2"] .cc-colmenu-type .chevron{ margin-left:auto;color:var(--ink-3) }
html[data-ui="v2"] .cc-colmenu-sep{ height:1px;background:var(--line-soft);margin:var(--e2) 4px }
html[data-ui="v2"] .cc-colmenu-item{
  display:flex;align-items:flex-start;gap:var(--e2);width:100%;
  padding:7px 9px;border:none;background:none;border-radius:var(--r-sm);
  font-size:var(--t-sm);color:var(--ink-2);cursor:pointer;text-align:left;
}
html[data-ui="v2"] .cc-colmenu-item:hover{ background:var(--sunk-2);color:var(--ink) }
html[data-ui="v2"] .cc-colmenu-item .ic{
  flex:none;width:16px;text-align:center;color:var(--ink-3);font-size:12px;line-height:1.5;
}
html[data-ui="v2"] .cc-colmenu-item .cc-icone{ flex:none;color:var(--ink-3);margin-top:1px }
/* La portée d'un geste ne se met pas en infobulle quand elle dépasse la
   personne qui clique : « masquer » vaut pour toute l'équipe, ça s'écrit. */
html[data-ui="v2"] .cc-colmenu-item small{
  display:block;font-size:var(--t-xs);color:var(--ink-3);margin-top:1px;
}

/* Le formulaire de colonne : la largeur est posée en ligne (min 320 / max 380,
   cf. popoverColonne) parce qu'elle vaut aussi en v1, où le défaut existait.
   Ici on ne règle que le dépli des réglages rares. */
html[data-ui="v2"] .cc-form-colonne .cc-dépli{ margin-top:var(--e3) }

@media (hover:none){
  html[data-ui="v2"] .cc-colmenu-item{ padding:11px 9px }
}

/* V8.41b — « Verrouiller cette colonne… » a quitté l'en-tête du formulaire
   pour la rangée d'actions. Elle y reste discrète — c'est un bouton-lien, pas
   un bouton plein — et calée à gauche, à distance de « Enregistrer ». */
html[data-ui="v2"] .actions > .btn-lien:first-child{ margin-right:auto }

/* V8.42 — le réglage d'une colonne devient une fenêtre centrée. La largeur
   reste celle du § « cc-form-colonne » (min 320 / max 380) : ce n'est plus la
   place disponible qui la décide, mais la lisibilité du formulaire. */
html[data-ui="v2"] .modal.cc-modal-colonne{
  max-width:420px;width:auto;max-height:min(86vh, 760px);
  overflow-y:auto;padding:var(--e5);
}
html[data-ui="v2"] .cc-modal-colonne .cc-form-colonne{ min-width:0 !important;max-width:none !important }
/* Sur téléphone, la fenêtre occupe la largeur utile et le fond garde ses 20 px
   (posés par `.modal-backdrop` dans app.css). */
@media (max-width:720px){
  html[data-ui="v2"] .modal.cc-modal-colonne{ max-width:none;width:100%;padding:var(--e4) }
}


/* ==========================================================================
   25. LE FORMULAIRE DE COLONNE HORS POPOVER — V8.42
   ==========================================================================
   ⚠ EN SORTANT CE FORMULAIRE DU POPOVER, JE LUI AI RETIRÉ SES STYLES.
   Les règles de mise en forme des formulaires — libellés en bloc, champs en
   pleine largeur, cases, rangée d'actions, textes d'aide — sont portées par
   `.popover` dans app.css et app2.css. Le formulaire vit maintenant dans une
   `.modal` : il n'héritait plus de rien, et ses libellés repassaient en ligne
   à côté des champs.
   Les sélecteurs ci-dessous sont les JUMEAUX exacts de ceux qui portent
   `.popover`, générés depuis eux — pas réécrits à la main, pour qu'aucune
   valeur ne diverge. Si une règle `.popover` change un jour, celle-ci devra
   être régénérée ; c'est le prix de la sortie du popover, et il est écrit ici
   plutôt que découvert plus tard.
   ========================================================================== */
html[data-ui="v2"] .cc-modal-colonne label{display: block; font-size: 12px; color: var(--ink-2); margin: 8px 0 3px;}
html[data-ui="v2"] .cc-modal-colonne input[type="text"],
html[data-ui="v2"] .cc-modal-colonne select,
html[data-ui="v2"] .cc-modal-colonne textarea{width: 100%; border: 1px solid var(--line); border-radius: 4px; padding: 5px 7px; font-size: 13px;}
html[data-ui="v2"] .cc-modal-colonne .actions{display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px;}
html[data-ui="v2"] .cc-modal-colonne .case{display: flex; align-items: center; gap: 6px; font-size: 13px; margin: 3px 0;}
html[data-ui="v2"] .cc-modal-colonne .aide-modal{font-size: 12px; color: var(--ink-2); margin: 0 0 10px;}
html[data-ui="v2"] .cc-modal-colonne .ligne-affichage{display: flex; align-items: center; gap: 6px; font-size: 12.5px; flex-wrap: wrap; margin-top: 6px; color: var(--ink-2);}
html[data-ui="v2"] .cc-modal-colonne .ligne-affichage select,
html[data-ui="v2"] .cc-modal-colonne .ligne-affichage input[type="number"]{width: auto;}
html[data-ui="v2"] .cc-modal-colonne-graphe label{display: block; margin-top: 8px; font-size: 11.5px; color: var(--ink-3);}
html[data-ui="v2"] .cc-modal-colonne-graphe label.case{display: flex; align-items: center; gap: 5px; margin-top: 2px; font-size: 12.5px; color: var(--ink);}
html[data-ui="v2"] .cc-modal-colonne .confirm-suppr + .btn-danger{background:var(--danger);color:#fff;font-weight:600;border-color:var(--danger);}
html[data-ui="v2"] .cc-modal-colonne label:not(.case){display:block;margin:var(--e5) 0 var(--e2);
  font-size:var(--t-sm);font-weight:600;color:var(--ink);}
html[data-ui="v2"] .cc-modal-colonne label:not(.case):first-child{margin-top:0}
html[data-ui="v2"] .cc-modal-colonne .case,
html[data-ui="v2"] .cc-modal-colonne-graphe label.case{margin:0;
  padding:calc(5px * var(--dense)) var(--e2);
  margin-left:calc(var(--e2) * -1);
  border-radius:var(--r-sm);
  font-weight:400;
  cursor:pointer;}
html[data-ui="v2"] .cc-modal-colonne .case:hover{background:var(--sunk)}
html[data-ui="v2"] .cc-modal-colonne label:not(.case) + .case{margin-top:var(--e1)}
html[data-ui="v2"] .cc-modal-colonne input[type=text],
html[data-ui="v2"] .cc-modal-colonne input[type=url],
html[data-ui="v2"] .cc-modal-colonne input[type=email],
html[data-ui="v2"] .cc-modal-colonne input[type=number],
html[data-ui="v2"] .cc-modal-colonne input[type=date],
html[data-ui="v2"] .cc-modal-colonne select,
html[data-ui="v2"] .cc-modal-colonne textarea{font-size:var(--t-md);
  padding:calc(9px * var(--dense)) calc(12px * var(--dense));
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--input-bg);
  color:var(--ink);}
html[data-ui="v2"] .cc-modal-colonne input:focus,
html[data-ui="v2"] .cc-modal-colonne select:focus,
html[data-ui="v2"] .cc-modal-colonne textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-pale);outline:none;}
html[data-ui="v2"] .cc-modal-colonne .actions{margin-top:var(--e4);padding-top:var(--e3);
  border-top:1px solid var(--line-soft);gap:var(--e2);}
html[data-ui="v2"] .cc-modal-colonne.cc-menu-pop{padding:var(--e1);min-width:250px;max-width:300px}
html[data-ui="v2"] .cc-modal-colonne.cc-deborde-pop{padding:var(--e1);min-width:230px}
html[data-ui="v2"] .cc-modal-colonne.cc-colmenu-pop{padding:var(--e2);min-width:250px;max-width:290px}


/* ==========================================================================
   26. LE COMPOSEUR DE NOTE (chantier 7) — V8.43
   ========================================================================== */
/* Au repos : une ligne, qui ne prétend pas être un formulaire. */
html[data-ui="v2"] .cc-note-declencheur{
  display:block;width:100%;text-align:left;border:1px dashed var(--line);
  background:none;border-radius:var(--r-md);padding:9px 12px;
  color:var(--ink-3);font-size:var(--t-sm);cursor:pointer;margin-top:var(--e3);
}
html[data-ui="v2"] .cc-note-declencheur:hover{
  border-color:var(--accent);color:var(--accent-fonce);background:var(--accent-pale);
}
html[data-ui="v2"] .cc-note-corps{ margin-top:var(--e3) }

/* LE TYPE SE CHOISIT EN PREMIER : il est donc AU-DESSUS du champ, en toutes
   lettres, et pas dans une liste déroulante à gauche qu'on lit après avoir
   écrit. Six pastilles tiennent sur une ligne ou deux ; une liste déroulante
   cache cinq choix sur six. */
html[data-ui="v2"] .cc-note-types{
  display:flex;flex-wrap:wrap;gap:var(--e1);margin-bottom:var(--e2);
}
html[data-ui="v2"] .cc-note-type{
  border:1px solid transparent;background:var(--sunk);border-radius:99px;
  padding:4px 12px;font-size:var(--t-xs);font-weight:600;color:var(--ink-2);cursor:pointer;
}
html[data-ui="v2"] .cc-note-type:hover{ background:var(--sunk-2);color:var(--ink) }
html[data-ui="v2"] .cc-note-type.actif{
  background:var(--accent-pale);border-color:var(--accent);color:var(--accent-fonce);
}
html[data-ui="v2"] .cc-note-ligne{
  display:flex;gap:var(--e2);align-items:center;flex-wrap:wrap;
}
html[data-ui="v2"] .cc-note-ligne > input{ flex:1;min-width:180px }
html[data-ui="v2"] .cc-note-aide{ margin:var(--e2) 0 0 }
@media (hover:none){
  html[data-ui="v2"] .cc-note-type{ padding:9px 14px }
  html[data-ui="v2"] .cc-note-declencheur{ padding:13px 12px }
}
/* ⚠ `display:block` ci-dessus BAT l'attribut `hidden` (dont le `display:none`
   vient de la feuille du navigateur, moins spécifique). Sans cette ligne, le
   déclencheur restait affiché sous le composeur déplié — le même piège que
   `.cc-badge-publie[hidden]` au § 21. */
html[data-ui="v2"] .cc-note-declencheur[hidden]{ display:none }


/* ==========================================================================
   27. LA COLONNE DE PROPRIÉTÉS DE LA FICHE (chantier 8) — V8.43
   ========================================================================== */
/* La doc demande trois mesures, et elles suffisent à rendre la colonne
   lisible : le nom de base en intertitre, 24 px entre deux bases, 6 px entre
   deux champs. Le groupement par rattachement, lui, EXISTAIT DÉJÀ dans les
   données (`fiche.rattachements[].definitions[]`) — il ne manquait que la
   typographie pour qu'il se voie. */
html[data-ui="v2"] .rattachement-bloc{
  border:none;padding:0;margin:0 0 var(--e5);
}
html[data-ui="v2"] .rattachement-bloc + .rattachement-bloc{
  padding-top:var(--e5);border-top:1px solid var(--line-soft);
}
html[data-ui="v2"] .cc-ratt-tete{
  display:flex;align-items:center;gap:var(--e2);margin-bottom:2px;
}
html[data-ui="v2"] .cc-ratt-tete strong{ font-size:var(--t-md);color:var(--ink) }
html[data-ui="v2"] .cc-ratt-tete .cc-ratt-copier{
  margin-left:auto;color:var(--ink-3);opacity:0;transition:opacity .12s;padding:2px 4px;
}
html[data-ui="v2"] .rattachement-bloc:hover .cc-ratt-copier,
html[data-ui="v2"] .cc-ratt-copier:focus-visible{ opacity:1 }
html[data-ui="v2"] .rattachement-bloc .chemin{ margin-bottom:var(--e3) }
html[data-ui="v2"] .rattachement-bloc .champ-ligne{ margin:calc(6px * var(--dense)) 0 }

/* Les champs calculés, sous leur filet : on les LIT, on ne les remplit pas. */
html[data-ui="v2"] .cc-champs-calcules{
  margin-top:var(--e3);padding-top:var(--e2);border-top:1px dashed var(--line);
}
html[data-ui="v2"] .cc-champs-calcules-titre{
  font-size:var(--t-xs);color:var(--ink-3);margin-bottom:var(--e1);
}

/* Le « ? » du vocabulaire : discret à côté du libellé, jamais à la place. */
html[data-ui="v2"] .cc-champ-aide{
  margin-left:5px;border:none;background:var(--sunk-2);color:var(--ink-3);
  width:15px;height:15px;border-radius:50%;font-size:10px;line-height:1;
  cursor:pointer;padding:0;vertical-align:1px;
}
html[data-ui="v2"] .cc-champ-aide:hover{ background:var(--accent-pale);color:var(--accent-fonce) }
html[data-ui="v2"] .cc-aide-terme{ max-width:300px }
html[data-ui="v2"] .cc-aide-terme p{ margin:var(--e1) 0 0;font-size:var(--t-sm) }
@media (hover:none){
  html[data-ui="v2"] .cc-ratt-copier{ opacity:.6 }
  html[data-ui="v2"] .cc-champ-aide{ width:22px;height:22px;font-size:12px }
}


/* ==========================================================================
   28. LE TIROIR DE PROPRIÉTÉS (chantier 11) — V8.47
   ========================================================================== */
/* Le § 17 posait le constat et laissait la dette : « 720–1180 : le panneau de
   propriétés passe sous le contenu (le transformer en tiroir demande du JS :
   couche B) ». Sous 1180 px, « passer sous le contenu » veut dire : après les
   blocs, après les discussions, après les notes — trois écrans de défilement
   avant de savoir à quelle base la fiche est rattachée. Le tiroir remet ces
   trois cartes à une touche de distance.

   ⚠ TOUT CE QUI SUIT EST SOUS MEDIA QUERY, ET C'EST LA LEÇON DE LA V8.34.
     Une règle non conditionnelle plus spécifique désactive une media query
     (voir § 16 bis). Les deux seules déclarations hors media query ci-dessous
     sont des `display:none` : au-dessus de 1180 px, le bouton et le voile
     n'existent pas, la colonne est une colonne, la grille est intacte. */
html[data-ui="v2"] .cc-btn-props{ display:none }
html[data-ui="v2"] .cc-props-voile{ display:none }

@media (max-width:1180px){
  html[data-ui="v2"] .cc-btn-props{ display:inline-flex;align-items:center;gap:5px }

  /* `position:fixed` fonctionne ici parce qu'aucun ancêtre ne porte de
     `transform`, `filter` ni `perspective` — vérifié : `.contenu` n'a que
     `overflow:auto`, qui ne crée pas de bloc conteneur pour du fixed.
     Hors flux, la colonne ne réclame plus de cellule : la grille retombe
     d'elle-même sur sa seule colonne de contenu. */
  html[data-ui="v2"] .fiche-grille > .cc-props{
    position:fixed;top:var(--topbar-h);right:0;z-index:34;
    width:min(360px,88vw);
    height:calc(100vh - var(--topbar-h));
    height:calc(100dvh - var(--topbar-h));
    overflow:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;
    background:var(--card);border-left:1px solid var(--line);
    box-shadow:-8px 0 24px rgba(24,43,58,.10);
    padding:var(--e4) var(--e4) calc(var(--e6) + env(safe-area-inset-bottom, 0px));
    /* `visibility:hidden` fermé, et non pas seulement `translateX(100%)` :
       un panneau simplement poussé hors de l'écran reste TABULABLE. On
       traverserait, à l'aveugle, quinze champs invisibles avant d'atteindre
       le pied de page. Le délai sur `visibility` laisse l'animation de
       fermeture se jouer avant que le panneau ne disparaisse. */
    transform:translateX(100%);visibility:hidden;
    transition:transform .18s ease, visibility 0s linear .18s;
  }
  html[data-ui="v2"] .fiche-grille.cc-props-ouvert > .cc-props{
    transform:none;visibility:visible;
    transition:transform .18s ease, visibility 0s;
  }
  html[data-ui="v2"] .fiche-grille > .cc-props:focus{ outline:none }

  /* Le voile commence SOUS le bandeau : la recherche, le compte et le retour
     restent cliquables tiroir ouvert. Il n'assombrit que ce qu'il recouvre. */
  html[data-ui="v2"] .cc-props-voile{
    position:fixed;inset:var(--topbar-h) 0 0 0;z-index:33;
    background:rgba(24,43,58,.28);
  }
  html[data-ui="v2"] .fiche-grille.cc-props-ouvert > .cc-props-voile{ display:block }
}

/* Sous 720 px le tiroir prend presque tout l'écran : à 360 px de large sur un
   téléphone de 390, la bande de voile restante ne sert plus à rien qu'à
   fermer — on la garde pour ça, mais le tiroir s'élargit. */
@media (max-width:520px){
  html[data-ui="v2"] .fiche-grille > .cc-props{ width:min(340px,92vw) }
}

@media (prefers-reduced-motion:reduce){
  html[data-ui="v2"] .fiche-grille > .cc-props,
  html[data-ui="v2"] .fiche-grille.cc-props-ouvert > .cc-props{ transition:none }
}


/* ==========================================================================
   29. LE CHOIX DE PORTÉE DE « LIER LES FICHES… » (chantier 9, palier 2) — V8.48
   ========================================================================== */
/* ⚠ SANS CE BLOC, LA V2 CASSE CE QUE LA V1 REND BIEN — encore le même piège.
   app.css:483 pose `label.cc-portee-choix { display:flex }` pour mettre le
   bouton radio SUR LA MÊME LIGNE que son libellé. Mais le § 5 ci-dessus dit
   `html[data-ui="v2"] .popover label:not(.case) { display:block }`, et
   `:not(.case)` compte comme une classe : cette règle-là est plus spécifique
   et gagne. Résultat sans correctif : en v2, le radio se pose AU-DESSUS de
   son texte, et les deux choix deviennent quatre lignes illisibles.
   On ne touche pas au § 5 (il a raison pour tous les autres labels) : on
   redit ici, plus spécifiquement, le seul cas qu'il ne doit pas régir. */
html[data-ui="v2"] .popover label.cc-portee-choix{
  display:flex;align-items:baseline;gap:var(--e2);flex-wrap:wrap;
  margin:var(--e2) 0 0;font-size:var(--t-sm);font-weight:400;color:var(--ink);
}
html[data-ui="v2"] .popover .cc-portee-lien{
  border-color:var(--line);border-radius:var(--r);background:var(--sunk-2);
  padding:var(--e1) var(--e3) var(--e3);margin:var(--e3) 0 var(--e1);
}
html[data-ui="v2"] .popover .cc-portee-lien > label:first-child{
  margin-top:var(--e2);font-weight:600;
}
html[data-ui="v2"] .popover label.cc-portee-choix em{
  font-style:normal;color:var(--ink-3);font-size:var(--t-xs);
}


/* ==========================================================================
   30. LA FLÈCHE DE RETOUR, ET LES DEUX LISTES DE RÉGLAGES — V8.49
   ========================================================================== */
/* Réduit à « ← », le lien de retour devient une cible de 8 px de large. On lui
   rend une zone de clic sans lui rendre un cadre : c'est toujours un lien
   dans un fil d'Ariane, pas un bouton. La règle `@media (hover:none)` du § 20
   lui donne déjà ses 40 px au doigt ; celle-ci vaut à la souris. */
html[data-ui="v2"] .cc-retour-fleche{
  padding:2px 6px;font-size:16px;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;
  min-width:24px;border-radius:var(--r);
}
html[data-ui="v2"] .cc-retour-fleche:hover{
  background:var(--sunk-2);color:var(--accent-fonce);text-decoration:none;
}

/* La barre d'outils du composeur : mêmes proportions que le reste de la v2,
   sans le rectangle sombre de la barre flottante. */
html[data-ui="v2"] .md-barre-fixe .fmt-btn{
  color:var(--ink-3);border-radius:var(--r);min-width:26px;padding:3px 6px;
}
html[data-ui="v2"] .md-barre-fixe .fmt-btn:hover{ background:var(--sunk-2);color:var(--ink) }
@media (hover:none){
  html[data-ui="v2"] .md-barre-fixe .fmt-btn{ min-width:34px;padding:7px 8px }
}

/* Les filtres au-dessus d'une liste de réglages (comptes, pages publiées).
   Discrets : ce sont des outils de lecture, pas des réglages de plus. */
html[data-ui="v2"] .cc-liste-filtre{
  display:flex;align-items:center;gap:var(--e2);flex-wrap:wrap;
  margin:var(--e2) 0 var(--e3);
}
html[data-ui="v2"] .cc-liste-filtre input[type="search"]{ flex:1 1 220px;max-width:320px }
/* ⚠ La v2 rend les `.btn` sans cadre tant qu'ils ne sont pas premiers d'une
   rangée (§ 5). Posé seul au milieu d'une carte, « voir plus » devenait donc
   une phrase grise cliquable, ce qu'il n'est pas. On lui redonne le cadre
   neutre : c'est bien un bouton, et c'est le seul de sa rangée. */
html[data-ui="v2"] .cc-liste-reste{
  display:block;margin:var(--e3) auto 0;
  border-color:var(--line);background:var(--card);color:var(--ink);
}
html[data-ui="v2"] .cc-liste-reste:hover{ border-color:var(--ink-3);background:var(--card) }


/* ==========================================================================
   31. LE PIED DE PILE « ↓ N DE PLUS » (⑤) — V8.50
   ========================================================================== */
/* Même remarque qu'au § 30 pour `.cc-liste-reste` : en v2 un `.btn` n'a de
   cadre que s'il ouvre une rangée. Au pied d'une colonne de kanban, sans
   cadre, « ↓ 275 de plus » se lisait comme une carte de plus — c'est-à-dire
   comme la chose qu'il sert justement à ne PAS afficher. */
/* `display:block` redit ici : la règle v1 (0,1,0) est battue par les règles
   de bouton de la surcouche, et le pied de pile redevenait un bouton
   `inline-flex` calé à gauche au lieu d'une barre sur toute la colonne. */
html[data-ui="v2"] .cc-plus-pile{
  display:block;width:100%;
  border:1px dashed var(--line);background:none;color:var(--ink-2);
  border-radius:var(--r);padding:5px 8px;font-size:var(--t-xs);
}
html[data-ui="v2"] .cc-plus-pile:hover{
  border-style:solid;border-color:var(--ink-3);background:var(--card);color:var(--ink);
}
html[data-ui="v2"] .cc-plus-pile[hidden]{ display:none }
@media (hover:none){
  html[data-ui="v2"] .cc-plus-pile{ padding:10px 8px }
}


/* ==========================================================================
   32. LE CORPS DES MODALES GÉNÉRIQUES — V8.51
   ========================================================================== */
/* app.css vient (enfin) d'habiller `.modal-corps > label` et ses champs. La v2
   les reprend à ses proportions, comme elle le fait déjà pour `.popover` au
   § 5 — sans quoi la même modale aurait deux typographies selon l'interface,
   ce qui est exactement le genre d'écart qui fait dire « c'est moche ». */
html[data-ui="v2"] .modal-corps > label:not(.case){
  font-size:var(--t-sm);font-weight:600;color:var(--ink);
  margin:var(--e4) 0 var(--e2);
}
html[data-ui="v2"] .modal-corps > label:not(.case):first-child{ margin-top:0 }
html[data-ui="v2"] .modal-corps > input[type="text"]:not(.copier-zone),
html[data-ui="v2"] .modal-corps > input[type="email"],
html[data-ui="v2"] .modal-corps > input[type="password"],
html[data-ui="v2"] .modal-corps > input[type="number"],
html[data-ui="v2"] .modal-corps > input[type="search"],
html[data-ui="v2"] .modal-corps > input[type="url"],
html[data-ui="v2"] .modal-corps > input[type="date"],
html[data-ui="v2"] .modal-corps > select,
html[data-ui="v2"] .modal-corps > textarea:not(.copier-zone){
  border-radius:var(--r);padding:9px 11px;font-size:var(--t-md);
  border-color:var(--line);background:var(--card);color:var(--ink);
}
html[data-ui="v2"] .modal-corps > input:focus,
html[data-ui="v2"] .modal-corps > select:focus,
html[data-ui="v2"] .modal-corps > textarea:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-pale);outline:none;
}


/* ==========================================================================
   33. LES RÉGLAGES DU COMPTE, ET LE TRAIT DU MENU (①) — V8.52
   ========================================================================== */
html[data-ui="v2"] .cc-compte-reglages > label{
  font-size:var(--t-sm);font-weight:600;color:var(--ink);margin:var(--e4) 0 var(--e2);
}
html[data-ui="v2"] .cc-compte-reglages > label:first-child{ margin-top:0 }
html[data-ui="v2"] .cc-compte-langue{
  margin-top:var(--e5);padding-top:var(--e4);border-top:1px solid var(--line-soft);
}
html[data-ui="v2"] .cc-compte-langue > label{
  display:block;font-size:var(--t-sm);font-weight:600;color:var(--ink);margin:0 0 var(--e2);
}
html[data-ui="v2"] .cc-compte-email{
  background:var(--sunk-2);border-radius:var(--r);padding:5px 9px;width:fit-content;
}
/* Le trait respire davantage en v2, où les entrées du menu sont plus hautes :
   sans cela il touchait l'entrée du dessus et se lisait comme sa soulignure. */
html[data-ui="v2"] .cc-menu-trait{ margin:var(--e3) 0 var(--e1) }
