/* Les dialogues : le voile, la boîte, ses champs, ses onglets et ses sections. */

/* ============================================================
   LES DIALOGUES — connexion, comptes, mot de passe
   ============================================================ */
/* AU-DESSUS DU TIROIR. Sous 1000 px, le menu sort en tiroir à z-index 200 :
   ouvrir « Préférences » depuis ce tiroir posait le panneau DERRIÈRE lui, et
   on ne voyait plus que la croix de fermeture dépasser sur le côté. Un
   dialogue est ce qu'on vient d'ouvrir — il passe devant tout. */
.dlg-back { position: fixed; inset: 0; z-index: 500; display: flex;
  align-items: center; justify-content: center;
  padding: 20px 20px calc(20px + env(safe-area-inset-bottom));
  background: rgba(0, 0, 0, .55); backdrop-filter: blur(2px); }
/* Une boîte de saisie — se connecter, renommer — reste étroite : un champ de
   1 100 px de large ne se remplit pas mieux. */
.dlg { position: relative; width: min(560px, 100%); max-height: 92vh; max-height: 92dvh;
  overflow: auto;
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 22px 24px 24px; box-shadow: 0 18px 50px rgba(0, 0, 0, .45); }
/* Un PANNEAU — préférences, administration, droits — prend la place qu'il a.
   À 560 px sur un écran de 1 600, la table des pages sortait du cadre et ses
   boutons de ligne étaient coupés à droite : on ne pouvait pas renommer une
   page sans faire défiler un tableau à l'intérieur d'une boîte. */
.dlg-wide { width: min(1180px, 96vw); }
.dlg h3 { margin: 0 0 14px; }
/* Un titre qui SUIT quelque chose reprend de l'air au-dessus : collé au
   paragraphe précédent, il se lisait comme sa dernière ligne. */
.dlg h4:not(:first-child) { margin-top: 10px; }
.dlg h4 { margin: 0 0 2px; font-size: var(--fs-ui); color: var(--fg3);
  text-transform: uppercase; letter-spacing: .08em; }
/* LE SEUL GESTE QUI REFERME, ET IL FAISAIT 13 × 22 PX. Mesuré le 9 septembre
   2026 : ni fond ni filet, une croix de texte de treize pixels de large au coin
   d'un panneau plein écran sur téléphone. Un bouton, comme les autres. */
.dlg-x { position: absolute; top: 10px; right: 12px;
  background: var(--bg3); border: 1px solid var(--line); border-radius: 9px;
  width: 48px; height: 48px; color: var(--fg2); font-size: 1.375rem; line-height: 1;
  cursor: pointer; }
.dlg-x:hover { color: var(--fg); border-color: var(--blue); }
/* Le titre laisse la place de la croix — en marge, pour que son trait s'arrête avant elle au lieu de passer dessous. */
.dlg-x + h3 { margin-right: 54px; min-height: 44px; box-sizing: border-box; }
/* LA FLÈCHE DE RETOUR, quand la boîte en a remplacé une autre (UI.md, règle 20) :
   même cible de 48 px que la croix, à l'autre bord, et le titre lui cède la place. */
.dlg-prev { position: absolute; top: 10px; left: 12px;
  background: var(--bg3); border: 1px solid var(--line); border-radius: 9px;
  width: 48px; height: 48px; color: var(--fg2); font-size: 1.75rem; line-height: 1;
  cursor: pointer; }
