diff --git a/.claude/settings.json b/.claude/settings.json index 2d45084..c151850 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -178,7 +178,21 @@ "Bash(cmd /c \"taskkill /PID 60564 /F\")", "Bash(cmd /c \"taskkill /F /PID 60564 2>&1\")", "Bash(kill -9 60564)", - "Bash(kill -9 9313)" + "Bash(kill -9 9313)", + "Read(//f/!Рабочие/ЦТ/Математика/**)", + "Read(//f/!Рабочие/ЦТ/Физика/**)", + "Read(//f/!����稥/��/��⥬�⨪�/**)", + "PowerShell(Get-ChildItem \"F:\\\\!Рабочие\\\\ЦТ\\\\Математика\\\\Математика\\\\ЦТ-ЦЭ\" | Select-Object Name, @{N='MB';E={[math]::Round\\($_.Length/1MB,1\\)}} | Format-Table -AutoSize)", + "Read(//f/!����稥/��/**)", + "PowerShell(Get-ChildItem \"F:\\\\!Рабочие\\\\ЦТ\\\\Физика\\\\Сборники ЦЭ,ЦТ-20260116T125835Z-3-001\" | Select-Object Name, @{N='MB';E={[math]::Round\\($_.Length/1MB,1\\)}} | Format-Table -AutoSize)", + "PowerShell(Get-ChildItem \"F:\\\\!Рабочие\\\\ЦТ\\\\Физика\\\\Сборники ЦТ-20260116T130104Z-3-001\" | Select-Object Name, @{N='MB';E={[math]::Round\\($_.Length/1MB,1\\)}} | Format-Table -AutoSize)", + "PowerShell(Get-ChildItem \"F:\\\\!Рабочие\\\\ЦТ\\\\Физика\\\\Сборники ЦЭ,ЦТ-20260116T125835Z-3-001\\\\Сборники ЦЭ,ЦТ\" | Select-Object Name, @{N='MB';E={[math]::Round\\($_.Length/1MB,1\\)}} | Format-Table -AutoSize)", + "PowerShell(Get-ChildItem \"F:\\\\!Рабочие\\\\ЦТ\\\\Физика\\\\Сборники ЦТ-20260116T130104Z-3-001\\\\Сборники ЦТ\" | Select-Object Name, @{N='MB';E={[math]::Round\\($_.Length/1MB,1\\)}} | Format-Table -AutoSize)", + "Bash(git commit -m ' *)", + "Bash(git push *)", + "Bash(curl -s http://localhost:3000/api/subjects)", + "PowerShell(\\(Get-Content \"g:\\\\Dev\\\\Тесты\\\\BQ-System\\\\frontend\\\\question-bank.html\"\\).Count)", + "Bash(curl -s \"http://localhost:3000/api/subjects/math/topics\" -H \"Authorization: Bearer test\")" ], "additionalDirectories": [ "\\tmp" diff --git a/backend/scripts/audit_chem8.js b/backend/scripts/audit_chem8.js new file mode 100644 index 0000000..8b40bff --- /dev/null +++ b/backend/scripts/audit_chem8.js @@ -0,0 +1,110 @@ +/* audit_chem8.js — аудит KaTeX и оформления учебника «Химия 8». + * Загружает каждую страницу в jsdom (renderMathInElement застаблен → $…$ остаются + * литералами с уже раскрытыми JS-эскейпами), строит все §, извлекает формулы и + * проверяет: баланс $, баланс {}, отсутствие управляющих символов (следы \t/\n), + * пустые формулы, «сырые» $…$ вне рендера. Запуск: node backend/scripts/audit_chem8.js + */ +'use strict'; +const fs = require('fs'); +const path = require('path'); +const { JSDOM, VirtualConsole } = require('jsdom'); + +const ROOT = path.join(__dirname, '..', '..'); +const readF = p => fs.readFileSync(path.join(ROOT, p), 'utf8'); +const wait = ms => new Promise(r => setTimeout(r, ms)); + +const PAGES = [ + ['chemistry_8_intro.html', 'chem8_intro_widgets'], + ['chemistry_8_ch1.html', 'chem8_ch1_widgets'], + ['chemistry_8_ch2.html', 'chem8_ch2_widgets'], + ['chemistry_8_ch3.html', 'chem8_ch3_widgets'], + ['chemistry_8_ch4.html', 'chem8_ch4_widgets'], + ['chemistry_8_ch5.html', 'chem8_ch5_widgets'], + ['chemistry_8_ch6.html', 'chem8_ch6_widgets'] +]; + +function buildPage(file, widgets) { + let html = readF('frontend/textbooks/' + file); + const inl = { + '/js/biochem-core.js': readF('frontend/js/biochem-core.js'), + '/js/chem8_svg.js': readF('frontend/js/chem8_svg.js'), + '/js/chem8_mol.js': readF('frontend/js/chem8_mol.js'), + ['/js/' + widgets + '.js']: readF('frontend/js/' + widgets + '.js'), + '/js/chem8_engine.js': readF('frontend/js/chem8_engine.js') + }; + html = html + .replace(/') + .replace(/'); + }); + return html; +} + +function extractMath(s) { + const out = []; + // $$...$$ затем $...$ + let re = /\$\$([\s\S]+?)\$\$/g, m; + let masked = s; + while ((m = re.exec(s)) !== null) out.push({ disp: true, body: m[1] }); + masked = s.replace(/\$\$[\s\S]+?\$\$/g, ''); + re = /\$([^$]*)\$/g; + while ((m = re.exec(masked)) !== null) out.push({ disp: false, body: m[1] }); + return out; +} + +function checkBraces(b) { let d = 0; for (const c of b) { if (c === '{') d++; else if (c === '}') d--; if (d < 0) return false; } return d === 0; } +function hasCtrl(b) { return /[\t\n\r\f\v\b]/.test(b); } + +async function auditPage(file, widgets) { + const issues = []; + const vc = new VirtualConsole(); const errs = []; + vc.on('jsdomError', e => errs.push(e.message)); + const dom = new JSDOM(buildPage(file, widgets), { + runScripts: 'dangerously', pretendToBeVisual: true, virtualConsole: vc, url: 'http://localhost/', + beforeParse(w) { w.scrollTo = function () {}; } + }); + await wait(120); + const doc = dom.window.document; + const paras = (dom.window.PARAS || []).map(p => p.id); + for (const id of paras) { try { dom.window.goTo(id); } catch (e) {} } + await wait(120); + + if (errs.length) issues.push('script errors: ' + errs.join(' | ')); + + // собрать все § тела + sidebar + let html = ''; + doc.querySelectorAll('[id$="-body"]').forEach(el => { html += el.innerHTML + '\n'; }); + const sidebar = doc.getElementById('sidebar-content'); if (sidebar) html += sidebar.innerHTML; + + // баланс $ (нечётное число одиночных $ вне $$) + const noDisp = html.replace(/\$\$[\s\S]+?\$\$/g, ''); + const singles = (noDisp.match(/\$/g) || []).length; + if (singles % 2 !== 0) issues.push('нечётное число одиночных $ (' + singles + ')'); + + const maths = extractMath(html); + let bad = 0; + for (const m of maths) { + const b = m.body; + if (!b.trim()) { issues.push('пустая формула $' + (m.disp ? '$' : '') + '$'); bad++; continue; } + if (!checkBraces(b)) { issues.push('несбалансированные {} в: ' + b.slice(0, 50)); bad++; } + if (hasCtrl(b)) { issues.push('управляющий символ (след \\t/\\n?) в: ' + JSON.stringify(b.slice(0, 50))); bad++; } + // одиночный backslash перед буквой, не часть известной команды? — грубая эвристика: \ в конце + if (/\\$/.test(b)) { issues.push('формула заканчивается на \\: ' + b.slice(-20)); bad++; } + } + return { file, mathCount: maths.length, badCount: bad, issues }; +} + +(async () => { + let total = 0, totalBad = 0; + for (const [file, w] of PAGES) { + const r = await auditPage(file, w); + total += r.mathCount; totalBad += r.badCount; + console.log('\n=== ' + file + ' — формул: ' + r.mathCount + ', проблем: ' + r.issues.length + ' ==='); + if (r.issues.length) r.issues.slice(0, 25).forEach(i => console.log(' ! ' + i)); + else console.log(' OK'); + } + console.log('\nИТОГО формул: ' + total + ', проблемных: ' + totalBad); + process.exit(0); +})(); diff --git a/backend/scripts/gen_phys10_ch.js b/backend/scripts/gen_phys10_ch.js new file mode 100644 index 0000000..026feb6 --- /dev/null +++ b/backend/scripts/gen_phys10_ch.js @@ -0,0 +1,1128 @@ +// Генератор physics_10_ch{1..6}.html — Phase 0 skeleton со STUB-builder'ами. +// Берём алгебру 11 ch1 как базу, заменяем только инфраструктуру: +// - title, theme keys, slug, hero, sec-nav names, PARAS list +// - STUB-builder для каждого § (37) + final{1..6} +// - SIDEBARS / TIPS / ACH_LABELS +// CSS POLISH + ICONS + 2D-хелперы оставляем 1:1 (нужны Phase 1+). +'use strict'; +const fs = require('fs'); +const path = require('path'); + +const TBOOKS = path.join(__dirname, '..', '..', 'frontend', 'textbooks'); +const SRC = path.join(TBOOKS, 'algebra_11_ch1.html'); + +// === Данные глав === +const PARA_NAMES = { + p1:'Основные положения МКТ', + p2:'Масса и размеры молекул. Количество вещества', + p3:'Идеальный газ. Основное уравнение МКТ', + p4:'Температура. Тепловое равновесие', + p5:'Уравнение состояния идеального газа', + p6:'Изопроцессы', + p7:'Строение и свойства твёрдых тел', + p8:'Строение и свойства жидкостей', + p9:'Испарение и конденсация. Насыщенный пар', + p10:'Влажность воздуха', + p11:'Внутренняя энергия', + p12:'Работа в термодинамике', + p13:'Количество теплоты', + p14:'Первый закон термодинамики', + p15:'Тепловые двигатели. Цикл Карно', + p16:'Электрический заряд', + p17:'Закон Кулона', + p18:'Электростатическое поле', + p19:'Напряжённость поля. Принцип суперпозиции', + p20:'Линии напряжённости', + p21:'Работа поля. Потенциал', + p22:'Разность потенциалов. Напряжение', + p23:'Конденсаторы', + p24:'Энергия поля конденсатора', + p25:'ЭДС источника тока', + p26:'Закон Ома для полной цепи', + p27:'Магнитное поле тока', + p28:'Индукция магнитного поля', + p29:'Сила Ампера', + p30:'Сила Лоренца', + p31:'Магнитный поток. Электромагнитная индукция', + p32:'Правило Ленца. Закон Фарадея', + p33:'Самоиндукция', + p34:'Ток в металлах. Сверхпроводимость', + p35:'Ток в электролитах', + p36:'Ток в газах. Плазма', + p37:'Ток в полупроводниках', +}; + +// Sub-формулы (с двойным backslash для JS string literals) +const PARA_SUBS = { + p1:'Положения МКТ', + p2:'$N_A = 6{,}022 \\\\cdot 10^{23}$', + p3:'$p = \\\\dfrac{1}{3}nm\\\\overline{v^2}$', + p4:'$\\\\overline{E_k} = \\\\dfrac{3}{2}kT$', + p5:'$pV = \\\\nu RT$', + p6:'$pV/T = \\\\text{const}$', + p7:'Кристаллы', + p8:'Поверхностное натяжение', + p9:'Насыщенный пар', + p10:'$\\\\varphi = p/p_н$', + p11:'$U = \\\\dfrac{3}{2}\\\\nu RT$', + p12:'$A = p\\\\Delta V$', + p13:'$Q = cm\\\\Delta T$', + p14:'$Q = \\\\Delta U + A$', + p15:'$\\\\eta = (T_1-T_2)/T_1$', + p16:'$q = ne$', + p17:'$F = k\\\\dfrac{q_1 q_2}{r^2}$', + p18:'$\\\\vec{E}$', + p19:'$\\\\vec{E} = \\\\sum \\\\vec{E_i}$', + p20:'Силовые линии', + p21:'$A = qU$', + p22:'$U = E \\\\cdot d$', + p23:'$C = q/U$', + p24:'$W = CU^2/2$', + p25:'$\\\\mathcal{E}$', + p26:'$I = \\\\mathcal{E}/(R+r)$', + p27:'Опыт Эрстеда', + p28:'$\\\\vec{B}$', + p29:'$F = BIL\\\\sin\\\\alpha$', + p30:'$F = qvB$', + p31:'$\\\\Phi = BS\\\\cos\\\\alpha$', + p32:'$\\\\mathcal{E}_i = -d\\\\Phi/dt$', + p33:'$L$, $W_L = LI^2/2$', + p34:'$\\\\rho(T)$', + p35:'$m = kIt$', + p36:'Виды разрядов', + p37:'n-/p-тип', +}; + +// Watermarks для секций (короткие) +const PARA_WM = { + p1:'МКТ', p2:'N_A', p3:'pV', p4:'T', p5:'pV=νRT', p6:'iso', p7:'cryst', p8:'σ', p9:'пар', p10:'φ', + p11:'U', p12:'A', p13:'Q', p14:'1-й', p15:'Карно', + p16:'q', p17:'Кулон', p18:'&vec;E', p19:'E', p20:'→', p21:'A=qU', p22:'U', p23:'C', p24:'CU²', + p25:'ε', p26:'Ом', + p27:'Эрстед', p28:'B', p29:'Ампер', p30:'Лоренц', p31:'Φ', p32:'Фарадей', p33:'L', + p34:'ρ(T)', p35:'m=kIt', p36:'plasma', p37:'n/p', + final1:'★', final2:'★', final3:'★', final4:'★', final5:'★', final6:'★', +}; + +const CHAPTERS = { + ch1: { + paras: ['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10'], final: 'final1', + title: 'Основы МКТ', + headerSub: 'Молекулярно-кинетическая теория · идеальный газ · изопроцессы · влажность', + hero: { h:'Молекулярная физика — почему вещество ведёт себя так', p:'Молекулярно-кинетическая теория объясняет свойства вещества движением и взаимодействием молекул. Изучаем газы, твёрдые тела, жидкости, температуру, давление и влажность.' }, + pri:'#2563eb', priD:'#1d4ed8', priSoft:'#dbeafe', priLight:'#60a5fa', + headerGrad:'linear-gradient(110deg,#1e3a8a 0%,#2563eb 55%,#60a5fa 100%)', + chNum:1, watermarkHero:'T', + }, + ch2: { + paras: ['p11','p12','p13','p14','p15'], final: 'final2', + title: 'Термодинамика', + headerSub: 'Внутренняя энергия · работа · теплота · 1-й закон · тепловые двигатели', + hero: { h:'Термодинамика — превращения энергии', p:'Термодинамика — наука о превращении энергии. Внутренняя энергия, работа газа, количество теплоты, первый закон и тепловые двигатели.' }, + pri:'#059669', priD:'#047857', priSoft:'#d1fae5', priLight:'#34d399', + headerGrad:'linear-gradient(110deg,#064e3b 0%,#059669 55%,#34d399 100%)', + chNum:2, watermarkHero:'ΔU', + }, + ch3: { + paras: ['p16','p17','p18','p19','p20','p21','p22','p23','p24'], final: 'final3', + title: 'Электростатика', + headerSub: 'Заряд · Кулон · поле · потенциал · напряжение · конденсаторы', + hero: { h:'Электростатика — поле неподвижных зарядов', p:'Электрический заряд создаёт поле. Изучаем закон Кулона, напряжённость и потенциал поля, конденсаторы и их энергию.' }, + pri:'#7c3aed', priD:'#6d28d9', priSoft:'#ede9fe', priLight:'#a78bfa', + headerGrad:'linear-gradient(110deg,#3b0764 0%,#7c3aed 55%,#a78bfa 100%)', + chNum:3, watermarkHero:'+q', + }, + ch4: { + paras: ['p25','p26'], final: 'final4', + title: 'Постоянный ток', + headerSub: 'ЭДС источника · закон Ома для полной цепи · КПД', + hero: { h:'Постоянный ток в полной цепи', p:'Постоянный ток в полной цепи: ЭДС источника, закон Ома, КПД источника.' }, + pri:'#db2777', priD:'#be185d', priSoft:'#fce7f3', priLight:'#f472b6', + headerGrad:'linear-gradient(110deg,#831843 0%,#db2777 55%,#f472b6 100%)', + chNum:4, watermarkHero:'I', + }, + ch5: { + paras: ['p27','p28','p29','p30','p31','p32','p33'], final: 'final5', + title: 'Магнитное поле и ЭМИ', + headerSub: 'Магнитное поле · Ампер · Лоренц · поток · индукция · Ленц · Фарадей · самоиндукция', + hero: { h:'Магнитное поле и электромагнитная индукция', p:'Магнитное поле тока, сила Ампера, сила Лоренца, явление электромагнитной индукции и закон Фарадея.' }, + pri:'#0891b2', priD:'#0e7490', priSoft:'#cffafe', priLight:'#22d3ee', + headerGrad:'linear-gradient(110deg,#164e63 0%,#0891b2 55%,#22d3ee 100%)', + chNum:5, watermarkHero:'B', + }, + ch6: { + paras: ['p34','p35','p36','p37'], final: 'final6', + title: 'Ток в различных средах', + headerSub: 'Металлы · сверхпроводимость · электролиз · газы · плазма · полупроводники', + hero: { h:'Электрический ток в разных средах', p:'Электрический ток ведёт себя по-разному в металлах, электролитах, газах и полупроводниках. Сверхпроводимость, электролиз, плазма, p-n переход.' }, + pri:'#10b981', priD:'#059669', priSoft:'#d1fae5', priLight:'#6ee7b7', + headerGrad:'linear-gradient(110deg,#064e3b 0%,#10b981 55%,#6ee7b7 100%)', + chNum:6, watermarkHero:'n/p', + }, +}; + +// === Sidebar rows: краткие подсказки для каждого § === +const SIDEBAR_ROWS = { + p1: [['Положения','3 положения МКТ: все вещества из частиц, частицы движутся, взаимодействуют'],['Опыты','Броуновское движение, диффузия'],['Размер','$d \\\\sim 10^{-10}$ м']], + p2: [['Авогадро','$N_A = 6{,}022 \\\\cdot 10^{23}$ 1/моль'],['Количество в-ва','$\\\\nu = N/N_A = m/M$'],['Молярная масса','$M$ — кг/моль']], + p3: [['Идеальный газ','точечные частицы, упругие столкновения'],['Осн. ур-ие МКТ','$p = \\\\tfrac{1}{3}nm\\\\overline{v^2}$'],['Концентрация','$n = N/V$']], + p4: [['Темпер.','$T$ — мера ср. кин. энергии'],['$\\\\overline{E_k}$','$\\\\overline{E_k} = \\\\tfrac{3}{2}kT$'],['Шкалы','$T_K = t + 273{,}15$']], + p5: [['Менделеев-Клапейрон','$pV = \\\\nu RT$'],['Клапейрон','$\\\\frac{pV}{T} = \\\\text{const}$'],['$R$','$R = 8{,}314$ Дж/(моль·К)']], + p6: [['Изотерма','$T = \\\\text{const}$: $pV = \\\\text{const}$ (Бойль-Мариотт)'],['Изобара','$p = \\\\text{const}$: $V/T = \\\\text{const}$ (Гей-Люссак)'],['Изохора','$V = \\\\text{const}$: $p/T = \\\\text{const}$ (Шарль)']], + p7: [['Крист.','дальний порядок'],['Аморф.','ближний порядок, нет $T_{пл}$'],['Деформ.','упругая, пластическая']], + p8: [['Жидкость','ближний порядок, текучесть'],['Поверх. натяж.','$\\\\sigma$ — Н/м'],['Капилляр','смачивание']], + p9: [['Испар.','с поверхности'],['Кипение','$p_{нас} = p_{внеш}$'],['Нас. пар','динам. равновесие']], + p10: [['Абс. вл.','$\\\\rho_{пара}$ — кг/м³'],['Отн. вл.','$\\\\varphi = p/p_{нас} \\\\cdot 100\\\\%$'],['Точка росы','$T$, при которой $\\\\varphi = 100\\\\%$']], + p11: [['$U$','$U = \\\\tfrac{3}{2}\\\\nu RT$ — для одноат. идеал. газа'],['$\\\\Delta U$','зависит только от $T$ для идеал. газа'],['Способы','теплопередача, работа']], + p12: [['$A_{газ}$','$A = p\\\\Delta V$ при $p = \\\\text{const}$'],['Геометрия','площадь под графиком $p(V)$'],['Знак','газ расш. — $A > 0$']], + p13: [['$Q = cm\\\\Delta T$','нагрев/охлаждение'],['$Q = \\\\lambda m$','плавление'],['$Q = rm$','парообразование'],['$Q = qm$','сгорание']], + p14: [['1-й закон','$Q = \\\\Delta U + A$'],['Изопроц.','частные случаи'],['Адиабат.','$Q = 0 \\\\Rightarrow A = -\\\\Delta U$']], + p15: [['КПД','$\\\\eta = A_{пол}/Q_1$'],['Карно','$\\\\eta_{max} = (T_1 - T_2)/T_1$'],['Циклы','Отто, Дизель']], + p16: [['Заряд','$q$ — Кл'],['Электрон','$e = 1{,}6 \\\\cdot 10^{-19}$ Кл'],['Закон сохр.','$\\\\sum q = \\\\text{const}$ в замкн. системе'],['$q = ne$','дискретность']], + p17: [['Закон','$F = k\\\\dfrac{|q_1 q_2|}{r^2}$'],['$k$','$k = 9 \\\\cdot 10^9$ Н·м²/Кл²'],['$\\\\varepsilon_0$','$\\\\varepsilon_0 = 8{,}85 \\\\cdot 10^{-12}$ Ф/м']], + p18: [['Поле','посредник взаимодействия'],['Свойства','действует на заряд силой $\\\\vec{F}$'],['Источник','$+q$ или $-q$']], + p19: [['$\\\\vec{E}$','$\\\\vec{E} = \\\\vec{F}/q_0$'],['Точ. заряд','$E = k|q|/r^2$'],['Суперпоз.','$\\\\vec{E} = \\\\sum \\\\vec{E_i}$']], + p20: [['Линии','касат. — $\\\\vec{E}$'],['Густота','$E$ велико — линии чаще'],['$+ \\\\to -$','начало на $+$, конец на $-$ или $\\\\infty$']], + p21: [['Работа поля','$A_{поля} = qU$ — не зависит от пути'],['Потенц.','$\\\\varphi = W_p/q$'],['Знак','от $+$ к $-$ ток. зар. — $A > 0$']], + p22: [['Разность','$U = \\\\varphi_1 - \\\\varphi_2$'],['Однор. поле','$U = Ed$'],['Эквипот.','$\\\\bot$ линиям $\\\\vec{E}$']], + p23: [['$C = q/U$','Ф (фарад)'],['Плоский','$C = \\\\varepsilon\\\\varepsilon_0 S/d$'],['Парал.','$C = \\\\sum C_i$'],['Послед.','$1/C = \\\\sum 1/C_i$']], + p24: [['Энергия','$W = \\\\tfrac{CU^2}{2} = \\\\tfrac{q^2}{2C} = \\\\tfrac{qU}{2}$'],['Плотн.','$w = \\\\tfrac{\\\\varepsilon\\\\varepsilon_0 E^2}{2}$']], + p25: [['$\\\\mathcal{E}$','ЭДС — В'],['Сторон. силы','внутри источника'],['$\\\\mathcal{E} = A_{стор}/q$','']], + p26: [['$I = \\\\mathcal{E}/(R+r)$','полная цепь'],['КЗ','$I_{кз} = \\\\mathcal{E}/r$'],['КПД','$\\\\eta = R/(R+r)$'],['$U = \\\\mathcal{E} - Ir$','напр. на полюсах']], + p27: [['Эрстед','ток отклоняет стрелку'],['Поле тока','вихревое, $\\\\vec{B}$'],['Правая рука','для проводника']], + p28: [['$\\\\vec{B}$','индукция магн. поля — Тл'],['Линии','замкнутые, без начала/конца'],['Опр.','$B = F_{max}/(IL)$']], + p29: [['$F_A = BIL\\\\sin\\\\alpha$','сила Ампера'],['Левая рука','для напр-я силы'],['$F_A \\\\bot \\\\vec{B}, \\\\vec{I}$','']], + p30: [['$F_л = qvB\\\\sin\\\\alpha$','сила Лоренца'],['Радиус','$r = mv/(qB)$'],['$F_л \\\\bot \\\\vec{v}$','траектория — окружность/спираль']], + p31: [['$\\\\Phi = BS\\\\cos\\\\alpha$','магн. поток — Вб'],['ЭМИ','при $\\\\Delta\\\\Phi \\\\ne 0$ возникает $\\\\mathcal{E}_i$'],['Опыт Фарадея','']], + p32: [['Ленц','$I_{инд}$ противодействует причине'],['$\\\\mathcal{E}_i = -d\\\\Phi/dt$','закон Фарадея'],['Знак','определяет Ленц']], + p33: [['$\\\\mathcal{E}_{si} = -L\\\\dfrac{dI}{dt}$','самоиндукция'],['$L$','индуктивность — Гн'],['$W_L = LI^2/2$','энергия магн. поля']], + p34: [['Носители','свободные электроны'],['$\\\\rho(T) = \\\\rho_0(1 + \\\\alpha t)$','зависимость от $T$'],['Сверхпров.','$T < T_c$, $\\\\rho = 0$']], + p35: [['Электролит','раствор/расплав ионных в-в'],['$m = kIt$','1-й закон Фарадея'],['$k = M/(zF)$','эл.-хим. эквивалент'],['$F$','$F = 96485$ Кл/моль']], + p36: [['Несам.','требует ионизатора'],['Самост.','тлеющий, искровой, дуговой, коронный'],['Плазма','газ из ионов и электронов']], + p37: [['n-тип','примесь-донор, носители — электроны'],['p-тип','примесь-акцептор, носители — дырки'],['p-n','одностор. проводимость, диод']], +}; + +// Tips на каждый параграф — краткая подсказка +const TIPS_HTML = { + p1: 'Положения МКТ: все вещества из частиц, частицы движутся, взаимодействуют. Доказательства — диффузия, броуновское движение.', + p2: '$N_A = 6{,}022 \\\\cdot 10^{23}$ — число частиц в 1 моле. $\\\\nu = m/M = N/N_A$.', + p3: 'Идеальный газ: точечные молекулы, упругие столкновения. Основное ур-ие МКТ: $p = \\\\tfrac{1}{3}nm\\\\overline{v^2}$.', + p4: '$T$ — мера ср. кин. энергии: $\\\\overline{E_k} = \\\\tfrac{3}{2}kT$. Абс. ноль $T = 0$ К $= -273{,}15$°C.', + p5: 'Уравнение Менделеева-Клапейрона: $pV = \\\\nu RT$, где $R = 8{,}314$ Дж/(моль·К).', + p6: 'Изопроцессы: при фиксации одного параметра ($T$, $p$ или $V$). Бойль-Мариотт, Гей-Люссак, Шарль.', + p7: 'Кристалл — дальний порядок, $T_{пл}$ определена. Аморфные — ближний порядок, плавятся плавно.', + p8: 'Жидкость имеет $V$, но не имеет форму. Поверхностное натяжение $\\\\sigma$ создаёт «плёнку» на поверхности.', + p9: 'Насыщенный пар — пар в динамическом равновесии с жидкостью. $p_{нас}$ зависит только от $T$.', + p10: 'Отн. влажность: $\\\\varphi = p_{пара}/p_{нас} \\\\cdot 100\\\\%$. При $\\\\varphi = 100\\\\%$ — точка росы.', + p11: 'Внутр. энергия идеал. одноат. газа: $U = \\\\tfrac{3}{2}\\\\nu RT$. Зависит только от $T$.', + p12: 'Работа газа: $A = p\\\\Delta V$ при $p = \\\\text{const}$. Геометрически — площадь под графиком $p(V)$.', + p13: '$Q = cm\\\\Delta T$ — нагрев. $Q = \\\\lambda m$ — плавление. $Q = rm$ — парообразование. $Q = qm$ — сгорание.', + p14: '1-й закон термодинамики: $Q = \\\\Delta U + A$ — теплота идёт на изменение внутр. энергии и работу газа.', + p15: 'КПД цикла Карно: $\\\\eta_{max} = (T_1 - T_2)/T_1$ — максимально возможный при данных $T_1, T_2$.', + p16: 'Заряд квантуется: $q = ne$, где $e = 1{,}6 \\\\cdot 10^{-19}$ Кл. Закон сохранения заряда — фундаментальный.', + p17: '$F = k\\\\dfrac{|q_1 q_2|}{r^2}$, $k = 9 \\\\cdot 10^9$ Н·м²/Кл². Аналог закона всемирного тяготения.', + p18: 'Поле — посредник взаимодействия. Действует на заряд силой $\\\\vec{F} = q\\\\vec{E}$.', + p19: '$\\\\vec{E} = \\\\vec{F}/q_0$ — векторная характеристика поля. Принцип суперпозиции: $\\\\vec{E} = \\\\sum \\\\vec{E_i}$.', + p20: 'Линии напряжённости — касательные к $\\\\vec{E}$. Начинаются на «+» зарядах, заканчиваются на «−» или в $\\\\infty$.', + p21: 'Работа поля не зависит от пути: $A_{поля} = qU = q(\\\\varphi_1 - \\\\varphi_2)$. Поле потенциально.', + p22: 'В однородном поле: $U = E \\\\cdot d$. Эквипотенциальные поверхности перпендикулярны линиям $\\\\vec{E}$.', + p23: '$C = q/U$ — Ф. Плоский: $C = \\\\dfrac{\\\\varepsilon\\\\varepsilon_0 S}{d}$. Параллельно — $C_\\\\Sigma = \\\\sum C_i$.', + p24: '$W = \\\\dfrac{CU^2}{2} = \\\\dfrac{q^2}{2C} = \\\\dfrac{qU}{2}$ — три эквивалентные формулы.', + p25: 'ЭДС — работа сторонних сил по перемещению единичного заряда: $\\\\mathcal{E} = A_{стор}/q$. Измер. в В.', + p26: 'Закон Ома для полной цепи: $I = \\\\dfrac{\\\\mathcal{E}}{R + r}$. КПД источника: $\\\\eta = R/(R + r)$.', + p27: 'Опыт Эрстеда показал: ток создаёт магн. поле. Линии $\\\\vec{B}$ вокруг тока — концентр. окружности.', + p28: '$\\\\vec{B}$ — индукция магн. поля, измер. в Тл. Линии замкнуты (магн. поле — вихревое).', + p29: 'Сила Ампера: $F_A = BIL\\\\sin\\\\alpha$. Направление — по правилу левой руки.', + p30: 'Сила Лоренца: $F_л = qvB\\\\sin\\\\alpha$. Заряд движется по окружности с $r = mv/(qB)$.', + p31: 'Магн. поток: $\\\\Phi = BS\\\\cos\\\\alpha$. Измеряется в Вб. ЭМИ возникает при $\\\\Delta\\\\Phi \\\\ne 0$.', + p32: 'Закон Фарадея: $\\\\mathcal{E}_i = -\\\\dfrac{d\\\\Phi}{dt}$. Правило Ленца: $I_{инд}$ противодействует $\\\\Delta\\\\Phi$.', + p33: 'Самоиндукция: $\\\\mathcal{E}_{si} = -L\\\\dfrac{dI}{dt}$. Энергия магн. поля катушки: $W_L = LI^2/2$.', + p34: 'В металлах носители — свободные электроны. $\\\\rho(T) = \\\\rho_0(1 + \\\\alpha t)$. Сверхпров.: $\\\\rho = 0$.', + p35: 'Электролиз: $m = kIt$ — 1-й закон Фарадея. $k = M/(zF)$, $F = 96485$ Кл/моль.', + p36: 'Самостоятельный разряд: тлеющий, искровой, дуговой, коронный. Плазма — ионизованный газ.', + p37: 'Полупроводники: n-тип (донор, электроны) и p-тип (акцептор, дырки). p-n переход — диод.', + final1: 'Финал главы 1 — интегрированные задачи по §§1–10. В разработке (Phase 1+).', + final2: 'Финал главы 2 — интегрированные задачи по §§11–15. В разработке (Phase 2+).', + final3: 'Финал главы 3 — интегрированные задачи по §§16–24. В разработке (Phase 3+).', + final4: 'Финал главы 4 — интегрированные задачи по §§25–26. В разработке (Phase 4+).', + final5: 'Финал главы 5 — интегрированные задачи по §§27–33. В разработке (Phase 5+).', + final6: 'Финал главы 6 — интегрированные задачи по §§34–37. В разработке (Phase 6+).', +}; + +// === Билд одного ch === +function buildCh(chKey) { + const C = CHAPTERS[chKey]; + const slug = 'physics-10-' + chKey; + const lsPrefix = 'physics10_' + chKey; + const xpKey = 'physics10_xp'; + const allParas = [...C.paras, C.final]; + const paraNum = (pid) => { + if (pid.startsWith('final')) return '★'; + return '§\xa0' + pid.slice(1); + }; + // PARAS JS literal + const parasArr = allParas.map(pid => { + if (pid.startsWith('final')) { + return ` { id:'${pid}', num:'\\u2605', name:'Финал главы', sub:'Итоги \\u00b7 боссы главы ${C.chNum}', final:true }`; + } + const sub = PARA_SUBS[pid] || ''; + return ` { id:'${pid}', num:'\\u00a7 ${pid.slice(1)}', name:${JSON.stringify(PARA_NAMES[pid])}, sub:'${sub}' }`; + }).join(',\n'); + + // TOTAL_PARAS + const total = allParas.length; + + // ACH_LABELS — мини + const achLabels = [ + ` start:"Начало главы ${C.chNum}!"`, + ...C.paras.map(pid => ` ${pid}_done:${JSON.stringify(PARA_NAMES[pid] + ' освоен!')}`), + ` ${chKey}_done:"Глава ${C.chNum} пройдена!"`, + ].join(',\n'); + + // SIDEBARS JS — для каждой п в главе + final + const sidebarObj = allParas.map(pid => { + const rows = pid.startsWith('final') + ? [[`§§${C.paras[0].slice(1)}–${C.paras[C.paras.length-1].slice(1)}`, `теория главы ${C.chNum}`],['Награда','+50 XP']] + : (SIDEBAR_ROWS[pid] || [['В разработке',`шпаргалка ${pid}`]]); + const titleStr = pid.startsWith('final') ? `Финал главы ${C.chNum}` : `Шпаргалка ${pid.startsWith('p') ? '§' + pid.slice(1) : pid}`; + const rowsLit = rows.map(([k,v]) => `["${k}","${v}"]`).join(','); + return ` ${pid}:{title:"${titleStr}",rows:[${rowsLit}]}`; + }).join(',\n'); + + // TIPS JS + const tipsArr = allParas.map(pid => { + const html = TIPS_HTML[pid] || `Подсказка к ${pid} — в разработке.`; + return ` {sec:'${pid}',html:"${html.replace(/"/g, '\\"')}"}`; + }).join(',\n'); + + // STUB-builder для каждого п + const builders = allParas.map(pid => { + const isFinal = pid.startsWith('final'); + const name = isFinal ? `Финал главы ${C.chNum}` : PARA_NAMES[pid]; + const num = isFinal ? '★' : '§' + pid.slice(1); + const next = (() => { + const idx = allParas.indexOf(pid); + return idx < allParas.length - 1 ? allParas[idx+1] : null; + })(); + const prev = (() => { + const idx = allParas.indexOf(pid); + return idx > 0 ? allParas[idx-1] : null; + })(); + const prevStr = prev ? `'${prev}'` : 'null'; + const nextStr = next ? `'${next}'` : 'null'; + + return `function build_${pid}(){ + const box = document.getElementById('${pid}-body'); + let html = ''; + html += makeCard('theory', ${JSON.stringify(name)}, ${JSON.stringify(num)}, \` +

${name} — этот параграф в разработке (Phase 1+).

+

Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.

+

+ Phase 0: создан скелет учебника. Phase ${C.chNum}+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019). +

