diff --git a/frontend/textbooks/physics_8_ch1.html b/frontend/textbooks/physics_8_ch1.html
index a97a694..0541b2c 100644
--- a/frontend/textbooks/physics_8_ch1.html
+++ b/frontend/textbooks/physics_8_ch1.html
@@ -301,8 +301,25 @@ const SIDEBARS = {
["Излучают всё","чем горячее, тем сильнее"],
["Тёмные тела","поглощают и излучают сильнее светлых"]
]},
- p6:{title:"Шпаргалка § 6",rows:[["В разработке","Phase 1 Wave 3"]]},
- p7:{title:"Шпаргалка § 7",rows:[["В разработке","Phase 1 Wave 3"]]},
+ p6:{title:"Шпаргалка § 6",rows:[
+ ["Закон","$Q = c m \\Delta T$"],
+ ["$c$ — уд. теплоёмкость","Дж/(кг·К)"],
+ ["вода","$c = 4200$"],
+ ["лёд","$c = 2100$"],
+ ["алюминий","$c = 920$"],
+ ["медь","$c = 380$"],
+ ["железо","$c = 460$"],
+ ["Баланс","$Q_{отд} = Q_{пол}$"]
+ ]},
+ p7:{title:"Шпаргалка § 7",rows:[
+ ["Закон","$Q = q m$"],
+ ["$q$ — уд. теплота сгорания","Дж/кг"],
+ ["дрова","$q = 10^7$"],
+ ["уголь","$q = 3 \\cdot 10^7$"],
+ ["бензин","$q = 4{,}6 \\cdot 10^7$"],
+ ["природ. газ","$q = 4{,}4 \\cdot 10^7$"],
+ ["КПД котла","$\\eta = Q_{пол}/(q m)$"]
+ ]},
p8:{title:"Шпаргалка § 8",rows:[["В разработке","Phase 1 Wave 4"]]},
p9:{title:"Шпаргалка § 9",rows:[["В разработке","Phase 1 Wave 4"]]},
p10:{title:"Шпаргалка § 10",rows:[["В разработке","Phase 1 Wave 5"]]},
@@ -316,8 +333,8 @@ const TIPS=[
{sec:'p3',html:"Один конец металлического стержня в огне — другой нагревается, хотя ничто не движется. Это теплопроводность : молекулы передают энергию соседям. У металлов это работает быстро, у дерева — медленно."},
{sec:'p4',html:"Тёплый воздух легче холодного и поднимается вверх. Так батарея греет всю комнату — это конвекция . В твёрдых телах конвекции нет, потому что молекулы не могут свободно двигаться."},
{sec:'p5',html:"Солнце греет Землю через космический вакуум — теплопроводность и конвекция тут невозможны. Это излучение электромагнитными волнами. Чёрная футболка в жаркий день нагревается сильнее белой."},
- {sec:'p6',html:"Параграф § 6 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."},
- {sec:'p7',html:"Параграф § 7 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."},
+ {sec:'p6',html:"Чтобы нагреть тело массой $m$ на $\\Delta T$ градусов, нужно $Q = c m \\Delta T$. Здесь $c$ — это «сколько энергии съедает 1 кг этого вещества на 1 градус». У воды $c$ самое большое — поэтому вода долго греется и долго остывает."},
+ {sec:'p7',html:"При сгорании 1 кг топлива выделяется $q$ Дж энергии. Полное выделение: $Q = q m$. У бензина $q$ в 4,5 раза больше, чем у дров, — поэтому литр бензина греет дольше, чем литр дров."},
{sec:'p8',html:"Параграф § 8 будет реализован в Phase 1 Wave 4. Используем хелперы из phys.js и optics.js."},
{sec:'p9',html:"Параграф § 9 будет реализован в Phase 1 Wave 4. Используем хелперы из phys.js и optics.js."},
{sec:'p10',html:"Параграф § 10 будет реализован в Phase 1 Wave 5. Используем хелперы из phys.js и optics.js."},
@@ -331,8 +348,8 @@ const BUILDERS = {
p3: ()=>{ build_p3(); },
p4: ()=>{ build_p4(); },
p5: ()=>{ build_p5(); },
- p6: ()=>{ const box=document.getElementById('p6-body'); box.innerHTML = buildStub('p6', 'Расчёт количества теплоты при нагревании и охлаждении. Удельная теплоёмкость', 'Phase 1 Wave 3') + secNavFor('p6') + readButton('p6'); renderMath(box); wireReadBtn('p6'); },
- p7: ()=>{ const box=document.getElementById('p7-body'); box.innerHTML = buildStub('p7', 'Горение. Удельная теплота сгорания топлива', 'Phase 1 Wave 3') + secNavFor('p7') + readButton('p7'); renderMath(box); wireReadBtn('p7'); },
+ p6: ()=>{ build_p6(); },
+ p7: ()=>{ build_p7(); },
p8: ()=>{ const box=document.getElementById('p8-body'); box.innerHTML = buildStub('p8', 'Плавление и кристаллизация', 'Phase 1 Wave 4') + secNavFor('p8') + readButton('p8'); renderMath(box); wireReadBtn('p8'); },
p9: ()=>{ const box=document.getElementById('p9-body'); box.innerHTML = buildStub('p9', 'Удельная теплота плавления и кристаллизации', 'Phase 1 Wave 4') + secNavFor('p9') + readButton('p9'); renderMath(box); wireReadBtn('p9'); },
p10: ()=>{ const box=document.getElementById('p10-body'); box.innerHTML = buildStub('p10', 'Испарение жидкостей. Факторы, влияющие на скорость испарения', 'Phase 1 Wave 5') + secNavFor('p10') + readButton('p10'); renderMath(box); wireReadBtn('p10'); },
@@ -2030,6 +2047,468 @@ function _initP5_mcq(){
render();
}
+/* ======================================================================
+ PHASE 1 · WAVE 3 — §6, §7
+ ====================================================================== */
+
+/* Таблица удельных теплоёмкостей (Дж/(кг·К)) */
+const MAT_C = [
+ {key:'water', name:'вода', c:4200},
+ {key:'ice', name:'лёд', c:2100},
+ {key:'oil', name:'масло раст.',c:2000},
+ {key:'wood', name:'дерево', c:2400},
+ {key:'glass', name:'стекло', c:840 },
+ {key:'al', name:'алюминий', c:920 },
+ {key:'fe', name:'железо', c:460 },
+ {key:'brass', name:'латунь', c:380 },
+ {key:'cu', name:'медь', c:380 },
+ {key:'lead', name:'свинец', c:130 },
+ {key:'hg', name:'ртуть', c:140 }
+];
+
+/* Таблица удельных теплот сгорания (Дж/кг) */
+const MAT_Q = [
+ {key:'wood', name:'дрова', q:1.0e7},
+ {key:'peat', name:'торф', q:1.5e7},
+ {key:'coal', name:'каменный уголь', q:3.0e7},
+ {key:'alc', name:'спирт', q:2.7e7},
+ {key:'oil', name:'нефть', q:4.4e7},
+ {key:'gas', name:'природный газ', q:4.4e7},
+ {key:'kero', name:'керосин', q:4.6e7},
+ {key:'gasoline',name:'бензин', q:4.6e7}
+];
+
+/* ======== §6 — Q = cm ΔT ======== */
+function build_p6(){
+ const box = document.getElementById('p6-body');
+ let h = '';
+
+ h += makeCard('theory', 'Закон нагревания', '§ 6.1',
+ '
Чтобы изменить температуру тела массой $m$ на $\\Delta T = T_2 - T_1$, нужно сообщить ему (или отнять у него) количество теплоты:
'
+ +'$$Q = c\\,m\\,\\Delta T$$
'
+ +''
+ +'$Q$ — количество теплоты, Дж; '
+ +'$c$ — удельная теплоёмкость вещества, Дж/(кг·К); '
+ +'$m$ — масса, кг; '
+ +'$\\Delta T$ — изменение температуры, К или °C (разница одна). '
+ +' '
+ +'Если $T_2 > T_1$ — тело нагревается, $Q > 0$. Если $T_2 < T_1$ — остывает, $Q < 0$.
'
+ );
+ h += makeCard('rule', 'Что такое удельная теплоёмкость', '§ 6.2',
+ '$c$ — количество теплоты, нужное чтобы нагреть 1 кг вещества на 1 К (или 1 °C).
'
+ +'У воды $c = 4200$ Дж/(кг·К) — это очень много. Поэтому:
'
+ +''
+ +'вода долго греется на плите; '
+ +'вода долго остывает (поэтому грелка из воды держит тепло); '
+ +'океан смягчает климат прибрежных стран. '
+ +' '
+ +'У металлов $c$ маленькая: медь 380, железо 460. Они быстро нагреваются и быстро остывают.
'
+ );
+ h += makeCard('example', 'Уравнение теплового баланса', '§ 6.3',
+ 'Когда горячее тело отдаёт тепло холодному в изолированной системе (без потерь), вся отданная теплота получена холодным:
'
+ +'$$Q_{отд} = Q_{пол}$$
'
+ +'Если смешать массы $m_1$ при $T_1$ и $m_2$ при $T_2$ одного вещества:
'
+ +'$$T = \\dfrac{m_1 T_1 + m_2 T_2}{m_1 + m_2}$$
'
+ +'Это средневзвешенная температура.
'
+ );
+
+ /* IV1 — калькулятор Q = cmΔT с анимацией */
+ let optsC = '';
+ MAT_C.forEach(m=>{ optsC += ''+m.name+' (c = '+m.c+') '; });
+ h += ''
+ +''
+ +'
Выбери вещество, массу и изменение температуры — увидь, сколько энергии нужно. Термометр покажет процесс.
'
+ +'
'
+ +'Вещество: '+optsC+' '
+ +'$m$, кг: 1.0 '
+ +'$\\Delta T$, °C: 50 '
+ +'
'
+ +'
'
+ +'
'
+ +'$c$ = 4200 Дж/(кг·К) '
+ +'$Q$ = 2.10 × 10^5 Дж = 210 кДж '
+ +'Это столько энергии съедает плита или электрочайник. '
+ +'
'
+ +'
';
+
+ /* IV2 — калькулятор смешивания */
+ h += '';
+
+ /* IV3 — DnD ранжирование c */
+ h += ''
+ +''
+ +'
Перетащи вещества так, чтобы они шли от меньшего $c$ к большему . Подсказка: у воды $c$ рекордно велика, у металлов — мала.
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — тренажёр расчётных задач */
+ h += ''
+ +''
+ +'
Введи числовой ответ. 4+ верных решения — +15 XP. Допуск ±2%.
'
+ +'
'
+ +'
Задача: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p6') + readButton('p6');
+ renderMath(box);
+ wireReadBtn('p6');
+
+ _initP6_calc();
+ _initP6_mix();
+ _initP6_dnd();
+ _initP6_tasks();
+}
+
+function _initP6_calc(){
+ const svg = document.getElementById('p6-sim'); if(!svg) return;
+ function fmtSci(x){
+ if(Math.abs(x) < 1000) return x.toFixed(0);
+ const e = Math.floor(Math.log10(Math.abs(x)));
+ const mant = (x / Math.pow(10, e)).toFixed(2);
+ return mant+' × 10'+e+' ';
+ }
+ function update(){
+ const c = +document.getElementById('p6-mat').value;
+ const m = +document.getElementById('p6-m').value;
+ const d = +document.getElementById('p6-d').value;
+ document.getElementById('p6-mv').textContent = m.toFixed(1);
+ document.getElementById('p6-dv').textContent = d;
+ document.getElementById('p6-cv').textContent = c;
+ const Q = c * m * d;
+ document.getElementById('p6-q').innerHTML = fmtSci(Q);
+ document.getElementById('p6-qkj').textContent = (Q/1000).toFixed(1);
+ /* sim: куб + термометр, цвет по итоговой T (20 + d) */
+ const Tfinal = 20 + d;
+ const col = window.PHYS.tempColor(Tfinal, -50, 150);
+ let s = '';
+ s += ' ';
+ s += 'm = '+m.toFixed(1)+' кг ';
+ s += ''+(d>0?'нагреваем':d<0?'охлаждаем':'без изменения')+' ';
+ /* термометр */
+ s += window.PHYS.thermometer(220, 30, 100, -50, 150, Tfinal);
+ /* подпись Q */
+ s += 'Q = c · m · ΔT ';
+ s += '= '+c+' · '+m.toFixed(1)+' · '+d+' ';
+ s += 'Q = '+(Q/1000).toFixed(1)+' кДж ';
+ svg.innerHTML = s;
+ }
+ document.getElementById('p6-mat').addEventListener('change', update);
+ document.getElementById('p6-m').addEventListener('input', update);
+ document.getElementById('p6-d').addEventListener('input', update);
+ update();
+}
+
+function _initP6_mix(){
+ function update(){
+ const m1 = +document.getElementById('p6-mx1').value;
+ const t1 = +document.getElementById('p6-tx1').value;
+ const m2 = +document.getElementById('p6-mx2').value;
+ const t2 = +document.getElementById('p6-tx2').value;
+ document.getElementById('p6-mxv1').textContent = m1.toFixed(1);
+ document.getElementById('p6-txv1').textContent = t1;
+ document.getElementById('p6-mxv2').textContent = m2.toFixed(1);
+ document.getElementById('p6-txv2').textContent = t2;
+ const T = (m1*t1 + m2*t2) / (m1 + m2);
+ document.getElementById('p6-tres').textContent = T.toFixed(1);
+ }
+ ['p6-mx1','p6-tx1','p6-mx2','p6-tx2'].forEach(id => document.getElementById(id).addEventListener('input', update));
+ update();
+}
+
+function _initP6_dnd(){
+ /* 5 веществ по возрастанию c: свинец(130) → железо(460) → стекло(840) → дерево(2400) → вода(4200) */
+ const items = [
+ {id:'pb', cat:'r1', html:'свинец (130)'},
+ {id:'fe', cat:'r2', html:'железо (460)'},
+ {id:'gl', cat:'r3', html:'стекло (840)'},
+ {id:'wd', cat:'r4', html:'дерево (2400)'},
+ {id:'wa', cat:'r5', html:'вода (4200)'}
+ ];
+ const dnd = setupSorter({ poolId:'p6-dnd-pool', scopeSelector:'#sec-p6', cats:['r1','r2','r3','r4','r5'], items, columnLayout:false });
+ document.getElementById('p6-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p6-dnd-fb');
+ let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; });
+ if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. У воды $c$ рекордно велика — её сложно нагреть и сложно охладить.'; addXp(15,'p6-dnd'); bumpProgress('p6', 20); renderMath(fb); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: металлы — мало, вода — рекорд.'; }
+ });
+ document.getElementById('p6-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p6-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP6_tasks(){
+ const TASKS = [
+ {q:'Сколько энергии в кДж нужно, чтобы нагреть 2 кг воды от 20 до 100 °C? ($c_{воды} = 4200$)', ans: 672, tol: 14, why:'$Q = 4200 \\cdot 2 \\cdot 80 = 672\\,000$ Дж = $672$ кДж.'},
+ {q:'Какую массу алюминия (в кг) можно нагреть на 50 °C, имея 92 кДж? ($c = 920$)', ans: 2, tol: 0.05, why:'$m = Q/(c \\Delta T) = 92\\,000/(920 \\cdot 50) = 2$ кг.'},
+ {q:'На сколько градусов нагреется 0,5 кг меди при $Q = 19\\,000$ Дж? ($c = 380$)', ans: 100, tol: 2, why:'$\\Delta T = Q/(cm) = 19\\,000/(380 \\cdot 0{,}5) = 100$ К.'},
+ {q:'Смешали 1 кг воды при 80 °C и 3 кг воды при 20 °C. Какая итоговая температура (°C)?', ans: 35, tol: 0.5, why:'$T = (1 \\cdot 80 + 3 \\cdot 20)/4 = 140/4 = 35$ °C.'},
+ {q:'Какова удельная теплоёмкость (Дж/(кг·К)) вещества, если 3 кг его при $\\Delta T = 40$ К получили 48 кДж?', ans: 400, tol: 10, why:'$c = Q/(m\\Delta T) = 48\\,000/(3 \\cdot 40) = 400$. Это близко к меди.'},
+ {q:'Найди $Q$ (в кДж) для остывания 4 кг железа с 200 до 50 °C. ($c = 460$). Запиши абсолютную величину.', ans: 276, tol: 6, why:'$|Q| = 460 \\cdot 4 \\cdot 150 = 276\\,000$ Дж = $276$ кДж.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const t = TASKS[i]; const wrap = document.getElementById('p6-task'); if(!wrap) return;
+ wrap.innerHTML =
+ 'Задача '+(i+1)+'. '+t.q+'
'
+ +' '
+ +'Ответ '
+ +'Подсказка '
+ +'Следующая
'
+ +''+t.why+'
'
+ +'
';
+ document.getElementById('p6-task-i').textContent = (i+1);
+ document.getElementById('p6-task-ok').textContent = ok;
+ document.getElementById('p6-task-go').addEventListener('click', ()=>{
+ const v = parseFloat((document.getElementById('p6-task-inp').value || '').replace(',','.'));
+ const fb = document.getElementById('p6-task-fb');
+ if(isNaN(v)){ fb.className='feedback fail'; fb.innerHTML='Введи число.'; return; }
+ done++;
+ if(Math.abs(v - t.ans) < t.tol){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно! '+t.why; addXp(4,'p6-task'); bumpProgress('p6', 6); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. Правильный ответ: '+t.ans+'. '+t.why; }
+ document.getElementById('p6-task-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= TASKS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p6-task-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — расчёты сданы ('+ok+'/'+TASKS.length+').'; addXp(15,'p6-task-bonus'); bumpProgress('p6', 15); }, 600); }
+ });
+ document.getElementById('p6-task-hint').addEventListener('click', ()=>{ document.getElementById('p6-task-hint-txt').classList.toggle('show'); });
+ document.getElementById('p6-task-next').addEventListener('click', ()=>{ i=(i+1)%TASKS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
+/* ======== §7 — Q = qm ======== */
+function build_p7(){
+ const box = document.getElementById('p7-body');
+ let h = '';
+
+ h += makeCard('theory', 'Горение и теплота сгорания', '§ 7.1',
+ 'При горении топливо реагирует с кислородом и выделяет энергию в виде тепла. Энергия эта запасена в химических связях молекул топлива.
'
+ +'Количество теплоты, выделившееся при полном сгорании массы $m$ топлива:
'
+ +'$$Q = q\\,m$$
'
+ +'$q$ — удельная теплота сгорания , Дж/кг. Это энергия, которую даёт сгорание 1 кг данного топлива.
'
+ );
+ h += makeCard('rule', 'Топлива и их $q$', '§ 7.2',
+ 'Топливо $q$, $\\dfrac{\\text{Дж}}{\\text{кг}}$ '
+ + MAT_Q.map(m=>''+m.name+' '+m.q.toExponential(1).replace('+','')+' ').join('')
+ +'
'
+ +'Чем больше $q$, тем «энергоёмче» топливо. Бензин примерно в 4,5 раза мощнее дров на кг.
'
+ );
+ h += makeCard('example', 'КПД нагревательного устройства', '§ 7.3',
+ 'Реально не вся выделившаяся при сгорании энергия идёт на полезное дело (нагрев воды, движение машины). Часть теряется в виде тепла в окружающую среду.
'
+ +'$$\\eta = \\dfrac{Q_{пол}}{Q_{сгор}} = \\dfrac{Q_{пол}}{q m}$$
'
+ +'У хорошего котла $\\eta \\approx 80\\%$, у плохой буржуйки — 30%.
'
+ );
+
+ /* IV1 — калькулятор Q = qm */
+ let optsQ = '';
+ MAT_Q.forEach(m=>{ optsQ += ''+m.name+' ($q = '+m.q.toExponential(1).replace('+','').replace('.','{,}')+'$) '; });
+ h += ''
+ +''
+ +'
Выбери топливо и массу — увидь, сколько энергии выделится при его полном сгорании.
'
+ +'
'
+ +'Топливо: '
+ + MAT_Q.map(m=>''+m.name+' (q='+m.q.toExponential(1).replace('+','')+') ').join('')
+ +' '
+ +'$m$, кг: 1.0 '
+ +'
'
+ +'
'
+ +'
'
+ +'$q$ = 107 Дж/кг '
+ +'$Q$ = 10 МДж = 2.8 кВт·ч '
+ +'Эквивалент: нагрев 30 кг воды от 20 до 100 °C. '
+ +'
'
+ +'
';
+
+ /* IV2 — викторина «какое топливо мощнее» */
+ h += ''
+ +''
+ +'
Выбери топливо с большей удельной теплотой сгорания.
'
+ +'
'
+ +'
Следующий раунд
'
+ +'
Раунд: 1 / 6 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD ранжирование топлив */
+ h += ''
+ +''
+ +'
От самого слабого до самого мощного по теплоте сгорания.
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — тренажёр расчётных задач */
+ h += ''
+ +''
+ +'
4+ верных — +15 XP. Допуск ±3 %.
'
+ +'
'
+ +'
Задача: 1 / 5 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p7') + readButton('p7');
+ renderMath(box);
+ wireReadBtn('p7');
+
+ _initP7_calc();
+ _initP7_quiz();
+ _initP7_dnd();
+ _initP7_tasks();
+}
+
+function _initP7_calc(){
+ const svg = document.getElementById('p7-sim'); if(!svg) return;
+ function update(){
+ const q = +document.getElementById('p7-fuel').value;
+ const m = +document.getElementById('p7-m').value;
+ document.getElementById('p7-mv').textContent = m.toFixed(1);
+ document.getElementById('p7-qv').innerHTML = q.toExponential(1).replace('+','').replace('e', ' × 10')+' ';
+ const Q = q * m;
+ document.getElementById('p7-q').innerHTML = (Q/1e6).toFixed(1)+' МДж';
+ document.getElementById('p7-qkw').textContent = (Q/3.6e6).toFixed(2);
+ /* эквивалент: нагрев воды от 20 до 100 → ΔT=80, Q=cmΔT, m = Q/(c·80) */
+ document.getElementById('p7-eqkg').textContent = (Q/(4200*80)).toFixed(1);
+ /* SVG: огонь + котелок */
+ let s = '';
+ /* печь */
+ s += ' ';
+ /* пламя */
+ const flameH = 30 + Math.min(50, m*5);
+ s += ' ';
+ s += ' ';
+ /* топливо */
+ s += ''+m.toFixed(1)+' кг ';
+ /* стрелка-энергия */
+ s += 'Q = q m ';
+ s += '= '+q.toExponential(1).replace('+','')+' · '+m.toFixed(1)+' ';
+ s += 'Q = '+(Q/1e6).toFixed(1)+' МДж ';
+ s += ''+(Q/3.6e6).toFixed(2)+' кВт·ч ';
+ svg.innerHTML = s;
+ }
+ document.getElementById('p7-fuel').addEventListener('change', update);
+ document.getElementById('p7-m').addEventListener('input', update);
+ update();
+}
+
+function _initP7_quiz(){
+ const QS = [
+ {A:'дрова', B:'бензин', ans:'B', why:'У бензина $q \\approx 4{,}6 \\cdot 10^7$, у дров $\\approx 10^7$ — бензин в 4,5 раза мощнее.'},
+ {A:'торф', B:'каменный уголь', ans:'B', why:'У угля $q$ вдвое больше, чем у торфа.'},
+ {A:'спирт', B:'природный газ', ans:'B', why:'У газа $4{,}4 \\cdot 10^7$, у спирта $2{,}7 \\cdot 10^7$.'},
+ {A:'керосин', B:'дрова', ans:'A', why:'Керосин — продукт переработки нефти, $q$ в 4,6 раза больше.'},
+ {A:'нефть', B:'бензин', ans:'B', why:'У бензина чуть больше: $4{,}6$ против $4{,}4 \\cdot 10^7$.'},
+ {A:'торф', B:'дрова', ans:'B', why:'У дров $q \\approx 10^7$, у торфа $1{,}5 \\cdot 10^7$ — торф мощнее. Правильный ответ: торф , ответ A.', flip:true}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p7-quiz'); if(!wrap) return;
+ /* для flip-задачи правильный ответ A */
+ const correctAns = q.flip ? 'A' : q.ans;
+ wrap.innerHTML =
+ ''
+ +'A. '+q.A+' '
+ +'B. '+q.B+' '
+ +'
'
+ +'
';
+ document.getElementById('p7-quiz-r').textContent = (i+1);
+ document.getElementById('p7-quiz-ok').textContent = ok;
+ wrap.querySelectorAll('[data-pick]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-pick]').forEach(b=>b.disabled=true);
+ const fb = document.getElementById('p7-quiz-fb');
+ if(btn.dataset.pick === correctAns){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p7-quiz'); bumpProgress('p7', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p7-quiz-ok').textContent = ok;
+ renderMath(wrap);
+ });
+ });
+ renderMath(wrap);
+ }
+ document.getElementById('p7-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP7_dnd(){
+ /* 5 топлив по возрастанию q: дрова(1) → торф(1.5) → спирт(2.7) → уголь(3) → бензин(4.6), все ×10^7 */
+ const items = [
+ {id:'wd', cat:'r1', html:'дрова ($10^7$)'},
+ {id:'pt', cat:'r2', html:'торф ($1{,}5 \\cdot 10^7$)'},
+ {id:'al', cat:'r3', html:'спирт ($2{,}7 \\cdot 10^7$)'},
+ {id:'cl', cat:'r4', html:'уголь ($3 \\cdot 10^7$)'},
+ {id:'gs', cat:'r5', html:'бензин ($4{,}6 \\cdot 10^7$)'}
+ ];
+ const dnd = setupSorter({ poolId:'p7-dnd-pool', scopeSelector:'#sec-p7', cats:['r1','r2','r3','r4','r5'], items, columnLayout:false });
+ document.getElementById('p7-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p7-dnd-fb');
+ let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; });
+ if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. Углеводороды (нефть, бензин, газ) — самые энергоёмкие.'; addXp(15,'p7-dnd'); bumpProgress('p7', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: бензин — самый мощный из распространённых.'; }
+ });
+ document.getElementById('p7-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p7-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP7_tasks(){
+ const TASKS = [
+ {q:'Сколько энергии (в МДж) выделится при полном сгорании 2 кг бензина? ($q = 4{,}6 \\cdot 10^7$)', ans: 92, tol: 2, why:'$Q = qm = 4{,}6 \\cdot 10^7 \\cdot 2 = 9{,}2 \\cdot 10^7 = 92$ МДж.'},
+ {q:'Какую массу (в кг) дров нужно сжечь, чтобы получить 50 МДж энергии? ($q = 10^7$)', ans: 5, tol: 0.1, why:'$m = Q/q = 5 \\cdot 10^7 / 10^7 = 5$ кг.'},
+ {q:'При сгорании 0,5 кг угля выделилось 15 МДж. Чему равно $q$ (в МДж/кг)?', ans: 30, tol: 1, why:'$q = Q/m = 15/0{,}5 = 30$ МДж/кг — это каменный уголь.'},
+ {q:'Котёл с $\\eta = 80\\%$ сжёг 2 кг дров. Какая полезная энергия (в МДж)? ($q = 10^7$)', ans: 16, tol: 0.3, why:'$Q_{сгор}=2 \\cdot 10^7 = 20$ МДж. $Q_{пол} = \\eta \\cdot Q_{сгор} = 0{,}8 \\cdot 20 = 16$ МДж.'},
+ {q:'Сколько кг бензина даст столько же энергии, что и 9,2 кг дров? ($q_{дров}=10^7$, $q_{бенз}=4{,}6 \\cdot 10^7$)', ans: 2, tol: 0.05, why:'Энергия дров: $9{,}2 \\cdot 10^7$ Дж. $m_{бенз}=E/q_{бенз}=9{,}2 \\cdot 10^7/(4{,}6 \\cdot 10^7) = 2$ кг.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const t = TASKS[i]; const wrap = document.getElementById('p7-task'); if(!wrap) return;
+ wrap.innerHTML =
+ 'Задача '+(i+1)+'. '+t.q+'
'
+ +' '
+ +'Ответ '
+ +'Подсказка '
+ +'Следующая
'
+ +''+t.why+'
'
+ +'
';
+ document.getElementById('p7-task-i').textContent = (i+1);
+ document.getElementById('p7-task-ok').textContent = ok;
+ document.getElementById('p7-task-go').addEventListener('click', ()=>{
+ const v = parseFloat((document.getElementById('p7-task-inp').value || '').replace(',','.'));
+ const fb = document.getElementById('p7-task-fb');
+ if(isNaN(v)){ fb.className='feedback fail'; fb.innerHTML='Введи число.'; return; }
+ done++;
+ if(Math.abs(v - t.ans) < t.tol){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно! '+t.why; addXp(4,'p7-task'); bumpProgress('p7', 6); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. Правильный ответ: '+t.ans+'. '+t.why; }
+ document.getElementById('p7-task-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= TASKS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p7-task-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — расчёты сданы ('+ok+'/'+TASKS.length+').'; addXp(15,'p7-task-bonus'); bumpProgress('p7', 15); }, 600); }
+ });
+ document.getElementById('p7-task-hint').addEventListener('click', ()=>{ document.getElementById('p7-task-hint-txt').classList.toggle('show'); });
+ document.getElementById('p7-task-next').addEventListener('click', ()=>{ i=(i+1)%TASKS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
function init(){
loadProgress(); initTheme(); initSidebarToggle(); initSearch();
buildParaSelector(); refreshProgressUI(); loadServerReadState(); goTo(PARAS[0].id);