feat(trainer): контент по программе учебников + геометрия + фильтр предмета
- классы тем выровнены по нашим учебникам (степени/формулы/упрощение/неравенства=7, пропорции/проценты=6, квадратные=8, прогрессии=9) - Прогрессии (9 кл): n-й член арифм./геом. прогрессии (compute) - ГЕОМЕТРИЯ (subject geometry): Углы (сумма углов треугольника, смежные, внешний — 7 кл), Пифагор (гипотенуза/катет через тройки — 8 кл), Площади (прямоугольник/треугольник/квадрат — 8 кл) - 36 генераторов, 12 тем; всё kind compute (числовой ответ, проверка подстановкой, sqrt в SimExpr) - страница: фильтр предмета Алгебра/Геометрия (segmented), синхрон с adaptive/ручным выбором; иерархия Предмет → Тема → Навык - смоук движка 572/572, страница 33/33; эмодзи/eval 0 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -20,15 +20,20 @@
|
|||||||
════════════════════════════════════════════════════════════════════════ */
|
════════════════════════════════════════════════════════════════════════ */
|
||||||
(function (global) {
|
(function (global) {
|
||||||
|
|
||||||
|
// Классы по программе наших учебников (Алгебра/Геометрия 7–9).
|
||||||
var TOPICS = [
|
var TOPICS = [
|
||||||
{ key: 'linear-eq', label: 'Уравнения', subject: 'algebra', grade: 7, order: 1 },
|
{ key: 'linear-eq', label: 'Уравнения', subject: 'algebra', grade: 7, order: 1 },
|
||||||
{ key: 'proportions', label: 'Пропорции', subject: 'algebra', grade: 7, order: 2 },
|
{ key: 'proportions', label: 'Пропорции', subject: 'algebra', grade: 6, order: 2 },
|
||||||
{ key: 'percents', label: 'Проценты', subject: 'algebra', grade: 7, order: 3 },
|
{ key: 'percents', label: 'Проценты', subject: 'algebra', grade: 6, order: 3 },
|
||||||
{ key: 'simplify', label: 'Упрощение', subject: 'algebra', grade: 7, order: 4 },
|
{ key: 'simplify', label: 'Упрощение', subject: 'algebra', grade: 7, order: 4 },
|
||||||
{ key: 'quadratic', label: 'Квадратные', subject: 'algebra', grade: 8, order: 5 },
|
{ key: 'powers', label: 'Степени', subject: 'algebra', grade: 7, order: 5 },
|
||||||
{ key: 'powers', label: 'Степени', subject: 'algebra', grade: 8, order: 6 },
|
{ key: 'formulas', label: 'Формулы', subject: 'algebra', grade: 7, order: 6 },
|
||||||
{ key: 'formulas', label: 'Формулы', subject: 'algebra', grade: 8, order: 7 },
|
{ key: 'inequalities', label: 'Неравенства', subject: 'algebra', grade: 7, order: 7 },
|
||||||
{ key: 'inequalities', label: 'Неравенства', subject: 'algebra', grade: 8, order: 8 }
|
{ key: 'quadratic', label: 'Квадратные', subject: 'algebra', grade: 8, order: 8 },
|
||||||
|
{ key: 'progressions', label: 'Прогрессии', subject: 'algebra', grade: 9, order: 9 },
|
||||||
|
{ key: 'g-angles', label: 'Углы', subject: 'geometry', grade: 7, order: 10 },
|
||||||
|
{ key: 'g-pyth', label: 'Пифагор', subject: 'geometry', grade: 8, order: 11 },
|
||||||
|
{ key: 'g-area', label: 'Площади', subject: 'geometry', grade: 8, order: 12 }
|
||||||
];
|
];
|
||||||
|
|
||||||
var GENERATORS = [
|
var GENERATORS = [
|
||||||
@@ -442,6 +447,149 @@
|
|||||||
{ note: 'Переносим {b} вправо:', tex: '-{a}x < {cmb}' },
|
{ note: 'Переносим {b} вправо:', tex: '-{a}x < {cmb}' },
|
||||||
{ note: 'Делим на отрицательное число (−{a}) — знак неравенства МЕНЯЕТСЯ на противоположный:', tex: 'x > {root}' }
|
{ note: 'Делим на отрицательное число (−{a}) — знак неравенства МЕНЯЕТСЯ на противоположный:', tex: 'x > {root}' }
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ═══ Тема: Прогрессии (9 класс) ═══ */
|
||||||
|
|
||||||
|
/* n-й член арифметической прогрессии */
|
||||||
|
{
|
||||||
|
id: 'prog-arith-term', topic: 'progressions', order: 1, subject: 'algebra', grade: 9, kind: 'compute',
|
||||||
|
title: 'n-й член арифм. прогрессии',
|
||||||
|
pick: { a: [-10, 20], d: [-8, 8], n: [3, 12] }, require: 'd != 0',
|
||||||
|
derive: { val: 'a + (n - 1)*d' },
|
||||||
|
lhs: 'x', rhs: '{a} + ({n} - 1)*{d}', display: 'Арифметическая прогрессия: a₁ = {a}, d = {d}. Найдите {n}-й член.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Формула n-го члена арифметической прогрессии: aₙ = a₁ + (n − 1)·d. Подставляем:', tex: 'x = {a} + ({n} - 1)*{d}' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* n-й член геометрической прогрессии */
|
||||||
|
{
|
||||||
|
id: 'prog-geom-term', topic: 'progressions', order: 2, subject: 'algebra', grade: 9, kind: 'compute',
|
||||||
|
title: 'n-й член геом. прогрессии',
|
||||||
|
pick: { b: [1, 5], q: [2, 3], n: [2, 4] },
|
||||||
|
derive: { val: 'b * q^(n - 1)' },
|
||||||
|
lhs: 'x', rhs: '{b} * {q}^({n} - 1)', display: 'Геометрическая прогрессия: b₁ = {b}, q = {q}. Найдите {n}-й член.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Формула n-го члена геометрической прогрессии: bₙ = b₁·q^(n−1). Подставляем:', tex: 'x = {b} * {q}^({n} - 1)' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ═══ Тема: Углы (геометрия, 7 класс) ═══ */
|
||||||
|
|
||||||
|
/* третий угол треугольника */
|
||||||
|
{
|
||||||
|
id: 'ang-triangle', topic: 'g-angles', order: 1, subject: 'geometry', grade: 7, kind: 'compute',
|
||||||
|
title: 'Третий угол треугольника',
|
||||||
|
pick: { a: [20, 80], b: [20, 80] }, derive: { val: '180 - a - b' }, require: 'val >= 15 && val <= 150',
|
||||||
|
lhs: 'x', rhs: '180 - {a} - {b}', display: 'В треугольнике два угла равны {a}° и {b}°. Найдите третий угол (в градусах).',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Сумма углов треугольника равна 180°. Значит третий угол:', tex: 'x = 180 - {a} - {b}' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* смежный угол */
|
||||||
|
{
|
||||||
|
id: 'ang-adjacent', topic: 'g-angles', order: 2, subject: 'geometry', grade: 7, kind: 'compute',
|
||||||
|
title: 'Смежный угол',
|
||||||
|
pick: { a: [25, 155] }, derive: { val: '180 - a' },
|
||||||
|
lhs: 'x', rhs: '180 - {a}', display: 'Один из смежных углов равен {a}°. Найдите другой смежный с ним угол.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Сумма смежных углов равна 180°. Значит:', tex: 'x = 180 - {a}' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* внешний угол треугольника */
|
||||||
|
{
|
||||||
|
id: 'ang-exterior', topic: 'g-angles', order: 3, subject: 'geometry', grade: 7, kind: 'compute',
|
||||||
|
title: 'Внешний угол треугольника',
|
||||||
|
pick: { a: [20, 80], b: [20, 80] }, derive: { val: 'a + b' }, require: 'val <= 160',
|
||||||
|
lhs: 'x', rhs: '{a} + {b}', display: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов. Эти углы равны {a}° и {b}°. Найдите внешний угол.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов:', tex: 'x = {a} + {b}' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ═══ Тема: Теорема Пифагора (геометрия, 8 класс) ═══ */
|
||||||
|
|
||||||
|
/* гипотенуза по катетам (пифагорова тройка m,n) */
|
||||||
|
{
|
||||||
|
id: 'pyth-hyp', topic: 'g-pyth', order: 1, subject: 'geometry', grade: 8, kind: 'compute',
|
||||||
|
title: 'Гипотенуза (Пифагор)',
|
||||||
|
pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n',
|
||||||
|
derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' },
|
||||||
|
lhs: 'x', rhs: 'sqrt({a}^2 + {b}^2)', display: 'Катеты прямоугольного треугольника равны {a} и {b}. Найдите гипотенузу.',
|
||||||
|
answerVar: 'x', answer: 'c', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'По теореме Пифагора c² = a² + b², значит c = √(a² + b²):', tex: 'x = sqrt({a}^2 + {b}^2)' },
|
||||||
|
{ note: 'Считаем (выходит целое — это пифагорова тройка):', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* катет по гипотенузе и катету */
|
||||||
|
{
|
||||||
|
id: 'pyth-leg', topic: 'g-pyth', order: 2, subject: 'geometry', grade: 8, kind: 'compute',
|
||||||
|
title: 'Катет (Пифагор)',
|
||||||
|
pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n',
|
||||||
|
derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' },
|
||||||
|
lhs: 'x', rhs: 'sqrt({c}^2 - {a}^2)', display: 'Гипотенуза прямоугольного треугольника {c}, один катет {a}. Найдите второй катет.',
|
||||||
|
answerVar: 'x', answer: 'b', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'По теореме Пифагора b² = c² − a², значит b = √(c² − a²):', tex: 'x = sqrt({c}^2 - {a}^2)' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ═══ Тема: Площади (геометрия, 8 класс) ═══ */
|
||||||
|
|
||||||
|
/* площадь прямоугольника */
|
||||||
|
{
|
||||||
|
id: 'area-rect', topic: 'g-area', order: 1, subject: 'geometry', grade: 8, kind: 'compute',
|
||||||
|
title: 'Площадь прямоугольника',
|
||||||
|
pick: { a: [2, 16], b: [2, 16] }, derive: { val: 'a*b' },
|
||||||
|
lhs: 'x', rhs: '{a}*{b}', display: 'Стороны прямоугольника {a} и {b}. Найдите его площадь.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Площадь прямоугольника — произведение его сторон:', tex: 'x = {a}*{b}' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* площадь треугольника */
|
||||||
|
{
|
||||||
|
id: 'area-triangle', topic: 'g-area', order: 2, subject: 'geometry', grade: 8, kind: 'compute',
|
||||||
|
title: 'Площадь треугольника',
|
||||||
|
pick: { a: [2, 16], h: [2, 16] }, require: 'mod(a*h, 2) == 0',
|
||||||
|
derive: { val: 'a*h/2' },
|
||||||
|
lhs: 'x', rhs: '{a}*{h}/2', display: 'Основание треугольника {a}, высота к нему {h}. Найдите площадь.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Площадь треугольника — половина произведения основания на высоту:', tex: 'x = {a}*{h}/2' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
/* площадь квадрата */
|
||||||
|
{
|
||||||
|
id: 'area-square', topic: 'g-area', order: 3, subject: 'geometry', grade: 8, kind: 'compute',
|
||||||
|
title: 'Площадь квадрата',
|
||||||
|
pick: { a: [2, 20] }, derive: { val: 'a*a' },
|
||||||
|
lhs: 'x', rhs: '{a}^2', display: 'Сторона квадрата {a}. Найдите его площадь.',
|
||||||
|
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||||
|
solution: [
|
||||||
|
{ note: 'Площадь квадрата — сторона, возведённая в квадрат:', tex: 'x = {a}^2' },
|
||||||
|
{ note: 'Считаем:', tex: 'x = {ans}' }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
+44
-4
@@ -39,9 +39,16 @@
|
|||||||
}
|
}
|
||||||
.tr-wrap { max-width: 740px; margin: 0 auto; padding: 34px 20px 90px; }
|
.tr-wrap { max-width: 740px; margin: 0 auto; padding: 34px 20px 90px; }
|
||||||
@keyframes trUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
|
@keyframes trUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
|
||||||
.tr-head, .tr-overall, .tr-mode, .tr-topbar, .tr-skillpanel, .tr-card { animation: trUp .5s var(--ease) both; }
|
.tr-head, .tr-overall, .tr-mode, .tr-subjects, .tr-topbar, .tr-skillpanel, .tr-card { animation: trUp .5s var(--ease) both; }
|
||||||
.tr-overall { animation-delay: .04s; } .tr-mode { animation-delay: .06s; }
|
.tr-overall { animation-delay: .04s; } .tr-mode { animation-delay: .06s; }
|
||||||
.tr-topbar { animation-delay: .1s; } .tr-skillpanel { animation-delay: .13s; } .tr-card { animation-delay: .16s; }
|
.tr-subjects { animation-delay: .08s; } .tr-topbar { animation-delay: .1s; } .tr-skillpanel { animation-delay: .13s; } .tr-card { animation-delay: .16s; }
|
||||||
|
|
||||||
|
/* ── фильтр по предмету (Алгебра / Геометрия) ── */
|
||||||
|
.tr-subjects { display: flex; gap: 7px; margin-bottom: 14px; }
|
||||||
|
.tr-subjects:empty { display: none; }
|
||||||
|
.tr-subbtn { font: inherit; font-size: .86rem; font-weight: 800; cursor: pointer; padding: 8px 18px; border-radius: 99px; border: 1px solid rgba(99,102,241,.2); background: #fff; color: var(--ink-soft); transition: .16s var(--ease); }
|
||||||
|
.tr-subbtn:hover { border-color: var(--g1); color: var(--accent-ink); }
|
||||||
|
.tr-subbtn.on { color: #fff; border-color: transparent; background: linear-gradient(135deg, var(--g1), var(--g2)); box-shadow: 0 8px 20px rgba(99,102,241,.3); }
|
||||||
|
|
||||||
.tr-head { margin-bottom: 20px; }
|
.tr-head { margin-bottom: 20px; }
|
||||||
.tr-h1 {
|
.tr-h1 {
|
||||||
@@ -335,6 +342,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="tr-subjects" id="tr-subjects"></div>
|
||||||
<div class="tr-topbar">
|
<div class="tr-topbar">
|
||||||
<span class="tr-nav-eyebrow">Тема</span>
|
<span class="tr-nav-eyebrow">Тема</span>
|
||||||
<div class="tr-topics" id="tr-topics"></div>
|
<div class="tr-topics" id="tr-topics"></div>
|
||||||
@@ -470,6 +478,7 @@
|
|||||||
var topics = (TG.topics ? TG.topics() : [{ key: null, label: 'Задачи' }]).concat([{ key: 'word', label: 'Текстовые задачи', word: true }]);
|
var topics = (TG.topics ? TG.topics() : [{ key: null, label: 'Задачи' }]).concat([{ key: 'word', label: 'Текстовые задачи', word: true }]);
|
||||||
var isTeacher = !!(ip && ip.isTeacher);
|
var isTeacher = !!(ip && ip.isTeacher);
|
||||||
var isAdmin = !!(ip && ip.isAdmin);
|
var isAdmin = !!(ip && ip.isAdmin);
|
||||||
|
var curSubject = 'algebra'; // фильтр предмета (Алгебра/Геометрия)
|
||||||
var customGens = []; // пользовательские генераторы (P13), тема «Авторские»
|
var customGens = []; // пользовательские генераторы (P13), тема «Авторские»
|
||||||
function skillKey(g) { return g.skill || g.id; }
|
function skillKey(g) { return g.skill || g.id; }
|
||||||
function skillsOf(topicKey) {
|
function skillsOf(topicKey) {
|
||||||
@@ -561,13 +570,29 @@
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function topicVisible(t) { return !!(t && (t.word || t.custom || (t.subject || 'algebra') === curSubject)); }
|
||||||
function renderTopics() {
|
function renderTopics() {
|
||||||
$('tr-topics').innerHTML = topics.map(function (t, i) {
|
$('tr-topics').innerHTML = topics.map(function (t, i) {
|
||||||
|
if (!topicVisible(t)) return '';
|
||||||
var done = topicMastered(t.key) ? '<span class="tr-badge" title="Тема освоена">' + ICON.star + '</span>' : '';
|
var done = topicMastered(t.key) ? '<span class="tr-badge" title="Тема освоена">' + ICON.star + '</span>' : '';
|
||||||
var gr = t.grade ? '<span class="tr-grade" title="' + t.grade + ' класс">' + t.grade + '</span>' : '';
|
var gr = t.grade ? '<span class="tr-grade" title="' + t.grade + ' класс">' + t.grade + '</span>' : '';
|
||||||
return '<button class="tr-chip' + (t.key === curTopic ? ' on' : '') + '" type="button" data-ti="' + i + '">' + esc(t.label) + gr + done + '</button>';
|
return '<button class="tr-chip' + (t.key === curTopic ? ' on' : '') + '" type="button" data-ti="' + i + '">' + esc(t.label) + gr + done + '</button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
}
|
}
|
||||||
|
function presentSubjects() {
|
||||||
|
var seen = {}, out = [];
|
||||||
|
topics.forEach(function (t) { if (t.subject && !seen[t.subject]) { seen[t.subject] = 1; out.push(t.subject); } });
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
function renderSubjects() {
|
||||||
|
var el = $('tr-subjects'); if (!el) return;
|
||||||
|
var subs = presentSubjects();
|
||||||
|
if (subs.length <= 1) { el.innerHTML = ''; return; }
|
||||||
|
var LBL = { algebra: 'Алгебра', geometry: 'Геометрия' };
|
||||||
|
el.innerHTML = subs.map(function (s) {
|
||||||
|
return '<button class="tr-subbtn' + (s === curSubject ? ' on' : '') + '" type="button" data-sub="' + s + '">' + esc(LBL[s] || s) + '</button>';
|
||||||
|
}).join('');
|
||||||
|
}
|
||||||
function skillPanelHeader() {
|
function skillPanelHeader() {
|
||||||
var hd = $('tr-skillpanel-hd'); if (!hd) return;
|
var hd = $('tr-skillpanel-hd'); if (!hd) return;
|
||||||
var t = topics.filter(function (x) { return x.key === curTopic; })[0];
|
var t = topics.filter(function (x) { return x.key === curTopic; })[0];
|
||||||
@@ -778,7 +803,7 @@
|
|||||||
var last = (lastSkill !== undefined) ? lastSkill : (curGen ? skillKey(curGen) : null);
|
var last = (lastSkill !== undefined) ? lastSkill : (curGen ? skillKey(curGen) : null);
|
||||||
var id = TA.nextSkill({ ordered: ordered, progress: prog, queue: reviewQ, answered: sessAnswered, last: last });
|
var id = TA.nextSkill({ ordered: ordered, progress: prog, queue: reviewQ, answered: sessAnswered, last: last });
|
||||||
var g = id ? gens.filter(function (x) { return skillKey(x) === id; })[0] : null;
|
var g = id ? gens.filter(function (x) { return skillKey(x) === id; })[0] : null;
|
||||||
if (g) { curGen = g; curTopic = g.topic; renderTopics(); renderSkills(); }
|
if (g) { curGen = g; curTopic = g.topic; if (g.subject) curSubject = g.subject; renderSubjects(); renderTopics(); renderSkills(); }
|
||||||
}
|
}
|
||||||
function recordAnswer(correct) {
|
function recordAnswer(correct) {
|
||||||
var sk = currentSkill();
|
var sk = currentSkill();
|
||||||
@@ -983,6 +1008,20 @@
|
|||||||
$('tr-teacher').addEventListener('click', function (e) { if (e.target === $('tr-teacher')) $('tr-teacher').style.display = 'none'; });
|
$('tr-teacher').addEventListener('click', function (e) { if (e.target === $('tr-teacher')) $('tr-teacher').style.display = 'none'; });
|
||||||
$('tr-analytics-btn').addEventListener('click', openAnalytics);
|
$('tr-analytics-btn').addEventListener('click', openAnalytics);
|
||||||
$('tr-builder-btn').addEventListener('click', function () { location.href = '/trainer-builder'; });
|
$('tr-builder-btn').addEventListener('click', function () { location.href = '/trainer-builder'; });
|
||||||
|
$('tr-subjects').addEventListener('click', function (e) {
|
||||||
|
var b = e.target.closest('.tr-subbtn'); if (!b) return;
|
||||||
|
curSubject = b.getAttribute('data-sub');
|
||||||
|
renderSubjects();
|
||||||
|
var ct = topics.filter(function (x) { return x.key === curTopic; })[0];
|
||||||
|
if (ct && topicVisible(ct)) { renderTopics(); return; } // текущая тема видна — просто перерисовать
|
||||||
|
var first = topics.filter(function (x) { return (x.subject || 'algebra') === curSubject; })[0];
|
||||||
|
if (first) {
|
||||||
|
curTopic = first.key;
|
||||||
|
var ss = skillsOf(curTopic); curGen = ss[0] || curGen;
|
||||||
|
for (var i = 0; i < ss.length; i++) { var p = prog[skillKey(ss[i])]; if (!(p && p.mastered)) { curGen = ss[i]; break; } }
|
||||||
|
}
|
||||||
|
renderTopics(); renderSkills(); newProblem();
|
||||||
|
});
|
||||||
$('tr-an-close').addEventListener('click', function () { $('tr-analytics').style.display = 'none'; });
|
$('tr-an-close').addEventListener('click', function () { $('tr-analytics').style.display = 'none'; });
|
||||||
$('tr-analytics').addEventListener('click', function (e) { if (e.target === $('tr-analytics')) $('tr-analytics').style.display = 'none'; });
|
$('tr-analytics').addEventListener('click', function (e) { if (e.target === $('tr-analytics')) $('tr-analytics').style.display = 'none'; });
|
||||||
$('tr-an-body').addEventListener('click', function (e) {
|
$('tr-an-body').addEventListener('click', function (e) {
|
||||||
@@ -993,6 +1032,7 @@
|
|||||||
var b = e.target.closest('.tr-chip'); if (!b) return;
|
var b = e.target.closest('.tr-chip'); if (!b) return;
|
||||||
var t = topics[+b.getAttribute('data-ti')]; if (!t) return;
|
var t = topics[+b.getAttribute('data-ti')]; if (!t) return;
|
||||||
curTopic = t.key;
|
curTopic = t.key;
|
||||||
|
if (t.subject) { curSubject = t.subject; renderSubjects(); }
|
||||||
renderTopics();
|
renderTopics();
|
||||||
if (t.word) { renderSkills(); loadWordPool(function () { serveWordProblem(); }); return; }
|
if (t.word) { renderSkills(); loadWordPool(function () { serveWordProblem(); }); return; }
|
||||||
var ss = skillsOf(curTopic);
|
var ss = skillsOf(curTopic);
|
||||||
@@ -1051,7 +1091,7 @@
|
|||||||
curGen = ss[0] || gens[0];
|
curGen = ss[0] || gens[0];
|
||||||
for (var si = 0; si < ss.length; si++) { var p = prog[skillKey(ss[si])]; if (!(p && p.mastered)) { curGen = ss[si]; break; } }
|
for (var si = 0; si < ss.length; si++) { var p = prog[skillKey(ss[si])]; if (!(p && p.mastered)) { curGen = ss[si]; break; } }
|
||||||
if (smart) pickNext(null); // адаптивный первый навык (last=null — можно взять текущий)
|
if (smart) pickNext(null); // адаптивный первый навык (last=null — можно взять текущий)
|
||||||
renderTopics(); renderSkills(); updateSession(); updateOverall(); newProblem();
|
renderSubjects(); renderTopics(); renderSkills(); updateSession(); updateOverall(); newProblem();
|
||||||
if (isTeacher) $('tr-analytics-btn').style.display = '';
|
if (isTeacher) $('tr-analytics-btn').style.display = '';
|
||||||
if (isAdmin) $('tr-builder-btn').style.display = '';
|
if (isAdmin) $('tr-builder-btn').style.display = '';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,16 @@ solved-форме `x=c` → общий `onSolved` (засчитывается к
|
|||||||
(T15 неравенства, T16 степени/формулы). **Осталось (стретч):** системы 2 ур-ний
|
(T15 неравенства, T16 степени/формулы). **Осталось (стретч):** системы 2 ур-ний
|
||||||
(пара-ответ), дроби 5–6, явная привязка к таксономии ЦТ.
|
(пара-ответ), дроби 5–6, явная привязка к таксономии ЦТ.
|
||||||
|
|
||||||
|
**Дополнено (контент по программе учебников + геометрия):** классы тем выровнены по
|
||||||
|
нашим учебникам (степени/формулы/упрощение/неравенства → 7; пропорции/проценты → 6;
|
||||||
|
квадратные → 8; прогрессии → 9). Добавлены **Прогрессии** (арифм./геом. n-й член, 9 кл)
|
||||||
|
и **ГЕОМЕТРИЯ** (subject 'geometry'): Углы (сумма углов треугольника, смежные, внешний —
|
||||||
|
7 кл), Пифагор (гипотенуза/катет через пифагоровы тройки — 8 кл), Площади (прямоугольник/
|
||||||
|
треугольник/квадрат — 8 кл) — всё kind compute (числовой ответ, проверка подстановкой,
|
||||||
|
sqrt в SimExpr). **36 генераторов, 12 тем.** На странице — **фильтр предмета
|
||||||
|
Алгебра/Геометрия** + бейдж класса на темах (Предмет → Тема → Навык). Смоук движка 572/572.
|
||||||
|
**Осталось:** системы 2 ур-ний (новый kind), дробно-рациональные, тригонометрия (9 кл геом).
|
||||||
|
|
||||||
Расширить охват и связать с подготовкой к ЦТ/ЦЭ.
|
Расширить охват и связать с подготовкой к ЦТ/ЦЭ.
|
||||||
- Новые темы: арифметика/дроби/десятичные (5–6), степени, формулы сокр. умножения,
|
- Новые темы: арифметика/дроби/десятичные (5–6), степени, формулы сокр. умножения,
|
||||||
разложение на множители, **линейные неравенства** (новый тип ответа: парсинг и
|
разложение на множители, **линейные неравенства** (новый тип ответа: парсинг и
|
||||||
|
|||||||
Reference in New Issue
Block a user