/* docs/legal/console/console.css
 *
 * Les jetons sont ceux de la page d'accueil (docs/legal/index.html) — mêmes valeurs, au chiffre
 * près, et repris tels quels plutôt que réinventés : la console est une page du site, pas un
 * satellite. Le site ne fait AUCUN appel réseau tiers (c'est un argument écrit noir sur blanc sur
 * l'accueil) : la police est servie depuis ../assets/, comme partout ailleurs.
 *
 * LE SOMBRE EST LE DÉFAUT, ET IL VIT ICI, DANS LE CSS. Aucune règle de média n'interroge le
 * système : la page s'ouvre sombre pour tout le monde, et seul un choix explicite du visiteur —
 * mémorisé dans localStorage['iptelvza-theme'] par la page d'accueil, reposé par le script du
 * <head> — la fait passer en clair via :root[data-theme="light"]. Conséquence voulue : sans
 * JavaScript, la page reste sombre et entièrement lisible.
 */

/* ================================================================== */
/* Polices — fichiers locaux, aucun appel réseau tiers                 */
/* ================================================================== */
@font-face{
  font-family:'Schibsted Grotesk'; font-style:normal; font-weight:400 800; font-display:swap;
  src:url('../assets/schibsted-grotesk-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2212, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Schibsted Grotesk'; font-style:normal; font-weight:400 800; font-display:swap;
  src:url('../assets/schibsted-grotesk-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ================================================================== */
/* Jetons                                                              */
/* ================================================================== */
:root{
  /* color-scheme suit le thème, mais passe par une variable : ce bloc et son jumeau
     [data-theme="light"] ne contiennent ainsi QUE des redéfinitions de variables. */
  --scheme:dark; color-scheme:var(--scheme);
  --bg:#0B1220; --bg-2:#0E1728; --card:#111B2E;
  --line:#1E2A40; --line-2:#2A3A56;
  --ink:#EEF3FC; --ink-2:#D2DCEE; --muted:#93A1BD;
  --accent:#1F6BFF; --accent-ink:#7FAAFF;
  --accent-wash:rgba(31,107,255,.15); --accent-line:rgba(127,170,255,.34);
  /* Les trois jetons d'état n'existent pas sur l'accueil (qui n'a rien à signaler) : ils sont
     posés ici, et REPEINTS dans le bloc clair — sur fond blanc, #FF6B6B ne tient que 2,8:1,
     très en dessous des 4,5:1 qu'un texte doit atteindre. */
  --danger:#FF6B6B; --ok:#4CD07D; --warn:#FFC46B;
  --danger-wash:rgba(255,107,107,.10);
  --radius:18px; --pad:clamp(20px,5vw,40px);
}
:root[data-theme="light"]{
  --scheme:light;
  --bg:#FFFFFF; --bg-2:#F3F6FC; --card:#FFFFFF;
  --line:#E6EBF3; --line-2:#D5DEEE;
  --ink:#0C1626; --ink-2:#1B2942; --muted:#465771;
  --accent-ink:#1857D6;
  --accent-wash:rgba(31,107,255,.07); --accent-line:rgba(31,107,255,.28);
  --danger:#C0392B; --ok:#1B7F4B; --warn:#8A5A00;
  --danger-wash:rgba(192,57,43,.08);
}

/* ================================================================== */
/* Base                                                                */
/* ================================================================== */
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;background:var(--bg)}
body{
  margin:0; background:var(--bg); color:var(--ink);
  font:16px/1.6 'Schibsted Grotesk',-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
}
/* Aucune largeur fixe nulle part : une seule colonne qui se serre. Le remplissage latéral est le
   même jeton que l'accueil, et la marge basse laisse respirer le pied de page sur téléphone. */
.enveloppe{max-width:720px;margin:0 auto;padding:var(--pad) var(--pad) 96px}

header.tete{display:flex;align-items:center;gap:12px;padding:16px 0 28px;flex-wrap:wrap}
header.tete img{width:36px;height:36px;border-radius:9px}
header.tete .langue{margin-left:auto;color:var(--muted);font-size:.92rem}
header.tete .langue a{color:var(--accent-ink)}

h1{font-size:clamp(1.5rem,4.5vw,2rem);line-height:1.2;margin:0 0 6px}
.sous{color:var(--muted);margin:0 0 28px}
section{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:clamp(16px,4vw,28px);margin:0 0 20px}
section .sous{margin-bottom:0}
/* ★ SAUF À LA CONFIRMATION, où jusqu'à quatre paragraphes s'empilent : l'empreinte, son aide,
   l'aperçu de ce que l'appareil affichera faute de mot libre (D6), puis l'échéance. Collés,
   ils se lisent comme un seul pavé — mesuré au navigateur, et c'est l'écran où l'on demande
   justement de VÉRIFIER. */
#etape-confirmation p{margin:0 0 14px}
h2{font-size:1.15rem;margin:0 0 14px}

/* ================================================================== */
/* Formulaires — 44px partout, c'est la cible tactile minimale         */
/* ================================================================== */
label{display:block;font-size:.92rem;color:var(--ink-2);margin:14px 0 6px}
input,select,textarea{
  width:100%;min-height:44px;padding:11px 13px;border-radius:12px;
  border:1px solid var(--line-2);background:var(--bg-2);color:var(--ink);
  font:inherit;font-size:16px; /* 16px : en dessous, iOS zoome le champ au focus */
}
textarea{min-height:96px;resize:vertical}
input:focus-visible,select:focus-visible,textarea:focus-visible,button:focus-visible,summary:focus-visible,a:focus-visible{
  outline:3px solid var(--accent-line);outline-offset:2px}
button{
  min-height:44px;padding:12px 20px;border-radius:12px;border:1px solid transparent;
  background:var(--accent);color:#fff;font:inherit;font-weight:600;cursor:pointer}
button.secondaire{background:transparent;border-color:var(--line-2);color:var(--ink)}
button[disabled]{opacity:.45;cursor:not-allowed}
.boutons{display:flex;gap:12px;flex-wrap:wrap;margin-top:20px}
.boutons button{flex:1 1 180px}

/* ================================================================== */
/* Appareils, empreintes, états                                        */
/* ================================================================== */
.appareil{display:flex;gap:14px;align-items:flex-start;padding:14px;border:1px solid var(--line);
  border-radius:14px;margin:10px 0;background:var(--bg-2)}
.appareil .corps{flex:1;min-width:0}
.appareil .nom{font-weight:600;word-break:break-word}
.appareil .etat{font-size:.88rem;color:var(--muted)}
details.empreinte{margin-top:8px}
/* ★ 44 px, pas 24. Mesuré au navigateur : la ligne de dépliage faisait 24 px de haut — sous la
   cible tactile minimale que le propriétaire impose partout ailleurs. Le remplissage vertical fait
   partie de la boîte du <summary> : il agrandit la CIBLE, pas seulement le vide autour. On évite
   `display:flex` ici, qui ferait disparaître le triangle de dépliage sous Chrome — et avec lui le seul
   signe que cette ligne s'ouvre. */
details.empreinte summary{cursor:pointer;color:var(--accent-ink);font-size:.9rem;
  min-height:44px;padding:12px 0}
details.empreinte code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em}
/* ★ Les trois gestes d'une carte tiennent sur une ligne tant que la place le permet. Mesuré au
   navigateur sans cette règle : le troisième — le RETRAIT, le seul irréversible — s'étalait seul
   sur toute la largeur et devenait le bouton le plus voyant de la carte. Sous 480 px, la règle
   générale reprend la main et les empile pleine largeur, ce qui est juste au doigt. */
.appareil .boutons{margin-top:14px}
.appareil .boutons button{flex:0 1 auto}

/* ================================================================== */
/* « Régler aussi l'application » (D16)                                */
/* ================================================================== */
/* ★ REPLIÉ PAR DÉFAUT, ET C'EST VOULU : c'est un complément, pas une étape. Déplié d'office, il
   doublerait la hauteur d'un formulaire déjà long et laisserait croire qu'il faut répondre à cinq
   questions de plus pour envoyer une source.
   ★ 44 px sur le <summary>, la même règle que l'empreinte, pour la même raison mesurée : sans le
   remplissage vertical, la ligne de dépliage fait 24 px — sous la cible tactile minimale. Pas de
   `display:flex` ici non plus : sous Chrome il escamote le triangle, seul signe que ça s'ouvre. */
#bloc-reglages{margin:18px 0 0;border:1px solid var(--line);border-radius:12px;
  padding:0 clamp(12px,3vw,16px);background:var(--bg-2)}
#bloc-reglages summary{cursor:pointer;color:var(--accent-ink);font-size:.95rem;
  min-height:44px;padding:12px 0}
