From 5ecae8a078c74415442491ba4d3abf98f2803017 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 28 May 2026 15:58:50 +0300 Subject: [PATCH] =?UTF-8?q?fix(geom8):=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20=E2=80=94=20feedback=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Баг: у элементов .feedback стоит inline style='display:none' и CSS-класс .feedback с display:none. Класс .feedback.ok должен переключать на display:block, но inline-стиль имеет ВЫСШУЮ специфичность и перекрывает классовый display:block. В итоге onclick-обработчики работали корректно (вызывали feedback()), но сообщение оставалось скрытым из-за inline display:none. Симптом: 'нажимаешь Проверить — ничего не происходит' в боссах, DnD, тренажёрах, квизах — везде где есть .feedback элемент. Фикс: функция feedback() теперь явно сбрасывает elm.style.display='block' после установки класса. Добавлен null-check на elm. Затронуто 3 файла (ch1, ch2, ch3). Все feedback-элементы во всех параграфах теперь показываются после клика по Проверить. Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/textbooks/geometry_8_ch1.html | 2 +- frontend/textbooks/geometry_8_ch2.html | 2 +- frontend/textbooks/geometry_8_ch3.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/textbooks/geometry_8_ch1.html b/frontend/textbooks/geometry_8_ch1.html index f5b1e23..a86be4a 100644 --- a/frontend/textbooks/geometry_8_ch1.html +++ b/frontend/textbooks/geometry_8_ch1.html @@ -592,7 +592,7 @@ function renderMath(root){ try{ renderMathInElement(root, {delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false}); }catch(e){} } } -function feedback(elm, ok, text){ elm.className = 'feedback ' + (ok ? 'ok' : 'fail'); elm.innerHTML = text || (ok ? '✓ Верно!' : '✗ Неверно'); } +function feedback(elm, ok, text){ if(!elm)return; elm.className = 'feedback ' + (ok ? 'ok' : 'fail'); elm.innerHTML = text || (ok ? '✓ Верно!' : '✗ Неверно'); elm.style.display='block'; } function fmt(n){ if(!isFinite(n)) return '?'; if(Number.isInteger(n)) return String(n); return Math.abs(n - Math.round(n)) < 1e-9 ? String(Math.round(n)) : (+n.toFixed(4)).toString(); } const ICONS = { diff --git a/frontend/textbooks/geometry_8_ch2.html b/frontend/textbooks/geometry_8_ch2.html index 2bd9393..16f1be5 100644 --- a/frontend/textbooks/geometry_8_ch2.html +++ b/frontend/textbooks/geometry_8_ch2.html @@ -442,7 +442,7 @@ function buildSidebar(id){ function initTheme(){ const t=localStorage.getItem('geometry8_ch2_theme')||'light'; if(t==='dark') document.documentElement.classList.add('dark'); document.getElementById('theme-lab').textContent=t==='dark'?'Светлая':'Тёмная'; document.getElementById('theme-btn').addEventListener('click',()=>{ document.documentElement.classList.toggle('dark'); const dark=document.documentElement.classList.contains('dark'); localStorage.setItem('geometry8_ch2_theme',dark?'dark':'light'); document.getElementById('theme-lab').textContent=dark?'Светлая':'Тёмная'; }); } function renderMath(root){ if(window.renderMathInElement){ try{renderMathInElement(root,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false});}catch(e){} } } -function feedback(elm,ok,text){ elm.className='feedback '+(ok?'ok':'fail');elm.innerHTML=text||(ok?'✓ Верно!':'✗ Неверно'); } +function feedback(elm,ok,text){ if(!elm)return; elm.className='feedback '+(ok?'ok':'fail');elm.innerHTML=text||(ok?'✓ Верно!':'✗ Неверно'); elm.style.display='block'; } function fmt(n){ if(!isFinite(n))return '?';if(Number.isInteger(n))return String(n);return Math.abs(n-Math.round(n))<1e-9?String(Math.round(n)):(+n.toFixed(4)).toString(); } const ICONS={repeat:'',theory:'',algo:'',rule:'',example:'',oral:'',class:'',home:''}; function makeCard(kind,title,num,body){ const labels={repeat:'Повторение',theory:'Теория',algo:'Алгоритм',rule:'Правило',example:'Пример',oral:'Устно',class:'Класс',home:'Домашка'}; return `
${ICONS[kind]}
${labels[kind]||''}${title&&title!==labels[kind]?' \xb7 '+title:''}
${num?`
${num}
`:''}
${body}
`; } diff --git a/frontend/textbooks/geometry_8_ch3.html b/frontend/textbooks/geometry_8_ch3.html index c1e3d35..efa6160 100644 --- a/frontend/textbooks/geometry_8_ch3.html +++ b/frontend/textbooks/geometry_8_ch3.html @@ -372,7 +372,7 @@ function buildSidebar(id){const box=document.getElementById('sidebar-content');c function initTheme(){const t=localStorage.getItem('geometry8_ch3_theme')||'light';if(t==='dark')document.documentElement.classList.add('dark');document.getElementById('theme-lab').textContent=t==='dark'?'Светлая':'Тёмная';document.getElementById('theme-btn').addEventListener('click',()=>{document.documentElement.classList.toggle('dark');const dark=document.documentElement.classList.contains('dark');localStorage.setItem('geometry8_ch3_theme',dark?'dark':'light');document.getElementById('theme-lab').textContent=dark?'Светлая':'Тёмная';});} function renderMath(root){if(window.renderMathInElement){try{renderMathInElement(root,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false});}catch(e){}}} -function feedback(elm,ok,text){elm.className='feedback '+(ok?'ok':'fail');elm.innerHTML=text||(ok?'✓ Верно!':'✗ Неверно');} +function feedback(elm,ok,text){if(!elm)return;elm.className='feedback '+(ok?'ok':'fail');elm.innerHTML=text||(ok?'✓ Верно!':'✗ Неверно');elm.style.display='block';} function fmt(n){if(!isFinite(n))return '?';if(Number.isInteger(n))return String(n);return Math.abs(n-Math.round(n))<1e-9?String(Math.round(n)):(+n.toFixed(4)).toString();} const ICONS={repeat:'',theory:'',algo:'',rule:'',example:'',oral:'',class:'',home:''}; function makeCard(kind,title,num,body){const labels={repeat:'Повторение',theory:'Теория',algo:'Алгоритм',rule:'Правило',example:'Пример',oral:'Устно',class:'Класс',home:'Домашка'};return `
${ICONS[kind]}
${labels[kind]||''}${title&&title!==labels[kind]?' \xb7 '+title:''}
${num?`
${num}
`:''}
${body}
`;}