diff --git a/frontend/textbooks/algebra_10_ch1.html b/frontend/textbooks/algebra_10_ch1.html
index c2962ba..084aaae 100644
--- a/frontend/textbooks/algebra_10_ch1.html
+++ b/frontend/textbooks/algebra_10_ch1.html
@@ -254,7 +254,7 @@ a{color:inherit;text-decoration:none}
-
+
@@ -383,7 +383,7 @@ const PARAS = [
{ id:'p10',num:'§ 10', name:'Сумма и разность', sub:'sin(α±β)' },
{ id:'p11',num:'§ 11', name:'Двойной аргумент', sub:'sin 2α' },
{ id:'p12',num:'§ 12', name:'Сумма → произведение', sub:'sin α + sin β' },
- { id:'final1', num:'★', name:'Финал главы', sub:'6 боссов', final:true },
+ { id:'final1', num:'★', name:'Финал главы', sub:'6 боссов', final:true },
];
function buildParaSelector(){
@@ -573,7 +573,7 @@ function buildSidebar(id){
html+='
';
if(STATE.achievements.size>0){
html+='Достижения ';
- [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
+ [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
html+='
';
}
box.innerHTML=html;
@@ -690,7 +690,7 @@ function makeBoss(paraId, bossDef){
const q=document.getElementById(idP+'-q');
const fb=document.getElementById(idP+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
+ stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
q.innerHTML='Босс повержен! ';
document.getElementById(idP+'-go').disabled=true;
document.getElementById(idP+'-go').style.opacity=.5;
@@ -1141,9 +1141,9 @@ function buildP2(){
/* IV3: возможно ли */
(function(){
const Q=[
- { e:'$\\sin\\alpha = 5/13$ и $\\cos\\alpha = 12/13$ одновременно', ok:true, why:'$(5/13)^2 + (12/13)^2 = 169/169 = 1$ ✓' },
+ { e:'$\\sin\\alpha = 5/13$ и $\\cos\\alpha = 12/13$ одновременно', ok:true, why:'$(5/13)^2 + (12/13)^2 = 169/169 = 1$ ✓' },
{ e:'$\\sin\\alpha = -0{,}3$ и $\\cos\\alpha = 0{,}4$ одновременно', ok:false, why:'$0{,}09 + 0{,}16 = 0{,}25 \\ne 1$.' },
- { e:'$\\sin\\alpha = 0{,}8$ и $\\cos\\alpha = 0{,}6$ одновременно', ok:true, why:'$0{,}64 + 0{,}36 = 1$ ✓' },
+ { e:'$\\sin\\alpha = 0{,}8$ и $\\cos\\alpha = 0{,}6$ одновременно', ok:true, why:'$0{,}64 + 0{,}36 = 1$ ✓' },
{ e:'$\\sin\\alpha = \\sqrt{3}$', ok:false, why:'$\\sqrt{3} \\approx 1{,}73 > 1$.' },
{ e:'$\\cos\\alpha = -1$', ok:true, why:'$\\cos\\pi = -1$.' },
{ e:'$\\sin\\alpha = 2$', ok:false, why:'$|\\sin\\alpha| \\le 1$.' },
@@ -1421,7 +1421,7 @@ function buildP4(){
title:'Босс §4 — Тождества',
steps:[
{ q:'Чему равно $\\sin^2 30° + \\cos^2 30°$?', verify:(v)=>+v===1, hint:'Основное тождество, всегда равно 1.' },
- { q:'$\\sin\\alpha = 5/13$ и $\\cos\\alpha = 12/13$. Возможно? «да»/«нет»', verify:(v)=>String(v).trim().toLowerCase().startsWith('д'), hint:'$25/169 + 144/169 = 1$ ✓.' },
+ { q:'$\\sin\\alpha = 5/13$ и $\\cos\\alpha = 12/13$. Возможно? «да»/«нет»', verify:(v)=>String(v).trim().toLowerCase().startsWith('д'), hint:'$25/169 + 144/169 = 1$ ✓.' },
{ q:'$\\sin\\alpha = -3/5$, $\\alpha \\in (\\pi; 3\\pi/2)$. Найди $\\cos\\alpha$ как дробь (введи -4/5).', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-4/5'||+v===-0.8;}, hint:'$\\cos^2 = 16/25$, в III четверти $\\cos < 0$.' },
{ q:'Если $\\tg\\alpha = 0{,}75$, то $\\ctg\\alpha = ?$ (введи в виде десятичной дроби).', verify:(v)=>Math.abs(+v - 4/3) < 0.01, hint:'$\\ctg = 1/\\tg = 1/0{,}75 = 4/3 \\approx 1{,}33$.' },
{ q:'Упрости: $(1 + \\tg^2\\alpha) \\cdot \\cos^2\\alpha$. Чему равно?', verify:(v)=>+v===1, hint:'$1 + \\tg^2 = 1/\\cos^2$, значит произведение $= 1$.' },
@@ -2272,7 +2272,7 @@ function buildP8(){
{ q:'Сколько корней у $\\sin x = 0{,}5$ на промежутке $[0;\\,2\\pi]$?', verify:(v)=>+v===2, hint:'$x_1 = \\pi/6$ и $x_2 = 5\\pi/6$ — обе в промежутке.' },
{ q:'Реши $\\cos x = -1$. Введи корень в $[0;\\,2\\pi]$ как pi (если ответ $\\pi$).', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='pi'||s==='π';}, hint:'$\\cos\\pi = -1$.' },
{ q:'Реши $2\\cos^2 x + 3\\cos x + 1 = 0$. Сколько корней в $[0;\\,2\\pi)$?', verify:(v)=>+v===3, hint:'$t = \\cos x$: $2t^2+3t+1=0$, $t = -1$ или $t = -1/2$. cos=−1: x=π. cos=−1/2: x=2π/3, 4π/3. Итого 3.' },
- { q:'Решает ли значение $x = \\dfrac{\\pi}{2}$ уравнение $\\sin x \\cos x = 0$? «да» или «нет»', verify:(v)=>String(v).trim().toLowerCase().startsWith('д'), hint:'$\\cos(\\pi/2) = 0$, произведение = 0 ✓.' },
+ { q:'Решает ли значение $x = \\dfrac{\\pi}{2}$ уравнение $\\sin x \\cos x = 0$? «да» или «нет»', verify:(v)=>String(v).trim().toLowerCase().startsWith('д'), hint:'$\\cos(\\pi/2) = 0$, произведение = 0 ✓.' },
{ q:'Реши $\\tg x = 1$. Введи наименьший положительный корень как pi/n.', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='pi/4'||s==='π/4';}, hint:'$\\arctg 1 = \\pi/4$, серия $x = \\pi/4 + \\pi n$.' },
]
});
@@ -2969,15 +2969,15 @@ function buildFinal1(){
/* === Hero card === */
html += ''
- +'
★
'
+ +'
★
'
+'
'
+'
ФИНАЛ ГЛАВЫ 1
'
+'
6 интегрированных боссов '
+'
Каждый босс проверяет синтез нескольких параграфов главы. Победи всех — получи ачивку «Магистр тригонометрии» и +150 XP.
'
+'
'
- +'
★ 6 боссов
'
+ +'
★ 6 боссов
'
+'
+ до 300 XP
'
- +'
★ Финальная ачивка
'
+ +'
★ Финальная ачивка
'
+'
';
/* === Overall progress === */
@@ -2995,7 +2995,7 @@ function buildFinal1(){
/* === Celebration === */
html += ''
- +'
★
'
+ +'
★
'
+'
МАГИСТР ТРИГОНОМЕТРИИ!
'
+'
Ты победил всех 6 боссов главы 1 и освоил тригонометрию. Получено: +150 XP и финальная ачивка.
'
+'
Вернуться к Алгебре 10 '
@@ -3064,7 +3064,7 @@ function buildFinal1(){
const q=document.getElementById('bb-'+b.n+'-q');
const fb=document.getElementById('bb-'+b.n+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён';
+ stageEl.textContent='✓ Побеждён';
fill.style.width='100%';
q.innerHTML='
Босс повержен! ';
document.getElementById('bb-'+b.n+'-go').disabled=true;
diff --git a/frontend/textbooks/algebra_10_ch2.html b/frontend/textbooks/algebra_10_ch2.html
index 49c193c..8a34e09 100644
--- a/frontend/textbooks/algebra_10_ch2.html
+++ b/frontend/textbooks/algebra_10_ch2.html
@@ -218,7 +218,7 @@ a{color:inherit;text-decoration:none}
-
+
@@ -326,7 +326,7 @@ const PARAS = [
{ id:'p15', num:'§ 15', name:'Преобразования', sub:'вынесение, рационализация' },
{ id:'p16', num:'§ 16', name:'y = ⁿ√x', sub:'свойства и графики' },
{ id:'p17', num:'§ 17', name:'Иррац. уравнения', sub:'возведение в степень' },
- { id:'final2', num:'★', name:'Финал главы', sub:'4 босса', final:true },
+ { id:'final2', num:'★', name:'Финал главы', sub:'4 босса', final:true },
];
function buildParaSelector(){
@@ -431,7 +431,7 @@ function buildSidebar(id){
html+='';
if(STATE.achievements.size>0){
html+='Достижения ';
- [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
+ [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
html+='
';
}
box.innerHTML=html;
@@ -547,7 +547,7 @@ function makeBoss(paraId, bossDef){
const q=document.getElementById(idP+'-q');
const fb=document.getElementById(idP+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
+ stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
q.innerHTML='Босс повержен! ';
document.getElementById(idP+'-go').disabled=true;
document.getElementById(idP+'-go').style.opacity=.5;
@@ -1223,7 +1223,7 @@ function buildP17(){
Возводим в квадрат: $x + 3 = 25$.
$x = 22$.
- Проверка: $\\sqrt{22 + 3} = \\sqrt{25} = 5$ ✓.
+ Проверка: $\\sqrt{22 + 3} = \\sqrt{25} = 5$ ✓.
Уравнение с подвохом. $\\sqrt{x - 1} = x - 7$.
Возводим в квадрат: $x - 1 = (x - 7)^2 = x^2 - 14x + 49$.
@@ -1231,7 +1231,7 @@ function buildP17(){
Проверка:
$x = 5$: $\\sqrt{4} = 5 - 7 = -2$. Но $\\sqrt{4} = 2 \\ne -2$. Посторонний!
- $x = 10$: $\\sqrt{9} = 10 - 7 = 3$. ✓
+ $x = 10$: $\\sqrt{9} = 10 - 7 = 3$. ✓
Ответ: $x = 10$.
`);
@@ -1369,15 +1369,15 @@ function buildFinal2(){
/* === Hero card === */
html += ''
- +'
★
'
+ +'
★
'
+'
'
+'
ФИНАЛ ГЛАВЫ 2
'
+'
4 интегрированных босса '
+'
Каждый босс проверяет синтез знаний главы. Победи всех — получи ачивку «Магистр корней» и +100 XP.
'
+'
'
- +'
★ 4 босса
'
+ +'
★ 4 босса
'
+'
+ до 200 XP
'
- +'
★ Финальная ачивка
'
+ +'
★ Финальная ачивка
'
+'
';
/* === Overall progress === */
@@ -1394,7 +1394,7 @@ function buildFinal2(){
/* === Celebration === */
html += ''
- +'
★
'
+ +'
★
'
+'
МАГИСТР КОРНЕЙ!
'
+'
Ты победил всех 4 боссов главы 2 и освоил корни n-й степени. Получено: +100 XP и финальная ачивка.
'
+'
Вернуться к Алгебре 10 '
@@ -1455,7 +1455,7 @@ function buildFinal2(){
const q=document.getElementById('bb-'+b.n+'-q');
const fb=document.getElementById('bb-'+b.n+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён';
+ stageEl.textContent='✓ Побеждён';
fill.style.width='100%';
q.innerHTML='
Босс повержен! ';
document.getElementById('bb-'+b.n+'-go').disabled=true;
diff --git a/frontend/textbooks/algebra_10_ch3.html b/frontend/textbooks/algebra_10_ch3.html
index 9674e0d..dc65240 100644
--- a/frontend/textbooks/algebra_10_ch3.html
+++ b/frontend/textbooks/algebra_10_ch3.html
@@ -221,8 +221,8 @@ a{color:inherit;text-decoration:none}
-
-
+
+
@@ -252,7 +252,7 @@ const ACH_LABELS = {
p22_done:'Наиб./наим. значения — освоены!',
ch3_done:'Глава 3 — Производная пройдена!',
deriv_master:'Магистр производных! +150 XP',
- alg10_master:'★ Алгебра 10 пройдена полностью!',
+ alg10_master:'★ Алгебра 10 пройдена полностью!',
};
function loadProgress(){
@@ -331,7 +331,7 @@ const PARAS = [
{ id:'p20', num:'§ 20', name:'Касательная, монотонность', sub:'геом. смысл' },
{ id:'p21', num:'§ 21', name:'Исследование функций', sub:'экстремумы' },
{ id:'p22', num:'§ 22', name:'Наиб. и наим. значения', sub:'на отрезке' },
- { id:'final3', num:'★', name:'Финал главы', sub:'5 боссов', final:true },
+ { id:'final3', num:'★', name:'Финал главы', sub:'5 боссов', final:true },
];
function buildParaSelector(){
@@ -437,7 +437,7 @@ function buildSidebar(id){
html+='';
if(STATE.achievements.size>0){
html+='Достижения ';
- [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
+ [...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='
✓ '+text+'
'; });
html+='
';
}
box.innerHTML=html;
@@ -553,7 +553,7 @@ function makeBoss(paraId, bossDef){
const q=document.getElementById(idP+'-q');
const fb=document.getElementById(idP+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
+ stageEl.textContent='✓ Побеждён'; fill.style.width='100%';
q.innerHTML='Босс повержен! ';
document.getElementById(idP+'-go').disabled=true;
document.getElementById(idP+'-go').style.opacity=.5;
@@ -1379,15 +1379,15 @@ function buildFinal3(){
let html = '';
html += ''
- +'
★
'
+ +'
★
'
+'
'
+'
ФИНАЛ ГЛАВЫ 3
'
+'
5 интегрированных боссов '
+'
Каждый босс проверяет синтез знаний главы. Победи всех — получи ачивку «Магистр производных» и +150 XP. А если уже завершил Главы 1 и 2 — получишь финальную ачивку «Алгебра 10 пройдена!» .
'
+'
'
- +'
★ 5 боссов
'
+ +'
★ 5 боссов
'
+'
+ до 250 XP
'
- +'
★ Курсовая ачивка
'
+ +'
★ Курсовая ачивка
'
+'
';
html += ''
@@ -1402,10 +1402,10 @@ function buildFinal3(){
html += '
';
html += '
'
- +'
★
'
+ +'
★
'
+'
МАГИСТР ПРОИЗВОДНЫХ!
'
+'
Ты победил всех 5 боссов главы 3. Получено: +150 XP и ачивка «Магистр производных» .
'
- +'
✦ АЛГЕБРА 10 ПРОЙДЕНА ПОЛНОСТЬЮ! ✦
'
+ +'
✦ АЛГЕБРА 10 ПРОЙДЕНА ПОЛНОСТЬЮ! ✦
'
+'
Вернуться к Алгебре 10 '
+'
';
@@ -1476,7 +1476,7 @@ function buildFinal3(){
const q=document.getElementById('bb-'+b.n+'-q');
const fb=document.getElementById('bb-'+b.n+'-fb');
if(st.defeated){
- stageEl.textContent='✓ Побеждён';
+ stageEl.textContent='✓ Побеждён';
fill.style.width='100%';
q.innerHTML='
Босс повержен! ';
document.getElementById('bb-'+b.n+'-go').disabled=true;
diff --git a/frontend/textbooks/algebra_11_ch1.html b/frontend/textbooks/algebra_11_ch1.html
index fc8a740..eab389f 100644
--- a/frontend/textbooks/algebra_11_ch1.html
+++ b/frontend/textbooks/algebra_11_ch1.html
@@ -265,7 +265,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -294,7 +294,7 @@ const PARAS = [
{ id:'p1', num:'§ 1', name:'Степень с рациональным показателем', sub:'$a^{m/n} = \\sqrt[n]{a^m}$' },
{ id:'p2', num:'§ 2', name:'Степенная функция', sub:'$y = x^\\alpha$' },
{ id:'p3', num:'§ 3', name:'Определение логарифма', sub:'$\\log_a b = c$' },
- { id:'final1', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 1', final:true }
+ { id:'final1', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 1', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -1829,7 +1829,7 @@ function buildFinal1(){
if(BOSS_STATE[idx].defeated){
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow');
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
}
goBtn.addEventListener('click', ()=>{
@@ -1843,7 +1843,7 @@ function buildFinal1(){
feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint);
addXp(10, 'boss-ch1-'+b.n);
bumpProgress('final1', 18);
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow','pulse');
diff --git a/frontend/textbooks/algebra_11_ch2.html b/frontend/textbooks/algebra_11_ch2.html
index 9d84125..2c0a14d 100644
--- a/frontend/textbooks/algebra_11_ch2.html
+++ b/frontend/textbooks/algebra_11_ch2.html
@@ -245,7 +245,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -274,7 +274,7 @@ const PARAS = [
{ id:'p4', num:'§ 4', name:'Показательная функция', sub:'$y = a^x$' },
{ id:'p5', num:'§ 5', name:'Показательные уравнения', sub:'$a^{f(x)} = a^{g(x)}$' },
{ id:'p6', num:'§ 6', name:'Показательные неравенства', sub:'$a^x > b$' },
- { id:'final2', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 2', final:true }
+ { id:'final2', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 2', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -2122,7 +2122,7 @@ function buildFinal2(){
if(BOSS_STATE[idx].defeated){
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow');
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
}
goBtn.addEventListener('click', ()=>{
@@ -2136,7 +2136,7 @@ function buildFinal2(){
feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint);
addXp(10, 'boss-ch2-'+b.n);
bumpProgress('final2', 18);
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow','pulse');
diff --git a/frontend/textbooks/algebra_11_ch3.html b/frontend/textbooks/algebra_11_ch3.html
index 968e526..b4e6f20 100644
--- a/frontend/textbooks/algebra_11_ch3.html
+++ b/frontend/textbooks/algebra_11_ch3.html
@@ -267,7 +267,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -297,7 +297,7 @@ const PARAS = [
{ id:'p8', num:'§ 8', name:'Логарифмическая функция', sub:'$y = \\log_a x$' },
{ id:'p9', num:'§ 9', name:'Логарифмические уравнения', sub:'$\\log_a f = \\log_a g$' },
{ id:'p10', num:'§ 10', name:'Логарифмические неравенства', sub:'$\\log_a f > b$' },
- { id:'final3', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 3', final:true }
+ { id:'final3', num:'★', name:'Финал главы', sub:'Итоги · боссы главы 3', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -2682,7 +2682,7 @@ function buildFinal3(){
if(BOSS_STATE[idx].defeated){
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow');
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
}
goBtn.addEventListener('click', ()=>{
@@ -2696,7 +2696,7 @@ function buildFinal3(){
feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint);
addXp(10, 'boss-ch3-'+b.n);
bumpProgress('final3', 18);
- goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow','pulse');
diff --git a/frontend/textbooks/algebra_11_hub.html b/frontend/textbooks/algebra_11_hub.html
index 6025c6a..97fd9b2 100644
--- a/frontend/textbooks/algebra_11_hub.html
+++ b/frontend/textbooks/algebra_11_hub.html
@@ -534,7 +534,7 @@ var FIN_BOSSES = [
title: 'Графический синтез',
tag: 'Гл. 2 + Гл. 3',
q: 'Сколько решений имеет уравнение $2^x = 6 - x$?',
- hint: '$y = 2^x$ возрастает, $y = 6 - x$ убывает. При $x = 2$: $4 = 4$ ✓. Пересечение возр. и убыв. графиков.',
+ hint: '$y = 2^x$ возрастает, $y = 6 - x$ убывает. При $x = 2$: $4 = 4$ ✓. Пересечение возр. и убыв. графиков.',
ans: 1,
step: '1'
},
diff --git a/frontend/textbooks/geometry_10_r2.html b/frontend/textbooks/geometry_10_r2.html
index 1c1824e..c791818 100644
--- a/frontend/textbooks/geometry_10_r2.html
+++ b/frontend/textbooks/geometry_10_r2.html
@@ -239,7 +239,7 @@ const PARAS = [
{ id:'p1', num:'§ 4', name:'Расположение прямых', sub:'Пересек. · парал. · скрещ.' },
{ id:'p2', num:'§ 5', name:'Прямая и плоскость', sub:'3 случая · признак $a \\parallel \\alpha$' },
{ id:'p3', num:'§ 6', name:'Две плоскости', sub:'Признак $\\alpha \\parallel \\beta$' },
- { id:'final', num:'★', name:'Финал раздела', sub:'4 интегрированных босса', final:true }
+ { id:'final', num:'★', name:'Финал раздела', sub:'4 интегрированных босса', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
diff --git a/frontend/textbooks/geometry_10_r3.html b/frontend/textbooks/geometry_10_r3.html
index 0bf42aa..e62695a 100644
--- a/frontend/textbooks/geometry_10_r3.html
+++ b/frontend/textbooks/geometry_10_r3.html
@@ -241,7 +241,7 @@ const PARAS = [
{ id:'p2', num:'§ 8', name:'Расстояния', sub:'Точка → плоскость, скрещ.' },
{ id:'p3', num:'§ 9', name:'Угол + ТТП', sub:'Наклонная, проекция, ТТП' },
{ id:'p4', num:'§ 10', name:'⊥-плоскости', sub:'Двугранный угол, признак' },
- { id:'final', num:'★', name:'Финал раздела', sub:'5 интегр. боссов', final:true }
+ { id:'final', num:'★', name:'Финал раздела', sub:'5 интегр. боссов', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
diff --git a/frontend/textbooks/geometry_10_r4.html b/frontend/textbooks/geometry_10_r4.html
index e0f08b2..863daf2 100644
--- a/frontend/textbooks/geometry_10_r4.html
+++ b/frontend/textbooks/geometry_10_r4.html
@@ -244,7 +244,7 @@ const PARAS = [
{ id:'p2', num:'§ 12', name:'Векторы', sub:'$\\vec{a}+\\vec{b}, k\\vec{a}$, базис' },
{ id:'p3', num:'§ 13', name:'Скаляр. произв.', sub:'$\\vec{a}\\cdot\\vec{b} = x_1x_2+y_1y_2+z_1z_2$' },
{ id:'p4', num:'§ 14', name:'Применение метода', sub:'Куб в координатах · углы' },
- { id:'final', num:'★', name:'Финал курса', sub:'Мега-ачивка stereo10_master', final:true }
+ { id:'final', num:'★', name:'Финал курса', sub:'Мега-ачивка stereo10_master', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -258,7 +258,7 @@ const ACH_LABELS = {
p4_done:'§14 — применение метода освоено',
start:'Начало раздела 4!',
r4_done:'Раздел 4 пройден!',
- master:'★ Геометрия 10 пройдена!'
+ master:'★ Геометрия 10 пройдена!'
};
function loadProgress(){
@@ -775,7 +775,7 @@ function buildP4(){
function buildFinal(){
const box = document.getElementById('final-body'); if(!box) return;
let html = '';
- html += 'Финал курса · 4 интегрированных босса Победи 4 финальных босса (координаты, векторы, скаляр., сборная). После — ачивка stereo10_r4_master + 120 XP.
★ Если все 4 ачивки разделов получены — выдаётся МЕГА-АЧИВКА stereo10_master + 200 XP супер-бонус.
';
+ html += 'Финал курса · 4 интегрированных босса Победи 4 финальных босса (координаты, векторы, скаляр., сборная). После — ачивка stereo10_r4_master + 120 XP.
★ Если все 4 ачивки разделов получены — выдаётся МЕГА-АЧИВКА stereo10_master + 200 XP супер-бонус.
';
html += '
';
html += '
';
@@ -819,10 +819,10 @@ function checkFinalComplete(){
ach.push('stereo10_master');
localStorage.setItem('geometry10_achievements', JSON.stringify(ach));
addXp(200, 'master');
- achievement('master', '★ Геометрия 10 пройдена!');
- megaHtml = '★★★ ГЕОМЕТРИЯ 10 ПРОЙДЕНА! ★★★
Все 4 раздела освоены. Стереометрия — твоя сила. Главная ачивка курса stereo10_master + 200 XP мега-бонус.
';
+ achievement('master', '★ Геометрия 10 пройдена!');
+ megaHtml = '★★★ ГЕОМЕТРИЯ 10 ПРОЙДЕНА! ★★★
Все 4 раздела освоены. Стереометрия — твоя сила. Главная ачивка курса stereo10_master + 200 XP мега-бонус.
';
} else if(hasAll){
- megaHtml = '★ Главная ачивка stereo10_master уже получена. Геометрия 10 пройдена!
';
+ megaHtml = '★ Главная ачивка stereo10_master уже получена. Геометрия 10 пройдена!
';
} else {
const missing = [];
if(ach.indexOf('stereo10_r1_master')<0) missing.push('R1');
diff --git a/frontend/textbooks/geometry_11_ch1.html b/frontend/textbooks/geometry_11_ch1.html
index 4b61063..8141120 100644
--- a/frontend/textbooks/geometry_11_ch1.html
+++ b/frontend/textbooks/geometry_11_ch1.html
@@ -267,7 +267,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -295,7 +295,7 @@ const _TB_SLUG = 'geometry-11-ch1';
const PARAS = [
{ id:'p1', num:'§ 1', name:"Призма", sub:'$S_{бок}=Pl$, $V=S_{осн}h$' },
{ id:'p2', num:'§ 2', name:"Цилиндр", sub:'$S_{бок}=2\\pi Rh$, $V=\\pi R^2h$' },
- { id:'final1', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 1', final:true }
+ { id:'final1', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 1', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
diff --git a/frontend/textbooks/geometry_11_ch2.html b/frontend/textbooks/geometry_11_ch2.html
index 170321f..697473b 100644
--- a/frontend/textbooks/geometry_11_ch2.html
+++ b/frontend/textbooks/geometry_11_ch2.html
@@ -267,7 +267,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -295,7 +295,7 @@ const _TB_SLUG = 'geometry-11-ch2';
const PARAS = [
{ id:'p3', num:'§ 3', name:"Пирамида", sub:'$V=\\frac{1}{3}S_{осн}h$' },
{ id:'p4', num:'§ 4', name:"Конус", sub:'$S_{бок}=\\pi Rl$' },
- { id:'final2', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 2', final:true }
+ { id:'final2', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 2', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
diff --git a/frontend/textbooks/geometry_11_ch3.html b/frontend/textbooks/geometry_11_ch3.html
index f82714a..c9b7071 100644
--- a/frontend/textbooks/geometry_11_ch3.html
+++ b/frontend/textbooks/geometry_11_ch3.html
@@ -269,7 +269,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -298,7 +298,7 @@ const PARAS = [
{ id:'p5', num:'§ 5', name:"Сфера", sub:'$(x-a)^2+(y-b)^2+(z-c)^2=R^2$' },
{ id:'p6', num:'§ 6', name:"Шар", sub:'$S=4\\pi R^2$, $V=\\frac{4}{3}\\pi R^3$' },
{ id:'p7', num:'§ 7', name:"Правильные многогранники", sub:'5 платоновых тел' },
- { id:'final3', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 3', final:true }
+ { id:'final3', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 3', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -1724,11 +1724,11 @@ function buildP7(){
+ 'где $V$ — число вершин, $E$ — рёбер, $F$ — граней.
'
+ 'Проверка для платоновых тел:
'
+ ''
- + 'Тетраэдр: $4 - 6 + 4 = 2$ ✓ '
- + 'Куб: $8 - 12 + 6 = 2$ ✓ '
- + 'Октаэдр: $6 - 12 + 8 = 2$ ✓ '
- + 'Додекаэдр: $20 - 30 + 12 = 2$ ✓ '
- + 'Икосаэдр: $12 - 30 + 20 = 2$ ✓ '
+ + 'Тетраэдр: $4 - 6 + 4 = 2$ ✓ '
+ + 'Куб: $8 - 12 + 6 = 2$ ✓ '
+ + 'Октаэдр: $6 - 12 + 8 = 2$ ✓ '
+ + 'Додекаэдр: $20 - 30 + 12 = 2$ ✓ '
+ + 'Икосаэдр: $12 - 30 + 20 = 2$ ✓ '
+ ' '
+ 'Двойственные пары.
'
+ 'Если в исходном теле соединить центры соседних граней — получится двойственный многогранник. Числа $F$ и $V$ у двойственной пары меняются местами, число рёбер $E$ сохраняется.
'
diff --git a/frontend/textbooks/geometry_11_ch4.html b/frontend/textbooks/geometry_11_ch4.html
index b8bfc61..51b0a03 100644
--- a/frontend/textbooks/geometry_11_ch4.html
+++ b/frontend/textbooks/geometry_11_ch4.html
@@ -271,7 +271,7 @@ input[type=range]:active{box-shadow:0 0 0 4px var(--pri-soft);border-radius:8px}
-
+
@@ -301,7 +301,7 @@ const PARAS = [
{ id:'p9', num:'§ 9', name:"Геометрические величины", sub:'площади, объёмы' },
{ id:'p10', num:'§ 10', name:"Координаты и векторы", sub:'3D: $\\vec{a}=(x;y;z)$' },
{ id:'p11', num:'§ 11', name:"Геометрические построения", sub:'циркуль и линейка' },
- { id:'final4', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 4', final:true }
+ { id:'final4', num:'★', name:"Финал раздела", sub:'Итоги · боссы раздела 4', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });