// template-pack-maths-brevet.jsx
// PACK MATHS BREVET 3e — Allo Education Books v1.2
// 15 templates pour générer le livre « Objectif Brevet Maths 3e ».
// Strictement composés à partir des blocs verrouillés (PageShell, PageTitle,
// Box, Cols, KettyBubble, QRBlock, TableBlock, FigureBlock, etc.) + helpers
// math (MathExpr, Frac, StepBlock, GridCalc, AxisGrid, BarChart, TriangleFigure).
// Aucun emoji. Tous pictos via iconKey.
const MB_FR = React.Fragment;
/* ════════════════════════════════════════════════════════════════════════
01 · math-lesson-exercise — Leçon maths avec exemple guidé
════════════════════════════════════════════════════════════════════════ */
function MBLessonExercise({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
On multiplie le facteur k par chaque terme dans la parenthèse,
sans oublier les signes, puis on regroupe les termes semblables.
Développer et réduire A = 4(2x − 3) + 5.
3(x + 5),
2(4x − 1) + 3,
5(2x + 3) − 4x,
−2(x − 7),
]} />
);
}
/* ════════════════════════════════════════════════════════════════════════
02 · math-progressive-exercise — Exercices progressifs
════════════════════════════════════════════════════════════════════════ */
function MBProgressive({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
1. Je regroupe les x à gauche, les nombres à droite.
2. Je réduis. 3. Je divise par le coefficient de x.
3x + 5 = 17 }]} />
5x − 7 = 2x + 8 }]} />
2(3x − 4) = 5x + 1, note: "distribue d'abord" }]} />
);
}
/* ════════════════════════════════════════════════════════════════════════
03 · math-guided-problem — Problème guidé
════════════════════════════════════════════════════════════════════════ */
function MBGuidedProblem({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Pour son concert, le club organise 180 places. Le tarif adulte
est de 12 € et le tarif jeune de 7 €. La recette
totale s'élève à 1 660 €.
Question : combien de places adultes ont été vendues ?
Total places : 180
Tarif adulte : 12 €
Tarif jeune : 7 €
Recette : 1 660 €
Ne pas oublier (180 − x) dans l'équation : c'est le nombre de
places jeunes, pas une seule place !
);
}
/* ════════════════════════════════════════════════════════════════════════
04 · math-grid-practice — Calculs en grille
════════════════════════════════════════════════════════════════════════ */
function MBGridPractice({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Effectue les calculs sans calculatrice. Tu disposes de
10 minutes . Si tu hésites, passe au suivant.
+ ,
− ,
× ,
]} />
);
}
/* ════════════════════════════════════════════════════════════════════════
05 · math-qcm — QCM maths
════════════════════════════════════════════════════════════════════════ */
function MBQCM({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Le nombre (−3)² est égal à :}
options={["−6", "9", "−9"]} />
L'écriture scientifique de 0,000 42 est :}
options={[4,2 × 10−4, 42 × 10−5, 4,2 × 104]} />
Une augmentation de 20 % puis une baisse de 20 % donne :}
options={["aucun changement", "une baisse de 4 %", "une baisse de 20 %"]} />
L'image de 3 par f tel que f(x) = 2x − 5 est :}
options={["1", "−1", "11"]} />
Si ABC est rectangle en A avec AB = 3, AC = 4, alors BC =}
options={["5", "7", "√7"]} />
La médiane de la série 4 ; 7 ; 9 ; 12 ; 15 est :}
options={["7", "9", "9,4"]} />
);
}
/* ════════════════════════════════════════════════════════════════════════
06 · algebra-equation-page — Équations / calcul littéral
════════════════════════════════════════════════════════════════════════ */
function MBAlgebra({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
A = 3(2x − 5)A = 3 · 2x + 3 · (−5) }, { expr: A = … }]} />
B = 4x + 7 − 2x + 3B = (4x − 2x) + (7 + 3) }, { expr: B = … }]} />
C = 6x + 9C = 3 · 2x + 3 · 3, note: "facteur 3" }, { expr: C = 3 · (…) }]} />
5(x − 2) = 3x + 4
);
}
/* ════════════════════════════════════════════════════════════════════════
07 · proportionality-table — Tableau de proportionnalité
════════════════════════════════════════════════════════════════════════ */
function MBProportionality({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Dans un tableau de proportionnalité, on passe d'une ligne à l'autre
en multipliant par un même nombre k appelé coefficient.
Je calcule le prix de 1 kg (ici : 5 ÷ 2 = 2,50 €), puis je
multiplie par la quantité voulue. C'est souvent le chemin le plus rapide.
12 kg coûtent €.
);
}
/* ════════════════════════════════════════════════════════════════════════
08 · percentage-scale-page — Pourcentages / échelles
════════════════════════════════════════════════════════════════════════ */
function MBPercentage({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Pour une hausse de t %, on multiplie par 1 + t/100.
Pour une baisse de t %, on multiplie par 1 − t/100.
Une échelle 1/25 000 signifie que 1 cm sur
la carte représente 25 000 cm = 250 m dans la réalité.
a. 1 cm sur la carte = combien de m en vrai ? b. Une rivière mesure 4,5 cm sur la carte. Sa longueur réelle est de .
Toujours convertir avant de comparer : 1 m = 100 cm, 1 km = 1 000 m.
Une réponse en cm ou en km change la note !
);
}
/* ════════════════════════════════════════════════════════════════════════
09 · function-table-graph — Fonctions
════════════════════════════════════════════════════════════════════════ */
function MBFunctions({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Image : on calcule f(x) en remplaçant.
Antécédent : on cherche x tel que f(x) = … (équation).
2 * x - 1}
xMin={-3} xMax={4} yMin={-5} yMax={5}
/>
Image de 4 par f : Antécédent de 7 : f(x) = 0 pour x =
);
}
/* ════════════════════════════════════════════════════════════════════════
10 · stats-probability-page — Statistiques / probabilités
════════════════════════════════════════════════════════════════════════ */
function MBStatsProba({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Calcule AB.Le triangle ABC est-il isocèle ? Justifie.
AB = , donc .
);
}
/* ════════════════════════════════════════════════════════════════════════
12 · geometry-theorem-page — Pythagore / Thalès / Trigo (variants)
════════════════════════════════════════════════════════════════════════ */
function MBTheorem({ variant = "pythagoras", density, qrVisible, scoreVisible, scale = 1 }) {
const cfg = {
"pythagoras": {
eyebrow: "Théorème de Pythagore",
title: "Calculer une longueur dans un triangle rectangle",
page: "Page 60",
condition: "Si le triangle ABC est rectangle en C…",
formula: "AB² = AC² + BC²",
hyp: "AB est l'hypoténuse (opposée à l'angle droit).",
figLabels: { AB: "?", AC: "5 cm", BC: "12 cm" },
pitfall: "L'hypoténuse est le côté OPPOSÉ à l'angle droit. Ne jamais confondre.",
qrSlug: "AE-3E-MATH-001-2026-V1-P060",
},
"pythagoras-converse": {
eyebrow: "Réciproque de Pythagore",
title: "Démontrer qu'un triangle est rectangle",
page: "Page 62",
condition: "Si AB² = AC² + BC², alors le triangle est rectangle en C.",
formula: "comparer AB² et AC² + BC²",
hyp: "On prend toujours le plus grand côté comme « hypoténuse » candidate.",
figLabels: { AB: "13 cm", AC: "5 cm", BC: "12 cm" },
pitfall: "Toujours calculer AB² ET AC² + BC² séparément, puis comparer.",
qrSlug: "AE-3E-MATH-001-2026-V1-P062",
},
"thales": {
eyebrow: "Théorème de Thalès",
title: "Reporter des rapports égaux",
page: "Page 65",
condition: "Si (MN) // (AB) et O, M, A alignés, O, N, B alignés…",
formula: "OM/OA = ON/OB = MN/AB",
hyp: "Trois rapports égaux. On utilise les deux qu'il nous faut.",
figLabels: {},
pitfall: "Vérifier l'alignement et le parallélisme avant de poser les rapports.",
qrSlug: "AE-3E-MATH-001-2026-V1-P065",
},
"trigonometry": {
eyebrow: "Trigonométrie",
title: "SOH · CAH · TOA",
page: "Page 68",
condition: "Dans un triangle rectangle, à partir d'un angle aigu α…",
formula: "sin α = opp/hyp · cos α = adj/hyp · tan α = opp/adj",
hyp: "Le côté opposé est en face de l'angle, l'adjacent est à côté de l'angle.",
figLabels: { AB: "hyp", AC: "adj", BC: "opp", angle: "α" },
pitfall: "Toujours identifier l'angle de référence avant de nommer les côtés.",
qrSlug: "AE-3E-MATH-001-2026-V1-P068",
},
}[variant];
const figVariant = variant === "thales" ? "thales" : (variant === "trigonometry" ? "trigonometry" : "pythagoras");
return (
{cfg.condition}
{cfg.formula}
);
return (
c³} />
L × ℓ × h} />
π × r² × h} />
Cube de côté 5 cm : V = cm³Pavé droit 4 × 3 × 6 cm : V = cm³Cylindre r = 2 cm, h = 10 cm : V = cm³
Le volume d'un cylindre s'écrit π × r² × h, pas π × r × h.
Pense à élever r au carré avant de multiplier par h.
);
}
/* ════════════════════════════════════════════════════════════════════════
17 · volume-units-page — Conversions L / cm³ / dm³ / m³ (P073-P075)
════════════════════════════════════════════════════════════════════════ */
function MBVolumeUnits({ density, qrVisible, scoreVisible, scale = 1 }) {
return (
Le litre est une unité de capacité. Il correspond exactement à
un dm³ . Pour passer du m³ au cm³, on traverse 3 zéros par étage.
2,5 L = cm³1 500 cm³ = L0,75 m³ = L4 200 mL = dm³
);
}
/* ════════════════════════════════════════════════════════════════════════
18 · geometry-transformations-page — Translation, rotation, sym., agrand. (P076-P078)
════════════════════════════════════════════════════════════════════════ */
function MBTransformations({ density, qrVisible, scoreVisible, scale = 1 }) {
const TransformIcon = ({ kind }) => {
if (kind === "translation") return (
);
if (kind === "rotation") return (
);
if (kind === "symmetry") return (
);
return (
);
};
const TCard = ({ kind, name, def }) => (
{name}
{def}
);
return (
Translation, rotation et symétrie conservent longueurs et angles.
L'homothétie de rapport k multiplie les longueurs par |k| et conserve les angles.
Le triangle A'B'C' est l'image de ABC après un glissement de 3 cm vers la droite. → Une figure est réfléchie par rapport à une droite. → Une photo est agrandie 2 fois. → Une horloge tourne autour de son axe central. →
);
}
/* ════════════════════════════════════════════════════════════════════════
19 · algorithm-tableur-page — Scratch / programmes de calcul / tableur (P078-P080)
════════════════════════════════════════════════════════════════════════ */
function MBAlgoTableur({ density, qrVisible, scoreVisible, scale = 1 }) {
const propCellHead = { padding: "0.07in 0.1in", fontFamily: "var(--ae-font-title)", fontWeight: 600, textAlign: "center", color: "var(--ae-primary-deep)" };
const propCell = { padding: "0.08in 0.1in", textAlign: "center", fontFamily: '"Cambria Math", Georgia, serif', fontStyle: "italic" };
const ScratchBlock = ({ kind, children }) => {
const colors = {
event: { bg: "#FFB22A", fg: "#3A2700" },
ctrl: { bg: "#FFA13F", fg: "#3A2700" },
op: { bg: "#59C059", fg: "#0F2E0F" },
var: { bg: "#FF8C1A", fg: "#3A2700" },
}[kind] || { bg: "#4C97FF", fg: "white" };
return (
{children}
);
};
return (
Choisir un nombre.
Le multiplier par 3.
Ajouter 5.
Soustraire le nombre choisi.
Annoncer le résultat.
Q1. Avec 4, on obtient : Q2. Avec x, on obtient :
quand drapeau cliquédemander « Choisis un nombre » et attendremettre n à : réponsemettre résultat à : (n × 3) + 5 − ndire (résultat)
A
B
C
n
résultat
vérif.
4
= A2 * 3 + 5 − A2
);
}
// Variant exports — for the 4 theorem variants, build small wrappers
function MBPythagoras(p) { return ; }
function MBPythagorasConverse(p){ return ; }
function MBThales(p) { return ; }
function MBTrigonometry(p) { return ; }
Object.assign(window, {
MBLessonExercise, MBProgressive, MBGuidedProblem, MBGridPractice, MBQCM,
MBAlgebra, MBProportionality, MBPercentage, MBFunctions, MBStatsProba,
MBGeometry, MBTheorem, MBPythagoras, MBPythagorasConverse, MBThales, MBTrigonometry,
MBSolidsVolume, MBVolumeUnits, MBTransformations, MBAlgoTableur,
MBFormulaSheet, MBMiniExam, MBCompactCorrection,
});