/* Automatismes — feuille de style unique.
   Lisible de loin (vidéoprojecteur) comme de près (tablette, téléphone). */

:root {
  --fond: #f7f7f5;
  --carte: #ffffff;
  --texte: #1b1b1a;
  --texte-doux: #62615d;
  --trait: #dedcd6;
  --accent: #2b5f8f;
  --accent-clair: #e8f0f7;
  --sur-accent: #ffffff;      /* texte posé sur un aplat d'accent */
  --juste: #1d7a4d;
  --juste-fond: #e6f4ec;
  --faux: #b3341f;
  --faux-fond: #fbeae7;
  --filet: rgba(0, 0, 0, 0.12);
  --rayon: 12px;
}

/* --- mode sombre ------------------------------------------------------
   Appliqué par theme.js via l'attribut data-theme sur <html>, avant le
   premier rendu, pour éviter tout clignotement au chargement.

   L'accent passe du bleu au violet : sur un fond sombre, un violet clair
   garde un bon contraste là où le bleu d'origine deviendrait terne.
   Le texte posé SUR l'accent passe au sombre, sinon le bouton principal
   serait illisible (clair sur clair).
   --------------------------------------------------------------------- */

:root[data-theme="sombre"] {
  /* Gris neutres, sans teinte colorée : le violet est réservé aux éléments
     qui étaient bleus en mode clair (boutons, accents, figures).
     Volontairement plus clairs que du noir — un fond quasi noir fatigue et
     écrase le relief entre le fond et les cartes. */
  --fond: #262626;
  --carte: #303030;
  --texte: #f0f0f0;
  --texte-doux: #b5b5b5;
  --trait: #464646;
  --accent: #a78bfa;
  --accent-clair: #383046;
  --sur-accent: #1a1a1a;
  --juste: #5fd39a;
  --juste-fond: #2a3b32;
  --faux: #f4796b;
  --faux-fond: #3f2e2b;
  --filet: rgba(255, 255, 255, 0.18);
}

:root[data-theme="sombre"] input,
:root[data-theme="sombre"] textarea { color-scheme: dark; }

* { box-sizing: border-box; }

/* Doit rester AVANT toute règle fixant « display ».
   Sans cela, une règle comme « button { display: inline-block } » l'emporte
   sur la feuille du navigateur et les éléments marqués « hidden » restent
   visibles — bug silencieux et difficile à repérer. */
[hidden] { display: none !important; }

body {
  margin: 0;
  padding: 0;
  background: var(--fond);
  color: var(--texte);
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 17px;
  line-height: 1.5;
}

.enveloppe {
  max-width: 780px;
  margin: 0 auto;
  padding: 20px 18px 60px;
}

h1 {
  font-size: 1.5rem;
  margin: 0 0 4px;
}

h2 {
  font-size: 1.15rem;
  margin: 28px 0 10px;
}

.sous-titre {
  color: var(--texte-doux);
  margin: 0 0 24px;
}

.carte {
  background: var(--carte);
  border: 1px solid var(--trait);
  border-radius: var(--rayon);
  padding: 18px;
  margin-bottom: 16px;
}

/* --- écrans ---------------------------------------------------------- */

.ecran { display: none; }
.ecran.actif { display: block; }

/* --- formulaire d'accueil -------------------------------------------- */

fieldset {
  border: none;
  padding: 0;
  margin: 0 0 18px;
}

legend {
  font-weight: 600;
  padding: 0;
  margin-bottom: 8px;
}

.choix-ligne {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.puce {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border: 1px solid var(--trait);
  background: var(--carte);
  border-radius: 999px;
  padding: 8px 14px;
  cursor: pointer;
  user-select: none;
}

.puce:has(input:checked) {
  border-color: var(--accent);
  background: var(--accent-clair);
  color: var(--accent);
  font-weight: 600;
}

.puce input { margin: 0; accent-color: var(--accent); }

.liste-competences {
  display: grid;
  gap: 8px;
}

.liste-competences .puce {
  border-radius: var(--rayon);
  justify-content: flex-start;
}

.compteur-generateurs {
  color: var(--texte-doux);
  font-size: 0.9rem;
  margin-left: auto;
}

/* --- boutons --------------------------------------------------------- */

button, a.bouton-secondaire, a.bouton-discret {
  font: inherit;
  /* Couleur explicite : sans elle, le navigateur applique son noir par défaut
     aux boutons, illisible en mode sombre. Chaque variante la redéfinit si
     nécessaire. */
  color: var(--texte);
  cursor: pointer;
  border-radius: 10px;
  border: 1px solid transparent;
  padding: 12px 20px;
  text-decoration: none;
  display: inline-block;
  text-align: center;
}

.bouton-principal {
  background: var(--accent);
  color: var(--sur-accent);
  font-weight: 600;
  width: 100%;
  font-size: 1.05rem;
  padding: 15px 20px;
}

.bouton-principal:hover { filter: brightness(1.08); }
.bouton-principal:disabled { opacity: 0.55; cursor: default; filter: none; }

.bouton-secondaire {
  background: var(--carte);
  border-color: var(--trait);
  color: var(--texte);
}

.bouton-secondaire:hover { border-color: var(--accent); color: var(--accent); }

/* Actions de troisième rang : de vrais boutons, simplement plus petits
   et plus sobres — jamais des liens soulignés.
   Le sélecteur mentionne aussi « a. » pour que les liens présentés en
   bouton aient exactement la même hauteur que les <button>. */
.bouton-discret, a.bouton-discret {
  background: var(--carte);
  border-color: var(--trait);
  color: var(--texte-doux);
  font-size: 0.92rem;
  padding: 9px 15px;
}

.bouton-discret:hover { border-color: var(--accent); color: var(--accent); }

button:focus-visible,
a.bouton-secondaire:focus-visible,
a.bouton-discret:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

.barre-boutons {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}

/* --- séance ---------------------------------------------------------- */

.entete-seance {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 12px;
  color: var(--texte-doux);
  font-size: 0.95rem;
}

.jauge {
  height: 6px;
  background: var(--trait);
  border-radius: 999px;
  overflow: hidden;
  margin-bottom: 22px;
}

.jauge span {
  display: block;
  height: 100%;
  background: var(--accent);
  transition: width 0.25s ease;
}

.etiquette-competence {
  display: inline-block;
  font-size: 0.8rem;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--texte-doux);
  margin-bottom: 10px;
}