+ \`); + html += secNav(${prevStr}, ${nextStr}); + html += readButton('${pid}'); + box.innerHTML = html; + renderMath(box); + wireReadBtn('${pid}'); +}`; + }).join('\n\n'); + + // BUILDERS map + const buildersMap = allParas.map(pid => `${pid}:()=>build_${pid}()`).join(', '); + + // sec node HTML + const secNodes = allParas.map(pid => { + const isFinal = pid.startsWith('final'); + const num = isFinal ? '★' : '§ ' + pid.slice(1); + const titleHtml = isFinal ? 'Финал главы' : PARA_NAMES[pid]; + const wm = PARA_WM[pid] || '?'; + const numHtml = isFinal + ? `` + : `${num}`; + return `
${numHtml}

${titleHtml}

`; + }).join('\n'); + + // sec accent CSS — все секции одного цвета главы + const secCss = allParas.map(pid => + `.sec[id="sec-${pid}"]{ --sec-acc:${C.pri}; --sec-acc-d:${C.priD}; --sec-acc-soft:${C.priSoft}; }` + ).join('\n'); + + // Search NAMES map for secNav titles + const namesObj = allParas.map(pid => { + const v = pid.startsWith('final') ? 'Финал' : '\\xA7' + pid.slice(1); + return `${pid}:'${v}'`; + }).join(','); + + // === Финальный HTML === + const html = ` + + + + + + +Физика 10 · Глава ${C.chNum} · «${C.title}» + + + + + + + + + + + + + +
+
+
+