/* La phrase d'aide dit que la source est facultative : elle ne doit pas coller au premier libellé. */
#bloc-reglages .sous{margin:0 0 4px;font-size:.88rem}
#liste-reglages{padding-bottom:8px}

/* ★ VINGT-HUIT RÉGLAGES : CE QUI REND LE BLOC LISIBLE, ET POURQUOI CHAQUE RÈGLE EXISTE.
   · le champ de recherche garde son ÉTIQUETTE VISIBLE (règle de la console : jamais un
     `placeholder` en guise d'étiquette — il s'efface à la première touche) ;
   · `position:sticky` sur le couple étiquette + champ : à vingt-huit réglages, on défile, et un
     champ de recherche qui sort de l'écran oblige à remonter pour affiner. Le fond est opaque,
     sinon les rangées défileraient VISIBLEMENT derrière lui ;
   · les sections reprennent les groupes de l'écran Réglages de l'app (Lecture, Sous-titres et
     audio, …) : c'est ce qui permet à l'aidant de dire « c'est dans Avancé » au téléphone et que
     la personne le retrouve. */
/* ★ LE COUPLE ÉTIQUETTE + CHAMP COLLE D'UN SEUL BLOC, ET LE BLOC EST OPAQUE. Deux `sticky`
   séparés (étiquette à `top:0`, champ à `top:2.1rem`) ont été essayés et REGARDÉS : entre les
   deux subsistait une bande transparente de quelques pixels où les rangées défilaient
   visiblement — et, sur les côtés, le rembourrage du `<details>` laissait passer la même chose.
   D'où le conteneur unique, et les marges négatives qui vont chercher les deux gouttières. */
