/* Styles communs des widgets NotebookLM. Tout est piloté par les variables
   --nlm-* posées en inline sur chaque conteneur .nlm-widget (cascade de réglages). */

.nlm-widget {
	--nlm-accent: #2b6cb0;
	--nlm-accent-dark: #255a97;
	--nlm-correct: #2f855a;
	--nlm-correct-dark: #22643f;
	--nlm-bg: #ffffff;
	--nlm-text: #1a202c;
	--nlm-font: Arial, Helvetica, sans-serif;
	--nlm-font-size: 16px;
	--nlm-radius: 10px;
	--nlm-max-width: 640px;
	/* Couleur des flashcards une fois évaluées (indépendante des réglages de cascade,
	   même teintes sur tous les thèmes) : sue = vert clair, à revoir = orange clair. */
	--nlm-status-known: #8ed7b3;
	--nlm-status-known-dark: #6aa386;
	--nlm-status-review: #e9a07c;
	--nlm-status-review-dark: #af785d;
	/* Statut "passée" (récap flashcards uniquement, pas un statut de carte vivante) */
	--nlm-ignored: #a0aec0;
	--nlm-ignored-dark: #7c8ba1;

	font-family: var(--nlm-font);
	font-size: var(--nlm-font-size);
	color: var(--nlm-text);
	max-width: var(--nlm-max-width);
	margin: 0 auto;
	box-sizing: border-box;
}
.nlm-widget * { box-sizing: border-box; }

