diff --git a/frontend/textbooks/physics_8_ch2.html b/frontend/textbooks/physics_8_ch2.html
index 186eae0..4137bf2 100644
--- a/frontend/textbooks/physics_8_ch2.html
+++ b/frontend/textbooks/physics_8_ch2.html
@@ -307,9 +307,26 @@ const ACH_LABELS = {
};
const SIDEBARS = {
- p12:{title:"Шпаргалка § 12",rows:[["В разработке","Phase 2 Wave 1"]]},
- p13:{title:"Шпаргалка § 13",rows:[["В разработке","Phase 2 Wave 1"]]},
- p14:{title:"Шпаргалка § 14",rows:[["В разработке","Phase 2 Wave 1"]]},
+ p12:{title:"Шпаргалка § 12",rows:[
+ ["2 рода зарядов","+ (стекло о шёлк), − (эбонит о шерсть)"],
+ ["Одноимённые","отталкиваются"],
+ ["Разноимённые","притягиваются"],
+ ["При трении","заряд один — +, другой — −"],
+ ["Сумма","сохраняется (закон сохр. заряда)"]
+ ]},
+ p13:{title:"Шпаргалка § 13",rows:[
+ ["Проводники","есть свободные носители"],
+ ["Примеры пров.","металлы, графит, растворы солей, кислот, щелочей"],
+ ["Диэлектрики","эбонит, стекло, дерево, пластик, дист. вода"],
+ ["В проводнике","заряд по поверхности"],
+ ["В диэлектрике","остаётся где появился"]
+ ]},
+ p14:{title:"Шпаргалка § 14",rows:[
+ ["Индукция","перераспределение зарядов в проводнике"],
+ ["Без касания","нейтральный проводник $\\to$ разделение"],
+ ["Ближний конец","заряд противоположного знака"],
+ ["Если разделить","на 2 заряженные части"]
+ ]},
p15:{title:"Шпаргалка § 15",rows:[["В разработке","Phase 2 Wave 2"]]},
p16:{title:"Шпаргалка § 16",rows:[["В разработке","Phase 2 Wave 2"]]},
p17:{title:"Шпаргалка § 17",rows:[["В разработке","Phase 2 Wave 3"]]},
@@ -331,9 +348,9 @@ const SIDEBARS = {
};
const TIPS=[
- {sec:'p12',html:"Параграф § 12 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."},
- {sec:'p13',html:"Параграф § 13 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."},
- {sec:'p14',html:"Параграф § 14 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."},
+ {sec:'p12',html:"Потри расчёску о волосы — она начнёт притягивать клочки бумаги. Это электризация . При трении один предмет получает положительный заряд, другой — отрицательный . Одноимённые отталкиваются, разноимённые — притягиваются."},
+ {sec:'p13',html:"Металлы — отличные проводники: их электроны легко двигаются. Эбонит, стекло, пластик — диэлектрики: электроны связаны атомами. Поэтому ручка отвёртки из пластика — а сама отвёртка металлическая."},
+ {sec:'p14',html:"Поднеси заряженный шар к незаряженному металлическому шарику — он притянется. В нейтральном проводнике под действием внешнего заряда электроны перераспределяются, и ближний конец получает противоположный знак."},
{sec:'p15',html:"Параграф § 15 будет реализован в Phase 2 Wave 2. Используем хелперы из phys.js и optics.js."},
{sec:'p16',html:"Параграф § 16 будет реализован в Phase 2 Wave 2. Используем хелперы из phys.js и optics.js."},
{sec:'p17',html:"Параграф § 17 будет реализован в Phase 2 Wave 3. Используем хелперы из phys.js и optics.js."},
@@ -355,9 +372,9 @@ const TIPS=[
];
const BUILDERS = {
- p12: ()=>{ const box=document.getElementById('p12-body'); box.innerHTML = buildStub('p12', 'Электризация тел. Взаимодействие зарядов', 'Phase 2 Wave 1') + secNavFor('p12') + readButton('p12'); renderMath(box); wireReadBtn('p12'); },
- p13: ()=>{ const box=document.getElementById('p13-body'); box.innerHTML = buildStub('p13', 'Проводники и диэлектрики', 'Phase 2 Wave 1') + secNavFor('p13') + readButton('p13'); renderMath(box); wireReadBtn('p13'); },
- p14: ()=>{ const box=document.getElementById('p14-body'); box.innerHTML = buildStub('p14', 'Электризация через влияние', 'Phase 2 Wave 1') + secNavFor('p14') + readButton('p14'); renderMath(box); wireReadBtn('p14'); },
+ p12: ()=>{ build_p12(); },
+ p13: ()=>{ build_p13(); },
+ p14: ()=>{ build_p14(); },
p15: ()=>{ const box=document.getElementById('p15-body'); box.innerHTML = buildStub('p15', 'Электрический заряд. Элементарный заряд', 'Phase 2 Wave 2') + secNavFor('p15') + readButton('p15'); renderMath(box); wireReadBtn('p15'); },
p16: ()=>{ const box=document.getElementById('p16-body'); box.innerHTML = buildStub('p16', 'Строение атома. Ионы', 'Phase 2 Wave 2') + secNavFor('p16') + readButton('p16'); renderMath(box); wireReadBtn('p16'); },
p17: ()=>{ const box=document.getElementById('p17-body'); box.innerHTML = buildStub('p17', 'Электрическое поле. Электрическое напряжение', 'Phase 2 Wave 3') + secNavFor('p17') + readButton('p17'); renderMath(box); wireReadBtn('p17'); },
@@ -715,6 +732,692 @@ function initSidebarToggle(){
document.addEventListener('keydown',e=>{ if(e.key==='Escape') close(); });
}
+/* ======================================================================
+ PHASE 2 · WAVE 1 — §12, §13, §14
+ ====================================================================== */
+
+/* Sim-management */
+const _SIMS = {};
+function _killSim(key){ if(_SIMS[key] && _SIMS[key].raf){ cancelAnimationFrame(_SIMS[key].raf); _SIMS[key].raf=0; } }
+function _isVisible(secId){ const el=document.getElementById('sec-'+secId); return el && el.classList.contains('active'); }
+
+/* ======== §12 — Электризация тел ======== */
+function build_p12(){
+ const box = document.getElementById('p12-body');
+ let h = '';
+
+ h += makeCard('theory', 'Электрический заряд', '§ 12.1',
+ '
При трении некоторых тел друг о друга они приобретают свойство притягивать лёгкие предметы — клочки бумаги, волоски. Говорят: тело электризуется , на нём появляется электрический заряд .
'
+ +'Опыты показывают: существует два рода зарядов.
'
+ +''
+ +'Положительный (+): возникает на стекле, потёртом о шёлк. '
+ +'Отрицательный (−): возникает на эбоните или пластике, потёртом о шерсть. '
+ +' '
+ );
+ h += makeCard('rule', 'Закон взаимодействия зарядов', '§ 12.2',
+ 'Одноимённые заряды (++ или −−) — отталкиваются . '
+ +'Разноимённые заряды (+−) — притягиваются .
'
+ +'При электризации трением заряды на двух телах равны по модулю и противоположны по знаку. Это закон сохранения электрического заряда .
'
+ +'Электризация происходит из-за переноса электронов с одного тела на другое: потерявшее электроны становится «+», получившее — «−».
'
+ );
+ h += makeCard('example', 'Примеры', '§ 12.3',
+ ''
+ +'Расчёска после волос притягивает мелкие бумажки. '
+ +'Воздушный шарик после трения о волосы прилипает к стене. '
+ +'Снятие шерстяного свитера — иногда искрит. '
+ +'Молния — гигантский электрический разряд между облаком и землёй. '
+ +' '
+ );
+
+ /* IV1 — виртуальный электроскоп */
+ h += ''
+ +''
+ +'
Потри палочку о ткань — она зарядится. Поднеси её к электроскопу — листочки разойдутся: одноимённые заряды отталкиваются.
'
+ +'
'
+ +'
Потереть палочку Поднести к электроскопу Сброс
'
+ +'
Заряд палочки: 0 Угол листочков: 0°
'
+ +'
';
+
+ /* IV2 — викторина «знаки зарядов» */
+ h += ''
+ +''
+ +'
По опыту с трением определи знак заряда тела.
'
+ +'
'
+ +'
Следующий
'
+ +'
Раунд: 1 / 5 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD «притягивает / отталкивает» */
+ h += ''
+ +''
+ +'
Распредели пары зарядов по типу взаимодействия.
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p12') + readButton('p12');
+ renderMath(box);
+ wireReadBtn('p12');
+
+ _initP12_sim();
+ _initP12_quiz();
+ _initP12_dnd();
+ _initP12_mcq();
+}
+
+function _initP12_sim(){
+ const svg = document.getElementById('p12-sim'); if(!svg) return;
+ let charged = false; /* палочка заряжена */
+ let touched = false; /* поднесено к электроскопу */
+ function draw(){
+ let s = '';
+ /* электроскоп: стеклянная колба, металлический стержень, два листочка */
+ const escCx = 320, escCy = 130;
+ s += ' ';
+ /* шар сверху */
+ s += ' ';
+ /* стержень */
+ s += ' ';
+ /* листочки */
+ const leafAng = touched && charged ? 35 : 4;
+ document.getElementById('p12-a').textContent = leafAng+'°';
+ const lx1 = escCx, ly1 = escCy+50;
+ const len = 36;
+ const lx2L = lx1 - len*Math.sin(leafAng*Math.PI/180);
+ const ly2L = ly1 + len*Math.cos(leafAng*Math.PI/180);
+ const lx2R = lx1 + len*Math.sin(leafAng*Math.PI/180);
+ const ly2R = ly1 + len*Math.cos(leafAng*Math.PI/180);
+ s += ' ';
+ s += ' ';
+ /* если заряжен и поднесён — рисуем + + на листочках */
+ if(touched && charged){
+ s += '− ';
+ s += '− ';
+ s += '− ';
+ }
+ /* палочка — слева */
+ const rodX = touched ? 260 : 100;
+ const rodY = 100;
+ s += ' ';
+ if(charged){
+ for(let i=0;i<5;i++) s += '− ';
+ }
+ /* ткань (если ещё не тёрли) */
+ if(!charged){
+ s += ' ';
+ s += 'шерсть ';
+ }
+ /* подпись */
+ s += 'палочка (эбонит) ';
+ s += 'электроскоп ';
+ svg.innerHTML = s;
+ }
+ document.getElementById('p12-rub').addEventListener('click', ()=>{ charged = true; document.getElementById('p12-q').textContent = '−5 нКл'; draw(); });
+ document.getElementById('p12-touch').addEventListener('click', ()=>{
+ if(!charged){
+ const fb = document.getElementById('p12-q'); fb.textContent = 'сначала потри!'; return;
+ }
+ touched = true; draw();
+ });
+ document.getElementById('p12-reset').addEventListener('click', ()=>{ charged=false; touched=false; document.getElementById('p12-q').textContent='0'; draw(); });
+ draw();
+}
+
+function _initP12_quiz(){
+ const QS = [
+ {sit:'Стеклянная палочка, потёртая о шёлк', ans:'+', why:'По таблице: стекло о шёлк — стекло положительное.'},
+ {sit:'Эбонитовая палочка о шерсть', ans:'-', why:'Эбонит получает электроны от шерсти — становится отрицательным.'},
+ {sit:'Шёлк после трения о стекло', ans:'-', why:'Шёлк забирает электроны со стекла — отрицательный.'},
+ {sit:'Шерсть после трения об эбонит', ans:'+', why:'Шерсть отдала электроны эбониту — положительная.'},
+ {sit:'Воздушный шарик о волосы', ans:'-', why:'Шарик принимает электроны с волос.'}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p12-quiz'); if(!wrap) return;
+ wrap.innerHTML =
+ ''+q.sit+'
'
+ +''
+ +'+ положительный '
+ +'− отрицательный '
+ +'
'
+ +'
';
+ document.getElementById('p12-quiz-r').textContent = (i+1);
+ document.getElementById('p12-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('p12-quiz-fb');
+ if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p12-quiz'); bumpProgress('p12', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p12-quiz-ok').textContent = ok;
+ });
+ });
+ }
+ document.getElementById('p12-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP12_dnd(){
+ const items = [
+ {id:'pp', cat:'rep', html:'$+q$ и $+q$'},
+ {id:'mm', cat:'rep', html:'$-q$ и $-q$'},
+ {id:'pm', cat:'attr', html:'$+q$ и $-q$'},
+ {id:'mp', cat:'attr', html:'$-q$ и $+q$'},
+ {id:'p0', cat:'attr', html:'$+q$ и нейтральный проводник'},
+ {id:'m0', cat:'attr', html:'$-q$ и нейтральный проводник'},
+ {id:'pn', cat:'attr', html:'$+q$ и капля воды (диэл.)'},
+ {id:'pf', cat:'attr', html:'$+q$ и металл. шарик'}
+ ];
+ const dnd = setupSorter({ poolId:'p12-dnd-pool', scopeSelector:'#sec-p12', cats:['attr','rep'], items, columnLayout:false });
+ document.getElementById('p12-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p12-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,'p12-dnd'); bumpProgress('p12', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: одноимённые отталкиваются; нейтральные всегда притягиваются.'; }
+ });
+ document.getElementById('p12-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p12-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP12_mcq(){
+ const QS = [
+ {q:'Сколько родов зарядов существует?', opts:['один','два','три','бесконечно много'], ans:1, why:'+ и −, всего два.'},
+ {q:'При электризации стекла о шёлк стекло становится…', opts:['отрицательным','положительным','не заряжается','любым'], ans:1, why:'Стекло теряет электроны → +.'},
+ {q:'Что переносится при трении?', opts:['атомы','молекулы','электроны','ядра'], ans:2, why:'Электроны переходят с одного тела на другое.'},
+ {q:'Два одинаково заряженных шарика…', opts:['притягиваются','отталкиваются','неподвижны','зависит от размера'], ans:1, why:'Одноимённые всегда отталкиваются.'},
+ {q:'Сумма зарядов при трении двух нейтральных тел…', opts:['растёт','становится 0','остаётся 0','становится +'], ans:2, why:'Заряд сохраняется: было 0, стало $+q$ и $-q$, сумма всё ещё 0.'},
+ {q:'Почему стенка притягивает шарик после трения о голову?', opts:['стенка тоже зарядилась','индукция в нейтральной стенке','гравитация','клей'], ans:1, why:'В диэлектрике стенки происходит небольшая поляризация — она притягивается к шарику.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p12-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ q.opts.forEach((opt,k)=>{ h += ''+String.fromCharCode(65+k)+'. '+opt+' '; });
+ h += '
Следующий
';
+ wrap.innerHTML = h;
+ document.getElementById('p12-mcq-i').textContent = (i+1);
+ document.getElementById('p12-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p12-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p12-mcq'); bumpProgress('p12', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p12-mcq-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p12-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p12-mcq-bonus'); bumpProgress('p12', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p12-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
+/* ======== §13 — Проводники и диэлектрики ======== */
+function build_p13(){
+ const box = document.getElementById('p13-body');
+ let h = '';
+
+ h += makeCard('theory', 'Свободные носители заряда', '§ 13.1',
+ 'Все вещества разделяют на два больших класса по способности проводить электрический заряд:
'
+ +''
+ +'Проводники — есть свободные носители заряда (например, свободные электроны у металлов). Заряд легко перемещается внутри. '
+ +'Диэлектрики (изоляторы) — носители связаны с атомами/молекулами и не могут свободно перемещаться. Заряд «застревает» там, куда попал. '
+ +' '
+ );
+ h += makeCard('rule', 'Примеры', '§ 13.2',
+ 'Проводники Диэлектрики '
+ +'все металлы эбонит, стекло, янтарь '
+ +'графит дерево (сухое), пластик, резина '
+ +'растворы солей, кислот, щелочей фарфор, бумага (сухая) '
+ +'тело человека (через жидкости) дистиллированная вода, воздух (сухой) '
+ +'влажная земля шёлк, мех
'
+ );
+ h += makeCard('example', 'Где это видно', '§ 13.3',
+ ''
+ +'Провода — медные (проводник), но в изоляции из пластика (диэлектрик). '
+ +'Розетки и выключатели — пластиковые корпуса. '
+ +'Заряд на металлическом шарике распределяется по всей поверхности — потому что он проводник. '
+ +'Заряд на пластиковой расчёске остаётся в месте трения — там, где «потёрли». '
+ +' '
+ );
+
+ /* IV1 — Анимация: заряд на проводнике vs диэлектрике */
+ h += ''
+ +''
+ +'
Сравни: на металлическом шарике заряд распределяется по всей поверхности. На пластиковом — остаётся в одном месте.
'
+ +'
'
+ +'
Дать заряд в одной точке Сброс
'
+ +'
';
+
+ /* IV2 — викторина пров/диэл */
+ h += ''
+ +''
+ +'
Назови материал — выбери тип.
'
+ +'
'
+ +'
Следующий
'
+ +'
Раунд: 1 / 8 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD */
+ h += ''
+ +''
+ +'
Перетащи материалы в нужную колонку.
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p13') + readButton('p13');
+ renderMath(box);
+ wireReadBtn('p13');
+
+ _initP13_sim();
+ _initP13_quiz();
+ _initP13_dnd();
+ _initP13_mcq();
+}
+
+function _initP13_sim(){
+ _killSim('p13sim');
+ const svg = document.getElementById('p13-sim'); if(!svg) return;
+ /* два шара: металлический (слева) и пластиковый (справа). При нажатии «дать заряд» — на метал. заряды разлетаются по поверхности, на пласт. остаются. */
+ const metCx = 130, metCy = 110, R = 60;
+ const plCx = 330, plCy = 110;
+ let charges = []; /* {x, y, target: 'met'|'pla', angTarget, sett: bool, settAng } */
+ let phase = 0; /* 0 = пусто, 1 = заряд дан */
+ function reset(){ charges = []; phase = 0; draw(); }
+ function giveCharge(){
+ /* добавляем 14 минус-зарядов в одной точке (верх каждого шара) */
+ if(phase > 0) return;
+ phase = 1;
+ for(let i=0;i<14;i++){
+ const a = Math.PI * 2 * i / 14;
+ charges.push({ targetA: a, x: metCx, y: metCy - R + 6, kind:'met', settled: false, t: 0 });
+ charges.push({ targetA: 0, x: plCx, y: plCy - R + 6, kind:'pla', settled: true, t: 0 });
+ }
+ }
+ function tick(){
+ if(!_isVisible('p13')){ _SIMS.p13sim.raf = requestAnimationFrame(tick); return; }
+ for(const c of charges){
+ if(c.kind === 'met' && !c.settled){
+ /* движение к точке на окружности (под углом targetA) */
+ c.t += 0.025;
+ const tx = metCx + (R-8) * Math.cos(c.targetA);
+ const ty = metCy + (R-8) * Math.sin(c.targetA);
+ c.x += (tx - c.x) * 0.06;
+ c.y += (ty - c.y) * 0.06;
+ if(Math.abs(c.x - tx) < 1 && Math.abs(c.y - ty) < 1) c.settled = true;
+ }
+ /* пластиковые сразу осели */
+ }
+ let s = '';
+ /* шары */
+ s += ' ';
+ s += 'МЕТАЛЛ (проводник) ';
+ s += ' ';
+ s += 'ПЛАСТИК (диэлектрик) ';
+ /* заряды */
+ for(const c of charges){
+ s += '− ';
+ }
+ /* стрелки касания если phase=0 */
+ if(phase === 0){
+ s += window.PHYS.drawArrow(metCx-30, metCy-R-30, metCx, metCy-R+2, '#10b981', 2, 9);
+ s += window.PHYS.drawArrow(plCx-30, plCy-R-30, plCx, plCy-R+2, '#10b981', 2, 9);
+ s += 'касание ';
+ s += 'касание ';
+ }
+ svg.innerHTML = s;
+ _SIMS.p13sim.raf = requestAnimationFrame(tick);
+ }
+ _SIMS.p13sim = { raf: 0 };
+ _SIMS.p13sim.raf = requestAnimationFrame(tick);
+ document.getElementById('p13-charge').addEventListener('click', giveCharge);
+ document.getElementById('p13-reset').addEventListener('click', reset);
+}
+
+function _initP13_quiz(){
+ const QS = [
+ {mat:'медь', ans:'C', why:'Металл — проводник.'},
+ {mat:'эбонит', ans:'D', why:'Эбонит — классический диэлектрик.'},
+ {mat:'графит (карандаш)', ans:'C', why:'Графит — проводник.'},
+ {mat:'стекло', ans:'D', why:'Стекло не проводит ток.'},
+ {mat:'раствор поваренной соли', ans:'C', why:'В растворе есть свободные ионы — проводит.'},
+ {mat:'дистиллированная вода', ans:'D', why:'Чистая вода — диэлектрик (нет ионов).'},
+ {mat:'железо', ans:'C', why:'Металл.'},
+ {mat:'фарфор', ans:'D', why:'Фарфор — изолятор, поэтому из него делают изоляторы на линиях электропередачи.'}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p13-quiz'); if(!wrap) return;
+ wrap.innerHTML =
+ ''+q.mat+'
'
+ +''
+ +'Проводник '
+ +'Диэлектрик '
+ +'
'
+ +'
';
+ document.getElementById('p13-quiz-r').textContent = (i+1);
+ document.getElementById('p13-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('p13-quiz-fb');
+ if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p13-quiz'); bumpProgress('p13', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p13-quiz-ok').textContent = ok;
+ });
+ });
+ }
+ document.getElementById('p13-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP13_dnd(){
+ const items = [
+ {id:'cu', cat:'cond', html:'медь'},
+ {id:'al', cat:'cond', html:'алюминий'},
+ {id:'gr', cat:'cond', html:'графит'},
+ {id:'sl', cat:'cond', html:'солёная вода'},
+ {id:'eb', cat:'diel', html:'эбонит'},
+ {id:'gl', cat:'diel', html:'стекло'},
+ {id:'pl', cat:'diel', html:'пластик'},
+ {id:'dw', cat:'diel', html:'дистил. вода'}
+ ];
+ const dnd = setupSorter({ poolId:'p13-dnd-pool', scopeSelector:'#sec-p13', cats:['cond','diel'], items, columnLayout:false });
+ document.getElementById('p13-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p13-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,'p13-dnd'); bumpProgress('p13', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Дистиллированная вода — диэлектрик (нет ионов).'; }
+ });
+ document.getElementById('p13-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p13-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP13_mcq(){
+ const QS = [
+ {q:'Чем отличаются проводники от диэлектриков?', opts:['массой','цветом','свободными носителями зарядов','температурой'], ans:2, why:'У проводников есть свободные заряды, у диэлектриков — нет.'},
+ {q:'Какие частицы свободны в металлах?', opts:['атомы','протоны','электроны','нейтроны'], ans:2, why:'Свободные электроны переносят заряд в металлах.'},
+ {q:'Заряд на металлическом шарике распределяется…', opts:['в центре','в одной точке','по всей поверхности','внутри'], ans:2, why:'Свободные заряды отталкиваются и оседают по поверхности.'},
+ {q:'Заряд на пластиковой расчёске…', opts:['распределяется','остаётся в месте трения','исчезает','уходит в землю'], ans:1, why:'Диэлектрик не позволяет заряду перемещаться.'},
+ {q:'Что используют для изоляции проводов?', opts:['медь','алюминий','пластик','графит'], ans:2, why:'Пластик — хороший диэлектрик.'},
+ {q:'Можно ли «зарядить» проводник, держа в руке голыми пальцами?', opts:['да','нет, заряд уйдёт через тело','зависит от металла','только летом'], ans:1, why:'Тело — проводник (через жидкости), заряд уходит в землю.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p13-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ q.opts.forEach((opt,k)=>{ h += ''+String.fromCharCode(65+k)+'. '+opt+' '; });
+ h += '
Следующий
';
+ wrap.innerHTML = h;
+ document.getElementById('p13-mcq-i').textContent = (i+1);
+ document.getElementById('p13-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p13-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p13-mcq'); bumpProgress('p13', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p13-mcq-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p13-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p13-mcq-bonus'); bumpProgress('p13', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p13-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
+/* ======== §14 — Электризация через влияние (индукция) ======== */
+function build_p14(){
+ const box = document.getElementById('p14-body');
+ let h = '';
+
+ h += makeCard('theory', 'Что такое индукция', '§ 14.1',
+ 'Если поднести заряженное тело к нейтральному проводнику , не касаясь его, в проводнике произойдёт перераспределение свободных электронов.
'
+ +'Электризация через влияние (или индукция ) — это разделение зарядов в проводнике под действием внешнего заряда без непосредственного контакта.
'
+ +'Ближний к источнику конец проводника получает заряд противоположного знака, дальний — того же знака.
'
+ );
+ h += makeCard('rule', 'Как это работает', '§ 14.2',
+ 'Подносим $+q$ к незаряженному металлическому шарику:
'
+ +''
+ +'Свободные электроны (отрицательные) притягиваются к $+q$ — собираются на ближнем конце. '
+ +'На дальнем конце остаются положительные ионы — некомпенсированный $+q$. '
+ +'В целом шарик остался нейтральным, но заряды разделились . '
+ +'Если теперь шарик разделить на 2 половинки — каждая будет заряжена! '
+ +' '
+ );
+ h += makeCard('example', 'Примеры явления', '§ 14.3',
+ ''
+ +'Заряженный шарик притягивает любой кусочек металла — даже нейтральный. '
+ +'Расчёска (заряженная) притягивает бумажки (диэлектрик слегка поляризуется). '
+ +'В стенке (диэлектрик) поляризация молекул — шарик прилипает. '
+ +'Молниеотвод собирает индукцией заряд из грозовой тучи и отводит в землю. '
+ +' '
+ );
+
+ /* IV1 — Симуляция: палочка + металлический шарик */
+ h += ''
+ +''
+ +'
Двигай заряженную палочку (slider) — наблюдай, как электроны в металлическом шарике перераспределяются.
'
+ +'
'
+ +'Положение палочки: слева '
+ +'Знак: отрицательная (−) положительная (+) '
+ +'
'
+ +'
'
+ +'
'
+ +'Ближний конец шара: + (противоположный палочке) '
+ +'Дальний конец шара: − (того же знака) '
+ +'
'
+ +'
';
+
+ /* IV2 — викторина: «что будет с шаром если…» */
+ h += ''
+ +''
+ +'
Дана ситуация — определи итог.
'
+ +'
'
+ +'
Следующий
'
+ +'
Раунд: 1 / 5 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD: «в проводнике / в диэлектрике» */
+ h += ''
+ +''
+ +'
В проводниках — индукция (электроны бегут); в диэлектриках — поляризация (молекулы поворачиваются).
'
+ +'
'
+ +'
'
+ +'
'
+ +'
Поляризация (в диэлектрике)
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p14') + readButton('p14');
+ renderMath(box);
+ wireReadBtn('p14');
+
+ _initP14_sim();
+ _initP14_quiz();
+ _initP14_dnd();
+ _initP14_mcq();
+}
+
+function _initP14_sim(){
+ const svg = document.getElementById('p14-sim'); if(!svg) return;
+ function draw(){
+ const sx = +document.getElementById('p14-x').value;
+ const sig = +document.getElementById('p14-sig').value;
+ document.getElementById('p14-xv').textContent = sx < 80 ? 'далеко' : (sx < 130 ? 'близко' : 'почти касается');
+ /* у шарика: nearLabel = противоп. знаку палочки */
+ const nearSym = sig > 0 ? '−' : '+';
+ const farSym = sig > 0 ? '+' : '−';
+ document.getElementById('p14-near').innerHTML = nearSym;
+ document.getElementById('p14-far').innerHTML = farSym;
+ /* draw */
+ let s = '';
+ /* палочка слева */
+ s += ' ';
+ const rodCol = sig > 0 ? '#dc2626' : '#2563eb';
+ const rodTxt = sig > 0 ? '+' : '−';
+ for(let i=0;i<4;i++) s += ''+rodTxt+' ';
+ /* металлический шарик в центре */
+ const shCx = 260, shCy = 90, shR = 56;
+ s += ' ';
+ /* концентрация электронов на ближнем конце (если sig=+, электроны к палочке) или ионов */
+ const intensity = Math.min(1, (180 - sx) / 100); /* чем ближе палочка, тем сильнее эффект */
+ /* near = слева от шара (ближе к палочке), far = справа */
+ /* ставим знаки. Если палочка -, на ближнем + (т.е. на левой стороне +) */
+ const nearCol = sig > 0 ? '#2563eb' : '#dc2626';
+ const farCol = sig > 0 ? '#dc2626' : '#2563eb';
+ const nearTxt = sig > 0 ? '−' : '+';
+ const farTxt = sig > 0 ? '+' : '−';
+ for(let i=0;i<6;i++){
+ const ang = -Math.PI/2 + (i-2.5)*0.18;
+ const r = shR - 14;
+ /* near (слева) */
+ const nx = shCx + r*Math.cos(Math.PI + ang*0.4);
+ const ny = shCy + r*Math.sin(Math.PI + ang*0.4) - i*0;
+ s += ''+nearTxt+' ';
+ /* far (справа) */
+ const fx = shCx + r*Math.cos(ang*0.4);
+ const fy = shCy + r*Math.sin(ang*0.4);
+ s += ''+farTxt+' ';
+ }
+ s += 'МЕТАЛЛ. ШАР (нейтральный) ';
+ /* подпись индукции */
+ if(intensity > 0.3){
+ s += 'индукция! ';
+ }
+ svg.innerHTML = s;
+ }
+ document.getElementById('p14-x').addEventListener('input', draw);
+ document.getElementById('p14-sig').addEventListener('change', draw);
+ draw();
+}
+
+function _initP14_quiz(){
+ const QS = [
+ {sit:'$+q$ поднесли к нейтральному металлическому шару, не касаясь.', opts:['шар стал +','шар стал −','шар стал нейтральным с разделёнными зарядами','шар не изменился'], ans:2, why:'Произошла индукция: внутри шара разделились заряды, но в целом он остался нейтральным.'},
+ {sit:'$-q$ поднесли к шару и коснулись его.', opts:['заряды шара не изменились','шар стал отрицательным','шар стал положительным','шар стал нейтральным'], ans:1, why:'Электроны с палочки перешли на шар.'},
+ {sit:'$+q$ долго держали возле шара, а потом убрали (не касаясь).', opts:['шар остался заряженным','шар нейтральный','шар стал отрицательным','шар стал положительным'], ans:1, why:'Без касания заряд просто перераспределялся; при удалении источника всё возвращается, шар нейтрален.'},
+ {sit:'$+q$ поднесли к двум прижатым друг к другу шарам. Их разъединили (не убирая $+q$), затем убрали $+q$.', opts:['оба нейтральны','оба +','оба −','один +, другой −'], ans:3, why:'При разделении в присутствии $+q$ заряды зафиксировались: дальний шар стал +, ближний −.'},
+ {sit:'$-q$ поднесли к листку бумаги (диэлектрик).', opts:['ничего','бумага зарядилась +','в бумаге поляризация, она притянулась','бумага оттолкнулась'], ans:2, why:'В диэлектрике молекулы поляризуются, листок притягивается.'}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p14-quiz'); if(!wrap) return;
+ let html = ''+q.sit+'
';
+ q.opts.forEach((opt,k)=>{ html += ''+String.fromCharCode(65+k)+'. '+opt+' '; });
+ html += '
';
+ wrap.innerHTML = html;
+ document.getElementById('p14-quiz-r').textContent = (i+1);
+ document.getElementById('p14-quiz-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p14-quiz-fb');
+ if(k===q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p14-quiz'); bumpProgress('p14', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p14-quiz-ok').textContent = ok;
+ });
+ });
+ }
+ document.getElementById('p14-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP14_dnd(){
+ const items = [
+ {id:'ms', cat:'ind', html:'$+q$ возле металлического шара'},
+ {id:'mf', cat:'ind', html:'заряженный шар возле фольги'},
+ {id:'mp', cat:'ind', html:'заряженный шар возле железной пластины'},
+ {id:'mw', cat:'ind', html:'$+q$ возле провода'},
+ {id:'pl', cat:'pol', html:'$-q$ возле клочка бумаги'},
+ {id:'pg', cat:'pol', html:'$+q$ возле стеклянной палочки'},
+ {id:'pw', cat:'pol', html:'$-q$ возле деревянной планки'},
+ {id:'pp', cat:'pol', html:'$+q$ возле пластиковой пластины'}
+ ];
+ const dnd = setupSorter({ poolId:'p14-dnd-pool', scopeSelector:'#sec-p14', cats:['ind','pol'], items, columnLayout:false });
+ document.getElementById('p14-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p14-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,'p14-dnd'); bumpProgress('p14', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Металлы и фольга — проводники, остальное — диэлектрики.'; }
+ });
+ document.getElementById('p14-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p14-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP14_mcq(){
+ const QS = [
+ {q:'Что такое электризация через влияние?', opts:['заряжение трением','перенос заряда касанием','разделение зарядов в проводнике без касания','испускание электронов'], ans:2, why:'Это разделение зарядов внутри проводника под действием внешнего заряда.'},
+ {q:'Ближний к источнику конец проводника получает заряд…', opts:['того же знака','противоположного','становится нейтральным','положительный'], ans:1, why:'Притягиваются заряды противоположного знака.'},
+ {q:'После убирания внешнего заряда (без касания) проводник…', opts:['остаётся заряженным','становится нейтральным','меняет знак','раскалывается'], ans:1, why:'Перераспределение исчезает, и проводник снова нейтрален.'},
+ {q:'Если в присутствии $+q$ разъединить шар на 2 части, что станет с частями после убирания $+q$?', opts:['обе +','обе −','одна +, другая −','обе нейтральны'], ans:2, why:'Разделение зафиксировалось: ближняя часть −, дальняя +.'},
+ {q:'Почему листочки бумаги притягиваются к расчёске?', opts:['индукция','поляризация молекул в диэлектрике','магнетизм','гравитация'], ans:1, why:'В диэлектрике молекулы поляризуются, и листок притягивается.'},
+ {q:'Молниеотвод использует…', opts:['индукцию','теплопередачу','излучение','реакцию горения'], ans:0, why:'Индукция собирает заряд из тучи на острие и отводит его в землю.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p14-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ q.opts.forEach((opt,k)=>{ h += ''+String.fromCharCode(65+k)+'. '+opt+' '; });
+ h += '
Следующий
';
+ wrap.innerHTML = h;
+ document.getElementById('p14-mcq-i').textContent = (i+1);
+ document.getElementById('p14-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p14-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p14-mcq'); bumpProgress('p14', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p14-mcq-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p14-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p14-mcq-bonus'); bumpProgress('p14', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p14-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
function init(){
loadProgress(); initTheme(); initSidebarToggle(); initSearch();
buildParaSelector(); refreshProgressUI(); loadServerReadState(); goTo(PARAS[0].id);