/* ★ ET IL PORTE UN FILET. Sans lui, la première ligne de description passait SOUS le champ en
   étant coupée en deux dans la hauteur — regardé au navigateur : ça ne se lit pas comme « le
   contenu défile dessous », ça se lit comme un rendu cassé. Le filet dit où s'arrête l'en-tête. */
.recherche-reglages{position:sticky;top:0;z-index:2;background:var(--bg-2);
  padding:10px clamp(12px,3vw,16px) 10px;
  margin:0 calc(-1 * clamp(12px,3vw,16px)) 0;
  border-bottom:1px solid var(--line)}
.recherche-reglages label{margin-bottom:2px}
.recherche-reglages input{margin-bottom:0}
/* La phrase du plafond tient sur quatre lignes au téléphone (mesuré, 390 px) : sans cette
   marge basse elle colle au premier titre de section. */
.compteur-reglages{margin:0 0 12px;font-variant-numeric:tabular-nums}

/* Le titre de section : plus discret qu'un `h3` de la page, mais franchement détaché de la rangée
   qui le précède — c'est la séparation qui fait lire une liste comme un sommaire. */
.groupe-reglages h4{margin:18px 0 2px;font-size:.82rem;text-transform:uppercase;
  letter-spacing:.06em;color:var(--accent-ink);border-top:1px solid var(--line);padding-top:14px}
.groupe-reglages:first-child h4{margin-top:4px;border-top:0;padding-top:0}

/* La description vit ENTRE l'étiquette et le champ : c'est là qu'on la lit avant de choisir, et
   pas après. Collée à l'étiquette, détachée du `<select>`. */
.reglage{margin-bottom:14px}
.reglage label{margin-bottom:2px}
.aide-reglage{margin:0 0 6px;font-size:.84rem;opacity:.85}
/* Un `<select>` éteint (plafond atteint) doit se VOIR éteint : sans ça, on clique et rien ne se
   passe, ce qui se lit comme une panne. */
.reglage select:disabled{opacity:.45;cursor:not-allowed}
#aucun-reglage{margin:4px 0 16px}