/* La consigne se lit sous l'énoncé, et se lit vraiment : même couleur que le
   reste du texte. En gris atténué, on la sautait. */
.consigne {
  color: var(--texte);
  font-size: 1.15rem;
  font-weight: 500;
  margin: 0 0 22px;
}

.enonce {
  font-size: 2.1rem;
  font-weight: 600;
  line-height: 1.35;
  margin: 0 0 10px;
  word-break: break-word;
}

.enonce-texte { font-size: 1.35rem; font-weight: 500; }

.enonce pre {
  font: inherit;
  margin: 0;
  white-space: pre-wrap;
}

/* --- figures géométriques -------------------------------------------- */

.figure {
  margin: 0 0 22px;
  text-align: center;
}

.figure-svg {
  width: 100%;
  max-width: 340px;
  height: auto;
  color: var(--texte);
}

.fig-trait  { stroke: currentColor; stroke-width: 2; stroke-linejoin: round; }
.fig-angle  { stroke: var(--accent); stroke-width: 1.8; }
.fig-codage { stroke: currentColor; stroke-width: 1.8; }
.fig-cote   { stroke: currentColor; stroke-width: 1.2; }
.fig-point  { fill: currentColor; }

.fig-hauteur {
  stroke: var(--accent);
  stroke-width: 1.8;
  stroke-dasharray: 5 4;
}

.fig-pointille { stroke-dasharray: 4 4; stroke-width: 1.4; }

.fig-cercle { stroke: var(--accent); stroke-width: 1.6; }

.fig-sommet {
  fill: currentColor;
  font-size: 14px;
  font-weight: 700;
  font-family: system-ui, sans-serif;
}

.fig-valeur {
  fill: var(--accent);
  font-size: 12.5px;
  font-weight: 600;
  font-family: system-ui, sans-serif;
}

/* --- crible d'Ératosthène : ce qui reste, et ce qui a été rayé --------- */

.fig-premier {
  fill: var(--accent);
  font-size: 11px;
  font-weight: 700;
  font-family: system-ui, sans-serif;
}

.fig-efface {
  fill: var(--texte-doux);
  font-size: 10px;
  font-family: system-ui, sans-serif;
}

.fig-rature { stroke: var(--texte-doux); stroke-width: 1.1; }

/* --- saisie ----------------------------------------------------------- */

.zone-reponse { margin-bottom: 16px; }

.ligne-saisie {
  display: flex;
  align-items: center;
  gap: 12px;
}

.unite-reponse {
  font-size: 1.4rem;
  font-weight: 600;
  color: var(--texte-doux);
  flex: 0 0 auto;
}

input[type="text"] {
  font: inherit;
  font-size: 1.6rem;
  width: 100%;
  padding: 12px 14px;
  border: 2px solid var(--trait);
  border-radius: 10px;
  background: var(--carte);
  color: var(--texte);
}

input[type="text"]:focus {
  outline: none;
  border-color: var(--accent);
}

.options-qcm {
  display: grid;
  gap: 10px;
}

.option-qcm {
  text-align: left;
  background: var(--carte);
  border: 2px solid var(--trait);
  color: var(--texte);
  font-size: 1.15rem;
  padding: 14px 16px;
  display: flex;
  gap: 12px;
  align-items: center;
}

.option-qcm:hover:not(:disabled) { border-color: var(--accent); }

/* Après validation les options sont désactivées. Sans cette règle, le
   navigateur applique sa couleur de texte « grisée » (un noir translucide)
   qui devient illisible sur les fonds vert et rouge, surtout en mode sombre. */
.option-qcm:disabled {
  color: var(--texte);
  opacity: 1;
  cursor: default;
}

.option-qcm .touche {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  border-radius: 6px;
  background: var(--fond);
  color: var(--texte-doux);
  font-size: 0.85rem;
  display: grid;
  place-items: center;
}

.option-qcm.choisie { border-color: var(--accent); background: var(--accent-clair); }
.option-qcm.bonne   { border-color: var(--juste); background: var(--juste-fond); }
.option-qcm.mauvaise{ border-color: var(--faux);  background: var(--faux-fond); }

/* --- retour immédiat -------------------------------------------------- */

.retour { border-radius: var(--rayon); padding: 16px 18px; margin-bottom: 16px; }

.retour.juste { background: var(--juste-fond); border: 1px solid var(--juste); }
.retour.faux  { background: var(--faux-fond);  border: 1px solid var(--faux); }