.dlg-prev:hover { color: var(--fg); border-color: var(--blue); }
.dlg-prev ~ h3 { margin-left: 54px; }
.dlg-body { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.dlg-field { display: flex; flex-direction: column; gap: 4px;
  font-size: var(--fs-floor); color: var(--fg3); text-transform: uppercase; letter-spacing: .04em; }
.dlg-field input, .dlg-body select {
  background: var(--bg3); color: var(--fg); border: 1px solid var(--line);
  border-radius: 8px; padding: 9px 11px; font: inherit; font-size: var(--fs-ui);
  text-transform: none; letter-spacing: normal; }
.dlg-field input:focus, .dlg-body select:focus { outline: none; border-color: var(--blue); }
/* MARGES À ZÉRO : c'est un <p>, donc 1 em au-dessus ET en dessous par défaut,
   qui s'ajoutaient à l'écart de la section — deux lignes d'aide écartaient un
   dialogue de 60 px pour rien (20 septembre 2026). */
.dlg-help { font-size: var(--fs-ui); color: var(--fg2); line-height: 1.6; margin: 0; }
.dlg-error { color: var(--red); font-size: var(--fs-ui); min-height: 1.2em; }
/* UN AVERTISSEMENT N'EST PAS UN REFUS. Le rouge de « .dlg-error » dit qu'un
   geste vient d'échouer ; celui-ci dit qu'une installation est perfectible, et
   il est là à l'ouverture du panneau. Un encadré, pour qu'il ne se lise pas
   comme un paragraphe d'aide de plus — c'est la seule ligne du panneau qui
   parle d'un trou. */
.dlg-warn { font-size: var(--fs-ui); line-height: 1.55; color: var(--fg);
  background: var(--bg3); border: 1px solid var(--line); border-left: 3px solid var(--red);
  border-radius: 8px; padding: 10px 12px; margin: 0 0 14px; }
.dlg .tw { margin: 0; }
/* Un tableau de valeurs COURTES se centre — ce n'est pas de la prose. Les
   tableaux de chemins, eux, restent à gauche : un chemin se lit au début. */
.dlg .tw-mid th, .dlg .tw-mid td { text-align: center; vertical-align: middle; }
.dlg .tw-mid .row-actions { justify-content: center; }
.dlg .tw-mid td.row-actions { text-align: center; }

/* ---- ce qui a changé entre deux versions ----
   Lister et restaurer sans montrer la différence oblige à restaurer pour
   savoir ce qu'on restaure. */
.diff { margin: 18px 0; border: 1px solid var(--line); border-radius: var(--radius);
  overflow: auto; font-family: var(--mono); font-size: var(--fs-floor); line-height: 1.6; }
.diff-l { padding: 1px 12px; white-space: pre-wrap; word-break: break-word; }
.diff-l.more { background: color-mix(in srgb, var(--green) 16%, transparent); }
.diff-l.less { background: color-mix(in srgb, var(--red) 16%, transparent); }
.diff-l.gap { background: var(--bg3); color: var(--fg3); font-size: var(--fs-floor);
  padding: 4px 12px; }

/* ============================================================
   LES DIALOGUES À ONGLETS
   Les réglages tenaient dans une bande affichée en permanence. Découpés en
   sections, chaque écran est court — donc lu — et l'onglet dit où chercher la
   prochaine fois.
   ============================================================ */
/* PASSÉS À LA LIGNE, JAMAIS GLISSÉS (UI.md, règle 46) : à 390 px, « 💾 Mes
   données » sortait du cadre et rien ne disait qu'il existait. */
.dlg-tabs {
  display: flex; flex-wrap: wrap; gap: 6px;
  border-bottom: 1px solid var(--line); margin: 0 0 16px; padding: 0 0 8px;
}
/* MÊME REPROCHE QUE LES ONGLETS D'UN CHAPITRE, MÊME REMÈDE. « 📖 Lecture » et
   « 💾 Mes données » n'avaient ni fond ni filet — mesurés le 9 septembre 2026
   à « transparent » et quatre bordures à 0 : seul l'onglet choisi se voyait, et
   on ne savait pas que les deux autres s'ouvraient. */
.dlg-tab {
  flex: 1 1 auto; background: var(--bg2); border: 1px solid var(--line);
  border-radius: 9px; color: var(--fg2);
  font: inherit; font-size: var(--fs-ui); padding: 9px 14px; min-height: 48px;
  cursor: pointer; white-space: nowrap;
}
.dlg-tab:hover { color: var(--fg); border-color: var(--blue); }
.dlg-tab.active { color: var(--bg); background: var(--blue); border-color: var(--blue); font-weight: 600; }

/* ---- le panneau d'un onglet : des SECTIONS, pas une file ----
   Chaque `section()` est un bloc. Sur un écran large, deux tiennent côte à
   côte : le panneau des préférences descendait sur trois écrans de haut alors
   que les deux tiers de la largeur restaient vides. Une section qui porte un
   TABLEAU reprend toute la largeur — la couper en deux ne rendrait service à
   personne. */
.dlg-panel { display: grid; grid-template-columns: 1fr; gap: 4px 34px;
  align-items: start; }
/* Le cadre d'un onglet : il ne se voit pas, ses sections restent les cases de
   la grille — sans quoi le panneau n'aurait plus qu'un seul enfant. La réserve
   d'une section qui se remplit plus tard (`dlg-slot`) obéit à la même règle,
   et pour la même raison. */
.dlg-tabbed, .dlg-slot { display: contents; }
/* L'avertissement traverse, et le verdict de la sonde avec lui : posés sur le
   panneau lui-même, ils en sont des cases — seuls dans leur colonne, ils
   laissaient l'autre vide. */
/* EN DESCENDANT, ET NON EN ENFANT DIRECT : le contenu d'un onglet vit dans un
   `.dlg-tabbed` (lui-même en `display:contents`), donc rien n'est jamais
   l'enfant direct du panneau. La règle ne visait que les sections, et le
   verdict de la porte restait coincé dans une colonne. */
.dlg-panel .dlg-warn, .dlg-panel .wide { grid-column: 1 / -1; }
@media (min-width: 860px) {
  .dlg-wide .dlg-panel { grid-template-columns: 1fr 1fr; }
  .dlg-wide .dlg-panel .dlg-sec:has(.tw),
  .dlg-wide .dlg-panel .dlg-sec:has(.perm-row),
  .dlg-wide .dlg-panel .dlg-sec:has(.group) { grid-column: 1 / -1; }
}
/* Le rythme de « Où j'en suis », le plus lisible des écrans : 6 px entre deux
   éléments, et une section qui ne prend pas 32 px de vide autour d'elle. */
.dlg-sec { display: flex; flex-direction: column; align-items: flex-start;
  gap: 6px; padding: 10px 0 12px; min-width: 0; }
/* UN BOUTON QUI SUIT UN CHAMP PREND DE L'AIR : collé à 6 px sous « Nom du
   groupe », « Créer » se lisait comme une partie du champ. */
.dlg .dlg-field + .btn,
.dlg .dlg-field + .dlg-error + .btn { margin-top: 10px; }
.dlg-sec > .tw { align-self: stretch; }
.dlg-sec > .dlg-field, .dlg-sec > .toolbar { align-self: stretch; }
/* La barre d'actions d'une section n'est pas la barre collante d'une page :
   elle ne colle à rien et ne pose pas de trait. */
.dlg-sec > .toolbar { position: static; background: none; backdrop-filter: none;
  border: none; padding: 0; margin: 0; }
.dlg-error:empty { min-height: 0; }

.dlg-choice { margin: 0; width: 100%; }
.dlg-choice select { width: 100%; max-width: 360px; }

.dlg-size { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dlg-size-v { font-family: var(--mono); font-size: var(--fs-floor); color: var(--fg3);
  min-width: 4.2em; text-align: right; }
/* UN CURSEUR, peint à la main dans les deux moteurs.
   Le rendu natif prend l'accent du système, pas celui du thème : sur « forêt »
   ou « contraste », un curseur bleu de Windows au milieu d'une palette verte
   est la seule chose de la page qui n'obéisse à rien. `accent-color` ne suffit
   pas — il ne touche ni la hauteur de la piste ni la taille de la poignée, et
   la poignée native fait 20 px sur Firefox, 12 sur Chrome. */
/* `flex-basis` court À DESSEIN : le panneau range ses sections en DEUX
   colonnes dès qu'il a la place, et chacune ne fait alors que 235 px. Avec
   150 px de base, le curseur et sa valeur les remplissaient à eux seuls et le
   bouton « ↩️ » passait à la ligne. */
.dlg-range { flex: 1 1 90px; min-width: 84px; height: 22px; margin: 0;
  background: none; -webkit-appearance: none; appearance: none; cursor: pointer; }
.dlg-range:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px;
  border-radius: 4px; }
.dlg-range::-webkit-slider-runnable-track { height: 4px; border-radius: 3px;
  background: var(--line); }
.dlg-range::-moz-range-track { height: 4px; border-radius: 3px; background: var(--line); }
.dlg-range::-webkit-slider-thumb { -webkit-appearance: none; appearance: none;
  width: 15px; height: 15px; margin-top: -5.5px; border-radius: 50%;
  background: var(--blue); border: 2px solid var(--bg2); transition: .15s; }
.dlg-range::-moz-range-thumb { width: 15px; height: 15px; border-radius: 50%;
  background: var(--blue); border: 2px solid var(--bg2); }
.dlg-range:hover::-webkit-slider-thumb { transform: scale(1.15); }
.dlg-check { display: flex; align-items: center; gap: 8px; font-size: var(--fs-ui);
  color: var(--fg2); cursor: pointer; }
.dlg .mono { font-family: var(--mono); font-size: var(--fs-floor); }
/* MÊME ÉCART QUE LA COLONNE DU MENU « ⋯ » (7 px) : à 5 px, les trois icônes
   d'une ligne se lisaient comme un seul bloc, et la destructive n'était pas
   plus détachée que les deux autres — mesuré le 19 septembre 2026. */
.dlg .row-actions { display: flex; gap: 7px; white-space: nowrap; }
.dlg .row-actions .danger { margin-left: 5px; }
/* SAUF QUAND C'EST UNE CELLULE : un `<td>` en `display:flex` n'est plus une
   case de tableau. Il cesse de prendre la hauteur de sa rangée, et son filet
   du bas se dessinait cinquante pixels plus haut que celui des trois autres
   colonnes — la ligne en escalier de la liste des comptes (21 septembre 2026).
   La cellule redevient une cellule, et c'est son CONTENU qui s'aligne. */
.dlg td.row-actions { display: table-cell; }
.dlg td.row-actions > * { vertical-align: middle; }

/* L'EMOJI D'UN BOUTON SANS TEXTE, à sa propre taille.
   Le nom de la classe évite « btn » à dessein : l'invariant qui garde une
   seule échelle de boutons refuse toute règle de taille sur un sélecteur qui
   le contient, et il a raison — c'est le bouton qui ne doit pas bouger, pas
   son glyphe. */
.act-em { font-size: 1.45em; line-height: 1; display: block; }

/* ---- le menu d'une entrée du plan ----
   Une colonne de boutons pleine largeur : au doigt, une cible pleine largeur
   vaut mieux qu'une rangée serrée, et la boîte est étroite de toute façon.
   La TAILLE reste celle de l'échelle — un invariant refuse qu'une feuille en
   redéfinisse une septième, et c'est exactement d'ici que venaient les
   précédentes. */
.dlg-actions { display: flex; flex-direction: column; gap: 7px; margin-top: 4px; }
.dlg-actions .btn { width: 100%; text-align: left; }
.dlg-manage .dlg-help.mono { overflow-wrap: anywhere; }

/* ---- LA PALETTE DE RECHERCHE : un champ, une liste, rien d'autre ----
   La ligne CHOISIE se voit sans comparer — au clavier comme à la souris, c'est
   la seule chose qui dise ce qu'Entrée va ouvrir. */
.find-q { width: 100%; background: var(--bg3); color: var(--fg);
  border: 1px solid var(--line); border-radius: 9px; padding: 11px 13px;
  font: inherit; font-size: var(--fs-ui); min-height: 48px; }
.find-q:focus { outline: none; border-color: var(--blue); }
.find-list { display: flex; flex-direction: column; gap: 5px;
  max-height: 52vh; max-height: 52dvh; overflow: auto; }
.find-group { font-size: var(--fs-floor); color: var(--fg3);
  text-transform: uppercase; letter-spacing: .08em; margin: 10px 0 2px; }
/* `flex: 0 0 auto` et non `min-height` seul : dans une colonne flex, une ligne
   se laisse COMPRIMER à ses 48 px et son extrait se coupe au milieu. */
.find-row { display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  flex: 0 0 auto;
  width: 100%; min-height: 48px; padding: 7px 12px; text-align: left;
  background: var(--bg3); border: 1px solid var(--line); border-radius: 9px;
  color: var(--fg); font: inherit; font-size: var(--fs-ui); cursor: pointer; }
.find-row.on { border-color: var(--blue);
  background: color-mix(in srgb, var(--blue) 18%, var(--bg3)); }
.find-t { font-weight: 600; }
/* La deuxième ligne d'une cible tactile — le wiki, ou l'extrait trouvé —, pas
   du texte à lire : elle tient sur une ligne et se coupe. */
.find-sub { font-size: var(--fs-floor); color: var(--fg3); max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.find-hint, .find-none { margin: 0; }

/* Au doigt : ce qu'on vise dans un dialogue fait 48 px. */
@media (max-width: 1000px), (pointer: coarse) {
  .dlg .row-actions .btn { min-width: 48px; }
  .dlg-field input, .dlg-body select { min-height: 48px; }
  .dlg-body input[type="range"] { height: 48px; }
  /* L'étiquette EST la cible — cliquer le texte coche la case — mais elle ne
     faisait que la hauteur de sa ligne, case de 13 px comprise. */
  .dlg-check { min-height: 48px; }
  .dlg-check input[type="checkbox"] { width: 24px; height: 24px; flex: none; }
}

/* ═══════════ AU TÉLÉPHONE : LA BOÎTE PREND MOINS DE BORD ═══════════
   Le voile réserve déjà 20 px tout autour ; 24 px de rembourrage en plus
   laissaient 44 px de vide de chaque côté d'un écran de 390. Les champs, les
   cases et la croix gardent leurs 48 px (bloc ci-dessus). */
@media (max-width: 1000px), (pointer: coarse) {
  .dlg-back { padding: 12px 12px calc(12px + env(safe-area-inset-bottom)); }
  .dlg { padding: 18px 16px 18px; }
  .dlg h3 { margin-bottom: 10px; }
  .dlg h4:not(:first-child) { margin-top: 8px; }
  .dlg-body { gap: 8px; }
  .dlg-sec { padding: 7px 0 8px; }
  .dlg-panel { gap: 2px 34px; }
}