/* ================================================================== */
/* « Vos listes »                                                      */
/* ================================================================== */
/* Une carte de liste est une carte d'appareil : même boîte, même respiration. Ce qu'elle ajoute,
   c'est un interrupteur et un <select> — donc deux réglages de formulaire DANS une carte, là où le
   reste de la page les met dans un formulaire pleine largeur. */
/* ★ LA RÈGLE GÉNÉRALE `input{width:100%;min-height:44px}` EST FAITE POUR DES CHAMPS DE SAISIE : une
   case à cocher étirée sur toute la largeur de la carte devient une barre grise que personne ne
   reconnaît. On la ramène à sa taille, et c'est la LIGNE ENTIÈRE — case + libellé — qui porte les
   44 px de cible tactile, ce qui est plus facile à viser au doigt que la case seule. */
.liste .interrupteur{display:flex;align-items:center;gap:10px;min-height:44px;margin-top:10px}
.liste .interrupteur input[type="checkbox"]{
  width:22px;height:22px;min-height:22px;padding:0;margin:0;flex:0 0 auto;accent-color:var(--accent)}
.liste .interrupteur label{margin:0;font-size:.92rem;cursor:pointer}
/* Le libellé du <select> d'intervalle : la marge haute du `label` général suffit, la basse non —
   collé à son <select>, le couple se lit comme un seul bloc. */
.liste select{margin-top:2px}

/* ★ Retirer un appareil est IRRÉVERSIBLE et emporte ses propositions en attente : ce bouton ne peut
   pas ressembler trait pour trait à « Renommer », qui ne coûte rien. Teinte et bordure, jamais un
   aplat rouge — on distingue, on n'effraie pas. */
button.danger{color:var(--danger);border-color:var(--danger)}

/* ★ 12px, PAS 999px — et ce n'est pas un détail de goût. Sur une puce d'une seule ligne (haute de
   ~27px), `999px` se ramène de toute façon à ~13px : les deux rendus sont indiscernables. Mais ces
   puces portent des PHRASES, pas des étiquettes — « L'appareil n'a pas pu déchiffrer — il a sans
   doute été restauré depuis une sauvegarde. Préparez-en une nouvelle. » tient sur trois lignes au
   téléphone. Mesuré au navigateur : en `999px`, cette boîte de trois lignes devenait un losange aux
   deux bouts énormes, l'élément le plus laid et le moins lisible de la page. */
.puce{display:inline-block;padding:3px 10px;border-radius:12px;font-size:.82rem;border:1px solid var(--line-2)}
/* ★ LES DEUX PUCES D'UNE PROPOSITION — l'état, et le verdict rendu par l'appareil — vivent dans un
   conteneur flex, pas derrière deux `margin-left` posés en ligne depuis le JavaScript. Deux raisons,
   toutes deux mesurées au navigateur : sur un téléphone ces phrases passent à la ligne, et sans
   `gap` la seconde ligne venait coller la première ; et une règle inline dans app.js est une règle
   que personne ne retrouve le jour où elle gêne. */
.appareil .puces{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0}
.puce.attente{color:var(--warn);border-color:var(--warn)}
.puce.ok{color:var(--ok);border-color:var(--ok)}
.puce.refus{color:var(--danger);border-color:var(--danger)}
.puce.neutre{color:var(--muted)}

.alerte{border-left:3px solid var(--danger);background:var(--danger-wash);
  padding:12px 16px;border-radius:10px;margin:14px 0;color:var(--ink)}
.alerte a{color:var(--accent-ink)}
.info{border-left:3px solid var(--accent);background:var(--accent-wash);
  padding:12px 16px;border-radius:10px;margin:14px 0}
/* Le lien de la marche à suivre (D5) est la seule action d'un compte sans appareil : c'est une
   CIBLE, pas une note de bas de page. Mesuré : 20 px de haut sans cette règle. */
.info a{display:inline-flex;align-items:center;min-height:44px;color:var(--accent-ink)}
.compteur{text-align:right;font-size:.85rem;color:var(--muted)}

footer{color:var(--muted);font-size:.9rem;border-top:1px solid var(--line);padding-top:18px;margin-top:32px}
footer a{color:var(--accent-ink)}