.retour-titre { font-weight: 700; font-size: 1.1rem; margin-bottom: 6px; }
.retour.juste .retour-titre { color: var(--juste); }
.retour.faux  .retour-titre { color: var(--faux); }

.explication { margin: 10px 0 0; padding: 0; list-style: none; }

.explication li {
  padding: 6px 0 6px 18px;
  border-left: 3px solid var(--filet);
  margin-bottom: 2px;
  font-size: 1.05rem;
}

/* --- bilan ------------------------------------------------------------ */

.score-grand {
  font-size: 3rem;
  font-weight: 700;
  text-align: center;
  margin: 10px 0 0;
}

.score-legende { text-align: center; color: var(--texte-doux); margin-bottom: 20px; }

table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.95rem;
}

th, td {
  text-align: left;
  padding: 9px 8px;
  border-bottom: 1px solid var(--trait);
}

th { color: var(--texte-doux); font-weight: 600; font-size: 0.85rem; }

td.nombre, th.nombre { text-align: right; white-space: nowrap; }

.barre-taux {
  display: inline-block;
  vertical-align: middle;
  width: 70px;
  height: 8px;
  border-radius: 999px;
  background: var(--trait);
  overflow: hidden;
  margin-right: 8px;
}

.barre-taux span { display: block; height: 100%; background: var(--accent); }

/* Score faible : piste teintée (visible même à 0 %) et remplissage rouge. */
.barre-taux.faible { background: var(--faux-fond); }
.barre-taux.faible span { background: var(--faux); }

.vide { color: var(--texte-doux); font-style: italic; }

/* Ce qu'il reste à choisir avant de pouvoir lancer. Ce n'est pas une erreur
   mais un guide, affiché en permanence sous un bouton fermé : il doit se lire
   d'un coup d'œil, donc ni gris ni italique. */
.message-choix {
  color: var(--texte);
  font-weight: 500;
  margin-top: 12px;
  text-align: center;
}

/* Bandeau d'avertissement en haut de l'accueil.
   Ne pas nommer cette classe « alerte » : ce nom entrerait en collision avec
   le modificateur des barres de score (.barre-taux.faible). */
.bandeau-avertissement {
  background: var(--faux-fond);
  border: 1px solid var(--faux);
  border-radius: var(--rayon);
  padding: 12px 14px;
  margin: 0 0 18px;
  font-size: 0.95rem;
}

/* --- comptes, formulaires, espace enseignant -------------------------- */

.enveloppe-large { max-width: 940px; }

/* --- roue de réglages, en haut à droite de chaque page ----------------- */

.coin-reglages {
  position: fixed;
  top: 12px;
  right: 12px;
  z-index: 100;
}

.bouton-roue {
  width: 42px;
  height: 42px;
  padding: 0;
  display: grid;
  place-items: center;
  background: var(--carte);
  border: 1px solid var(--trait);
  border-radius: 50%;
  color: var(--texte-doux);
}

.bouton-roue svg { width: 20px; height: 20px; display: block; }
.bouton-roue:hover { border-color: var(--accent); color: var(--accent); }

.menu-reglages {
  position: absolute;
  top: 50px;
  right: 0;
  min-width: 240px;
  background: var(--carte);
  border: 1px solid var(--trait);
  border-radius: var(--rayon);
  padding: 8px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.22);
}

.menu-identite {
  margin: 0;
  padding: 8px 10px 10px;
  border-bottom: 1px solid var(--trait);
  color: var(--texte-doux);
  font-size: 0.86rem;
  word-break: break-word;
}

.menu-ligne {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 10px;
  font-size: 0.95rem;
}

.menu-action {
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  border-radius: 8px;
  padding: 10px;
  font-size: 0.95rem;
  color: var(--texte);
  text-decoration: none;
}

.menu-action:hover { background: var(--accent-clair); color: var(--accent); }

/* La roue est en position fixe : on réserve la place en haut à droite pour
   qu'elle ne recouvre jamais un titre ou un bouton.
   La règle équivalente pour les petits écrans est dans la requête média en
   fin de fichier — sans elle, elle serait écrasée. */
.enveloppe { padding-right: 66px; }

/* En-tête de page : un titre à gauche, des boutons à droite.
   « center » plutôt que « baseline » : aligner un bouton sur la ligne de base
   d'un titre le fait dépasser vers le bas. Et une marge basse explicite, sans
   laquelle les boutons se retrouvent collés à la carte suivante. */
.entete-page {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px 16px;
  flex-wrap: wrap;
  margin-bottom: 18px;
}

.entete-page h1, .entete-page h2 { margin-bottom: 0; }

.champ { display: block; margin-bottom: 16px; }
.champ > span { display: block; font-weight: 600; margin-bottom: 6px; }
.champ small { font-weight: 400; color: var(--texte-doux); }

.champ input {
  font: inherit;
  font-size: 1.1rem;
  width: 100%;
  padding: 11px 13px;
  border: 2px solid var(--trait);
  border-radius: 10px;
  background: var(--fond);
  color: var(--texte);
}

.champ input:focus { outline: none; border-color: var(--accent); background: var(--carte); }

.ligne-formulaire { display: flex; gap: 10px; flex-wrap: wrap; }

.ligne-formulaire input {
  font: inherit;
  flex: 1 1 160px;
  padding: 11px 13px;
  border: 2px solid var(--trait);
  border-radius: 10px;
  background: var(--fond);
  color: var(--texte);
}

.message-erreur {
  color: var(--faux);
  background: var(--faux-fond);
  border-radius: 8px;
  padding: 10px 12px;
  margin: 0 0 14px;
  font-size: 0.95rem;
}

