/* =========================================================
   THOMATHS — Styles produits par le moteur LaTeX->HTML maison
   (apps/thomaths/services/latex_engine/). Toutes les classes ici
   correspondent à des macros/environnements de latex/macros.tex.
   ========================================================= */

.tex-smallcaps { font-variant: small-caps; }

.tex-boxed {
    display: inline-block;
    border: 1px solid var(--border, #444);
    border-radius: 3px;
    padding: 0 5px;
}

.tex-block {
    display: inline-block;
    border-radius: 5px;
    padding: 2px 8px;
    border-width: 1.5px;
    border-style: solid;
    /* Fond teinté à ~20% de la couleur de bordure, aligné sur le
       \NewDocumentCommand{\InlineBox} de macros.tex (fill=#2!20 par défaut,
       fill=none seulement pour la variante étoilée \InlineBox*, non rendue
       ici) : texte non teinté, seule la bordure + le fond portent la couleur. */
    color: inherit;
}
/* SmallInlineBox : padding réduit, pour rester plus proche du texte. */
.tex-block-small { padding: 1px 4px; }
.tex-block-red   { border-color: #e0837a; background: rgba(224, 131, 122, 0.2); }
.tex-block-blue  { border-color: var(--accent, #6d7bff); background: rgba(109, 123, 255, 0.2); }
.tex-block-black { border-color: #999; background: rgba(153, 153, 153, 0.2); }
/* "Blue" (majuscule) : couleur custom de theorems.tex, distincte de la
   "blue" standard de xcolor ci-dessus au niveau LaTeX (classe casse-
   sensible, cf. InlineBox dans macros.py, qui ne peut pas normaliser la
   casse d'un simple template #1) — mais rendue avec le MÊME bleu qu'elle
   (--accent, aussi utilisé par tikz.py pour le \definecolor{Blue} des
   figures TikZ) : à l'écran, "Blue" et "blue" doivent rester visuellement
   indiscernables plutôt que deux bleus différents. */
.tex-block-Blue  { border-color: var(--accent, #6d7bff); background: rgba(109, 123, 255, 0.2); }

/* ColorBox (theorems.tex) : box en BLOC (pas inline-block comme .tex-block
   ci-dessus, pensé pour une étiquette dans le fil du texte) — cadre fin,
   coins nets (sharp corners côté LaTeX), fond très clair pour rester
   lisible malgré un contenu potentiellement long (formule affichée...). */
.tex-colorbox {
    display: block;
    margin: 0.8em auto;
    padding: 0.6em 1em;
    border: 1.5px solid #999;
    border-radius: 0;
}
.tex-colorbox-blue { background: transparent; border-color: var(--accent, #6d7bff); }

/* \todo{...} EN LIGNE (macros.py) — même identité que le bloc Todo isolé
   (.doc-env-todo dans doc.css, couleur --content-exercise), en pastille à
   part plutôt qu'en carte à part entière. `display: block` (pas
   inline-block) : un \todo{} glissé au milieu d'une phrase doit se détacher
   du texte qui l'entoure (retour à la ligne avant ET après), pas rester
   soudé au mot précédent/suivant sur la même ligne. `width: fit-content` :
   un `block` prendrait sinon toute la largeur disponible, alors que la
   pastille ne doit entourer que son propre texte. */
.tex-todo {
    display: block;
    width: fit-content;
    max-width: 100%;
    margin: 0.4em 0;
    border-radius: 5px;
    padding: 0 6px;
    border: 1.5px solid var(--content-exercise, #f97316);
    background: color-mix(in srgb, var(--content-exercise, #f97316) 12%, transparent);
    color: var(--content-exercise, #f97316);
    font-weight: 600;
}

/* \newpage (macros.py) : sans effet en HTML (pas de pagination) — juste un
   repère visuel discret pour le prof, pour ne pas laisser croire à un bug de
   rendu. Séparateur pointillé + libellé centré (pas une simple <hr>, pour
   rester identifiable au premier coup d'oeil). Invisible en mode élève : ce
   moteur ne connaît pas le mode prof/élève, donc le marqueur est toujours
   généré et c'est le CSS qui tranche (cf. .mode-eleve sur <body>,
   sheet_detail.html). */
.tex-newpage-break {
    display: flex;
    align-items: center;
    gap: 0.6em;
    margin: 1.2em 0;
    color: var(--text-muted, #999);
    font-size: 0.75em;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
.tex-newpage-break::before,
.tex-newpage-break::after {
    content: "";
    flex: 1;
    border-top: 1px dashed currentColor;
}
.mode-eleve .tex-newpage-break { display: none; }

.tex-circbox {
    display: inline-block;
    border-radius: 4px;
    padding: 0 6px;
    border: 0.5px solid var(--tex-circbox-color, #999);
    background: color-mix(in srgb, var(--tex-circbox-color, #999) 12%, transparent);
}

.tex-item-label {
    display: inline-block;
    min-width: 1.4em;
    font-weight: 600;
}

/* Grille (pas column-count) : cf. commentaire de _render_list dans
   converter.py — column-count remplit colonne par colonne (ordre "1 3 / 2 4"),
   alors que le LaTeX réel (EnumCols/ItemCols/ListCols/*Fit) affiche en ordre
   de lecture "1 2 / 3 4". Grid, en flow par défaut (row), respecte l'ordre du
   DOM tout en alignant les colonnes entre les lignes. --tex-cols-n posé en
   inline style par le moteur (nombre de colonnes demandé côté LaTeX). */
.tex-cols > .latex-list {
    display: grid;
    /* minmax(0, 1fr) et pas 1fr tout court : une piste `1fr` seule refuse de
       rétrécir sous le min-content de son contenu (ex. une formule MathJax,
       jamais coupée nativement) — avec suffisamment de colonnes/texte, la
       grille DÉBORDE de son conteneur au lieu de se tasser. minmax(0, 1fr)
       autorise chaque colonne à descendre sous ce min-content ; overflow-wrap
       ci-dessous absorbe alors le débordement en repassant à la ligne DANS
       la cellule plutôt qu'en le laissant fuir horizontalement. */
    grid-template-columns: repeat(var(--tex-cols-n, 2), minmax(0, 1fr));
    column-gap: 2rem;
    row-gap: 0.3em;
}
.tex-cols > .latex-list > li { overflow-wrap: anywhere; }
/* Les <ol>/<ul> grid gardent leur padding-left normal (réservé au marqueur
   ::before/::marker de CHAQUE item, cf. règles ol.latex-list/ul.latex-list
   ci-dessous) — seule la mise en page globale (colonnes) change, pas
   l'alignement interne de chaque item. */

/* Les <p>/<ol>/<ul> produits par le moteur gardent leurs marges par
   défaut du navigateur (~1em chacun) : un <p> suivi d'un <ol> cumule les
   deux marges en un vide bien plus grand que voulu (et en colonnes CSS
   .tex-cols, la marge du haut ne s'affiche qu'au-dessus de la première
   colonne). On neutralise les marges par défaut et on ne réintroduit un
   espacement que entre enfants directs successifs de .content. */
.content p, .content ol, .content ul,
.doc-prose p, .doc-prose ol, .doc-prose ul { margin: 0; }
.content > * + *, .doc-prose > * + * { margin-top: 0.6em; }
/* .tex-cols (liste en colonnes) : même spécificité que la règle ci-dessus
   ne suffit pas à neutraliser sa marge (elle ne cible que p/ol/ul, pas le
   div englobant), d'où un espace résiduel réservé aux listes en colonnes. */
.content > .tex-cols, .doc-prose > .tex-cols { margin-top: 0; }

.tex-center { text-align: center; }

.tex-proof {
    margin: 0.5em 0;
    padding-left: 0.75em;
    border-left: 2px solid var(--border, #ccc);
}

/* \CenterInline{#1}{#2} (macros.tex) : #1 au fer à gauche à largeur
   naturelle, #2 centré dans le reste de la ligne (cf. \makebox coté LaTeX) —
   bloc à lui seul (le \par de la macro LaTeX termine le paragraphe). */
.tex-center-inline {
    display: flex;
    align-items: flex-start;
}
.tex-center-inline-label { flex: 0 0 auto; }
.tex-center-inline-content { flex: 1 1 auto; text-align: center; }

.tex-partie {
    counter-increment: tex-partie;
    text-align: center;
    font-weight: 700;
    font-size: 1.05em;
    margin: 1em 0 0.5em;
}
/* Pas de scrollbar dans les cards : un contenu intrinsèquement large et non
   compressible (listes en colonnes .tex-cols, matrices/systèmes en grille,
   tableaux, formule KaTeX trop longue) peut déborder visuellement de la card
   plutôt que de déclencher un scroll local. */
.content, .doc-prose {
    counter-reset: tex-partie;
}
.tex-partie::before {
    content: "Partie " counter(tex-partie, upper-roman) ". ";
}

/* \begin{tabular}{...}...\end{tabular} (apps/thomaths/services/latex_engine/
   converter.py::_render_tabular) : rendu en <table> natif (KaTeX ne supporte
   pas tabular, cf. commentaire de math.py) — wrapper avec overflow-x pour ne
   jamais faire déborder la card sur un tableau large. */
.tex-table-wrap { overflow-x: auto; margin: 0.6em 0; }
.tex-table { border-collapse: collapse; margin: 0 auto; }
.tex-table td {
    /* Bordures posées au cas par cas en inline style par le convertisseur
       (converter.py, _render_tabular) selon les \hline/| réellement présents
       dans la source — pas de bordure par défaut ici. Couleur alignée sur
       le même bleu que InlineBox/ColorBox (--accent, cf. plus bas) plutôt
       que --border (bien plus pâle) : sinon la même notion de "bleu" du
       cours rendait différemment selon qu'elle vienne d'un tableau ou d'un
       autre élément. */
    border-color: var(--accent, #6d7bff);
    border-style: solid;
    border-width: 0;
    padding: 0.4em 0.8em;
    vertical-align: middle;
}

/* \begin{AlignedList}[spec] (apps/thomaths/services/latex_engine/converter.py
   ::_render_aligned_list) : itemize dont chaque \AItem aligne ses colonnes de
   préfixe sur la plus large de leur colonne — une vraie <table> fait ça
   nativement (table-layout auto = largeur de colonne = son contenu le plus
   large, sur toutes les lignes), pas besoin de rejouer le \settowidth de la
   version LaTeX (macros.tex). Pas de bordures (ni tex-table ni tex-table-wrap
   : ce n'est pas un tableau visuel, juste un alignement). */
.tex-alignedlist { border-collapse: collapse; width: 100%; margin: 0.4em 0; }
.tex-alignedlist td { vertical-align: baseline; padding: 0.15em 0; }
.tex-alignedlist-bullet {
    padding-right: 0.5em;
    color: var(--accent, #6d7bff);
}
.tex-alignedlist-col { padding-right: 0.6em; white-space: nowrap; }
.tex-alignedlist-free { width: 100%; }
/* \hfill dans une colonne AlignedList (converter.py, _render_aligned_cell) :
   équivalent HTML du glue `fill` LaTeX — absorbe tout l'espace restant de la
   colonne (déjà à largeur fixe, cf. table-layout natif ci-dessus). */
.tex-hfill-wrap { display: inline-flex; width: 100%; }
.tex-hfill-spacer { flex: 1 0 auto; }

/* `table` (float) / `minipage` (converter.py, _BLOCK_ENVIRONMENTS) :
   plusieurs minipage voisines (souvent deux tableaux côte à côte) doivent
   s'aligner en ligne, pas s'empiler — inline-block + vertical-align:top
   reproduit l'effet du \hfill entre elles (ignoré côté conversion, cf.
   _NOOP_CMDS) sans avoir besoin de le traduire explicitement. */
.tex-table-float { margin: 0.8em 0; text-align: center; }
.tex-minipage { display: inline-block; vertical-align: top; text-align: center; }
.tex-minipage + .tex-minipage { margin-left: 1.5em; }
/* \caption*{...} (souvent sous un tableau de minipage) : légende discrète,
   pas un paragraphe de texte normal. */
.tex-caption { font-size: 0.9em; font-style: italic; opacity: 0.75; margin-top: 0.3em; }

.tex-unsupported {
    font-style: italic;
    color: var(--text-faint, #888);
    padding: 0.5em;
    border: 1px dashed var(--border, #ccc);
    border-radius: 4px;
}

/* Commande LaTeX sans macro/gestion connue côté moteur maison (converter.py,
   repli du parseur générique) : signalée en ligne plutôt que silencieusement
   avalée, pour repérer une macro manquante sans avoir à comparer au PDF. */
.tex-unknown-cmd {
    color: var(--latex-error);
    background: rgba(var(--latex-error-rgb), 0.12);
    border: 1px solid rgba(var(--latex-error-rgb), 0.35);
    border-radius: 3px;
    padding: 0 3px;
    font-family: "Fira Code", "Consolas", monospace;
    font-size: 0.85em;
}

/* \CRef{label} (converter.py + resolveCRefs dans katex_typeset.js) : lien
   vers le bloc numéroté (Def/Thm/Prop...) portant ce label dans la feuille. */
.tex-cref {
    color: var(--link-color, #4a90d9);
    text-decoration: none;
    border-bottom: 1px dotted currentColor;
}
.tex-cref:hover {
    text-decoration: none;
    border-bottom-style: solid;
}
.tex-cref-broken {
    color: var(--latex-error);
    border-bottom-color: var(--latex-error);
    cursor: help;
}

/* \Systeme{...} (apps/thomaths/services/latex_engine/systeme.py) : rendu
   entièrement délégué à KaTeX (\left\{\begin{array}...\end{array}\right.)
   depuis la migration hors CSS Grid maison — plus de classes dédiées ici. */

/* \begin{tikzpicture}...\end{tikzpicture} (apps/thomaths/services/latex_engine/
   tikz.py) : image SVG précompilée (fond transparent, couleurs déjà
   adaptées au thème sombre à la compilation) — juste centrée et contrainte
   en largeur ici, pas de filtre CSS supplémentaire. */
.tex-tikz {
    display: block;
    max-width: 100%;
    margin: 0.75em auto;
}
