diff --git a/frontend/textbooks/physics_7_ch1.html b/frontend/textbooks/physics_7_ch1.html
index c2f7bab..9a606df 100644
--- a/frontend/textbooks/physics_7_ch1.html
+++ b/frontend/textbooks/physics_7_ch1.html
@@ -184,8 +184,8 @@ const PARAS = [{id:'p1',num:'§ 1',title:"Физика — наука о при
const TOTAL_PARAS = PARAS.length;
const SIDEBARS = {};
-PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [['В разработке','контент появится с волной соответствующего §']] }; });
-const TIPS = [{ sec: PARAS[0].id, html: 'Скелет главы готов. Контент параграфов выйдет в одной из ближайших фаз.' }];
+PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [] }; });
+const TIPS = [];
const ACH_LABELS = { start: 'Начало главы 1', ch_done: 'Юный физик' };
const STATE = { current: null, progress: {}, xp: 0, level: 1, achievements: new Map(), _built: new Set() };
@@ -292,9 +292,11 @@ function buildSidebar(id){
const xpPct = xpRange > 0 ? Math.round(xpInLv / xpRange * 100) : 100;
let html = '';
html += '
XP-прогрессУр. ' + STATE.level + '
' + STATE.xp + ' XP' + xpNext + ' XP
';
- html += '' + sb.title + '
';
- sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
- html += '
';
+ if(sb && sb.rows && sb.rows.length){
+ html += '' + sb.title + '
';
+ sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
+ html += '
';
+ }
const tip = TIPS.find(t => t.sec === id) || TIPS[0];
if(tip){
html += 'Подсказка
' + tip.html + '
';
diff --git a/frontend/textbooks/physics_7_ch2.html b/frontend/textbooks/physics_7_ch2.html
index 76bcd56..c2ab7da 100644
--- a/frontend/textbooks/physics_7_ch2.html
+++ b/frontend/textbooks/physics_7_ch2.html
@@ -180,8 +180,8 @@ const PARAS = [{id:'p8',num:'§ 8',title:"Дискретное строение
const TOTAL_PARAS = PARAS.length;
const SIDEBARS = {};
-PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [['В разработке','контент появится с волной соответствующего §']] }; });
-const TIPS = [{ sec: PARAS[0].id, html: 'Скелет главы готов. Контент параграфов выйдет в одной из ближайших фаз.' }];
+PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [] }; });
+const TIPS = [];
const ACH_LABELS = { start: 'Начало главы 2', ch_done: 'Знаток вещества' };
const STATE = { current: null, progress: {}, xp: 0, level: 1, achievements: new Map(), _built: new Set() };
@@ -288,9 +288,11 @@ function buildSidebar(id){
const xpPct = xpRange > 0 ? Math.round(xpInLv / xpRange * 100) : 100;
let html = '';
html += 'XP-прогрессУр. ' + STATE.level + '
' + STATE.xp + ' XP' + xpNext + ' XP
';
- html += '' + sb.title + '
';
- sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
- html += '
';
+ if(sb && sb.rows && sb.rows.length){
+ html += '' + sb.title + '
';
+ sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
+ html += '
';
+ }
const tip = TIPS.find(t => t.sec === id) || TIPS[0];
if(tip){
html += 'Подсказка
' + tip.html + '
';
diff --git a/frontend/textbooks/physics_7_ch3.html b/frontend/textbooks/physics_7_ch3.html
index b7709d1..2a5c52a 100644
--- a/frontend/textbooks/physics_7_ch3.html
+++ b/frontend/textbooks/physics_7_ch3.html
@@ -212,8 +212,8 @@ const PARAS = [{id:'p14',num:'§ 14',title:"Механическое движе
const TOTAL_PARAS = PARAS.length;
const SIDEBARS = {};
-PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [['В разработке','контент появится с волной соответствующего §']] }; });
-const TIPS = [{ sec: PARAS[0].id, html: 'Скелет главы готов. Контент параграфов выйдет в одной из ближайших фаз.' }];
+PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [] }; });
+const TIPS = [];
const ACH_LABELS = { start: 'Начало главы 3', ch_done: 'Мастер движения' };
const STATE = { current: null, progress: {}, xp: 0, level: 1, achievements: new Map(), _built: new Set() };
@@ -320,9 +320,11 @@ function buildSidebar(id){
const xpPct = xpRange > 0 ? Math.round(xpInLv / xpRange * 100) : 100;
let html = '';
html += 'XP-прогрессУр. ' + STATE.level + '
' + STATE.xp + ' XP' + xpNext + ' XP
';
- html += '' + sb.title + '
';
- sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
- html += '
';
+ if(sb && sb.rows && sb.rows.length){
+ html += '' + sb.title + '
';
+ sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
+ html += '
';
+ }
const tip = TIPS.find(t => t.sec === id) || TIPS[0];
if(tip){
html += 'Подсказка
' + tip.html + '
';
diff --git a/frontend/textbooks/physics_7_ch4.html b/frontend/textbooks/physics_7_ch4.html
index 0aa0494..8249872 100644
--- a/frontend/textbooks/physics_7_ch4.html
+++ b/frontend/textbooks/physics_7_ch4.html
@@ -188,8 +188,8 @@ const PARAS = [{id:'p28',num:'§ 28',title:"Давление. Единицы д
const TOTAL_PARAS = PARAS.length;
const SIDEBARS = {};
-PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [['В разработке','контент появится с волной соответствующего §']] }; });
-const TIPS = [{ sec: PARAS[0].id, html: 'Скелет главы готов. Контент параграфов выйдет в одной из ближайших фаз.' }];
+PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [] }; });
+const TIPS = [];
const ACH_LABELS = { start: 'Начало главы 4', ch_done: 'Властелин давления' };
const STATE = { current: null, progress: {}, xp: 0, level: 1, achievements: new Map(), _built: new Set() };
@@ -296,9 +296,11 @@ function buildSidebar(id){
const xpPct = xpRange > 0 ? Math.round(xpInLv / xpRange * 100) : 100;
let html = '';
html += 'XP-прогрессУр. ' + STATE.level + '
' + STATE.xp + ' XP' + xpNext + ' XP
';
- html += '' + sb.title + '
';
- sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
- html += '
';
+ if(sb && sb.rows && sb.rows.length){
+ html += '' + sb.title + '
';
+ sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
+ html += '
';
+ }
const tip = TIPS.find(t => t.sec === id) || TIPS[0];
if(tip){
html += 'Подсказка
' + tip.html + '
';
diff --git a/frontend/textbooks/physics_7_ch5.html b/frontend/textbooks/physics_7_ch5.html
index d6234cd..b7f88f4 100644
--- a/frontend/textbooks/physics_7_ch5.html
+++ b/frontend/textbooks/physics_7_ch5.html
@@ -184,8 +184,8 @@ const PARAS = [{id:'p36',num:'§ 36',title:"Механическая работ
const TOTAL_PARAS = PARAS.length;
const SIDEBARS = {};
-PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [['В разработке','контент появится с волной соответствующего §']] }; });
-const TIPS = [{ sec: PARAS[0].id, html: 'Скелет главы готов. Контент параграфов выйдет в одной из ближайших фаз.' }];
+PARAS.forEach(p => { SIDEBARS[p.id] = { title: 'Шпаргалка ' + p.num, rows: [] }; });
+const TIPS = [];
const ACH_LABELS = { start: 'Начало главы 5', ch_done: 'Энергетик' };
const STATE = { current: null, progress: {}, xp: 0, level: 1, achievements: new Map(), _built: new Set() };
@@ -292,9 +292,11 @@ function buildSidebar(id){
const xpPct = xpRange > 0 ? Math.round(xpInLv / xpRange * 100) : 100;
let html = '';
html += 'XP-прогрессУр. ' + STATE.level + '
' + STATE.xp + ' XP' + xpNext + ' XP
';
- html += '' + sb.title + '
';
- sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
- html += '
';
+ if(sb && sb.rows && sb.rows.length){
+ html += '' + sb.title + '
';
+ sb.rows.forEach(([k,v]) => { html += '
' + k + '' + (v ? ' — ' + v : '') + '
'; });
+ html += '
';
+ }
const tip = TIPS.find(t => t.sec === id) || TIPS[0];
if(tip){
html += 'Подсказка
' + tip.html + '
';