.message-succes {
  color: var(--juste);
  background: var(--juste-fond);
  border-radius: 8px;
  padding: 10px 12px;
  margin: 0 0 14px;
  font-size: 0.95rem;
}

.encadre {
  background: var(--accent-clair);
  border-left: 3px solid var(--accent);
  border-radius: 6px;
  padding: 12px 14px;
  margin: 0 0 18px;
  font-size: 0.93rem;
}

.encadre-alerte {
  background: var(--faux-fond);
  border-left-color: var(--faux);
}

.info-sync {
  text-align: center;
  color: var(--texte-doux);
  font-size: 0.9rem;
  margin: -12px 0 18px;
}

/* --- portail : les modules du site --------------------------------------- */

.tuiles {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 14px;
  margin-bottom: 24px;
}

.tuile {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  padding: 22px 20px;
  border: 1px solid var(--trait);
  border-radius: var(--rayon);
  background: var(--carte);
  color: inherit;
  text-decoration: none;
}

.tuile:hover, .tuile:focus-visible {
  border-color: var(--accent);
  outline: none;
}

.tuile-icone {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 12px;
  background: var(--accent-clair);
  color: var(--accent);
}

.tuile-icone svg { width: 24px; height: 24px; }

.tuile-titre { font-size: 1.15rem; font-weight: 700; }

.tuile-detail {
  font-size: 0.92rem;
  color: var(--texte-doux);
  line-height: 1.45;
}

/* --- mode projection ------------------------------------------------------
   Tout est dimensionné pour être lu depuis le fond d'une salle de classe,
   sur un vidéoprojecteur souvent pâle : gros caractères, contraste franc,
   et surtout aucun élément décoratif qui volerait de la place.
   ------------------------------------------------------------------------- */

/* Projeter, c'est occuper tout l'écran : plus d'enveloppe centrée, plus de
   roue de réglages, plus de pied de page. La planche prend la place ainsi
   libérée, ce qui permet d'agrandir les caractères d'autant. */
body.en-projection .enveloppe { max-width: none; padding: 0; }
body.en-projection .coin-reglages,
body.en-projection .pied { display: none; }

body.en-projection #ecran-planche.actif {
  display: flex;
  flex-direction: column;
  height: 100vh;
  padding: 16px 38px 22px;
}

.planche-barre {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}

.planche-titre { font-weight: 700; font-size: 1.05rem; }
.planche-actions { display: flex; gap: 8px; flex-wrap: wrap; }

/* Toujours deux rangées, quel que soit le nombre de questions : c'est ce qui
   donne des cases carrées et la plus grande taille de texte possible. Le
   nombre de colonnes et la taille sont posés par prof.js, qui les déduit du
   nombre de questions demandé. */
.planche {
  flex: 1 1 auto;
  min-height: 0;
  display: grid;
  grid-template-columns: repeat(var(--colonnes, 4), minmax(0, 1fr));
  grid-template-rows: repeat(2, minmax(0, 1fr));
  gap: 14px;
  font-size: var(--taille, 1.75rem);
}

.planche-question {
  display: flex;
  gap: 0.5em;
  min-height: 0;
  overflow: auto;
  padding: 0.55em 0.6em;
  border: 2px solid var(--trait);
  border-radius: var(--rayon);
  background: var(--carte);
  cursor: pointer;
}

.planche-question.devoilee { border-color: var(--juste); }

/* La taille exacte de chaque case est posée par prof.js après rendu : il
   mesure et descend jusqu'à ce que le contenu tienne. Une question courte
   reste donc énorme même si sa voisine porte une longue figure. */

/* Tout l'intérieur d'une case est exprimé en « em » : changer la taille de la
   planche suffit alors à redimensionner numéro, énoncé, options et correction
   d'un seul coup, sans qu'aucune proportion ne bouge. */
.planche-numero {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.5em;
  height: 1.5em;
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  font-weight: 700;
  font-size: 0.62em;
}

.planche-corps { flex: 1 1 auto; min-width: 0; }

/* Projetée au fond de la classe, une consigne grise ne se lit pas : même
   couleur que l'énoncé, juste un cran plus petite. */
.planche-consigne {
  margin: 0.3em 0 0;
  font-size: 0.62em;
  line-height: 1.3;
  font-weight: 500;
  color: var(--texte);
}

.planche-enonce {
  margin: 0;
  font-size: 1em;
  font-weight: 600;
  line-height: 1.3;
}

pre.planche-enonce {
  font-family: ui-monospace, monospace;
  font-size: 0.92em;
  white-space: pre-wrap;
}

/* Les énoncés rédigés sont plus longs que les expressions à calculer : ils
   sont donc un peu plus petits, mais à peine — c'est encore la ligne que la
   classe doit lire de loin. */
.planche-enonce.enonce-texte { font-size: 0.86em; font-weight: 500; }

.planche-options {
  list-style: none;
  margin: 0.5em 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(6em, 1fr));
  gap: 0.25em;
  font-size: 0.62em;
}

.planche-lettre {
  display: inline-block;
  min-width: 1em;
  margin-right: 0.4em;
  color: var(--accent);
  font-weight: 700;
}

/* La réponse occupe sa place dès le départ, simplement invisible : dévoiler
   ne déplace donc rien à l'écran. Un saut de mise en page au moment où toute
   la classe regarde le tableau serait le pire moment pour en faire un. */
