diff --git a/frontend/textbooks/physics_10_ch3.html b/frontend/textbooks/physics_10_ch3.html
index c845b30..1b33912 100644
--- a/frontend/textbooks/physics_10_ch3.html
+++ b/frontend/textbooks/physics_10_ch3.html
@@ -3494,35 +3494,600 @@ function build_p23(){
function build_p24(){
const box = document.getElementById('p24-body');
let html = '';
- html += makeCard('theory', "Энергия поля конденсатора", "§24", `
-
Энергия поля конденсатора — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Энергия заряженного конденсатора */
+ html += makeCard('theory', "Энергия заряженного конденсатора", "§24", `
+
Заряженный конденсатор обладает запасённой энергией. Чтобы зарядить конденсатор, источник тока совершает работу — переносит заряды с одной обкладки на другую против сил электрического поля.
+
Если рассчитать эту работу через интегрирование, получим, что энергия конденсатора равна:
+
$$W = \\dfrac{CU^2}{2}$$
+
Используя соотношение $q = CU$ ($C = q/U$, $U = q/C$), эту формулу можно переписать ещё двумя способами:
+
$$W = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$$
+
Все три формулы эквивалентны — выбирай удобную в зависимости от того, какие величины даны в задаче:
+
+
Известны $C$ и $U$ → $W = CU^2/2$.
+
Известны $q$ и $C$ → $W = q^2/(2C)$.
+
Известны $q$ и $U$ → $W = qU/2$.
+
+
Единица энергии: Джоуль (Дж). На практике в электронике: мДж $= 10^{-3}$ Дж, мкДж $= 10^{-6}$ Дж.
`);
+
+ /* THEORY 2 — Где запасена энергия */
+ html += makeCard('rule', "Где запасена энергия. Плотность энергии поля", "§24", `
+
Где же находится энергия конденсатора? Не на пластинах и не в зарядах. Энергия запасена в электрическом поле между обкладками.
+
Это глубокий вывод: электрическое поле — носитель энергии, как и материя. Энергию можно вычислить через характеристики самого поля.
+
Объёмная плотность энергии — энергия в единице объёма поля:
+ `);
+
+ /* INTERACTIVE 1 — Энергия от C и U */
+ html += `
+
ИНТЕРАКТИВ 1
Энергия конденсатора от $C$ и $U$
+
Меняй ёмкость $C$ и напряжение $U$. Наблюдай $W = CU^2/2$ и заряд $q = CU$. «Заряжённость» обкладок видна по числу значков «+» и «−».
+
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 2 — Калькулятор энергии */
+ html += `
+
ИНТЕРАКТИВ 2
Калькулятор энергии: 3 формулы
+
Выбери формулу, подставь данные, получи $W$. Попробуй все три варианта.
+
+
+
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 3 — Как изменится энергия? */
+ html += `
+
ИНТЕРАКТИВ 3
Как изменится энергия конденсатора?
+
Опираясь на формулы $W = CU^2/2 = q^2/(2C) = qU/2$, выбери, как изменится энергия.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр энергии */
+ html += `
+
ИНТЕРАКТИВ 4
Тренажёр энергии конденсатора
+
5 задач. Допуск $\\pm 5\\%$. Внимательно следи за единицами (мкФ, нФ, мкКл, мДж).
+
Задача 1 / 5Очки: 0 / 5
+
+
+ ответ =
+
+
+
+
+
+
`;
+
html += secNav('p23', 'final3');
html += readButton('p24');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Энергия конденсатора (C, U) */
+ (function(){
+ const CS = document.getElementById('p24-iv1-C');
+ const US = document.getElementById('p24-iv1-U');
+ const CL = document.getElementById('p24-iv1-CL');
+ const UL = document.getElementById('p24-iv1-UL');
+ const svg = document.getElementById('p24-iv1-svg');
+ const out = document.getElementById('p24-iv1-out');
+ const seen = new Set();
+ let _done = false;
+
+ function render(){
+ const C_uF = +CS.value; // мкФ
+ const U = +US.value; // В
+ const C = C_uF * 1e-6; // Ф
+ const W = C * U * U / 2; // Дж
+ const q = C * U; // Кл
+ CL.textContent = C_uF;
+ UL.textContent = U;
+
+ // SVG: два прямоугольника-обкладки с зарядами
+ const W_svg = 480, H_svg = 260, cx = W_svg/2, cy = H_svg/2;
+ const plateW = 280, plateH = 14;
+ const gap = 90;
+ const xL = cx - plateW/2;
+ const yTop = cy - gap/2 - plateH;
+ const yBot = cy + gap/2;
+ // Число значков пропорционально q (норм. к диапазону ~ q_max = 1000e-6 * 500 = 0.5 Кл; logarithmically scale)
+ const qMax = 1000e-6 * 500;
+ const ratio = Math.min(1, Math.sqrt(q / qMax));
+ const nSign = Math.max(3, Math.round(3 + ratio * 17)); // 3..20
+
+ let g = '';
+ g += '';
+ g += 'Заряд на обкладках';
+ // Поле (стрелки между пластинами)
+ const yMid = (yTop+plateH + yBot)/2;
+ for(let i = 0; i < 5; i++){
+ const x = xL + 30 + i*(plateW-60)/4;
+ g += '';
+ g += '';
+ }
+ // Верхняя обкладка (+)
+ g += '';
+ // Нижняя обкладка (−)
+ g += '';
+ // Значки + сверху
+ for(let i = 0; i < nSign; i++){
+ const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
+ g += '+';
+ }
+ // Значки − снизу
+ for(let i = 0; i < nSign; i++){
+ const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
+ g += '−';
+ }
+ // Подписи U и q
+ g += '+q';
+ g += '−q';
+ g += 'U';
+
+ svg.innerHTML = g;
+
+ // Вывод
+ let WStr;
+ if(W >= 1) WStr = W.toFixed(2) + ' Дж';
+ else if(W >= 1e-3) WStr = (W*1e3).toFixed(2) + ' мДж';
+ else WStr = (W*1e6).toFixed(2) + ' мкДж';
+ let qStr;
+ if(q >= 1e-3) qStr = (q*1e3).toFixed(2) + ' мКл';
+ else qStr = (q*1e6).toFixed(2) + ' мкКл';
+
+ out.innerHTML = '$W = \\dfrac{CU^2}{2} = \\dfrac{'+C_uF+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} \\approx$ '+WStr+' $q = CU = $ '+qStr+'';
+ renderMath(out);
+
+ seen.add(C_uF+':'+U);
+ if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p24-iv1'); bumpProgress('p24', 15); }
+ }
+ CS.addEventListener('input', render);
+ US.addEventListener('input', render);
+ render();
+ })();
+
+ /* IV2 — Калькулятор энергии (3 формулы) */
+ (function(){
+ let mode = 'CU';
+ const mCU = document.getElementById('p24-iv2-mCU');
+ const mqC = document.getElementById('p24-iv2-mqC');
+ const mqU = document.getElementById('p24-iv2-mqU');
+ const inputs = document.getElementById('p24-iv2-inputs');
+ const out = document.getElementById('p24-iv2-out');
+ const seen = new Set();
+ let _done = false;
+
+ function setMode(m){
+ mode = m;
+ [mCU,mqC,mqU].forEach(b => b.classList.remove('primary'));
+ if(m === 'CU') mCU.classList.add('primary');
+ else if(m === 'qC') mqC.classList.add('primary');
+ else mqU.classList.add('primary');
+ render();
+ }
+ function render(){
+ if(mode === 'CU'){
+ inputs.innerHTML = ''
+ + '';
+ } else if(mode === 'qC'){
+ inputs.innerHTML = ''
+ + '';
+ } else {
+ inputs.innerHTML = ''
+ + '';
+ }
+ renderMath(inputs);
+ out.innerHTML = 'Введи значения и нажми «Вычислить $W$».';
+ renderMath(out);
+ }
+ function calc(){
+ let W = 0, html = '';
+ if(mode === 'CU'){
+ const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
+ const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
+ const C = Cuf * 1e-6;
+ W = C * U * U / 2;
+ html = '$W = \\dfrac{CU^2}{2} = \\dfrac{'+Cuf+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} = '+W.toExponential(3)+'$ Дж';
+ } else if(mode === 'qC'){
+ const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
+ const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
+ const q = quc * 1e-6, C = Cuf * 1e-6;
+ W = (C > 0) ? (q*q / (2*C)) : 0;
+ html = '$W = \\dfrac{q^2}{2C} = \\dfrac{('+quc+'\\cdot 10^{-6})^2}{2 \\cdot '+Cuf+'\\cdot 10^{-6}} = '+W.toExponential(3)+'$ Дж';
+ } else {
+ const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
+ const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
+ const q = quc * 1e-6;
+ W = q * U / 2;
+ html = '$W = \\dfrac{qU}{2} = \\dfrac{'+quc+'\\cdot 10^{-6} \\cdot '+U+'}{2} = '+W.toExponential(3)+'$ Дж';
+ }
+ // Дополнительный перевод в удобные единицы
+ let extra = '';
+ if(W >= 1) extra = '$\\approx '+W.toFixed(3)+'$ Дж';
+ else if(W >= 1e-3) extra = '$\\approx '+(W*1e3).toFixed(3)+'$ мДж';
+ else if(W > 0) extra = '$\\approx '+(W*1e6).toFixed(3)+'$ мкДж';
+ out.innerHTML = html + (extra ? ' '+extra+'' : '');
+ renderMath(out);
+ seen.add(mode);
+ if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p24-iv2'); bumpProgress('p24', 15); }
+ }
+ mCU.addEventListener('click', () => setMode('CU'));
+ mqC.addEventListener('click', () => setMode('qC'));
+ mqU.addEventListener('click', () => setMode('qU'));
+ document.getElementById('p24-iv2-go').addEventListener('click', calc);
+ setMode('CU');
+ })();
+
+ /* IV3 — Как изменится энергия? (6 заданий, 4 варианта) */
+ (function(){
+ const OPTS = ['увеличится в 2 раза', 'уменьшится в 2 раза', 'увеличится в 4 раза', 'не изменится'];
+ // ans: 0 = увеличится в 2 раза, 1 = уменьшится в 2 раза, 2 = увеличится в 4 раза, 3 = не изменится
+ const Q = [
+ { q:'Удвоили $U$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = CU^2/2$: $U$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
+ { q:'Удвоили $C$ при том же $U$. Как изменится $W$?', ans:0, why:'$W = CU^2/2$: $C$ удваивается $\\Rightarrow W$ растёт в 2 раза.' },
+ { q:'Удвоили заряд $q$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = q^2/(2C)$: $q$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
+ { q:'Уменьшили $C$ в 2 раза при том же заряде $q$. Как изменится $W$?', ans:0, why:'$W = q^2/(2C)$: $C$ в знаменателе уменьшается в 2 раза $\\Rightarrow W$ растёт в 2 раза.' },
+ { q:'Уменьшили $U$ в 2 раза, а $C$ увеличили в 4 раза. Как изменится $W$?', ans:3, why:'$W = CU^2/2$: $U^2$ упало в 4 раза, $C$ выросло в 4 раза $\\Rightarrow$ $W$ не меняется.' },
+ { q:'Зарядили конденсатор с 100 В до 200 В при том же $C$. Как изменилась $W$?', ans:2, why:'$W \\propto U^2$: $(200/100)^2 = 4$ — $W$ увеличилась в 4 раза.' },
+ ];
+
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p24-iv3-q');
+ const oEl = document.getElementById('p24-iv3-opts');
+ const fb = document.getElementById('p24-iv3-fb');
+ const iEl = document.getElementById('p24-iv3-i');
+ const sEl = document.getElementById('p24-iv3-s');
+ // Update score-display total to actual length
+ const total = Q.length;
+ document.querySelector('#p24-iv3 .score-display').innerHTML =
+ 'Задача 1 / '+total+'Очки: 0 / '+total+'';
+ const iEl2 = document.getElementById('p24-iv3-i');
+ const sEl2 = document.getElementById('p24-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p24-iv3'); bumpProgress('p24', 25); }
+ else if(score >= 4){ addXp(8, 'p24-iv3'); bumpProgress('p24', 15); }
+ return;
+ }
+ iEl2.textContent = (i+1);
+ sEl2.textContent = score;
+ const item = Q[i];
+ qEl.innerHTML = item.q;
+ oEl.innerHTML = OPTS.map((t, k) => '').join('');
+ fb.style.display = 'none';
+ renderMath(qEl); renderMath(oEl);
+ oEl.querySelectorAll('button').forEach(b => {
+ b.addEventListener('click', () => {
+ const v = +b.dataset.v;
+ if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶');
+ sEl2.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 2000);
+ });
+ });
+ }
+ document.getElementById('p24-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр энергии */
+ (function(){
+ const Q = [
+ { q:'$C = 100$ мкФ, $U = 100$ В. Найди $W$ в Дж (до сотых).', ans:0.5, tol:0.03, hint:'$W = CU^2/2 = 10^{-4}\\cdot 10^4/2 = 0{,}5$ Дж.' },
+ { q:'$C = 1000$ мкФ, $U = 300$ В (фотовспышка). Найди $W$ в Дж.', ans:45, tol:2.5, hint:'$W = CU^2/2 = 10^{-3}\\cdot 9\\cdot 10^4/2 = 45$ Дж.' },
+ { q:'$q = 10$ мкКл, $U = 200$ В. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = qU/2 = 10^{-5}\\cdot 200/2 = 10^{-3}$ Дж $= 1$ мДж.' },
+ { q:'$q = 20$ мкКл, $C = 200$ нФ. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = q^2/(2C) = (2\\cdot 10^{-5})^2/(2\\cdot 2\\cdot 10^{-7}) = 4\\cdot 10^{-10}/(4\\cdot 10^{-7}) = 10^{-3}$ Дж $= 1$ мДж.' },
+ { q:'Если удвоить $U$ конденсатора при $C = $ const, во сколько раз вырастет $W$?', ans:4, tol:0.1, hint:'$W \\propto U^2$: $(2U)^2/U^2 = 4$.' }
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p24-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15, 'p24-iv4'); bumpProgress('p24', 25); }
+ else if(score >= 3){ addXp(8, 'p24-iv4'); bumpProgress('p24', 15); }
+ return;
+ }
+ document.getElementById('p24-iv4-i').textContent = (i+1);
+ document.getElementById('p24-iv4-s').textContent = score;
+ document.getElementById('p24-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p24-iv4-ans').value = '';
+ renderMath(document.getElementById('p24-iv4-q'));
+ document.getElementById('p24-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p24-iv4-fb');
+ const raw = document.getElementById('p24-iv4-ans').value.replace(',', '.');
+ const ans = parseFloat(raw);
+ if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
+ if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
+ document.getElementById('p24-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1800);
+ }
+ document.getElementById('p24-iv4-go').addEventListener('click', go);
+ document.getElementById('p24-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
+ document.getElementById('p24-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p24');
}
function build_final3(){
const box = document.getElementById('final3-body');
let html = '';
- html += makeCard('theory', "Финал главы 3", "★", `
-
Финал главы 3 — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
- `);
+
+ /* Часть А — Шпаргалка главы (9 mini-карточек) */
+ const SHEET = [
+ { t:'§ 16 · Заряд', icon:'', body:'$q = ne$, $e = 1{,}6 \\cdot 10^{-19}$ Кл. Закон сохранения: $\\sum q = $ const.' },
+ { t:'§ 17 · Кулон', icon:'', body:'$F = k\\dfrac{q_1 q_2}{r^2}$, $k = 9\\cdot 10^9$ Н·м²/Кл². В среде: $F = F_0/\\varepsilon$.' },
+ { t:'§ 18 · Поле', icon:'', body:'Создаётся неподвижными зарядами, действует на заряды. Пробный заряд $q_0$ — для измерения.' },
+ { t:'§ 19 · Напряжённость', icon:'', body:'$\\vec{E} = \\vec{F}/q$. Точечный: $E = kq/r^2$. Принцип суперпозиции — векторно.' },
+ { t:'§ 20 · Линии', icon:'', body:'Касательны к $\\vec{E}$. От + к −, не пересекаются. Густота = $E$. Однородное поле — параллельные линии.' },
+ { t:'§ 21 · Работа · потенциал', icon:'', body:'$A = qEd\\cos\\alpha = q(\\varphi_1-\\varphi_2)$. $\\varphi = kq/r$. Работа не зависит от траектории.' },
+ { t:'§ 22 · Напряжение', icon:'', body:'$U = \\varphi_1 - \\varphi_2$ [В]. В однородном: $U = Ed$. Эквипотенциальные поверхности $\\perp \\vec{E}$.' },
+ { t:'§ 23 · Конденсаторы', icon:'', body:'$C = q/U$ [Ф]. Плоский: $C = \\varepsilon\\varepsilon_0 S/d$. $\\parallel$: $\\sum C$. Последов.: $\\sum 1/C$.' },
+ { t:'§ 24 · Энергия', icon:'', body:'$W = \\dfrac{CU^2}{2} = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$. Хранится в поле.' },
+ ];
+
+ html += `
Ключевые формулы и идеи всех 9 параграфов главы — повтори перед битвой с боссами.
+
+ ${SHEET.map(s => `
+
+ ${s.icon}
+
${s.t}
+
+
${s.body}
+
`).join('')}
+
+
+
`;
+
+ /* Часть Б — 7 боссов intro */
+ html += `
+
+ ${ICONS.rule}
+ Боссы главы 3
+ 7
+
+
+
7 интегрированных задач по §§16–24. За каждого побеждённого босса: +10 XP, +14% к прогрессу. Победишь всех — ачивка «Мастер электростатики» и +50 XP бонус.