/* ================================================================== */
/* Rien ne sort jamais de l'écran                                      */
/* ================================================================== */
/* Le contenu que le JavaScript écrira (nom d'appareil choisi par son propriétaire, empreinte,
   adresse de serveur) n'a aucune longueur garantie. On ne pose PAS overflow-x:hidden sur le corps
   — posé là, il se propage à la fenêtre et `documentElement.scrollWidth` reste collé à
   `innerWidth` : le contrôle anti-débordement ne mesurerait plus rien. On casse donc les mots
   là où ils arrivent, ce qui règle la cause au lieu de la cacher. */
h1,h2,p,li,label,.appareil,.alerte,.info,#empreinte-confirmation,#liste-propositions,#liste-appareils{
  overflow-wrap:anywhere}
code{overflow-wrap:anywhere}
img{max-width:100%;height:auto}

/* app.js montre et masque les étapes avec l'attribut `hidden`, jamais avec style.display :
   l'attribut reste lisible dans le HTML livré, et cette règle le rend plus fort qu'un
   display: flex ou grid qui viendrait d'ailleurs. */
[hidden]{display:none !important}

@media (max-width:480px){ .boutons button, .appareil .boutons button{flex:1 1 100%} }
/* ★ ET SAUF LES QUATRE GESTES D'UNE LISTE. La règle ci-dessus est juste pour les TROIS gestes d'une
   carte d'appareil ; à quatre, et surtout à quatre dont un irréversible, elle se retourne. Mesuré au
   navigateur (390px) : empilés pleine largeur, les quatre boutons font 282px de large chacun et la
   carte 479px de haut — « Supprimer » devient aussi grand et aussi invitant que « Monter », alors
   qu'il retire une source de TOUS les appareils. C'est le défaut déjà nommé juste au-dessus pour le
   retrait d'une proposition. En largeur naturelle, les quatre tiennent sur deux rangs (96+124 puis
   124+122), la cible reste à 52px de haut, et le rouge redevient un bouton parmi d'autres. */
@media (max-width:480px){ #liste-listes .boutons button{flex:0 1 auto} }
/* ★ SAUF LE RETRAIT D'UNE PROPOSITION, qui est SEUL sur sa ligne. La règle ci-dessus est juste pour
   les trois gestes d'une carte d'appareil — empilés pleine largeur, ils restent lisibles au doigt.
   Un bouton unique étalé sur toute la largeur, lui, devient l'élément le plus voyant de la ligne :
   plus voyant que ce qui est proposé et que son état, c'est-à-dire que ce qu'on vient lire. Mesuré
   au navigateur (390px) : 286px de large contre 95px ici, et la cible reste à 52px de haut. */
@media (max-width:480px){ #liste-propositions .boutons button{flex:0 1 auto} }

/* ------------------------------------------------------------------ *
 * Bascule de thème                                                     *
 *                                                                      *
 * Elle n'existe que si le script du <head> a tourné (`.js-theme`) —    *
 * même règle que la page d'accueil : jamais de bouton qui ne ferait    *
 * rien. Sans JavaScript la page reste sombre, et entièrement lisible.  *
 *                                                                      *
 * ★ POURQUOI ELLE EXISTE ICI. La console hérite du thème choisi sur    *
 * l'accueil, mais qui arrive directement sur /console/ depuis l'app    *
 * n'est jamais passé par l'accueil : sans ce bouton, il n'a aucun      *
 * moyen d'aller au clair. Une préférence qu'on ne peut pas exprimer    *
 * n'en est pas une.                                                    *
 * ------------------------------------------------------------------ */
.tsw{display:none}
.js-theme .tsw{
  display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; margin-left:auto;      /* cible tactile, comme le reste */
  border:1px solid var(--line); border-radius:12px;
  background:transparent; color:var(--muted); cursor:pointer;
  font-size:1.05rem; line-height:1;
  -webkit-tap-highlight-color:transparent;
}
.js-theme .tsw:hover{color:var(--ink); border-color:var(--accent)}
.js-theme .tsw:focus-visible{outline:2px solid var(--accent); outline-offset:2px}
/* La langue reprend la main sur la marge automatique : le bouton se pose entre
   la marque et le lien de langue, pas à la place de celui-ci. */
.js-theme .tete .langue{margin-left:10px}