Физика 10 · Глава ${C.chNum}

+
${C.headerSub}
+
+
+ К физике 10 + + + +
+
+
+ +
+
+ +
+

${C.hero.h}

+

${C.hero.p}

+
+ +
+ Прогресс по главе +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +${secNodes} + +
+ +
+
+ + + +
Достижение!
+ + + + + + +`; + + return html; +} + +// === Run === +for (const chKey of ['ch1','ch2','ch3','ch4','ch5','ch6']) { + const dst = path.join(TBOOKS, `physics_10_${chKey}.html`); + const html = buildCh(chKey); + fs.writeFileSync(dst, html); + + // Parse-check the inline + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 1

+
Первоначальные химические понятия: вещество, атом, элемент, молекула, формула, валентность, реакция и уравнение
+
+
+ К главам + +
+
+
+ +
+
+ +
+

С чего начинается химия

+

Химия изучает вещества, их свойства и превращения. В этой главе вы научитесь главному «языку» химии: узнаете об атомах и химических элементах, научитесь записывать состав веществ формулами, определять валентность и составлять уравнения химических реакций.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 1

Химия — наука о веществах

+
§ 2

Чистые вещества и смеси

+
ПР 1

Практическая работа: знакомство с лабораторией. Разделение смесей

+
§ 3

Атомы. Химические элементы

+
§ 4

Относительная атомная масса химических элементов

+
§ 5

Молекулы. Простые вещества

+
§ 6

Сложные вещества

+
§ 7

Химическая формула

+
§ 8

Относительная молекулярная масса

+
§ 9

Валентность

+
§ 10

Явления физические и химические. Признаки химических реакций

+
Лаб. 1

Лабораторный опыт: признаки протекания химических реакций

+
§ 11

Закон сохранения массы веществ. Химические уравнения

+
§ 12

Составление уравнений химических реакций

+

Финал главы

+ +
+ +
+ + +
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch2.html b/frontend/textbooks/chemistry_7_ch2.html new file mode 100644 index 0000000..4842c14 --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch2.html @@ -0,0 +1,227 @@ + + + + + + + + +Химия 7 · Глава 2 · «Кислород» + + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 2

+
Кислород: воздух, горение, оксиды, получение кислорода
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Кислород — газ, который даёт жизнь и огонь

+

Кислород — самый распространённый элемент на Земле. Без него невозможны дыхание и горение. В этой главе вы узнаете состав воздуха, познакомитесь с кислородом как простым веществом, изучите горение и оксиды, научитесь получать кислород в лаборатории.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 13

Воздух как смесь газов

+
Лаб. 2

Лабораторный опыт: сборка приборов для получения и собирания газов

+
§ 14

Кислород как химический элемент и простое вещество

+
§ 15

Химические свойства кислорода

+
§ 16

Оксиды

+
§ 17

Получение кислорода

+
ПР 2

Практическая работа: получение кислорода и изучение его свойств

+

Финал главы

+ +
+ +
+ + +
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch3.html b/frontend/textbooks/chemistry_7_ch3.html new file mode 100644 index 0000000..da9ee68 --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch3.html @@ -0,0 +1,120 @@ + + + + + + + + +Химия 7 · Глава 3 · «Водород» + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 3

+
Водород: свойства, кислоты и индикаторы, ряд активности, соли
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Водород — самый лёгкий элемент Вселенной

+

Водород — первый элемент периодической системы и самый распространённый во Вселенной. В этой главе вы изучите его свойства, познакомитесь с кислотами и индикаторами, узнаете, как металлы вытесняют водород из кислот, и что такое соли.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 18

Водород — химический элемент и простое вещество

+
§ 19

Химические свойства водорода

+
§ 20

Понятие о кислотах

+
Лаб. 3

Лабораторный опыт: действие кислот на индикаторы

+
§ 21

Взаимодействие кислот с металлами

+
Лаб. 4

Лабораторный опыт: взаимодействие серной и соляной кислот с металлами

+
§ 22

Соли — продукты замещения атомов водорода в кислотах на металлы

+
ПР 3

Практическая работа: получение водорода и изучение его свойств

+

Финал главы

+ +
+ +
+ + +
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch4.html b/frontend/textbooks/chemistry_7_ch4.html new file mode 100644 index 0000000..8dc7ba9 --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch4.html @@ -0,0 +1,116 @@ + + + + + + + + +Химия 7 · Глава 4 · «Вода» + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 4

+
Вода: состав и свойства, основания и индикаторы, нейтрализация, охрана природы
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Вода — самое важное вещество на Земле

+

Вода знакома каждому, но в химии она удивительна. В этой главе вы изучите состав и свойства воды, познакомитесь с основаниями и индикаторами, узнаете о реакции нейтрализации и о том, как беречь воду и окружающую среду.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 23

Состав, физические и химические свойства воды

+
§ 24

Основания как сложные вещества

+
Лаб. 5

Лабораторный опыт: действие щелочей на индикаторы

+
§ 25

Реакция нейтрализации

+
ПР 4

Практическая работа: реакция нейтрализации

+
§ 26

Охрана окружающей среды

+

Финал главы

+ +
+ +
+ + +
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_hub.html b/frontend/textbooks/chemistry_7_hub.html new file mode 100644 index 0000000..60d4dd3 --- /dev/null +++ b/frontend/textbooks/chemistry_7_hub.html @@ -0,0 +1,540 @@ + + + + + + + + +Химия 7 класс — учебник + + + + + + + + + + +
+
+
+ + + К каталогу + +
+
+

Химия — 7 класс

+
Первый курс химии: вещества и реакции, кислород, водород, вода. 4 главы, 26 параграфов, 5 лабораторных опытов, 4 практические работы.
+
+
+ +
+
+
+ +
+ +
+
Х
+
+
Общий прогресс по курсу
+
Загрузка...
+
+
+ +
+ +
+ + +
+
Aₕ
+
Глава 1
+
Первоначальные химические понятия
+
§1–§12 · ЛО 1 · ПР 1
+
+
+
Вещества и смеси, атомы и химические элементы, относительная атомная масса, молекулы, простые и сложные вещества, химическая формула и $M_r$, валентность, признаки реакций, закон сохранения массы и химические уравнения.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
O₂
+
Глава 2
+
Кислород
+
§13–§17 · ЛО 2 · ПР 2
+
+
+
Воздух как смесь газов, кислород — элемент и простое вещество, химические свойства кислорода и горение, оксиды, получение кислорода и катализаторы.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
H₂
+
Глава 3
+
Водород
+
§18–§22 · ЛО 3,4 · ПР 3
+
+
+
Водород — элемент и простое вещество, химические свойства водорода, понятие о кислотах и индикаторах, взаимодействие кислот с металлами и ряд активности, соли как продукты замещения.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
H₂O
+
Глава 4
+
Вода
+
§23–§26 · ЛО 5 · ПР 4
+
+
+
Состав, физические и химические свойства воды, основания как сложные вещества и индикаторы, реакция нейтрализации, охрана окружающей среды.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ +
+ +
+ +
+ +
Шпаргалка курса
+
+
Гл. 1Первоначальные понятия
  • $M_r=\sum A_r$ всех атомов
  • Валентность по водороду: H — I, O — II
  • Простое — один элемент, сложное — разные
  • В реакции масса сохраняется → коэффициенты
+
Гл. 2Кислород
  • Воздух: $N_2$ 78 %, $O_2$ 21 %
  • Горение: вещество $+ O_2 \to$ оксид
  • Оксид — соединение элемента с O
  • $O_2$ из разложения (катализатор $MnO_2$)
+
Гл. 3Водород
  • $H_2$ — самый лёгкий газ
  • Кислота = H + кислотный остаток
  • Ряд активности: до $H_2$ — вытесняют газ
  • Соль = металл + кислотный остаток
+
Гл. 4Вода
  • Разложение воды: $H_2 : O_2 = 2 : 1$
  • Основание = металл + OH
  • Индикаторы: лакмус, метилоранж, фенолфталеин
  • Нейтрализация: кислота + основание → соль + вода
+
+ +
8 интегрированных боссов
+
Боссов побеждено: 0 / 8
+
+ +
+
+
Курс «Химия 7» пройден!
Вы прошли итоговую проверку по всем 4 главам. +150 XP, ачивка «Химик 7 класса» получена.
+ К каталогу +
+ +
+
+ +
+
+ +
+
+
Химик 7 класса
+
Изучите все 26 параграфов курса, чтобы получить достижение.
+
+
+ +
+ + + + + + + diff --git a/plans/BIOCHEM_UPGRADE.md b/plans/BIOCHEM_UPGRADE.md index 40c5d29..0e4c342 100644 --- a/plans/BIOCHEM_UPGRADE.md +++ b/plans/BIOCHEM_UPGRADE.md @@ -121,17 +121,15 @@ > Все 7 фильтров в UI редактора теперь с данными; контроллер их уже валидирует, > XP начисляется. data_json совпадает с UI (balance: reactants/products/coefficients; > match: pairs; classify/complete: target/equation/choices/answer). -> Сделано также: 5.2 живая поэлементная проверка баланса; 5.3 3D-build с -> изоморфизмом графа (Morgan-хеш) + 4 задания; 5.5 ачивки bc_* привязаны к -> событиям. Осталось только 5.4 (адаптивность/«задача дня»/streak). +> Осталось: drag-and-drop (5.2), 3D-build (5.3), адаптивность (5.4), ачивки bc_* (5.5). Слоты ачивок `bc_5_challenges`/`bc_20_challenges` уже есть в `_shared.js` — довести до конца и расширить вызовы. - [x] 5.1 Засидированы типы challenge: balance, match, classify, complete (16 заданий, идемпотентный сидер). -- [x] 5.2 Живая поэлементная проверка баланса (счётчик атомов слева=справа по мере ввода). _(числовой ввод с мгновенной обратной связью вместо литерального drag-and-drop.)_ -- [x] 5.3 3D-build challenge: `structuralMatch`/`canonicalHash` (Morgan) в контроллере — проверка связности против эталона (molecule_id), отличает изомеры (этанол≠диметиловый эфир); +4 structure-build задания. +- [ ] 5.2 UI drag-and-drop для balance/match (сейчас только выбор/ввод). +- [ ] 5.3 3D-build challenge: собрать молекулу и проверить не только формулу, но и связность/геометрию. - [ ] 5.4 Адаптивная сложность + «задача дня»; streak по биохимии. -- [x] 5.5 Ачивки `bc_first_molecule`/`bc_5_challenges`/`bc_20_challenges` привязаны: `checkAchievements` вызывается после решения задачи и сохранения молекулы; счётчики из `bio_user_challenges`/`bio_user_molecules` в `checkPhase3Achievements`. +- [ ] 5.5 Привязать ачивки `bc_5_challenges`/`bc_20_challenges` (и новые: «собрал АТФ», «сбалансировал 10 реакций», «прошёл цикл Кребса») к событиям; проверить начисление в `gamificationController`. --- diff --git a/plans/OPTICS_CONSTRUCTOR.md b/plans/OPTICS_CONSTRUCTOR.md index a904038..e578e72 100644 --- a/plans/OPTICS_CONSTRUCTOR.md +++ b/plans/OPTICS_CONSTRUCTOR.md @@ -39,14 +39,7 @@ - [x] 3.2 Пресеты систем (микроскоп/телескоп/проектор/зеркальная) — Фаза 1; экспорт PNG (`benchExportPng`, кнопка «Снимок PNG»). - [x] 3.3 Экран ловит изображение: светящиеся пятна (additive `lighter`) в точках попадания лучей, по λ — видно формирование изображения и спектр. -### Фаза 4 — Контент и улучшения — [x] -- [x] Источники: **одиночный луч** и **лазер** (узкий пучок) + **угол прицеливания** (point/single/laser/parallel наклоняются на `ang`). -- [x] Новые элементы: **граница сред** (Снеллиус на вертикальной плоскости + ПВО — проверено: 30°→19.47°, ПВО при 50°) и **стеклянная пластина** (параллельный сдвиг, преломление на входе/выходе). -- [x] Отсечение апертурой: лучи вне апертуры линзы/зеркала поглощаются (видно виньетирование, размер апертуры значим). -- [x] Метки **F и 2F** у собирающей линзы. -- [x] Числовые значения у слайдеров инспектора (живое обновление без пересборки панели). - -Бэклог: точная двухгранная призма (Снеллиус на гранях вместо тонкопризменного); профиль интенсивности на экране; поворот/наклон элементов и 2D-перетаскивание (yf); делитель пучка (форк луча); удаление legacy `FreeBuildSim`. +Бэклог: точная двухгранная призма (Снеллиус на гранях вместо тонкопризменного), апертурное отсечение лучей вне линзы (сейчас проходят прямо), профиль интенсивности на экране, поворот элементов, удаление legacy `FreeBuildSim`. --- История: создан 2026-05-30. diff --git a/plans/textbooks-10/PLAN_PHYSICS_10.md b/plans/textbooks-10/PLAN_PHYSICS_10.md new file mode 100644 index 0000000..fb85f6b --- /dev/null +++ b/plans/textbooks-10/PLAN_PHYSICS_10.md @@ -0,0 +1,424 @@ +# План реализации: Физика 10 (Беларусь, Громыко, 2019) + +**Источник:** `fizika_10kl_gromika_rus_2019.pdf` (267 стр., 2 части, 6 глав, 37 §) +**Издательство:** «Адукацыя і выхаванне», 2019 +**Уровень:** базовый + повышенный (с электронным приложением). + +> **Самый большой учебник во всём проекте** — 37 параграфов против 19 в Алгебре 9 и 16 в Геометрии 9. Учитывает весь опыт 10 предыдущих учебников: единый KaTeX-эскейп, ноль пикселей в подписях, ноль эмодзи, 3D-движок `g3d.js`, snap-точки в slider'ах, цветовая кодировка, drag-to-rotate. **Главная фишка** — настоящие физические **симуляции**: броуновское движение, изопроцессы (PV-диаграммы), линии поля, электрические цепи, движение заряженных частиц в магнитном поле, явление индукции. + +--- + +## 🎯 Содержание учебника + +### Часть 1. МОЛЕКУЛЯРНАЯ ФИЗИКА + +**Глава 1. Основы молекулярно-кинетической теории (§§1–10)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §1 | Основные положения МКТ | 3 положения: вещество — частицы, частицы движутся, частицы взаимодействуют | +| §2 | Масса и размеры молекул. Количество вещества | $N_A = 6.022 \cdot 10^{23}$, $M = m \cdot N_A$, $\nu = N/N_A = m/M$ | +| §3 | Макро- и микропараметры. Идеальный газ. Основное уравнение МКТ | $p = \dfrac{1}{3} n m_0 \overline{v^2} = \dfrac{2}{3} n \overline{E_k}$ | +| §4 | Тепловое равновесие. Температура | $\overline{E_k} = \dfrac{3}{2} kT$, шкала Кельвина: $T = t + 273$ | +| §5 | Уравнение состояния идеального газа | $pV = \nu RT$, $pV = \dfrac{m}{M} RT$ (Клапейрон–Менделеев) | +| §6 | Изопроцессы | Изотерма $pV = \text{const}$, изобара $V/T = \text{const}$, изохора $p/T = \text{const}$ | +| §7 | Строение и свойства твёрдых тел | Кристаллы (моно-, поликристаллы), аморфные тела, анизотропия | +| §8 | Строение и свойства жидкостей | Поверхностное натяжение, смачивание | +| §9 | Испарение и конденсация. Насыщенный пар | Динамическое равновесие, давление насыщенного пара | +| §10 | Влажность воздуха | $\varphi = \dfrac{p}{p_н} \cdot 100\%$, точка росы, психрометр | + +**Глава 2. Основы термодинамики (§§11–15)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §11 | Внутренняя энергия | $U = \dfrac{3}{2} \nu R T$ (одноатомный газ) | +| §12 | Работа в термодинамике | $A = p \Delta V$ (изобарный), графически площадь под кривой | +| §13 | Количество теплоты | $Q = cm \Delta T$, $Q = \lambda m$ (плавление), $Q = rm$ (испарение), $Q = qm$ (сгорание) | +| §14 | Первый закон термодинамики | $\Delta U = Q + A_{внеш}$ или $Q = \Delta U + A_{газ}$ | +| §15 | Тепловые двигатели. КПД | $\eta = \dfrac{A}{Q_1} = \dfrac{Q_1 - Q_2}{Q_1}$, $\eta_{Карно} = \dfrac{T_1 - T_2}{T_1}$ | + +### Часть 2. ЭЛЕКТРОДИНАМИКА + +**Глава 3. Электростатика (§§16–24)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §16 | Электрический заряд. Закон сохранения | $q = ne$, $e = 1.6 \cdot 10^{-19}$ Кл, $\sum q = \text{const}$ | +| §17 | Закон Кулона | $F = k \dfrac{|q_1 q_2|}{r^2}$, $k = 9 \cdot 10^9$ Н·м²/Кл² | +| §18 | Электростатическое поле | Силовая характеристика, источник | +| §19 | Напряжённость поля. Принцип суперпозиции | $\vec{E} = \dfrac{\vec{F}}{q_{пр}}$, $\vec{E} = \sum \vec{E_i}$ | +| §20 | Линии напряжённости | Силовые линии, поле точечного заряда, диполя | +| §21 | Работа поля. Потенциал | $A = qU$, $\varphi = \dfrac{W_p}{q}$ | +| §22 | Разность потенциалов. Напряжение | $U = \varphi_1 - \varphi_2$, $E = U/d$ (однородное) | +| §23 | Конденсаторы. Электроёмкость | $C = q/U$, $C = \dfrac{\varepsilon \varepsilon_0 S}{d}$ | +| §24 | Энергия поля конденсатора | $W = \dfrac{CU^2}{2} = \dfrac{q^2}{2C} = \dfrac{qU}{2}$ | + +**Глава 4. Постоянный электрический ток (§§25–26)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §25 | ЭДС источника тока | $\mathcal{E} = A_{ст}/q$, ЭДС, сторонние силы | +| §26 | Закон Ома для полной цепи | $I = \dfrac{\mathcal{E}}{R + r}$, КПД $\eta = U/\mathcal{E}$ | + +**Глава 5. Магнитное поле. Электромагнитная индукция (§§27–33)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §27 | Магнитное поле тока | Опыт Эрстеда, взаимодействие проводников | +| §28 | Индукция магнитного поля | $\vec{B}$, правило буравчика, линии индукции | +| §29 | Сила Ампера | $F_A = BIL\sin\alpha$, правило левой руки | +| §30 | Сила Лоренца | $F_L = qvB\sin\alpha$, движение по окружности: $R = \dfrac{mv}{qB}$ | +| §31 | Магнитный поток. Электромагнитная индукция | $\Phi = BS\cos\alpha$, опыты Фарадея | +| §32 | Правило Ленца. Закон ЭМИ | $\mathcal{E}_i = -\dfrac{d\Phi}{dt}$ | +| §33 | Самоиндукция. Индуктивность | $\mathcal{E}_{si} = -L \dfrac{dI}{dt}$, $W_L = \dfrac{LI^2}{2}$ | + +**Глава 6. Электрический ток в различных средах (§§34–37)** +| § | Тема | Ключевые формулы | +|---|------|------------------| +| §34 | Ток в металлах. Сверхпроводимость | Свободные электроны, $\rho(T) = \rho_0(1+\alpha t)$ | +| §35 | Ток в электролитах | Электролиз, законы Фарадея: $m = kIt$, $k = \dfrac{M}{F n}$ | +| §36 | Ток в газах. Плазма | Самостоятельный/несамостоятельный разряд, виды разрядов | +| §37 | Ток в полупроводниках | Собственная и примесная проводимость, n-тип, p-тип, p-n-переход | + +**ИТОГО:** 6 глав, 37 параграфов, **2 части**. + +--- + +## 🎨 SVG-СТАНДАРТ КАЧЕСТВА ДЛЯ ФИЗИКИ + +Это первая физика в проекте — нужны новые хелперы. Унаследует всё от математических учебников + добавляет physics-specific. + +### Унаследованные хелперы (из Алгебры 11 / Геометрии 11) +- `axes2D(W, H, pad, xmin, xmax, ymin, ymax)` — координатная плоскость +- `plotFunc(f, xmin, xmax, toX, toY, color, N)` — график функции +- `pointWithDrop(x, fx, toX, toY, color, label)` — точка с проекциями +- `asymptote(orientation, value, ...)` — асимптота +- `snapToValue(value, snaps, tolerance)` — snap-точки +- `rightAngleMark`, `angleArcAuto`, `unitVec`, `deg2rad` +- **`g3d.js`** — мини-3D движок (для линий магнитной индукции, движения частиц) + +### Новые physics-specific хелперы (в `frontend/js/phys.js`) + +```javascript +// === Стрелка вектора (2D) === +function drawArrow(x1, y1, x2, y2, color, width, headSize) { + // Возвращает SVG: линия + треугольная стрелка на конце + const dx = x2 - x1, dy = y2 - y1; + const len = Math.sqrt(dx*dx + dy*dy); + const ux = dx / len, uy = dy / len; + const px = -uy, py = ux; // перпендикуляр + const h = headSize || 10; + const w = (headSize || 10) * 0.6; + const tipX = x2, tipY = y2; + const baseX = x2 - ux * h, baseY = y2 - uy * h; + const leftX = baseX + px * w, leftY = baseY + py * w; + const rightX = baseX - px * w, rightY = baseY - py * w; + return `` + + ``; +} + +// === Линии электрического поля от точечного заряда === +function fieldLinesPointCharge(cx, cy, sign, scale, numLines) { + // sign: +1 или -1 (от знака заряда) + // numLines: число линий (12-24) + // Возвращает массив SVG-линий — стрелки наружу для +q, внутрь для -q + let s = ''; + const N = numLines || 16; + for (let i = 0; i < N; i++) { + const a = 2 * Math.PI * i / N; + const r1 = 15, r2 = scale; + const x1 = cx + r1 * Math.cos(a), y1 = cy + r1 * Math.sin(a); + const x2 = cx + r2 * Math.cos(a), y2 = cy + r2 * Math.sin(a); + if (sign > 0) s += drawArrow(x1, y1, x2, y2, '#dc2626', 1.5); + else s += drawArrow(x2, y2, x1, y1, '#2563eb', 1.5); + } + return s; +} + +// === Линии поля диполя (две точечных зарядов противоположных) === +function fieldLinesDipole(c1, c2, scale, numLines) { + // Параметрически — линия от +q к -q вдоль кривых, перпендикулярных эквипотенциалям + // Упрощённо: использовать numerical integration по полю + // ... +} + +// === Электрическая схема: компоненты === +function batteryEMF(x, y, EMF, orientation) { + // Возвращает SVG условного обозначения батареи (две полоски + подпись ε) +} +function resistor(x, y, w, h, R, orientation) { + // Возвращает SVG зигзага резистора + подпись R +} +function capacitor(x, y, C, orientation) { + // Две параллельные линии + подпись C +} +function ammeter(x, y) { + // Круг с буквой A +} +function voltmeter(x, y) { + // Круг с буквой V +} +function inductor(x, y, L, orientation) { + // Серия маленьких полукругов +} +function lightbulb(x, y) { + // Круг с крестиком (или волной) +} + +// === Магнитное поле: стрелки В через плоскость экрана === +function magneticField(x, y, direction, dx, dy) { + // direction: 'in' (крест) или 'out' (точка) + // Рисует сетку 5x5 крестиков (вошло в плоскость) или точек (вышло из плоскости) + let s = ''; + for (let i = 0; i < 5; i++) { + for (let j = 0; j < 5; j++) { + const cx = x + i * dx, cy = y + j * dy; + if (direction === 'in') { + s += ``; + s += ``; + s += ``; + } else { + s += ``; + s += ``; + } + } + } + return s; +} + +// === PV-диаграмма с изопроцессами === +function pvDiagram(W, H, pad, pMax, vMax) { + // Возвращает axes2D-объект с диапазоном (0..vMax, 0..pMax) + // Подписи осей: P (атм или Па), V (л или м³) +} + +// === Молекула газа (частица) === +function molecule(x, y, r, color) { + return ``; +} + +// === Симуляция броуновского движения / движения молекул газа === +class GasSimulation { + constructor(opts) { + this.W = opts.W; this.H = opts.H; + this.N = opts.N || 30; + this.particles = []; + for (let i = 0; i < this.N; i++) { + this.particles.push({ + x: Math.random() * this.W, + y: Math.random() * this.H, + vx: (Math.random() - 0.5) * opts.speed, + vy: (Math.random() - 0.5) * opts.speed + }); + } + } + step(dt) { + this.particles.forEach(p => { + p.x += p.vx * dt; p.y += p.vy * dt; + // отражение от стенок + if (p.x < 0 || p.x > this.W) p.vx = -p.vx; + if (p.y < 0 || p.y > this.H) p.vy = -p.vy; + }); + } + render() { + return this.particles.map(p => molecule(p.x, p.y, 4, '#2563eb')).join(''); + } +} +``` + +### Цветовая кодировка для физики + +- **Положительный заряд** — красный (`#dc2626`) +- **Отрицательный заряд** — синий (`#2563eb`) +- **Электрическое поле $\vec{E}$** — оранжевый (`#ea580c`) +- **Магнитное поле $\vec{B}$** — фиолетовый (`#7c3aed`) +- **Сила** — зелёный (`#10b981`) +- **Скорость** — голубой (`#0891b2`) +- **Молекулы газа** — синие точки +- **Температура** — градиент от синего (холод) к красному (горячо) +- **Ток** — янтарный (`#d97706`) +- **Резистор / провод** — тёмно-серый (`#374151`) +- **Изотерма** (P-V) — оранжевый +- **Изобара** (V-T) — синий +- **Изохора** (P-T) — зелёный + +### Правила (обязательны с §1) + +1. **Все единицы измерения через KaTeX** — `\\text{Н}`, `\\text{м}^2$, `\\text{Дж/(моль·К)}` — никогда сырой текст. +2. **Slider'ы — в реальных физических величинах** с разумными диапазонами: + - Температура: 100..500 К (или $-100..200$ °C) + - Давление: 0.5..5 атм или $10^4..10^6$ Па + - Объём: 1..10 л или $0.001..0.01$ м³ + - Заряд: $\pm 10^{-9}..10^{-6}$ Кл (нКл, мкКл) + - Расстояние между зарядами: 0.01..1 м + - Напряжение: 1..220 В + - Ток: 0.01..10 А + - Магнитная индукция: $10^{-3}..1$ Тл +3. **Snap-точки** на эталонных значениях: $T = 273$ К ($0$ °C), $T = 0$ K, $p = 1$ атм. +4. **Все формулы с КаTeX**, двойные backslash. +5. **Векторы — со стрелками** через `drawArrow`. Никогда `→` в тексте — через KaTeX `\\vec{E}`. +6. **Подписи единиц измерения** — обязательны на всех осях графиков, во всех результатах калькуляторов. +7. **Симуляции — через `requestAnimationFrame`** с возможностью паузы и сброса. +8. **Эмодзи запрещены.** +9. **Никаких пикселей в подписях** — всё в СИ или производных единицах. + +### Типы интерактивов по темам + +| Тип | Применение | +|-----|-----------| +| **Симуляция движения молекул** | §1 (МКТ), §3 (давление как удары о стенку), §9 (испарение) | +| **PV/VT/PT диаграммы** | §6 (изопроцессы — главное!), §15 (цикл Карно) | +| **Калькулятор Клапейрона–Менделеева** | §5 | +| **Психрометрический анализ** | §10 | +| **Поток теплоты симуляция** | §13 | +| **Цикл Карно — анимированная PV-диаграмма** | §15 | +| **Закон Кулона: 3D-визуализатор сил** | §17 | +| **Линии напряжённости электрического поля** | §20 (главный визуал электростатики) | +| **Эквипотенциальные поверхности** | §22 | +| **Конденсатор-конструктор** | §23 | +| **Электрическая цепь — конструктор** | §25, §26 | +| **Правило буравчика / левой руки — 3D** | §28, §29, §30 | +| **Движение заряженной частицы в B-поле — 3D-траектория** | §30 (главный визуал магнетизма) | +| **Опыты Фарадея — анимация катушки и магнита** | §31 | +| **Самоиндукция — LR-цепь, ток как функция времени** | §33 | +| **p-n переход — визуализация дырок и электронов** | §37 | + +--- + +## 🚀 ПОРЯДОК РЕАЛИЗАЦИИ + +Учитывая 37 параграфов — самый большой проект, разбиваем на **8 фаз**. + +### Phase 0: Архитектура (фундамент) +- `physics_10_hub.html` — палитра **yellow/amber** (классический физический цвет) или **orange** +- 6 ch-файлов: `physics_10_ch1.html` (МКТ), `_ch2.html` (термодинамика), `_ch3.html` (электростатика), `_ch4.html` (пост. ток), `_ch5.html` (магнитное поле), `_ch6.html` (ток в средах) +- Миграция `0XX_physics_10_hub.sql` (следующий доступный номер) +- **`frontend/js/phys.js`** — новый модуль physics-хелперов (drawArrow, fieldLines, magneticField, схемы, GasSimulation, pvDiagram) +- 2D-хелперы (axes2D, plotFunc, etc.) и G3D подключены в каждый ch +- KaTeX CDN + auto-render +- POLISH CSS + bump-score JS + +### Phase 1: Молекулярная физика — Глава 1 (10 §) — 5 волн +Самая большая глава учебника. По 2 §§ на волну. +- **Wave 1**: §1 (МКТ основные положения, БРОУНОВСКОЕ ДВИЖЕНИЕ симуляция) + §2 (масса/количество вещества, калькулятор $N$, $\nu$, $m$). +- **Wave 2**: §3 (давление через удары молекул, симуляция $p = \frac{1}{3} n m \overline{v^2}$) + §4 (температура, шкалы, $\overline{E_k} = \frac{3}{2}kT$). +- **Wave 3**: §5 (уравнение Клапейрона–Менделеева, калькулятор) + §6 (**изопроцессы — главный визуал главы**: PV/VT/PT диаграммы с slider'ом T, V, p). +- **Wave 4**: §7 (твёрдые тела, виды кристаллов SVG) + §8 (жидкости, поверхностное натяжение симуляция). +- **Wave 5**: §9 (испарение, насыщенный пар, динамическое равновесие симуляция) + §10 (влажность, психрометрический калькулятор) + **Финал главы 1** (7 боссов + ачивка «Мастер МКТ»). + +### Phase 2: Молекулярная физика — Глава 2 «Термодинамика» (5 §) — 3 волны +- **Wave 1**: §11 (внутренняя энергия, $U = \frac{3}{2} \nu R T$) + §12 (работа в термодинамике, площадь под P-V кривой). +- **Wave 2**: §13 (количество теплоты — все 4 формулы) + §14 (первый закон термодинамики, применение к изопроцессам). +- **Wave 3**: §15 (тепловые двигатели, **цикл Карно — анимация PV-цикла**, КПД) + **Финал главы 2** (5 боссов + ачивка «Мастер термодинамики»). + +### Phase 3: Электростатика (9 §) — 5 волн +- **Wave 1**: §16 (заряд, закон сохранения) + §17 (**закон Кулона — визуализатор сил**, slider $q_1, q_2, r$). +- **Wave 2**: §18 (электрическое поле) + §19 (напряжённость, суперпозиция). +- **Wave 3**: §20 (**линии напряжённости — главный визуал** — поле точечного заряда, диполя, двух одноимённых) + §21 (работа поля, потенциал). +- **Wave 4**: §22 (разность потенциалов, напряжение, $E = U/d$) + §23 (конденсаторы, $C = \varepsilon \varepsilon_0 S/d$). +- **Wave 5**: §24 (энергия поля конденсатора) + **Финал главы 3** (7 боссов + ачивка «Мастер электростатики»). + +### Phase 4: Постоянный ток (2 §) — 1 волна +- **Wave 1**: §25 (ЭДС, сторонние силы) + §26 (закон Ома для полной цепи, **конструктор электрической цепи**) + **Финал главы 4** (5 боссов). + +### Phase 5: Магнитное поле и индукция (7 §) — 4 волны +- **Wave 1**: §27 (опыт Эрстеда, симуляция) + §28 (индукция, правило буравчика, **3D-линии магнитной индукции вокруг проводника**). +- **Wave 2**: §29 (сила Ампера, правило левой руки, симуляция) + §30 (**сила Лоренца — 3D-движение частицы по спирали в B-поле**). +- **Wave 3**: §31 (магнитный поток, **опыты Фарадея — анимация катушки и магнита**) + §32 (правило Ленца, закон ЭМИ). +- **Wave 4**: §33 (самоиндукция, индуктивность, LR-цепь) + **Финал главы 5** (7 боссов + ачивка «Мастер магнетизма»). + +### Phase 6: Ток в различных средах (4 §) — 2 волны +- **Wave 1**: §34 (металлы, сверхпроводимость) + §35 (электролиты, законы Фарадея). +- **Wave 2**: §36 (газы, плазма, виды разрядов) + §37 (полупроводники, **p-n переход — визуализация дырок и электронов**, n-/p-тип) + **Финал главы 6** (5 боссов + ачивка «Мастер токов»). + +### Phase 7: Финал курса Физика 10 +- Итоговая шпаргалка (6 mini-карточек: МКТ, термодинамика, электростатика, ток, магнетизм, ток в средах) +- **10 интегрированных боссов**, комбинирующих темы из разных глав: + 1. **МКТ + термодинамика**: $U$ и $T$ моноатомного газа + 2. **Изопроцесс + работа**: $A$ за изобарное расширение + 3. **Цикл Карно**: КПД при $T_1 = 600$ К, $T_2 = 300$ К + 4. **Закон Кулона + суперпозиция**: сила на 3-й заряд от двух источников + 5. **Конденсатор + энергия**: $W$ от $C$, $U$ + 6. **Закон Ома для полной цепи + КПД** + 7. **Сила Лоренца + радиус**: $R = mv/(qB)$ + 8. **Закон ЭМИ Фарадея**: $\mathcal{E}_i$ от $d\Phi/dt$ + 9. **Самоиндукция + энергия**: $W_L = LI^2/2$ + 10. **Магистр электродинамики**: синтез +- Ачивка **«Магистр физики 10»** (+150 XP — крупнейший курс) +- Кнопка «К каталогу учебников» → `/textbooks` + +--- + +## 📦 Структура каждого § (стандарт) + +### Wave 0 главы — skeleton (включено в Phase 0) +- CSS + цветовая палитра 3 акцентов на § +- Sections + stub-builders +- Hub-карточка обновляется +- Миграция в БД + +### Wave N — наполнение § (по 2 § на волну) + +**Каждый § содержит:** +- **3 теоретические карточки** (`theory`, `rule`, `example`) с SVG-схемами/графиками +- **4 интерактива** (`.wg` виджеты): + 1. **Симуляция** или **3D/SVG-визуализатор** (главный) + 2. **Калькулятор закона** (ввод параметров → формула с подстановкой → результат с единицами) + 3. **DnD/Квикфайр** (понятийный) + 4. **Тренажёр расчётных задач** (5-6 задач с числовым ответом, допуск 1-5%) +- **Кнопка «Я прочитал § (+10 XP)»** +- **Прогресс/XP**: IV1 15%/10XP, IV2 15%/10XP, IV3 25%/15XP, IV4 25%/15XP, чтение 30%/10XP + +### Wave финал главы +- **Итоговая шпаргалка** с формулами +- **5-7 интегрированных боссов** (синтез тем главы) +- **Ачивка «Мастер главы N»** + 50 XP + confetti +- **Кнопка** перехода к следующей главе + +--- + +## 📊 Оценка объёма + +| Глава | § | LOC | +|-------|---|-----| +| Phase 0: skeleton + phys.js | — | 2500 | +| Глава 1 МКТ (§§1-10) | 10 | 13 000 | +| Глава 2 Термодинамика (§§11-15) | 5 | 6 500 | +| Глава 3 Электростатика (§§16-24) | 9 | 12 000 | +| Глава 4 Пост. ток (§§25-26) | 2 | 3 000 | +| Глава 5 Магнетизм (§§27-33) | 7 | 10 500 | +| Глава 6 Ток в средах (§§34-37) | 4 | 5 500 | +| Phase 7 финал курса | — | 1 500 | +| **Итого** | **37** | **~54 500 LOC** | + +Это **больше**, чем Геометрия 11 (~30K) или Алгебра 9 (~30K). Самый объёмный курс. + +--- + +## ⚠️ Критические правила (опыт всех 10 предыдущих учебников) + +### ❌ НЕ делать +- **Slider'ы в пиксельных диапазонах** (40..150). Только в реальных физических единицах с правильным масштабом отрисовки. +- **Подписи без единиц измерения** ($p = 100$ — это что? Па? атм?). Всегда: $p = 1$ атм $= 10^5$ Па. +- **Эмодзи** (`⚠`, `🌡️`, `🔋`). Только inline SVG. +- **Одиночный `\` перед буквой** в JS template literals: `\dfrac`, `\sin`, `\vec`. ВСЕГДА `\\dfrac`. +- **Сырой KaTeX в `