.nlm-widget button {
	font-family: inherit;
	cursor: pointer;
	border: none;
	border-radius: var(--nlm-radius);
	background: var(--nlm-accent);
	color: #fff;
	padding: 10px 18px;
	font-size: 15px;
	transition: background .2s;
	/* Sans ça, le rendu natif du bouton (thème OS) peut laisser un fond gris
	   "pressé" transparaître par endroits sur certains navigateurs/OS, même
	   avec un background explicite posé au-dessus. */
	-webkit-appearance: none;
	appearance: none;
}
.nlm-widget button:hover { background: var(--nlm-accent-dark); }
.nlm-widget button:disabled { opacity: .4; cursor: default; }
.nlm-widget button.nlm-sec { background: #edf1f7; color: #2d3748; }
.nlm-widget button.nlm-sec:hover { background: #dfe6f0; }

/* ---------- FORMULES (KaTeX) ---------- */
/* Un $...$ ne doit jamais être coupé par un retour à la ligne — notamment dans les
   nœuds de mindmap (overflow-wrap:break-word pour tenir dans leur largeur). Testé :
   sans cette règle, une formule trop large pour son conteneur se coupe en plein
   milieu au lieu de déborder proprement. */
.nlm-widget .katex { white-space: nowrap; }
.nlm-widget .katex-display { overflow-x: auto; overflow-y: hidden; max-width: 100%; }

/* ---------- QUIZ — design "Arcade néon" (v0.10.0) ---------- */
/* --nlm-qz-accent2 : second ton du bandeau dégradé + lettres/bouton indice —
   fixe, signature du design (même principe que --nlm-status-known/review pour
   les flashcards : une couleur dédiée, PAS dérivée de la cascade). L'autre
   extrémité du dégradé utilise var(--nlm-accent) (déjà configurable) : le rendu
   par défaut reproduit donc exactement la maquette validée, --nlm-accent valant
   #2b6cb0 par défaut — et suit un changement d'accent dans les réglages. */
.nlm-widget.nlm-quiz {
	--nlm-qz-accent2: #6a3df5;
	--nlm-qz-card-bg: #fff;
	--nlm-qz-card-shadow: 0 4px 16px rgba(45,55,90,.12);
	--nlm-qz-body-text: var(--nlm-text);
	--nlm-qz-opt-bg: #f7f8fb;
	--nlm-qz-opt-border: #e2e6ef;
	--nlm-qz-opt-hover-bg: #f2f0ff;
	--nlm-qz-letter-color: var(--nlm-qz-accent2);
	--nlm-qz-correct-border: #16a34a;
	--nlm-qz-correct-bg: #a7f3d0;
	--nlm-qz-correct-glow: rgba(22,163,74,.4);
	--nlm-qz-correct-text: #14532d;
	--nlm-qz-incorrect-border: #dc2626;
	--nlm-qz-incorrect-bg: #fecaca;
	--nlm-qz-incorrect-glow: rgba(220,38,38,.32);
	--nlm-qz-incorrect-text: #7f1d1d;
	--nlm-qz-hint-hover-text: #fff;
	--nlm-qz-rationale-bg: #a7f3d0;
	--nlm-qz-rationale-text: #14532d;
	--nlm-qz-muted-text: #6b7280;
	--nlm-qz-track: #e2e6ef;
}
.nlm-widget.nlm-quiz[data-theme="dark"] {
	--nlm-qz-card-bg: #1a1f2e;
	--nlm-qz-card-shadow: 0 10px 30px rgba(0,0,0,.3);
	--nlm-qz-body-text: #e2e8f0;
	--nlm-qz-opt-bg: #262c40;
	--nlm-qz-opt-border: #363e58;
	--nlm-qz-opt-hover-bg: #2c3350;
	--nlm-qz-letter-color: #8b93ff;
	--nlm-qz-correct-border: #4ade80;
	--nlm-qz-correct-bg: #173322;
	--nlm-qz-correct-glow: rgba(74,222,128,.4);
	--nlm-qz-correct-text: #86efac;
	--nlm-qz-incorrect-border: #f87171;
	--nlm-qz-incorrect-bg: #3a1a1a;
	--nlm-qz-incorrect-glow: rgba(248,113,113,.3);
	--nlm-qz-incorrect-text: #fca5a5;
	--nlm-qz-hint-hover-text: #1a1f2e;
	--nlm-qz-rationale-bg: #173322;
	--nlm-qz-rationale-text: #86efac;
	--nlm-qz-muted-text: #a3adc7;
	--nlm-qz-track: #363e58;
}
.nlm-quiz .nlm-qz-card { background: var(--nlm-qz-card-bg); border-radius: 20px; overflow: hidden; box-shadow: var(--nlm-qz-card-shadow); color: var(--nlm-qz-body-text) !important; }

.nlm-quiz .nlm-qz-head { background: linear-gradient(90deg, var(--nlm-qz-accent2), var(--nlm-accent)); padding: 14px 20px 18px; }
.nlm-quiz .nlm-qz-headrow { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 8px; }
.nlm-quiz .nlm-qz-chip { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: #fff !important; font-size: 12.5px; background: rgba(255,255,255,.18); padding: 5px 12px; border-radius: 999px; justify-self: start; white-space: nowrap; }
.nlm-quiz .nlm-qz-streak { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: #ffd76b !important; font-size: 12.5px; justify-self: end; white-space: nowrap; }
/* Pas de couleur dans la classe de base : le bouton bascule thème est utilisé
   dans DEUX contextes de fond très différents (bandeau dégradé de l'en-tête,
   toujours sombre-ish quel que soit le thème du site ; fond plein du récap,
   qui SUIT le thème clair/sombre) — .theme-btn-dark/.theme-btn-light portent
   les couleurs adaptées à chacun. Piège corrigé : l'ancienne classe unique,
   codée en dur pour le fond blanc du bandeau, rendait le bouton du récap
   quasi invisible (bordure/texte blancs) sur la carte blanche du thème clair. */
.nlm-quiz .nlm-qz-theme-btn { justify-self: center; font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 11.5px; border-style: solid; border-width: 1.5px; border-radius: 999px; padding: 5px 12px; }
.nlm-quiz .nlm-qz-theme-btn.theme-btn-dark { border-color: rgba(255,255,255,.55) !important; background: rgba(255,255,255,.12) !important; color: #fff !important; }
.nlm-quiz .nlm-qz-theme-btn.theme-btn-dark:hover { background: rgba(255,255,255,.26) !important; }
.nlm-quiz .nlm-qz-theme-btn.theme-btn-light { border-color: rgb(185 212 78 / 55%) !important; background: rgba(255,255,255,.12) !important; color: #666 !important; }
.nlm-quiz .nlm-qz-theme-btn.theme-btn-light:hover { color: #666 !important; background: #bfbfbf !important; }
.nlm-quiz .nlm-qz-head .nlm-qz-question { font-family: 'Fredoka', var(--nlm-font); color: #fff !important; font-weight: 600; font-size: 1.12em; margin-top: 10px; line-height: 1.45; }

.nlm-quiz .nlm-qz-body { padding: 20px 20px 18px; }
.nlm-quiz .nlm-qz-opts { display: grid !important; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 4px; }
.nlm-quiz .nlm-qz-opt {
	display: flex !important; align-items: flex-start; gap: 8px; text-align: left;
	background: var(--nlm-qz-opt-bg) !important; color: var(--nlm-qz-body-text) !important;
	border: 2.5px solid var(--nlm-qz-opt-border); border-radius: 12px;
	padding: 14px 12px; font-size: 13.5px; font-weight: 400;
	transition: border-color .15s, background .15s, box-shadow .15s;
}
.nlm-quiz .nlm-qz-opt .nlm-qz-opt-text { color: var(--nlm-qz-body-text) !important; flex: 1; }
.nlm-quiz .nlm-qz-opt:hover:not(:disabled) { border-color: var(--nlm-qz-accent2); background: var(--nlm-qz-opt-hover-bg) !important; }
.nlm-quiz .nlm-qz-opt .nlm-qz-letter { flex: 0 0 auto; font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: var(--nlm-qz-letter-color) !important; background: none; width: auto; height: auto; }
.nlm-quiz .nlm-qz-opt.correct { border-color: var(--nlm-qz-correct-border); background: var(--nlm-qz-correct-bg) !important; box-shadow: 0 0 0 6px var(--nlm-qz-correct-glow); animation: nlmQzPop .4s ease; }
.nlm-quiz .nlm-qz-opt.correct .nlm-qz-letter { color: var(--nlm-qz-correct-text) !important; }
.nlm-quiz .nlm-qz-opt.incorrect { border-color: var(--nlm-qz-incorrect-border); background: var(--nlm-qz-incorrect-bg) !important; box-shadow: 0 0 0 5px var(--nlm-qz-incorrect-glow); }
.nlm-quiz .nlm-qz-opt.incorrect .nlm-qz-letter { color: var(--nlm-qz-incorrect-text) !important; }
@keyframes nlmQzPop { 0% { transform: scale(1); } 45% { transform: scale(1.06); } 100% { transform: scale(1); } }

.nlm-quiz .nlm-qz-info { min-height: 22px; margin: 6px 2px 10px; }
.nlm-quiz .nlm-qz-hint-text { font-size: 12.5px; color: var(--nlm-qz-muted-text) !important; font-style: italic; }
.nlm-quiz .nlm-qz-rationale { background: var(--nlm-qz-rationale-bg) !important; color: var(--nlm-qz-rationale-text) !important; font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 13.5px; line-height: 1.5; padding: 12px 14px; border-radius: 12px; }

/* Grid 3 colonnes (au lieu d'un simple flex justify-content:flex-end) : la
   colonne centrale garantit que le bouton Imprimer reste visuellement AU
   MILIEU de la ligne, entre l'indice et Suivant, que le bouton indice soit
   présent ou non pour la question courante (v0.29.2, demande explicite) — une
   colonne gauche VIDE (.nlm-qz-nav-left, toujours rendue même sans indice)
   maintient les 3 enfants attendus par le grid, sans quoi le bouton Imprimer
   se retrouverait auto-placé en colonne 1 (donc à gauche) dès qu'il n'y a pas
   d'indice à afficher. */
.nlm-quiz .nlm-qz-nav { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 10px; }
.nlm-quiz .nlm-qz-nav-left { justify-self: start; }
.nlm-quiz .nlm-qz-nav > .nlm-qz-btn-primary { justify-self: end; }
.nlm-quiz .nlm-qz-hint-btn { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 12.5px; border: 2px solid var(--nlm-qz-accent2) !important; background: transparent !important; color: var(--nlm-qz-accent2) !important; border-radius: 999px; padding: 9px 15px; display: inline-flex; align-items: center; gap: 6px; }
.nlm-quiz .nlm-qz-hint-btn:hover:not(:disabled) { background: var(--nlm-qz-accent2) !important; color: var(--nlm-qz-hint-hover-text) !important; }
.nlm-quiz .nlm-qz-btn-primary { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 14px; background: linear-gradient(90deg, var(--nlm-qz-accent2), var(--nlm-accent)) !important; color: #fff !important; border-radius: 12px; padding: 11px 22px; transition: filter .15s; }
.nlm-quiz .nlm-qz-btn-primary:hover:not(:disabled) { filter: brightness(.88); background: linear-gradient(90deg, var(--nlm-qz-accent2), var(--nlm-accent)) !important; }
/* Bouton "Imprimer" : colonne centrale de .nlm-qz-nav (voir ci-dessus), même
   taille que .nlm-fc-print des flashcards (35px / 21px, demande explicite —
   "pareil que pour les flashcards"), mais couleurs/forme reprenant le langage
   visuel déjà établi de CE widget (pastille, comme .nlm-qz-hint-btn) plutôt
   que le gris neutre .nlm-sec des flashcards. PAS de contour par défaut
   (v0.29.5, demande explicite) — seul le survol reste rempli/coloré. */
.nlm-quiz .nlm-qz-print {
	justify-self: center;
	width: 35px; height: 35px; font-size: 21px;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	line-height: 1;
	border-radius: 999px;
	border: 2px solid transparent;
	background: transparent !important;
	color: var(--nlm-qz-accent2) !important;
}
.nlm-quiz .nlm-qz-print:hover { background: var(--nlm-qz-accent2) !important; color: var(--nlm-qz-hint-hover-text) !important; }

/* ---------- Récap quiz ---------- */
.nlm-quiz .nlm-qz-recap-theme-row { margin-bottom: 10px; }
.nlm-quiz .nlm-qz-recap-top { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin-bottom: 16px; }
.nlm-quiz .nlm-qz-recap-msg { flex: 1 1 240px; font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 1.25em; line-height: 1.35; color: var(--nlm-qz-body-text) !important; }
.nlm-quiz .nlm-qz-ring-wrap { position: relative; width: 104px; height: 104px; flex: 0 0 auto; }
.nlm-quiz .nlm-qz-ring-wrap svg { width: 104px; height: 104px; }
.nlm-quiz .nlm-qz-ring-center { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.nlm-quiz .nlm-qz-ring-frac { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 17px; color: var(--nlm-qz-body-text) !important; }
.nlm-quiz .nlm-qz-ring-pct { font-size: 12px; color: var(--nlm-qz-muted-text) !important; font-weight: 600; }
.nlm-quiz .nlm-qz-ring-time { font-size: 10.5px; color: var(--nlm-qz-muted-text) !important; margin-top: 2px; }

.nlm-quiz .nlm-qz-recap-controls { display: flex; gap: 8px; align-items: center; margin-bottom: 14px; flex-wrap: wrap; }
.nlm-quiz .nlm-qz-filter-btn { font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 12px; border-radius: 999px; padding: 6px 13px; background: transparent !important; color: var(--nlm-qz-muted-text) !important; border: 2px solid var(--nlm-qz-opt-border); }
.nlm-quiz .nlm-qz-filter-btn.all { border-color: var(--nlm-qz-accent2); color: var(--nlm-qz-accent2) !important; }
.nlm-quiz .nlm-qz-filter-btn.all.is-active { background: linear-gradient(90deg, var(--nlm-qz-accent2), var(--nlm-accent)) !important; border-color: transparent; color: #fff !important; }
.nlm-quiz .nlm-qz-filter-btn.all:hover:not(.is-active) { background: var(--nlm-qz-accent2) !important; border-color: transparent; color: #fff !important; }
.nlm-quiz .nlm-qz-filter-btn.all.is-active:hover { filter: brightness(.9); }
.nlm-quiz .nlm-qz-filter-btn.err { border-color: var(--nlm-qz-incorrect-border); color: var(--nlm-qz-incorrect-border) !important; }
.nlm-quiz .nlm-qz-filter-btn.err.is-active { background: var(--nlm-qz-incorrect-border) !important; border-color: transparent; color: #fff !important; }
.nlm-quiz .nlm-qz-filter-btn.err:hover:not(.is-active) { background: var(--nlm-qz-incorrect-border) !important; border-color: transparent; color: #fff !important; }
.nlm-quiz .nlm-qz-filter-btn.err.is-active:hover { filter: brightness(.9); }
.nlm-quiz .nlm-qz-toggleview { margin-left: auto; font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 12px; border-radius: 999px; padding: 6px 14px; background: transparent !important; color: var(--nlm-qz-muted-text) !important; border: 2px dashed var(--nlm-qz-opt-border); }
.nlm-quiz .nlm-qz-toggleview:hover { background: var(--nlm-qz-opt-hover-bg) !important; border-color: var(--nlm-qz-accent2); color: var(--nlm-qz-accent2) !important; }

.nlm-quiz .nlm-qz-recap-group-head { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 12px; margin: 14px 0 8px; text-transform: uppercase; letter-spacing: .03em; }
.nlm-quiz .nlm-qz-recap-group-head.err { color: var(--nlm-qz-incorrect-border) !important; }
.nlm-quiz .nlm-qz-recap-group-head.ok { color: var(--nlm-qz-correct-border) !important; }
.nlm-quiz .nlm-qz-recap-group-head:first-child { margin-top: 0; }

.nlm-quiz .nlm-qz-recap-item { display: flex; gap: 10px; padding: 11px 12px; border-radius: 10px; margin-bottom: 8px; align-items: flex-start; border-left: 4px solid; }
.nlm-quiz .nlm-qz-recap-item.ok { background: var(--nlm-qz-correct-bg) !important; border-color: var(--nlm-qz-correct-border); }
.nlm-quiz .nlm-qz-recap-item.err { background: var(--nlm-qz-incorrect-bg) !important; border-color: var(--nlm-qz-incorrect-border); }
.nlm-quiz .nlm-qz-recap-badge { font-weight: 700; flex: 0 0 auto; }
.nlm-quiz .nlm-qz-recap-item.ok .nlm-qz-recap-badge { color: var(--nlm-qz-correct-text) !important; }
.nlm-quiz .nlm-qz-recap-item.err .nlm-qz-recap-badge { color: var(--nlm-qz-incorrect-text) !important; }
.nlm-quiz .nlm-qz-recap-q { font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 13px; color: var(--nlm-qz-body-text) !important; display: block; }
.nlm-quiz .nlm-qz-recap-a { font-size: 12px; font-style: italic; color: var(--nlm-qz-muted-text) !important; margin-top: 2px; display: block; }

.nlm-quiz .nlm-qz-recap-nav { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; }
.nlm-quiz .nlm-qz-btn-secondary { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 13px; background: var(--nlm-qz-opt-bg) !important; color: var(--nlm-qz-body-text) !important; border: 2px solid var(--nlm-qz-opt-border) !important; border-radius: 12px; padding: 10px 18px; }
.nlm-quiz .nlm-qz-btn-secondary:hover { background: var(--nlm-qz-opt-hover-bg) !important; border-color: var(--nlm-qz-accent2) !important; color: var(--nlm-qz-accent2) !important; }

/* ---------- Feu d'artifice "bonne réponse" (nlm-quiz-fireworks.js) ---------- */
.nlm-qz-fw-bravo {
	position: fixed; left: 50%; top: 38%; transform: translate(-50%,-50%) scale(0);
	font-family: 'Fredoka', sans-serif; font-weight: 700; font-size: 56px; white-space: nowrap;
	background: linear-gradient(90deg,#6a3df5,#2b6cb0,#4ade80,#f97316);
	-webkit-background-clip: text; background-clip: text; color: transparent;
	filter: drop-shadow(0 4px 14px rgba(0,0,0,.25));
	z-index: 999999; pointer-events: none;
	animation: nlmQzFwBravoPop 1.7s cubic-bezier(.34,1.56,.64,1) forwards;
}
@keyframes nlmQzFwBravoPop {
	0% { transform: translate(-50%,-50%) scale(0); opacity: 0; }
	15% { transform: translate(-50%,-50%) scale(1.15); opacity: 1; }
	25% { transform: translate(-50%,-50%) scale(1); opacity: 1; }
	82% { transform: translate(-50%,-50%) scale(1); opacity: 1; }
	100% { transform: translate(-50%,-50%) scale(.92); opacity: 0; }
}

/* ---------- FLASHCARDS ---------- */
.nlm-flashcards .nlm-fc-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; font-size: 14px; color: #555; gap: 12px; }
.nlm-flashcards .nlm-fc-count { flex: 0 0 auto; white-space: nowrap; }
.nlm-flashcards .nlm-fc-counters { flex: 0 0 auto; white-space: nowrap; display: inline-flex; align-items: center; gap: 4px; font-weight: 600; }
.nlm-flashcards .nlm-fc-c-known { color: var(--nlm-correct, #2f855a); }
.nlm-flashcards .nlm-fc-c-review { color: #c53030; }
.nlm-flashcards .nlm-fc-c-ignored { color: #555; }
.nlm-flashcards .nlm-fc-c-sep { color: #cbd5e0; font-weight: 400; }
.nlm-flashcards .nlm-fc-progress { flex: 1 1 auto; height: 8px; background: #e6e9ef; border-radius: 4px; overflow: hidden; min-width: 50px; }
.nlm-flashcards .nlm-fc-bar { display: block; height: 100%; background: var(--nlm-accent, #2b6cb0); width: 0; transition: width .3s; }
.nlm-flashcards .nlm-fc-instructions { font-size: 13px; color: #718096; margin-bottom: 12px; line-height: 1.45; }
.nlm-flashcards .nlm-fc-emph { font-size: 1.15em; font-weight: 700; color: var(--nlm-text); }

/* Scène + carte "jeton de jeu" + animations.
   overflow:hidden clippe le glissement horizontal de la carte "précédente" fantôme
   (.nlm-fc-card-prev, utilisée pour l'effet de poussée de « Précédent ») ; sans ça,
   au repos hors-champ (translateX(-100%)), elle reste partiellement visible dans la
   marge gauche sur une mise en page étroite. La hauteur réserve 30px au-dessus
   (médaillon qui dépasse, top:-26px) ET 6px en dessous (ombre "pressée" de la carte,
   box-shadow 0 6px 0 — sans cette marge, le bas de l'ombre est rogné par le clip). */
.nlm-flashcards .nlm-fc-stage { position: relative; margin-bottom: 16px; height: 226px; overflow: hidden; perspective: 1200px; }
.nlm-flashcards .nlm-fc-card, .nlm-flashcards .nlm-fc-card-prev { position: absolute; top: 30px; left: 0; width: 100%; height: 190px; }
.nlm-flashcards .nlm-fc-card { cursor: pointer; transform-origin: center center; z-index: 1; }
.nlm-flashcards .nlm-fc-card-prev { z-index: 2; transform: translateX(-100%); pointer-events: none; }
.nlm-flashcards .nlm-fc-inner { position: relative; width: 100%; height: 100%; transition: transform .65s cubic-bezier(.68,-0.55,.27,1.55); transform-style: preserve-3d; }
.nlm-flashcards .nlm-fc-card.flipped .nlm-fc-inner { transform: rotateY(180deg); }
.nlm-flashcards .nlm-fc-face {
	position: absolute; inset: 0; backface-visibility: hidden; -webkit-backface-visibility: hidden;
	display: flex; align-items: center; justify-content: center; text-align: center;
	padding: 34px 24px 30px; border-radius: 20px; box-sizing: border-box;
	border: 3px solid var(--nlm-accent); background: var(--nlm-bg); box-shadow: 0 6px 0 var(--nlm-accent-dark);
}
.nlm-flashcards .nlm-fc-back { border-color: var(--nlm-correct); box-shadow: 0 6px 0 var(--nlm-correct-dark); transform: rotateY(180deg); }
.nlm-flashcards .nlm-fc-medal {
	position: absolute; top: -26px; left: 50%; transform: translateX(-50%);
	width: 52px; height: 52px; border-radius: 50%; background: var(--nlm-accent);
	border: 3px solid #fff; display: flex; align-items: center; justify-content: center;
	font-size: 24px; box-shadow: 0 4px 8px rgba(0,0,0,.25);
}
.nlm-flashcards .nlm-fc-back .nlm-fc-medal { background: var(--nlm-correct); }
.nlm-flashcards .nlm-fc-label { display: block; margin-bottom: 8px; font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: #a0aec0; font-size: 12px; letter-spacing: .04em; text-transform: uppercase; }
.nlm-flashcards .nlm-fc-text { font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 1.15em; line-height: 1.5; color: var(--nlm-text); }
/* Indice de retournement : fait partie de la carte (recto ET verso, + la carte
   "précédente" fantôme), donc animé avec elle plutôt qu'affiché à côté. */
.nlm-flashcards .nlm-fc-flip-hint { position: absolute; bottom: 10px; left: 14px; font-size: 11px; color: #a0aec0; white-space: nowrap; }

/* Couleur pilotée par le STATUT de la carte (pas par la face affichée) : sue = vert
   clair, à revoir = orange clair, sans statut = couleurs de base ci-dessus. */
.nlm-flashcards :is(.nlm-fc-card, .nlm-fc-card-prev).nlm-fc-status-known .nlm-fc-face { border-color: var(--nlm-status-known); box-shadow: 0 6px 0 var(--nlm-status-known-dark); }
.nlm-flashcards :is(.nlm-fc-card, .nlm-fc-card-prev).nlm-fc-status-known .nlm-fc-medal { background: var(--nlm-status-known); }
.nlm-flashcards :is(.nlm-fc-card, .nlm-fc-card-prev).nlm-fc-status-review .nlm-fc-face { border-color: var(--nlm-status-review); box-shadow: 0 6px 0 var(--nlm-status-review-dark); }
.nlm-flashcards :is(.nlm-fc-card, .nlm-fc-card-prev).nlm-fc-status-review .nlm-fc-medal { background: var(--nlm-status-review); }

/* Animations de sortie/entrée de .nlm-fc-card (indépendantes de .nlm-fc-inner
   ci-dessus, qui gère uniquement le retournement) : chute tirelire (Je savais),
   secousse + repli (À revoir), rotation 3D (Suivant), glissement (Précédent — la
   carte précédente, .nlm-fc-card-prev, entre et pousse la carte actuelle dehors). */
.nlm-flashcards .nlm-fc-card.nlm-fc-reenter { animation: nlmFcReenter .25s ease; }
@keyframes nlmFcReenter { from { opacity: 0; transform: scale(.9); } to { opacity: 1; transform: scale(1); } }

@keyframes nlmFcExitKnown { 0% { transform: translate(0,0) rotate(0) scale(1); opacity: 1; } 100% { transform: translate(var(--nlm-fc-tx,0px), var(--nlm-fc-ty,0px)) rotate(-16deg) scale(.1); opacity: 0; } }
/* La secousse reprend les mêmes repères que le reste de l'UI (15/30/45%, ±5px/2px) ;
   le repli final (45%→100%, un seul segment) tombe vers --nlm-fc-tx/--nlm-fc-ty —
   la position réelle du bouton "À revoir", calculée en JS au moment du clic. */
@keyframes nlmFcExitReview { 0% { transform: translate(0,0) rotate(0) scale(1); opacity: 1; } 15% { transform: translate(-5px,0) rotate(0) scale(1); opacity: 1; } 30% { transform: translate(5px,0) rotate(0) scale(1); opacity: 1; } 45% { transform: translate(-2px,0) rotate(0) scale(1); opacity: 1; } 100% { transform: translate(var(--nlm-fc-tx,0px), var(--nlm-fc-ty,0px)) rotate(14deg) scale(.1); opacity: 0; } }
@keyframes nlmFcExitNext { 0% { transform: translateX(0) rotateY(0); opacity: 1; } 100% { transform: translateX(75%) rotateY(180deg) scale(.5); opacity: 0; } }
/* Ni "exitPrev" ni "enterPrev" ne touchent à l'opacité : la carte qui pousse
   (.nlm-fc-card-prev) est déjà, à la toute fin, exactement là où .nlm-fc-card doit
   réapparaître (même position, pleinement opaque) — pas besoin (et pas souhaitable :
   ça provoquerait un flash) de fondu à la reprise. */
@keyframes nlmFcExitPrev { 0% { transform: translateX(0); } 100% { transform: translateX(100%); } }
@keyframes nlmFcEnterPrev { 0% { transform: translateX(-100%); } 100% { transform: translateX(0); } }

.nlm-flashcards .nlm-fc-card[data-play="known"] { animation: nlmFcExitKnown .5s cubic-bezier(.55,.06,.68,.19) forwards; }
.nlm-flashcards .nlm-fc-card[data-play="review"] { animation: nlmFcExitReview .55s ease-in forwards; }
.nlm-flashcards .nlm-fc-card[data-play="next"] { animation: nlmFcExitNext .45s ease-in forwards; }
.nlm-flashcards .nlm-fc-card[data-play="prev"] { animation: nlmFcExitPrev .65s cubic-bezier(.4,0,.2,1) forwards; }
.nlm-flashcards .nlm-fc-card-prev[data-play="enter"] { animation: nlmFcEnterPrev .65s cubic-bezier(.4,0,.2,1) forwards; }
@media (prefers-reduced-motion: reduce) {
	.nlm-flashcards .nlm-fc-card[data-play], .nlm-flashcards .nlm-fc-card-prev[data-play], .nlm-flashcards .nlm-fc-card.nlm-fc-reenter { animation-duration: .01s; }
}

/* .nlm-fc-controls-nav (Précédent/Suivant) est un groupe centré indépendant, comme
   .nlm-fc-assess (Je savais/À revoir) juste au-dessus — même largeur totale une fois
   les boutons alignés par paire en JS (buildUI()), donc centrés au même endroit sans
   avoir besoin de partager un conteneur commun. .nlm-fc-print est sorti du flux
   (position:absolute) pour ne jamais perturber ce centrage : il se cale au bord droit
   de LA LIGNE ENTIÈRE (.nlm-fc-controls), indépendamment de la largeur du groupe
   centré Précédent/Suivant. */
.nlm-flashcards .nlm-fc-controls { position: relative; display: flex; align-items: center; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; min-height: 35px; }
.nlm-flashcards .nlm-fc-controls-nav { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; }
.nlm-flashcards .nlm-fc-assess { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; margin-bottom: 14px; }
.nlm-flashcards button.nlm-fc-known { background: var(--nlm-correct); }
.nlm-flashcards button.nlm-fc-review { background: #c05621; }
.nlm-flashcards .nlm-fc-status { text-align: center; font-size: 13px; color: #718096; margin-bottom: 10px; min-height: 18px; }

/* Récapitulatif flashcards */
.nlm-flashcards .nlm-fc-recap-top { display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; margin-bottom: 14px; }
.nlm-flashcards .nlm-fc-recap-title { margin: 0; font-family: 'Fredoka', var(--nlm-font); font-size: 1.5em; font-weight: 700; line-height: 1.3; color: var(--nlm-text); flex: 1 1 260px; min-width: 220px; }

/* Diagramme en anneau (récap) : 3 segments sues/à revoir/passées + légende.
   Couleurs alignées sur .nlm-fc-ring-* / .nlm-fc-legend-*. */
.nlm-flashcards .nlm-fc-chart { display: flex; align-items: center; gap: 16px; flex: 0 0 auto; }
.nlm-flashcards .nlm-fc-ring-wrap { position: relative; width: 96px; height: 96px; flex: 0 0 auto; }
.nlm-flashcards .nlm-fc-ring { width: 100%; height: 100%; display: block; }
.nlm-flashcards .nlm-fc-ring-bg { fill: none; stroke: #edf1f7; stroke-width: 12; }
.nlm-flashcards .nlm-fc-ring-seg { fill: none; stroke-width: 12; }
.nlm-flashcards .nlm-fc-ring-rotate { transform-origin: 60px 60px; transform: rotate(-90deg); }
.nlm-flashcards .nlm-fc-ring-known { stroke: var(--nlm-correct, #2f855a); }
.nlm-flashcards .nlm-fc-ring-review { stroke: #c53030; }
.nlm-flashcards .nlm-fc-ring-ignored { stroke: #a0aec0; }
.nlm-flashcards .nlm-fc-ring-center { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; pointer-events: none; }
.nlm-flashcards .nlm-fc-ring-frac { font-size: 17px; font-weight: 700; color: var(--nlm-text); line-height: 1.15; }
.nlm-flashcards .nlm-fc-ring-pct { font-size: 11px; color: #718096; }
.nlm-flashcards .nlm-fc-ring-time { font-size: 10px; color: #a0aec0; margin-top: 1px; }
/* Grille (pas flex) : les 3 lignes partagent les MÊMES colonnes, donc la colonne
   symbole (✓/✗/→) tombe toujours à la même position horizontale d'une ligne à
   l'autre — c'est ce qui les aligne verticalement les uns sous les autres. Chaque
   .nlm-fc-legend-item est en display:contents : ses 4 enfants (puce, libellé,
   symbole, nombre) deviennent directement les cellules de la grille de la ligne. */
/* Légende réduite (11px, au lieu de 13px) : moins de poids visuel qu'à côté
   de l'anneau, qui porte déjà les mêmes chiffres. */
.nlm-flashcards .nlm-fc-legend { display: grid; grid-template-columns: auto auto auto auto; align-items: center; row-gap: 6px; column-gap: 7px; font-size: 11px; }
.nlm-flashcards .nlm-fc-legend-item { display: contents; font-weight: 700; white-space: nowrap; }
.nlm-flashcards .nlm-fc-legend-item b { justify-self: end; }
.nlm-flashcards .nlm-fc-legend-sym { justify-self: center; }
.nlm-flashcards .nlm-fc-legend-item-known { color: var(--nlm-correct, #2f855a); }
.nlm-flashcards .nlm-fc-legend-item-review { color: #c53030; }
.nlm-flashcards .nlm-fc-legend-item-ignored { color: #a0aec0; }
.nlm-flashcards .nlm-fc-legend-dot { width: 9px; height: 9px; border-radius: 50%; }
.nlm-flashcards .nlm-fc-legend-dot.nlm-fc-legend-known { background: var(--nlm-correct, #2f855a); }
.nlm-flashcards .nlm-fc-legend-dot.nlm-fc-legend-review { background: #c53030; }
.nlm-flashcards .nlm-fc-legend-dot.nlm-fc-legend-ignored { background: #a0aec0; }

/* Ligne de contrôles du récap : 3 boutons-filtres (Tout / à revoir / passées),
   recolorés selon les conventions déjà utilisées par les stickers de la liste
   (voir plus bas) — seul "Tout" reste neutre (bleu), n'ayant pas d'équivalent
   sticker — + un bouton bascule d'affichage aligné à droite sur la même ligne. */
.nlm-flashcards .nlm-fc-recap-controls { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.nlm-flashcards .nlm-fc-filter-btn { font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 12px; border-radius: 999px; padding: 6px 12px; cursor: pointer; border: 2px solid; background: #fff; }
.nlm-flashcards .nlm-fc-filter-btn:disabled { opacity: .45; cursor: default; }
.nlm-flashcards .nlm-fc-filter-all { border-color: var(--nlm-accent); color: var(--nlm-accent); }
.nlm-flashcards .nlm-fc-filter-all.is-active { background: var(--nlm-accent); color: #fff; }
/* Sans ce dernier, la règle générique .nlm-widget button:hover (plus
   spécifique que .nlm-fc-filter-all) assombrit déjà le fond au survol, mais
   ne touche pas le texte : bleu sur fond bleu foncé = illisible quand "Tout"
   n'est pas actif. */
.nlm-flashcards .nlm-fc-filter-all:hover:not(:disabled) { background: var(--nlm-accent-dark); color: #fff; }
.nlm-flashcards .nlm-fc-filter-review { border-color: var(--nlm-status-review); color: var(--nlm-status-review-dark); background: #fdf3ee; }
.nlm-flashcards .nlm-fc-filter-review.is-active { background: var(--nlm-status-review); color: #fff; }
.nlm-flashcards .nlm-fc-filter-review:hover:not(:disabled) { background: #db6b6b; border-color: #db6b6b; color: #fff; }
.nlm-flashcards .nlm-fc-filter-ignored { border-color: var(--nlm-ignored); color: var(--nlm-ignored-dark); background: #f4f5f7; }
.nlm-flashcards .nlm-fc-filter-ignored.is-active { background: var(--nlm-ignored); color: #fff; }
.nlm-flashcards .nlm-fc-filter-ignored:hover:not(:disabled) { background: #8596ad; border-color: #8596ad; color: #fff; }
/* Bouton bascule "Cartes groupées" / "Dans l'ordre des cartes" : neutre et
   discret (bordure pointillée) pour bien le distinguer des filtres qui
   changent le CONTENU affiché — lui ne change que sa PRÉSENTATION. */
.nlm-flashcards .nlm-fc-toggleview { margin-left: auto; font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 12px; border-radius: 999px; padding: 6px 14px 6px 12px; cursor: pointer; border: 2px dashed #cbd5e0; background: #fff; color: #4a5568; display: inline-flex; align-items: center; gap: 6px; }
.nlm-flashcards .nlm-fc-toggleview:hover { background: #cbd5e0; border-color: var(--nlm-accent); color: var(--nlm-accent); }
/* Le fond ne doit rester grisé QUE pendant le survol : une fois le clic
   terminé (bouton relâché, plus survolé), il redevient blanc — sans ce reset
   explicite, certains navigateurs conservent l'état visuel "pressé" du
   bouton natif après un clic. */
.nlm-flashcards .nlm-fc-toggleview:active,
.nlm-flashcards .nlm-fc-toggleview:focus { background: #fff; }
.nlm-flashcards .nlm-fc-toggleview:hover:active,
.nlm-flashcards .nlm-fc-toggleview:hover:focus { background: #cbd5e0; }

.nlm-flashcards .nlm-fc-recap-list { margin-bottom: 16px; }

/* Carte-réponse en "sticker" (bordure colorée, fond pâle teinté par statut,
   badge en coin, légère inclinaison alternée) : remplace l'ancienne ligne
   plate à bordure fine. Réutilisée telle quelle dans les deux affichages
   (dans l'ordre des cartes / groupées par statut, voir JS renderList()). */
.nlm-flashcards .nlm-fc-recap-item { border-radius: 12px; border: 2px solid; padding: 9px 12px; position: relative; margin-bottom: 9px; }
.nlm-flashcards .nlm-fc-recap-item:nth-child(odd) { transform: rotate(-.4deg); }
.nlm-flashcards .nlm-fc-recap-item:nth-child(even) { transform: rotate(.4deg); }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-known { border-color: var(--nlm-status-known); background: #f1faf5; }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-review { border-color: var(--nlm-status-review); background: #fdf3ee; }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-ignored { border-color: var(--nlm-ignored); background: #f4f5f7; }
.nlm-flashcards .nlm-fc-recap-corner { position: absolute; top: -9px; right: 10px; width: 22px; height: 22px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; font-size: 10.5px; border: 2px solid #fff; }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-known .nlm-fc-recap-corner { background: var(--nlm-status-known); }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-review .nlm-fc-recap-corner { background: var(--nlm-status-review); }
.nlm-flashcards .nlm-fc-recap-item.nlm-fc-a-ignored .nlm-fc-recap-corner { background: var(--nlm-ignored); }
.nlm-flashcards .nlm-fc-recap-q { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 12.5px; margin-bottom: 1px; padding-right: 16px; color: var(--nlm-text); }
.nlm-flashcards .nlm-fc-recap-a { font-size: 11px; color: #666; }

/* Affichage "groupées par statut" (bandeaux teintés façon pages de carnet) :
   les stickers ci-dessus sont simplement nichés dans ces bandeaux, avec une
   bordure/ombre légèrement plus marquée pour se détacher du fond déjà teinté. */
.nlm-flashcards .nlm-fc-recap-group { border-radius: 16px; padding: 14px 14px 4px; margin-bottom: 16px; }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-known { background: #f1faf5; }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-review { background: #fdf3ee; }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-ignored { background: #f4f5f7; }
.nlm-flashcards .nlm-fc-recap-group-head { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 12.5px; margin-bottom: 10px; }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-known .nlm-fc-recap-group-head { color: var(--nlm-status-known-dark); }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-review .nlm-fc-recap-group-head { color: var(--nlm-status-review-dark); }
.nlm-flashcards .nlm-fc-recap-group.nlm-fc-a-ignored .nlm-fc-recap-group-head { color: var(--nlm-ignored-dark); }
.nlm-flashcards .nlm-fc-recap-group .nlm-fc-recap-item { border-width: 2.5px; box-shadow: 2px 3px 0 rgba(0,0,0,.05); }

.nlm-flashcards .nlm-fc-recap-empty { color: #718096; font-style: italic; }

/* Boutons de fin, langage "jeton" (chunky, sans flou) : neutres (bleu) pour
   les actions qui ne visent pas une seule catégorie ("Tout refaire", combiné
   "à revoir + passées"), recolorés pour les actions ciblées ("Ne rejouer que
   « à revoir »"/"« passées »"), mêmes conventions que les filtres/stickers. */
.nlm-flashcards .nlm-fc-recap-nav { display: flex; gap: 10px; flex-wrap: wrap; }
.nlm-flashcards .nlm-fc-recap-nav button { font-family: 'Fredoka', var(--nlm-font); font-weight: 600; border-radius: 12px; box-shadow: 0 4px 0 var(--nlm-accent-dark); }
.nlm-flashcards .nlm-fc-recap-nav button.nlm-fc-btn-review { background: var(--nlm-status-review); box-shadow: 0 4px 0 var(--nlm-status-review-dark); }
.nlm-flashcards .nlm-fc-recap-nav button.nlm-fc-btn-ignored { background: var(--nlm-ignored); box-shadow: 0 4px 0 var(--nlm-ignored-dark); }
.nlm-flashcards button.nlm-fc-btn-review { background: #c53030; }
.nlm-flashcards button.nlm-fc-btn-ignored { background: #555; }

/* ---------- Impression PDF des flashcards (v0.28.2 → v0.29.1) ---------- */
/* Bouton "Imprimer" : même ligne que Précédent/Suivant (.nlm-fc-controls),
   callé COMPLÈTEMENT à droite de cette ligne via position:absolute (v0.29.1,
   demande explicite après 1er test réel) — pas margin-left:auto : Précédent/
   Suivant doivent rester un groupe CENTRÉ (aligné sous Je savais/À revoir, voir
   .nlm-fc-controls-nav plus haut), donc sorti du flux pour ne jamais disputer
   d'espace avec ce groupe. Taille FIXE (35px / 21px, demande explicite après
   test réel — remplace l'ancien calcul JS "moitié de la hauteur de Précédent",
   jugé pas assez grand en conditions réelles). */
.nlm-flashcards .nlm-fc-print {
	position: absolute; right: 0; top: 50%; transform: translateY(-50%);
	width: 35px; height: 35px; font-size: 21px;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	line-height: 1;
	border-radius: 6px;
}

/* Feuille d'impression : construite en DOM caché (JS, printCards()), DEDANS le
   widget (.nlm-widget, pas document.body) pour hériter des variables --nlm-*
   résolues par la cascade de réglages de CETTE ressource (couleur d'accent,
   police, etc.) — un enfant de document.body n'aurait pas hérité de ces
   custom properties, posées en inline style sur .nlm-widget. Masquée à
   l'écran EN TOUTE CIRCONSTANCE (jamais affichée hors @media print, même une
   fois la classe -active posée juste avant window.print() — évite tout flash
   visible à l'écran).
   ⚠️ **PIÈGE `display:none` — corrigé (v0.28.3) : les formules $...$ restaient
   en texte brut à l'impression, jamais converties en KaTeX.** `typeset()`
   (`renderMathInElement`) est appelé AVANT window.print(), pendant que la
   feuille est encore dans son état masqué de base — avec `display:none`, la
   feuille (et tout son sous-arbre) est retirée de l'arbre de mise en page :
   `getBoundingClientRect()`/mesures de layout y renvoient des valeurs nulles,
   ce que certains calculs internes de KaTeX ne supportent pas silencieusement
   (l'erreur est avalée par le `try/catch` de `typeset()`, laissant le texte
   $...$ intact). Fix d'origine : masquage via `position:absolute` hors-écran
   + `visibility:hidden` plutôt que `display:none`.
   ⚠️⚠️ **PIÈGE « 9 pages, 3 avec contenu » (v0.29.11, correctif DÉFENSIF —
   mécanisme NON confirmé, voir honnêteté testé/supposé ci-dessous) :**
   imprimer les flashcards PUIS le quiz (ou l'inverse) faisait hériter le
   NOMBRE DE PAGES de la ressource imprimée EN PREMIER, avec seulement les
   premières pages remplies (ex. flashcards = 9 pages, puis quiz = 9 pages
   dont 3 seulement avec du contenu). Hypothèse retenue : `position:absolute`
   retire un élément du FLUX normal, mais ne garantit PAS qu'il soit exclu de
   l'étendue de mise en page utilisée par le moteur d'impression pour
   calculer la pagination — la feuille de la ressource imprimée en premier
   (ex. 9 "pages" de cartes flashcards), restée dans le DOM en position
   `absolute;left:-99999px` même une fois son impression terminée, pourrait
   influencer la pagination d'une impression SUIVANTE (quiz) sur une AUTRE
   feuille du même widget. Fix : retour à `display:none` comme état de repos
   par défaut — retire l'élément de TOUTE mise en page, sans ambiguïté
   possible (contrairement à `position:absolute` seul, dont le comportement
   exact vis-à-vis de la pagination d'impression n'a pas pu être confirmé,
   voir ci-dessous). La classe `.nlm-fc-print-measuring` (ajoutée juste avant
   `typeset()`, retirée juste après, voir `printCards()`) réintroduit une
   fenêtre `display:block` UNIQUEMENT pendant la mesure KaTeX, préservant le
   fix v0.28.3 sans réintroduire de fenêtre `display:none` risquée à ce
   moment précis — `display:none` redevient l'état de repos immédiatement
   après, pour TOUTE feuille non activement en cours d'impression (y compris
   celle du même widget, une fois son impression terminée).
   ⚠️ **Honnêteté testé vs supposé** : une tentative de reproduction du
   mécanisme exact (un élément `position:absolute;left:-99999px` de 5000px
   de haut, avec/sans `visibility:hidden`) N'A PAS montré d'inflation de
   `document.documentElement.scrollHeight` en navigateur réel — l'hypothèse
   ci-dessus reste donc NON CONFIRMÉE (la pagination d'impression pourrait
   suivre un algorithme différent de celui du défilement d'écran, jamais
   testé directement faute de pouvoir déclencher une impression réelle dans
   cet environnement). Le fix est conservé quand même : `display:none` est,
   par spécification, la seule garantie ABSOLUE qu'un élément ne participe à
   AUCUN calcul de mise en page, quel que soit le moteur/mode de rendu — un
   changement sain et sans effet de bord négatif connu, même si le symptôme
   exact rapporté par l'utilisateur n'a pas pu être reproduit pour confirmer
   ce correctif précis. **À reconfirmer par l'utilisateur.** */
.nlm-fc-print-sheet {
	display: none;
	position: absolute; left: -99999px; top: 0;
	visibility: hidden;
}
.nlm-fc-print-sheet.nlm-fc-print-measuring { display: block; }

@media print {
	/* Technique standard "n'imprimer que CET élément" : tout devient invisible
	   (mais garde sa place en layout, visibility != display), puis la feuille
	   active + ses descendants redeviennent visibles et se repositionnent en
	   position:absolute à l'origine de la page — indépendant de la profondeur
	   d'imbrication réelle de la feuille dans le DOM du thème WordPress. */
	body.nlm-printing-flashcards * { visibility: hidden; }
	body.nlm-printing-flashcards .nlm-fc-print-active,
	body.nlm-printing-flashcards .nlm-fc-print-active * { visibility: visible; }
	body.nlm-printing-flashcards .nlm-fc-print-active {
		display: block;
		position: absolute; left: 0; top: 0;
	}
	@page { margin: 1cm; }
}

.nlm-fc-print-note { font-size: 9.5pt; margin: 0 0 0.4cm; color: #333; font-family: var(--nlm-font); }

/* Grille 2 colonnes (recto/verso) : bordures fusionnées (border-collapse) pour
   ne jamais dessiner deux traits superposés sur une même arête partagée.
   Chaque <td> déclare le même style "pointillés-traits" (dashed) sur ses 4
   côtés — les arêtes PARTAGÉES entre deux <td> d'accord sur le même style ne
   posent aucun conflit ; SEULE l'arête centrale (question|réponse, le PLI) a
   besoin d'un style différent (pointillés-points, dotted) : déclarée
   UNIQUEMENT côté question (border-right), jamais côté réponse (border-left:
   none) — avec border-collapse, une arête sans déclaration perd TOUJOURS face
   à une arête déclarée (priorité "none" la plus basse), donc aucune ambiguïté
   de résolution de conflit à gérer. */
.nlm-fc-print-grid { border-collapse: collapse; table-layout: fixed; }
.nlm-fc-print-row { break-inside: avoid; page-break-inside: avoid; }
.nlm-fc-print-cell {
	position: relative; width: 8cm; height: 4cm; box-sizing: border-box;
	padding: 0; overflow: hidden; vertical-align: top;
	border: 1px dashed #999;
}
.nlm-fc-print-cell.nlm-fc-print-q { border-right: 1px dotted #999; }
.nlm-fc-print-cell.nlm-fc-print-a { border-left: none; }

/* Carte : position absolue à l'intérieur de la cellule → ne contribue JAMAIS
   à la hauteur naturelle du <td> (contrairement à un flux normal), ce qui
   garantit une ligne de EXACTEMENT 4cm quel que soit le texte (un texte trop
   long déborde/est coupé par overflow:hidden sur .nlm-fc-print-cell — limite
   physique inhérente à une carte 8x4cm, pas contournable sans réduire le
   texte). Le médaillon déborde par-dessus le bord supérieur de la boîte,
   exactement comme à l'écran (.nlm-fc-medal/.nlm-fc-face), mais reste
   entièrement CONTENU dans les 4cm de la cellule (0.4cm de marge réservée en
   haut de .nlm-fc-print-box = la moitié du médaillon qui dépasse). */
.nlm-fc-print-box {
	position: absolute; top: 0.4cm; left: 0.3cm; right: 0.3cm; bottom: 0.15cm;
	border: 1.5pt solid var(--nlm-accent); border-radius: 0.25cm;
	display: flex; flex-direction: column; align-items: center; justify-content: center;
	text-align: center; padding: 0.3cm 0.35cm; box-sizing: border-box;
	background: #fff;
}
.nlm-fc-print-box.nlm-fc-print-box-a { border-color: var(--nlm-correct); }
.nlm-fc-print-medal {
	position: absolute; top: -0.4cm; left: 50%; transform: translateX(-50%);
	width: 0.8cm; height: 0.8cm; border-radius: 50%; background: var(--nlm-accent);
	border: 1.5pt solid #fff; display: flex; align-items: center; justify-content: center;
	font-size: 0.4cm; box-shadow: 0 1pt 2pt rgba(0,0,0,.25);
}
.nlm-fc-print-box-a .nlm-fc-print-medal { background: var(--nlm-correct); }
.nlm-fc-print-label {
	display: block; margin-bottom: 0.12cm; font-family: 'Fredoka', var(--nlm-font);
	font-weight: 700; color: #a0aec0; font-size: 6.5pt; letter-spacing: .04em; text-transform: uppercase;
}
.nlm-fc-print-text {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 8.5pt;
	line-height: 1.3; color: var(--nlm-text); overflow: hidden; max-height: 100%;
}
/* Étiquette bas-gauche (v0.28.2, remplace "cliquer pour retourner" — sans objet
   sur papier, demande explicite) : même position/discrétion que l'indice de
   retournement à l'écran (.nlm-fc-flip-hint), adaptée en unités d'impression. */
.nlm-fc-print-tag {
	position: absolute; bottom: 0.12cm; left: 0.3cm; right: 0.3cm;
	font-size: 5.5pt; color: #a0aec0; white-space: nowrap; overflow: hidden;
	text-overflow: ellipsis; text-align: left; font-family: var(--nlm-font);
}

/* ---------- Impression PDF du quiz (v0.29.2, redesign v0.29.5) ---------- */
/* Même technique de fond que l'impression flashcards ci-dessus (voir les
   commentaires détaillés de cette section) : feuille hors-écran ENFANT du
   widget (hérite des variables --nlm-*), "n'imprimer que cet élément" via
   @media print, border-collapse pour la ligne de pli en pointillés-points VS
   les découpes en pointillés-traits, <tr> jamais coupé entre 2 pages. Format
   8×6cm (plus haut que les 8×4cm des flashcards — une question + 4 options +
   indice éventuel, c'est davantage de contenu qu'une flashcard, demande
   explicite de l'utilisateur).
   v0.29.5 (retour utilisateur après 1er test réel) : la carte imprimée
   reproduit maintenant fidèlement le design ÉCRAN (.nlm-qz-card/.nlm-qz-head/
   .nlm-qz-opts, voir plus haut dans ce fichier) plutôt qu'un design
   imprimable indépendant — bandeau dégradé + chip + options en tuiles
   bordées sur 2 colonnes. Toujours le thème CLAIR à l'impression (demande
   d'origine), quel que soit le data-theme courant du widget à l'écran : les
   variables --nlm-qz-* theme-dépendantes sont re-déclarées ici avec leurs
   valeurs CLAIRES, indépendamment d'un éventuel [data-theme="dark"] posé sur
   l'ancêtre .nlm-widget.nlm-quiz (--nlm-qz-accent2/--nlm-qz-correct-* etc. ne
   sont PAS theme-dépendantes, donc pas besoin d'être re-déclarées ici).
   ⚠️⚠️ **`display:none` (v0.29.11, correctif DÉFENSIF — mécanisme NON
   confirmé)** : voir le commentaire détaillé sur `.nlm-fc-print-sheet` plus
   haut dans ce fichier (même correctif, même honnêteté testé vs supposé) —
   hypothèse retenue : un `position:absolute` seul (état d'origine ici aussi)
   pourrait laisser la feuille contribuer à l'étendue de mise en page utilisée
   par le moteur d'impression pour paginer, même hors de la zone imprimable.
   Imprimer le quiz après avoir déjà imprimé les flashcards (ou l'inverse)
   faisait hériter le nombre de pages de LA PRÉCÉDENTE feuille encore présente
   dans le DOM. `.nlm-qz-print-measuring` (ajoutée/retirée dans `printQuiz()` autour
   de `typeset()`) réintroduit une fenêtre `display:block` UNIQUEMENT pendant
   la mesure KaTeX, sans réintroduire le bug de pagination. */
.nlm-qz-print-sheet {
	display: none;
	position: absolute; left: -99999px; top: 0;
	visibility: hidden;
	--nlm-qz-card-bg: #fff;
	--nlm-qz-card-shadow: 0 4px 16px rgba(45,55,90,.12);
	--nlm-qz-body-text: var(--nlm-text);
	--nlm-qz-opt-bg: #f7f8fb;
	--nlm-qz-opt-border: #e2e6ef;
	--nlm-qz-muted-text: #6b7280;
}
.nlm-qz-print-sheet.nlm-qz-print-measuring { display: block; }

@media print {
	body.nlm-printing-quiz * { visibility: hidden; }
	body.nlm-printing-quiz .nlm-qz-print-active,
	body.nlm-printing-quiz .nlm-qz-print-active * { visibility: visible; }
	body.nlm-printing-quiz .nlm-qz-print-active {
		display: block;
		position: absolute; left: 0; top: 0;
	}
}

.nlm-qz-print-note { font-size: 9.5pt; margin: 0 0 0.4cm; color: #333; font-family: var(--nlm-font); }

.nlm-qz-print-grid { border-collapse: collapse; table-layout: fixed; }
.nlm-qz-print-row { break-inside: avoid; page-break-inside: avoid; }
.nlm-qz-print-cell {
	position: relative; width: 8cm; height: 6cm; box-sizing: border-box;
	padding: 0; overflow: hidden; vertical-align: top;
	border: 1px dashed #999;
}
.nlm-qz-print-cell.nlm-qz-print-q { border-right: 1px dotted #999; }
.nlm-qz-print-cell.nlm-qz-print-a { border-left: none; }

/* Carte en position absolue à l'intérieur de la cellule → ne contribue JAMAIS
   à la hauteur naturelle du <td>, même principe que les flashcards (garantit
   les 6cm exacts quel que soit le nombre d'options/la longueur du texte —
   overflow:hidden en filet de sécurité physique). Reproduit .nlm-qz-card :
   coins arrondis + overflow:hidden (le bandeau dégradé épouse le haut de la
   carte) + ombre légère. Forcer l'impression des couleurs de fond (dégradé
   du bandeau, fonds des tuiles d'options) : la plupart des navigateurs les
   omettent par défaut à l'impression sans ce réglage. */
.nlm-qz-print-card {
	position: absolute; top: 0.15cm; left: 0.15cm; right: 0.15cm; bottom: 0.15cm;
	border-radius: 0.35cm; overflow: hidden; box-sizing: border-box;
	box-shadow: var(--nlm-qz-card-shadow);
	background: var(--nlm-qz-card-bg);
	display: flex; flex-direction: column;
	-webkit-print-color-adjust: exact; print-color-adjust: exact;
}

/* ---- Bandeau (reprend .nlm-qz-head/.nlm-qz-headrow/.nlm-qz-chip/.nlm-qz-question) ---- */
/* Hauteur FIXE (v0.29.7, demande explicite) : le recto (question en 7.4pt) et
   le verso (même question reprise en 6.2pt, voir .nlm-qz-print-question-a plus
   bas) ne remplissent pas la même hauteur pour un texte identique — sans
   hauteur explicite, les deux bandeaux d'une même carte auraient une hauteur
   différente. `overflow:hidden` en filet de sécurité si une question très
   longue dépasse (même principe que le reste de la carte imprimée : limite
   physique assumée plutôt qu'un bandeau qui grandirait sans borne). */
.nlm-qz-print-head {
	flex: none; height: 2cm; box-sizing: border-box; overflow: hidden;
	background: linear-gradient(90deg, var(--nlm-qz-accent2), var(--nlm-accent));
	padding: 0.22cm 0.26cm 0.24cm;
	-webkit-print-color-adjust: exact; print-color-adjust: exact;
}
/* Bandeau du VERSO (v0.29.7, demande explicite) : dégradé dédié, distinct de
   celui du recto — couleurs fixes (pas de variable), même principe que
   --nlm-qz-accent2 (signature du design, pas dérivée de la cascade de
   réglages). */
.nlm-qz-print-cell.nlm-qz-print-a .nlm-qz-print-head {
	background: linear-gradient(90deg, #00b359, #28714d);
}
.nlm-qz-print-headrow { display: flex; align-items: center; justify-content: space-between; gap: 0.2cm; }
.nlm-qz-print-chip {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: #fff !important;
	font-size: 6.3pt; background: rgba(255,255,255,.18); padding: 0.05cm 0.16cm;
	border-radius: 999px; white-space: nowrap; flex: 0 0 auto;
}
.nlm-qz-print-meta {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 600; color: rgba(255,255,255,.88) !important;
	font-size: 5.6pt; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
	text-align: right; flex: 1 1 auto; min-width: 0;
}
.nlm-qz-print-question {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 7.4pt;
	color: #fff !important; line-height: 1.32; margin-top: 0.14cm;
}
/* Verso (v0.29.5, demande explicite) : la question est reprise SOUS le même
   bandeau, mais en plus petit/italique, dans un ton pastel qui reprend la
   couleur du bandeau plutôt que le blanc gras du recto — un blanc TRANSLUCIDE
   (pas une couleur calculée à la main) se teinte automatiquement de la
   couleur du dégradé qu'il recouvre, quel que soit l'accent configuré. */
.nlm-qz-print-question-a {
	font-weight: 500; font-style: italic; font-size: 6.2pt;
	color: rgba(255,255,255,.6) !important; margin-top: 0.1cm;
}

/* ---- Corps (reprend .nlm-qz-body/.nlm-qz-opts/.nlm-qz-opt) ---- */
.nlm-qz-print-body {
	flex: 1 1 auto; overflow: hidden; box-sizing: border-box;
	background: var(--nlm-qz-card-bg);
	padding: 0.2cm 0.24cm;
	display: flex; flex-direction: column;
}
.nlm-qz-print-opts {
	display: grid; grid-template-columns: 1fr 1fr; gap: 0.12cm;
	flex: 1 1 auto; overflow: hidden;
}
.nlm-qz-print-opt {
	display: flex; align-items: flex-start; gap: 0.08cm;
	background: var(--nlm-qz-opt-bg); border: 1pt solid var(--nlm-qz-opt-border);
	border-radius: 0.16cm; padding: 0.11cm 0.12cm;
	font-size: 6.3pt; line-height: 1.25; color: var(--nlm-qz-body-text);
	-webkit-print-color-adjust: exact; print-color-adjust: exact;
}
.nlm-qz-print-letter { font-family: 'Fredoka', var(--nlm-font); font-weight: 700; color: var(--nlm-qz-accent2); flex: 0 0 auto; }
.nlm-qz-print-hint {
	flex: 0 0 auto; margin-top: 0.1cm;
	font-size: 5.6pt; line-height: 1.25; color: var(--nlm-qz-muted-text); font-family: var(--nlm-font);
}
.nlm-qz-print-hint-label { text-decoration: underline; font-weight: 700; }

/* ---- Verso : lettre + texte de la bonne réponse (inchangé sur le fond) ---- */
.nlm-qz-print-body-a { align-items: center; justify-content: center; text-align: center; }
.nlm-qz-print-answer-letter {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 700; font-size: 26pt;
	color: var(--nlm-correct); line-height: 1; margin: 0.08cm 0;
}
.nlm-qz-print-answer-text {
	font-family: 'Fredoka', var(--nlm-font); font-weight: 600; font-size: 7.6pt;
	line-height: 1.3; color: var(--nlm-qz-body-text);
}

/* ---------- MINDMAP (repris de mindmap_markmap_demo_2.html) ---------- */
.nlm-mindmap { border: 1px solid #dfe3ea; border-radius: 14px; overflow: hidden; background: #fff; position: relative; max-width: none; }
.nlm-mindmap .mmk-head { padding: 10px 12px 0; background: #fbfcfe; }
.nlm-mindmap .mmk-title { font-weight: bold; }
.nlm-mindmap .mmk-title .t-main { font-size: 26px; color: #d62828; }
.nlm-mindmap .mmk-title .t-sub { font-size: 13px; color: #1a365d; }
.nlm-mindmap .mmk-btns { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; padding: 10px 12px; background: #fbfcfe; }
/* Boutons de la barre d'outils — icônes seules, cercle pastel (v0.29.0,
   remplace les pilules texte : "trop de place, trop présentes" retour
   utilisateur explicite). Système PARTAGÉ par les deux vues (.mmk-btns vue
   linéaire ICI, .mmkr-btns vue radiale dans nlm-mindmap-radial.css) — les
   classes .mmk-icon-btn/.mmk-c-* vivent ici pour que les deux fichiers CSS
   les consomment sans dupliquer les couleurs. Palette dérivée de PALETTE
   (nlm-mindmap-radial.js, couleurs de branches) en tons pastel. */
.nlm-mindmap .mmk-icon-btn { width: 34px; height: 34px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--mmk-mid); background: var(--mmk-bg) !important; cursor: pointer; padding: 0; position: relative; }
.nlm-mindmap .mmk-icon-btn svg { width: 17px; height: 17px; color: var(--mmk-mid); }
.nlm-mindmap .mmk-icon-btn:hover { filter: brightness(.96); }
.nlm-mindmap .mmk-icon-btn.is-active { background: var(--mmk-mid) !important; }
.nlm-mindmap .mmk-icon-btn.is-active svg { color: #fff; }
.nlm-mindmap .mmk-c-teal { --mmk-bg: #e6f4f2; --mmk-mid: #4f9d94; }
.nlm-mindmap .mmk-c-green { --mmk-bg: #eaf5ec; --mmk-mid: #5fa873; }
.nlm-mindmap .mmk-c-gold { --mmk-bg: #f7f0e3; --mmk-mid: #b6903f; }
.nlm-mindmap .mmk-c-pink { --mmk-bg: #fbeaf1; --mmk-mid: #c97ba0; }
.nlm-mindmap .mmk-c-blue { --mmk-bg: #e9f1fb; --mmk-mid: #4f7fb3; }
/* Badge menu déroulant (Export Image/Texte) — remplace le "▾" texte devenu
   sans objet sur un bouton icône seule. */
.nlm-mindmap .mmk-chev { position: absolute; right: -3px; bottom: -3px; width: 13px; height: 13px; border-radius: 50%; background: #fff; border: 1px solid var(--mmk-mid); display: flex; align-items: center; justify-content: center; }
.nlm-mindmap .mmk-chev svg { width: 7px; height: 7px; color: var(--mmk-mid); }
/* .mmk-export NICHÉ dans .mmk-btns/.mmkr-btns (v0.29.1, demande explicite : les
   boutons Export doivent rester sur la MÊME ligne que les autres, pas en dessous).
   Avant : ligne séparée avec son propre padding/background/justify-content — un
   1er essai (spacer margin-left:auto DANS .mmk-btns) pouvait laisser les boutons
   Export à gauche quand .mmk-btns passait à la ligne (flex-wrap). Ici .mmk-export
   est lui-même UN SEUL item flex de la ligne .mmk-btns/.mmkr-btns : son propre
   margin-left:auto le pousse au bord droit DE CET ITEM (donc de la ligne), sans
   dépendre du nombre de boutons qui précèdent — et s'il n'y a plus de place, il
   passe à la ligne suivante EN BLOC (flex-wrap du parent), jamais scindé entre
   ses deux boutons. */
.nlm-mindmap .mmk-export { display: flex; gap: 8px; align-items: center; margin-left: auto; }
.nlm-mindmap .mmk-export-wrap { position: relative; }
.nlm-mindmap [data-tip] { position: relative; }
.nlm-mindmap [data-tip]:hover::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); white-space: nowrap; background: #1a365dd9; color: #fff; font-size: 11px; padding: 4px 8px; border-radius: 6px; pointer-events: none; z-index: 20; }
.nlm-mindmap [data-tip]:hover::before { content: ""; position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); border: 5px solid transparent; border-top-color: #1a365d; z-index: 20; }
/* Infobulles des boutons de BORD (v0.29.2 → v0.29.3, retour utilisateur :
   coupées par overflow:hidden du widget, .nlm-mindmap) — même technique que
   l'override .mmk-vt-btn ci-dessous (nlm-mindmap-radial.css) : ancrage au
   bord du bouton plutôt que centré. TOUS les boutons directs de
   .mmk-btns/.mmkr-btns (Ajuster/Développer/Replier/Zoom ±/Plein écran) →
   ancrés à GAUCHE (pas seulement le 1er : à v0.29.2, le 2ᵉ bouton
   « Tout développer » débordait encore, son texte d'infobulle plus long que
   « Ajuster » suffisant à dépasser le bord même centré sur son propre
   bouton) ; boutons Export (toujours les plus à droite, .mmk-export poussé
   par margin-left:auto) → ancrés à DROITE. Le sélecteur `>` cible les
   boutons DIRECTS de la ligne, pas les boutons nichés dans .mmk-export. */
.nlm-mindmap .mmk-btns > [data-tip]:hover::after,
.nlm-mindmap .mmkr-btns > [data-tip]:hover::after {
	left: 0; transform: none;
}
.nlm-mindmap .mmk-btns > [data-tip]:hover::before,
.nlm-mindmap .mmkr-btns > [data-tip]:hover::before {
	left: 14px; transform: none;
}
/* Boutons Export : infobulle EN DESSOUS plutôt qu'au-dessus (v0.29.4, retour
   utilisateur — solution retenue plutôt que de continuer à ajuster le
   z-index face à .mmk-vt-btn juste au-dessus, dans .mmk-head : l'export
   texte, dernier bouton de la ligne, est géométriquement flush-droite comme
   .mmk-vt-btn, donc leurs bulles/boutons peuvent se chevaucher quel que soit
   le z-index. En pointant vers le bas, l'infobulle s'étend dans la zone du
   SVG/canevas juste en dessous, qui ne contient jamais rien à cet endroit —
   aucun risque de chevauchement, indépendamment de tout contexte
   d'empilement. Même principe que l'override .mmk-vt-btn (ci-dessous,
   nlm-mindmap-radial.css) : bottom auto / top calc(100% + 6px), flèche
   retournée (border-bottom-color au lieu de border-top-color). */
.nlm-mindmap .mmk-export .exp-btn[data-tip]:hover::after {
	bottom: auto; top: calc(100% + 6px);
	left: auto; right: 0; transform: none;
}
.nlm-mindmap .mmk-export .exp-btn[data-tip]:hover::before {
	bottom: auto; top: 100%;
	left: auto; right: 14px; transform: none;
	border-top-color: transparent; border-bottom-color: #1a365d;
}
/* Le menu s'ancre maintenant sur SON PROPRE bouton (.mmk-export-wrap, position:relative
   ci-dessus) et non plus sur toute la ligne .mmk-btns : il s'ouvre directement sous
   l'intitulé qui l'a déclenché, plutôt qu'à une position fixe de la ligne entière. */
.nlm-mindmap .mmk-menu { position: absolute; top: calc(100% + 4px); right: 0; left: auto; background: #fff; border: 1px solid #dfe3ea; border-radius: 10px; box-shadow: 0 6px 20px rgba(0,0,0,.12); padding: 6px; min-width: 240px; max-width: calc(100vw - 24px); z-index: 30; display: none; }
.nlm-mindmap .mmk-menu.open { display: block; }
.nlm-mindmap .mmk-menu .grp { font-size: 11px; text-transform: uppercase; letter-spacing: .05em; color: #a0aec0; padding: 6px 8px 2px; font-weight: bold; }
.nlm-mindmap .mmk-menu button { display: block; width: 100%; text-align: left; background: transparent !important; color: #2d3748 !important; padding: 8px 10px; border-radius: 6px; position: static; border: none; cursor: pointer; }
.nlm-mindmap .mmk-menu button:hover { background: #edf4ff !important; }
.nlm-mindmap .mmk-hint { padding: 0 12px 10px; font-size: 12px; color: #718096; background: #fbfcfe; border-bottom: 1px solid #e6e9ef; display: none; }
.nlm-mindmap.mmk-hasmouse .mmk-hint { display: block; }
.nlm-mindmap .mmk-svg { width: 100%; height: 600px; display: block; --markmap-max-width: 340px; cursor: grab; border-top: 1px solid #e6e9ef; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; }
.nlm-mindmap .mmk-svg.mmk-grabbing { cursor: grabbing; }
.nlm-mindmap .mmk-svg .markmap-node:has(> circle) > foreignObject { cursor: pointer; }
.nlm-mindmap .mmk-svg .markmap-node > circle { cursor: pointer; }
.nlm-mindmap .mmk-svg .markmap-node.mmk-foldable > foreignObject { cursor: pointer; }
.nlm-mindmap .mmk-msg { padding: 18px; color: #c05621; font-size: 14px; }

/* Message d'erreur (éditeurs seulement) */
.nlm-error { margin: 10px 0; }

/* ---------- ONGLETS multi-ressources ([nlm_quiz]/[nlm_flashcards] à 2+ id) ---------- */
/* .nlm-tabs-wrap enveloppe plusieurs .nlm-widget (un par id demandé) derrière une
   barre d'onglets — n'existe QUE si le shortcode reçoit 2+ id valides (1 seul id
   garde le rendu "nu" historique, sans enveloppe, voir NLM_Shortcodes::render_group()).
   Reprend les mêmes variables --nlm-* que .nlm-widget (calculées côté PHP depuis
   la 1ère ressource du groupe + les mêmes surcharges de shortcode que tous les
   widgets du groupe) pour que la barre suive visuellement le thème du contenu
   qu'elle encadre, avec les mêmes valeurs de repli si aucune n'est fournie. */
.nlm-tabs-wrap {
	--nlm-accent: #2b6cb0;
	--nlm-accent-dark: #255a97;
	--nlm-radius: 10px;
	--nlm-font: Arial, Helvetica, sans-serif;
	--nlm-font-size: 16px;
	--nlm-max-width: 640px;
	max-width: var(--nlm-max-width);
	margin: 0 auto;
	font-family: var(--nlm-font);
	box-sizing: border-box;
}
/* Chaque panneau contient déjà un .nlm-widget complet, qui se centrerait sinon
   une 2e fois sur SA PROPRE largeur (potentiellement différente si les réglages
   diffèrent d'une ressource à l'autre) — .nlm-tabs-wrap est la seule référence
   de largeur/centrage du groupe entier, le widget interne remplit son panneau. */
.nlm-tabs-wrap .nlm-widget { max-width: none; margin: 0; }

.nlm-tabs-bar {
	display: flex; flex-wrap: wrap; gap: 4px;
	margin-bottom: 12px; border-bottom: 2px solid #e2e8f0;
}
/* ⚠️ `!important` sur `:hover`/`.is-active` — piège rencontré en conditions
   réelles (thème WordPress de l'utilisateur) : une règle de thème du genre
   `:not(.mejs-button) > button:hover, :not(.mejs-button) > button:focus { … }`
   a une spécificité plus élevée qu'un simple `.nlm-tabs-btn:hover` (elle combine
   un sélecteur de type `button` ET deux pseudo-classes/`:not()`), donc elle
   gagne sans `!important` — même famille de piège que `.nlm-tabs-panel[hidden]`
   ci-dessous, juste côté spécificité plutôt que côté `[hidden]` natif. Design
   "onglet souligné" (pas de boîte pleine) : retenu après essai d'un design en
   bouton/boîte pleine, retiré sur retour utilisateur (v0.22.3). */
.nlm-tabs-btn {
	font-family: inherit; font-size: calc(var(--nlm-font-size) * 0.8); font-weight: 700;
	cursor: pointer; border: none; background: transparent; color: #4a5568;
	padding: 8px 16px; border-radius: var(--nlm-radius) var(--nlm-radius) 0 0;
	border: #ccc solid 1px !important;
	border-bottom: 3px solid transparent; margin-bottom: -2px;
	transition: color .15s, border-color .15s;
	-webkit-appearance: none; appearance: none;
}
.nlm-tabs-btn:hover { color: var(--nlm-accent) !important; background: #dbe0f5 !important; }
.nlm-tabs-btn.is-active { border: #2e6ab3 solid 2px !important; background: #dbe0f5 !important; color: var(--nlm-accent) !important; border-bottom-color: var(--nlm-accent) !important; font-weight: 800; }

/* Piège CSS [hidden] déjà rencontré 3 fois côté admin sur ce projet (voir
   CLAUDE.md) : une règle d'auteur peut battre `[hidden]{display:none}` à
   spécificité égale — règle explicite posée dès la création plutôt que
   découverte après coup une 4e fois. */
.nlm-tabs-panel[hidden] { display: none !important; }