.planche-reponse {
  margin-top: 0.5em;
  padding-top: 0.4em;
  border-top: 2px dashed var(--trait);
  visibility: hidden;
}

.planche-question.devoilee .planche-reponse { visibility: visible; }

.planche-reponse-valeur {
  font-size: 0.92em;
  font-weight: 700;
  color: var(--juste);
}

/* Projetée, une correction détaillée ne se lit pas du fond de la classe : elle
   ne ferait que faire déborder la case et rapetisser la réponse, qui est la
   seule chose que la classe doit voir. Les étapes restent dans la page — elles
   ressortent à l'impression, où la place ne manque pas. */
.planche-reponse .explication { display: none; }

/* En « em » et non en « vh » : la figure suit alors la taille de sa case,
   ce qui permet à l'ajustement automatique de la faire rentrer elle aussi.
   Hauteur imposée et largeur libre : le dessin garde ses proportions et
   n'abandonne pas la moitié de sa boîte à du vide, comme le ferait une
   largeur à 100 % rognée par une hauteur maximale. */
.planche .figure { margin: 0.4em 0 0; }

.planche .figure-svg {
  width: auto;
  height: 6.5em;
  max-width: 100%;
}

/* --- bandeau d'appel, en bas de « Mes classes » -------------------------- */

.bandeau-projection {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  flex-wrap: wrap;
  margin-top: 28px;
  padding: 24px 26px;
  border: 1px solid var(--accent);
  border-radius: var(--rayon);
  background: var(--accent-clair);
}

.bandeau-projection h2 { margin: 0 0 6px; }

.bandeau-projection p {
  margin: 0;
  max-width: 60ch;
  color: var(--texte-doux);
  font-size: 0.95rem;
  line-height: 1.5;
}

.bandeau-projection .bouton-principal { margin: 0; flex: 0 0 auto; }

/* --- impression : la planche devient une feuille d'exercices -------------- */

@media print {
  .coin-reglages, .planche-barre, .pied { display: none !important; }

  /* Sur papier, on ne raisonne plus en hauteur d'écran : deux colonnes qui
     se déroulent sur autant de pages qu'il faut. */
  body.en-projection #ecran-planche.actif {
    display: block;
    height: auto;
    padding: 0;
  }
  .planche {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: none;
    font-size: 1.05rem;
  }
  .planche-question {
    break-inside: avoid;
    border-color: #000;
    overflow: visible;
  }
  .planche-numero { background: #000 !important; }
  .planche .figure-svg { max-height: none; max-width: 200px; }

  /* Sur la feuille de correction, le détail reprend toute sa valeur. */
  .planche-reponse .explication {
    display: block;
    margin: 0.3em 0 0;
    padding-left: 1.2em;
    font-size: 0.62em;
    line-height: 1.35;
  }
}

/* --- cartes de révision --------------------------------------------------- */

.carte-revision { text-align: center; }

.carte-recto {
  font-size: 1.25rem;
  font-weight: 600;
  line-height: 1.45;
  margin: 6px 0 20px;
}

.carte-verso {
  font-size: 1.05rem;
  line-height: 1.5;
  text-align: left;
  background: var(--juste-fond);
  border-left: 3px solid var(--juste);
  border-radius: 6px;
  padding: 14px 16px;
  margin: 0 0 16px;
}

.carte-astuce {
  font-size: 0.93rem;
  line-height: 1.45;
  text-align: left;
  color: var(--texte-doux);
  border-left: 3px solid var(--trait);
  padding: 2px 0 2px 12px;
  margin: 0 0 18px;
}

/* La touche du clavier rappelée sur le bouton : on révise vite au clavier. */
.touche {
  display: inline-block;
  min-width: 18px;
  margin-left: 6px;
  padding: 1px 5px;
  border: 1px solid currentColor;
  border-radius: 5px;
  font-size: 0.78em;
  opacity: 0.65;
}

.ligne-boite {
  display: grid;
  grid-template-columns: 84px 1fr 32px;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  font-size: 0.9rem;
}

.ligne-boite-nom { color: var(--texte-doux); }
.ligne-boite-nombre { text-align: right; font-variant-numeric: tabular-nums; }

/* --- fiche imprimable ----------------------------------------------------- */

.carte-fiche {
  padding: 14px 0;
  border-bottom: 1px solid var(--trait);
}

.carte-fiche:last-child { border-bottom: none; padding-bottom: 0; }

.carte-fiche-entete {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 6px;
}

.carte-fiche-recto { font-weight: 600; margin: 0 0 6px; }
.carte-fiche-verso { margin: 0; }

.carte-fiche-astuce {
  margin: 6px 0 0;
  font-size: 0.9rem;
  color: var(--texte-doux);
}

.carte-cliquable {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
  width: 100%;
  text-align: left;
  font: inherit;
  cursor: pointer;
  background: var(--carte);
  border: 1px solid var(--trait);
  border-radius: var(--rayon);
  padding: 16px 18px;
  margin-bottom: 12px;
}

.carte-cliquable:hover { border-color: var(--accent); background: var(--accent-clair); }
.carte-titre { font-size: 1.15rem; font-weight: 700; }
.carte-detail { color: var(--texte-doux); font-size: 0.9rem; }

.chiffres {
  display: flex;
  gap: 28px;
  flex-wrap: wrap;
  margin-bottom: 18px;
}

.chiffres div { display: flex; flex-direction: column; }
.chiffres strong { font-size: 1.9rem; line-height: 1.1; }
.chiffres span { color: var(--texte-doux); font-size: 0.85rem; }

.discret { color: var(--texte-doux); font-weight: 400; }

code {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 0.95em;
  background: var(--fond);
  padding: 1px 5px;
  border-radius: 4px;
}

.bouton-mini {
  font-size: 0.8rem;
  padding: 5px 9px;
  border: 1px solid var(--trait);
  background: var(--carte);
  color: var(--texte-doux);
  border-radius: 7px;
}

.bouton-mini:hover { border-color: var(--accent); color: var(--accent); }
.bouton-mini.danger:hover { border-color: var(--faux); color: var(--faux); }

/* --- écran de bienvenue ------------------------------------------------ */

.bienvenue {
  text-align: center;
  padding: 8vh 0 0;
}

.bienvenue h1 { font-size: 2.2rem; margin-bottom: 10px; }
.bienvenue .sous-titre { margin-bottom: 36px; }

.bienvenue-choix {
  display: grid;
  gap: 12px;
  max-width: 340px;
  margin: 0 auto 28px;
}

/* Le bouton secondaire prend toute la largeur ici, pour équilibrer la pile */
.bienvenue-choix .bouton-secondaire {
  width: 100%;
  padding: 15px 20px;
  font-size: 1.05rem;
}

.bienvenue-note {
  color: var(--texte-doux);
  font-size: 0.92rem;
  max-width: 420px;
  margin: 0 auto;
  line-height: 1.6;
}

.note-enseignant {
  color: var(--texte-doux);
  font-size: 0.88rem;
  margin: 14px 0 0;
  text-align: center;
}

/* --- paramètres et interrupteur --------------------------------------- */

.parametre {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
}

.parametre-texte strong { display: block; font-size: 1.05rem; }

.parametre-texte p {
  margin: 4px 0 0;
  color: var(--texte-doux);
  font-size: 0.92rem;
}

.interrupteur {
  flex: 0 0 auto;
  width: 58px;
  height: 32px;
  padding: 0;
  border-radius: 999px;
  border: 1px solid var(--trait);
  background: var(--fond);
  position: relative;
  transition: background 0.18s ease, border-color 0.18s ease;
}

.interrupteur-pastille {
  position: absolute;
  top: 3px;
  left: 3px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--texte-doux);
  transition: transform 0.18s ease, background 0.18s ease;
}

.interrupteur.actif {
  background: var(--accent);
  border-color: var(--accent);
}

.interrupteur.actif .interrupteur-pastille {
  transform: translateX(26px);
  background: var(--sur-accent);
}

/* --- étiquettes d'identifiants à découper ----------------------------- */

.etiquettes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 10px;
}

.etiquette {
  border: 1px dashed var(--texte-doux);
  border-radius: 8px;
  padding: 11px 13px;
  font-size: 0.9rem;
  break-inside: avoid;
}

.etiquette-classe {
  font-weight: 700;
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--texte-doux);
  margin-bottom: 6px;
}

.etiquette-ligne { display: flex; justify-content: space-between; gap: 8px; margin-bottom: 3px; }
.etiquette-ligne span { color: var(--texte-doux); font-size: 0.8rem; }
.etiquette-nom { margin-top: 8px; color: var(--texte-doux); font-size: 0.8rem; }

@media print {
  body { background: #fff; }
  .pied, .entete-page button, .barre-boutons, .encadre { display: none !important; }

  /* Sur l'écran d'une classe, imprimer ne veut dire qu'une chose : sortir la
     planche d'étiquettes. Tout le reste de l'écran disparaît.

     La restriction à #ecran-classe est indispensable : écrite pour n'importe
     quel « .ecran », cette règle vidait aussi la liste des cartes de révision
     et les fiches d'exercices, qui s'imprimaient blanches. */
  #ecran-classe > *:not(#bloc-identifiants) { display: none !important; }
  #bloc-identifiants { border: none; padding: 0; }
  .etiquettes { grid-template-columns: repeat(3, 1fr); }
  .etiquette { border-color: #999; }
}

.pied {
  margin-top: 34px;
  padding-top: 14px;
  border-top: 1px solid var(--trait);
  color: var(--texte-doux);
  font-size: 0.85rem;
  display: flex;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}

@media (max-width: 520px) {
  .enonce { font-size: 1.7rem; }
  /* La marge droite doit rester réservée à la roue, sinon les titres passent
     dessous sur petit écran. */
  .enveloppe { padding: 14px 60px 50px 12px; }
}

/* --- onglets de l'espace enseignant ------------------------------------
   Trois écrans de même rang. Un simple soulignement marque l'actif :
   des boutons pleins concurrenceraient le bouton principal de la page.
   ---------------------------------------------------------------------- */

.onglets {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
  margin-bottom: 22px;
  border-bottom: 1px solid var(--trait);
}

.onglet {
  border: none;
  background: none;
  color: var(--texte-doux);
  font: inherit;
  font-weight: 600;
  padding: 10px 14px;
  border-radius: var(--rayon) var(--rayon) 0 0;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}

.onglet:hover { color: var(--accent); background: var(--accent-clair); }

.onglet.actif {
  color: var(--accent);
  border-bottom-color: var(--accent);
}

/* --- chapitres visibles ------------------------------------------------ */

.parametre-chapitre {
  padding: 14px 0;
  border-bottom: 1px solid var(--trait);
}

.parametre-chapitre:first-child { padding-top: 0; }
.parametre-chapitre:last-child { border-bottom: none; padding-bottom: 0; }

/* --- ramassage des cahiers --------------------------------------------- */

.reglages-grille {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 0 16px;
}

/* Les intitulés n'ont pas tous la même longueur : sans cela, un libellé sur
   deux lignes décalerait son champ de saisie vers le bas, seul de sa rangée. */
.reglages-grille .champ { display: flex; flex-direction: column; }
.reglages-grille .champ input { margin-top: auto; }

/* Le tirage se lit de loin : l'enseignant annonce les numéros à la classe
   sans se rapprocher de l'écran. */
.tirage {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: center;
  margin: 20px 0 14px;
}

.tirage-numero {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 74px;
  height: 74px;
  padding: 0 10px;
  border-radius: var(--rayon);
  background: var(--accent);
  color: var(--sur-accent);
  font-size: 2.1rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

/* Une case par élève : le numéro, un point par ramassage prévu, la note.
   C'est la vue qui répond d'un coup d'œil à « qui n'est pas encore passé ? ». */
.grille-eleves {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: 8px;
}

.eleve-case {
  border: 1px solid var(--trait);
  border-radius: var(--rayon);
  padding: 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 5px;
  font-size: 0.85rem;
}

.eleve-case.jamais { border-color: var(--accent); background: var(--accent-clair); }

.eleve-numero { font-weight: 700; font-variant-numeric: tabular-nums; }

.eleve-points { display: flex; gap: 3px; flex-wrap: wrap; justify-content: center; }

.pastille {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  border: 1px solid var(--texte-doux);
}

.pastille.pleine { background: var(--accent); border-color: var(--accent); }

.eleve-note { color: var(--texte-doux); font-variant-numeric: tabular-nums; }

/* Saisie des notes : des puces plutôt qu'un champ, parce qu'on note debout,
   au fond de la classe, sur une tablette. */
.table-notes td { vertical-align: middle; }

.choix-notes { gap: 4px; margin: 0; }

.puce-note {
  padding: 5px 10px;
  font-variant-numeric: tabular-nums;
}

.puce-absent { padding: 5px 10px; }

/* La remarque prend une largeur fixe : sinon la mise en page automatique du
   tableau lui donne de quoi renvoyer « absent » à la ligne, sous les notes. */
.table-notes th:last-child, .table-notes td:last-child { width: 240px; }

.saisie-remarque {
  width: 100%;
  min-width: 0;
  padding: 7px 9px;
  border: 1px solid var(--trait);
  border-radius: 8px;
  background: var(--fond);
  color: var(--texte);
  font: inherit;
  font-size: 0.9rem;
}

.saisie-remarque:focus { outline: none; border-color: var(--accent); background: var(--carte); }

/* En dessous d'environ 900 px, les trois colonnes ne laissent plus assez de
   place aux notes, qui se replient sur deux lignes — le pire des deux mondes.
   On empile alors : le numéro, les notes en pleine largeur, puis la remarque. */
@media (max-width: 900px) {
  /* La remarque passe sous les notes : trois colonnes ne tiennent pas. */
  .table-notes, .table-notes tr, .table-notes td,
  .table-notes td:last-child { display: block; width: 100%; }
  .table-notes tr:first-child { display: none; }
  .table-notes td { border-bottom: none; padding: 2px 0; }
  .table-notes tr { border-bottom: 1px solid var(--trait); padding: 10px 0; }
}

/* --- ranger ses groupes en les faisant glisser --------------------------
   La poignée seule est saisissable : le reste de la carte doit continuer
   d'ouvrir la classe, et le doigt de faire défiler la liste.
   ---------------------------------------------------------------------- */

.carte-cliquable.avec-poignee { position: relative; padding-left: 42px; }

.poignee {
  position: absolute;
  left: 10px;
  top: 0;
  bottom: 0;
  width: 24px;
  cursor: grab;
  /* Indispensable au toucher : sans cela, le navigateur interprète le
     glissement comme un défilement et ne nous envoie plus rien. */
  touch-action: none;
  /* Les six points d'une poignée, dessinés en dégradés pour n'ajouter ni
     image ni police. */
  background-image: radial-gradient(circle, var(--texte-doux) 1.6px, transparent 1.7px);
  background-size: 8px 7px;
  background-position: center;
  background-repeat: repeat-y;
  opacity: 0.45;
  transition: opacity 0.15s ease;
}

.carte-cliquable:hover .poignee { opacity: 0.9; }
.poignee:active { cursor: grabbing; }

.carte-cliquable.en-deplacement {
  position: relative;
  z-index: 2;
  border-color: var(--accent);
  box-shadow: 0 8px 20px var(--filet);
}

/* Pendant le glissement, tout le reste doit se tenir tranquille : pas de
   sélection de texte, pas de survol qui clignote sous la carte déplacée. */
body.en-glissement { user-select: none; }
body.en-glissement .carte-cliquable:hover { background: var(--carte); border-color: var(--trait); }
body.en-glissement .carte-cliquable.en-deplacement { border-color: var(--accent); }

/* --- fiches d'exercices -------------------------------------------------
   Une feuille, pas une interface : peu de cadres, beaucoup de blanc, et une
   hiérarchie qui tient à l'écran comme sur le papier.
   ------------------------------------------------------------------------ */

.fiche-entete {
  border-bottom: 2px solid var(--texte);
  padding-bottom: 12px;
  margin-bottom: 24px;
}

.fiche-entete h1 { margin-bottom: 6px; }

.fiche-sous-titre {
  margin: 0;
  color: var(--texte-doux);
  font-size: 0.92rem;
}

/* La ligne où l'élève écrit son nom n'a de sens que sur la feuille. */
.fiche-nom { display: none; }

.exercice {
  margin-bottom: 30px;
  break-inside: avoid;
}

.exercice-titre {
  font-size: 1.02rem;
  font-weight: 500;
  margin: 0 0 12px;
}

.exercice-numero { font-weight: 700; }

.exercice-items {
  list-style: none;
  margin: 0 0 12px;
  padding: 0;
}

.item {
  display: flex;
  gap: 10px;
  align-items: baseline;
  margin-bottom: 10px;
  break-inside: avoid;
}

.item-lettre {
  flex: 0 0 auto;
  font-weight: 700;
  color: var(--texte-doux);
  min-width: 1.2em;
}

.item-corps { flex: 1 1 auto; min-width: 0; }

.item-consigne {
  display: block;
  color: var(--texte-doux);
  font-size: 0.9rem;
  margin-bottom: 2px;
}

.item-enonce { font-size: 1.15rem; font-weight: 600; }
.item-enonce-texte { font-size: 1rem; font-weight: 500; }

pre.item-enonce {
  font: inherit;
  font-weight: 600;
  margin: 0;
  white-space: pre-wrap;
}

/* Les propositions d'un QCM se cochent : sur papier on entoure, à l'écran on
   lit. Une case vide devant chacune suffit à dire lequel des deux on fait. */
.item-choix {
  list-style: none;
  margin: 6px 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
}

.item-choix li { display: flex; align-items: baseline; gap: 7px; }

.item-choix li::before {
  content: '';
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
  border: 1px solid var(--texte-doux);
  border-radius: 3px;
}

.bouton-correction { margin-top: 4px; }

.correction {
  margin-top: 14px;
  padding: 14px 16px;
  border-left: 3px solid var(--accent);
  background: var(--accent-clair);
  border-radius: 0 var(--rayon) var(--rayon) 0;
}

.correction h3 {
  margin: 0 0 10px;
  font-size: 0.8rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--texte-doux);
}

.correction-item { margin-bottom: 12px; }
.correction-item:last-child { margin-bottom: 0; }

.correction-reponse {
  margin: 0;
  font-weight: 600;
}

.correction .explication { margin-top: 4px; }

.fiche-pied {
  color: var(--texte-doux);
  font-size: 0.9rem;
  font-style: italic;
}

/* L'en-tête du papier : caché à l'écran, où le titre et le sous-titre disent
   déjà tout — et bien mieux. */
.fiche-papier { display: none; }

/* --- la fiche à l'impression --------------------------------------------
   Le but est de faire tenir le maximum d'exercices sur une seule feuille.
   Quatre décisions, dans l'ordre de ce qu'elles font gagner :

   1. Aucune place laissée pour écrire. Les fiches se font sur le cahier ou
      au brouillon ; des lignes pointillées doublaient la hauteur de la
      feuille pour un usage que personne n'en faisait.
   2. Les exercices courts passent en ligne — « a. −14  b. +3  c. 7,9 » —
      au lieu d'un item par ligne. Un exercice de quatre items tient alors
      sur deux lignes au lieu de cinq.
   3. Un en-tête d'une seule ligne : le numéro et le chapitre. Le reste
      (compétences, niveau, nom, pied de page) sort de la feuille.
   4. Un corps de texte plus petit et des marges resserrées, comme sur une
      fiche composée en LaTeX.
   ------------------------------------------------------------------------ */

@page { size: A4; margin: 12mm 14mm; }

@media print {
  body { font-size: 10.5pt; line-height: 1.35; }
  .enveloppe { max-width: none; padding: 0; }

  #ecran-fiche .fiche-pied { display: none !important; }

  /* L'en-tête d'écran cède la place à sa version d'une ligne. */
  .fiche-entete h1, .fiche-sous-titre { display: none !important; }

  .fiche-entete {
    border-bottom: 1px solid #000;
    padding-bottom: 3mm;
    margin-bottom: 5mm;
  }

  .fiche-papier {
    display: block;
    margin: 0;
    font-weight: 700;
    font-size: 11pt;
  }

  .exercice { margin-bottom: 4.5mm; }
  .exercice-titre { margin-bottom: 1.5mm; font-size: 1em; }
  .exercice-items { margin-bottom: 0; }
  .item { margin-bottom: 1mm; }
  .item-enonce { font-size: 1em; font-weight: 600; }

  /* Les items courts se suivent sur la même ligne, séparés par un blanc
     franc : c'est la mise en page d'une fiche d'exercices sur papier. */
  .exercice-compact .exercice-items {
    display: flex;
    flex-wrap: wrap;
    gap: 0 9mm;
  }
  .exercice-compact .item { margin-bottom: 0.5mm; }

  .item-choix { margin-top: 0.5mm; gap: 0.5mm 6mm; }
  .item-choix li::before { border-color: #000; }

  /* Une correction dépliée s'imprime avec la fiche : c'est le corrigé qu'on
     veut alors, pas la feuille à faire. Repliée, elle ne prend pas de place. */
  .correction {
    background: none;
    border-left: 1.5pt solid #000;
    padding: 2mm 0 2mm 3mm;
    margin-top: 2mm;
    break-inside: avoid;
  }
  .correction h3 { margin-bottom: 1.5mm; }
  .correction-item { margin-bottom: 2mm; }
  .explication li { margin-bottom: 0.5mm; }

  .bouton-correction { display: none !important; }
}
