feat(text7): Wave 0 — каркас Алгебры 7 и Геометрии 7 (hubs + миграции + стабы)

- docs/PLAN_ALGEBRA_7_GEOMETRY_7.md: полный план реализации (содержание, архитектура, волны)
- 018_algebra_7_hub.sql: hub algebra-7 (sort=6) + 4 ch (§1-§3, §4-§14, §15-§20, §21-§25)
- 019_geometry_7_hub.sql: hub geometry-7 (sort=7) + 5 ch (§1-§7, §8-§14, §15-§18, §19-§26, §27-§31)
- algebra_7_hub.html: 4-карточный hub в pink-теме (Арефьева/Пирютко 2022)
- geometry_7_hub.html: 5-карточный hub в blue-теме (Казаков 2022)
- 9 стаб-страниц глав со ссылкой назад в свой hub (заглушки до реализации волн 1-9)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-28 21:13:56 +03:00
parent 5df801daf8
commit e8767ed30d
15 changed files with 1905 additions and 0 deletions
+96
View File
@@ -0,0 +1,96 @@
'use strict';
const fs = require('fs');
const path = require('path');
const root = path.join(__dirname, '..', '..', 'frontend', 'textbooks');
const STUBS = [
{ f:'algebra_7_ch1.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 1 · Степень', range:'§1–§3', color:'#d97706', colorD:'#b45309', wm:'a&#8319;' },
{ f:'algebra_7_ch2.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 2 · Выражения и их преобразования', range:'§4–§14', color:'#059669', colorD:'#047857', wm:'P(x)' },
{ f:'algebra_7_ch3.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 3 · Линейные уравнения. Неравенства. Функция', range:'§15–§20', color:'#7c3aed', colorD:'#6d28d9', wm:'y=kx' },
{ f:'algebra_7_ch4.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 4 · Системы линейных уравнений', range:'§21–§25', color:'#0891b2', colorD:'#0e7490', wm:'{' },
{ f:'geometry_7_ch1.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 1 · Начальные понятия', range:'§1–§7', color:'#d97706', colorD:'#b45309', wm:'&#9679;' },
{ f:'geometry_7_ch2.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 2 · Признаки равенства треугольников', range:'§8–§14', color:'#059669', colorD:'#047857', wm:'&#9651;' },
{ f:'geometry_7_ch3.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 3 · Параллельность прямых', range:'§15–§18', color:'#7c3aed', colorD:'#6d28d9', wm:'&#8741;' },
{ f:'geometry_7_ch4.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 4 · Сумма углов треугольника', range:'§19–§26', color:'#0891b2', colorD:'#0e7490', wm:'&#8736;' },
{ f:'geometry_7_ch5.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 5 · Задачи на построение', range:'§27–§31', color:'#db2777', colorD:'#9d174d', wm:'&#9711;' },
];
const tpl = ({ hub, hubName, ch, range, color, colorD, wm }) => `<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>${ch}</title>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@600;800;900&family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<script src="/js/api.js" defer></script>
<style>
:root{--bg:#fafafa;--card:#fff;--text:#0f172a;--muted:#64748b;--border:#e2e8f0;--pri:${color};--pri-d:${colorD};--pri-soft:${color}1a}
html.dark{--bg:#0a0a0e;--card:#13120a;--text:#fef9e7;--muted:#a39070;--border:#2a2512}
*{margin:0;padding:0;box-sizing:border-box}
html,body{min-height:100vh}
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.55}
.hdr{position:relative;background:linear-gradient(110deg,${colorD},${color} 60%,${color}cc);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid ${color}33}
.hdr::before{content:'${wm}';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Outfit',sans-serif;font-size:clamp(5rem,15vw,11rem);font-weight:900;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.12);line-height:1;pointer-events:none}
.hdr-inner{position:relative;z-index:1;max-width:1100px;margin:0 auto;display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.14);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600}
.hdr-back:hover{background:rgba(255,255,255,.24)}
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.6rem;font-weight:900}
.hdr-sub{font-size:.92rem;opacity:.85;margin-top:4px}
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;display:inline-block;vertical-align:middle}
main{max-width:740px;margin:0 auto;padding:48px 22px 80px}
.coming{background:var(--card);border:1.5px solid var(--border);border-radius:18px;padding:32px 28px;text-align:center;box-shadow:0 4px 18px rgba(0,0,0,.05)}
.coming-icon{width:72px;height:72px;border-radius:20px;background:var(--pri-soft);display:flex;align-items:center;justify-content:center;margin:0 auto 18px;color:var(--pri-d)}
.coming-icon svg{width:36px;height:36px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.coming h2{font-family:'Outfit',sans-serif;font-size:1.5rem;color:var(--pri-d);margin-bottom:12px}
.coming p{font-size:1rem;color:var(--muted);margin-bottom:8px}
.coming p b{color:var(--text)}
.coming-cta{margin-top:24px;display:inline-flex;align-items:center;gap:8px;padding:12px 22px;background:linear-gradient(135deg,var(--pri),var(--pri-d));color:#fff;border-radius:12px;font-weight:700;text-decoration:none;box-shadow:0 6px 22px ${color}33}
.coming-cta:hover{filter:brightness(1.08)}
.range-pill{display:inline-block;padding:5px 13px;background:var(--pri-soft);color:var(--pri-d);border-radius:99px;font-size:.84rem;font-weight:700;margin-top:6px}
</style>
</head>
<body>
<header class="hdr">
<div class="hdr-inner">
<div>
<a href="${hub}" class="hdr-back">
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
К ${hubName}
</a>
</div>
<div>
<h1>${ch}</h1>
<div class="hdr-sub">${range}</div>
</div>
</div>
</header>
<main>
<div class="coming">
<div class="coming-icon">
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
</div>
<h2>Глава в разработке</h2>
<p>Эта глава — часть нового курса <b>${hubName}</b>.</p>
<p>Содержание (${range}) уже спланировано — теория, интерактивы и финальный босс появятся в одной из ближайших волн реализации.</p>
<div class="range-pill">${range}</div>
<div style="margin-top:8px">
<a href="${hub}" class="coming-cta">
Вернуться к учебнику
<svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg>
</a>
</div>
</div>
</main>
</body>
</html>
`;
for (const s of STUBS) {
fs.writeFileSync(path.join(root, s.f), tpl(s), 'utf8');
console.log('wrote ' + s.f);
}
@@ -0,0 +1,32 @@
-- Algebra 7 hub migration.
-- Adds hub row + 4 chapter children for Алгебра 7 (Арефьева/Пирютко, 2022).
-- Pattern mirrors 014_algebra_8_hub.sql and 017_geometry_8_hub.sql.
-- 1. Hub row.
INSERT INTO textbooks
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active)
VALUES
('algebra-7', 'math', 7, 'Алгебра — 7 класс', '',
'Полный курс алгебры 7 класса по учебнику И. Г. Арефьевой и О. Н. Пирютко: степени, многочлены и ФСУ, линейные уравнения и функция, системы. 4 главы, 25 параграфов, ~120 интерактивов, 21 босс-проверка.',
'algebra_7_hub.html', 25, 'pink', 6, 1);
-- 2. Chapter children.
INSERT INTO textbooks
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug)
VALUES
('algebra-7-ch1', 'math', 7, 'Алгебра 7 · Степень',
'',
'§1–§3: степень с натуральным и целым показателем, свойства степени, стандартный вид числа.',
'algebra_7_ch1.html', 3, 'amber', 1, 1, 'algebra-7'),
('algebra-7-ch2', 'math', 7, 'Алгебра 7 · Выражения и преобразования',
'',
'§4–§14: числовые выражения и тождества, одночлены и многочлены, действия с ними, формулы сокращённого умножения, разложение на множители.',
'algebra_7_ch2.html', 11, 'emerald', 2, 1, 'algebra-7'),
('algebra-7-ch3', 'math', 7, 'Алгебра 7 · Линейные уравнения. Неравенства. Функция',
'',
'§15–§20: линейные уравнения и текстовые задачи, числовые и линейные неравенства, функция и её график, линейная функция.',
'algebra_7_ch3.html', 6, 'violet', 3, 1, 'algebra-7'),
('algebra-7-ch4', 'math', 7, 'Алгебра 7 · Системы линейных уравнений',
'',
'§21–§25: линейное уравнение с двумя переменными, графический способ, системы и способы их решения, текстовые задачи на системы.',
'algebra_7_ch4.html', 5, 'cyan', 4, 1, 'algebra-7');
@@ -0,0 +1,36 @@
-- Geometry 7 hub migration.
-- Adds hub row + 5 chapter children for Геометрия 7 (Казаков, 2022).
-- Pattern mirrors 017_geometry_8_hub.sql.
-- 1. Hub row.
INSERT INTO textbooks
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active)
VALUES
('geometry-7', 'math', 7, 'Геометрия — 7 класс', '',
'Полный курс геометрии 7 класса по учебнику В. В. Казакова: начальные понятия, признаки равенства треугольников, параллельность прямых, сумма углов треугольника, задачи на построение. 5 глав, 31 параграф, ~150 интерактивов, 25 боссов-проверок.',
'geometry_7_hub.html', 31, 'blue', 7, 1);
-- 2. Chapter children.
INSERT INTO textbooks
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug)
VALUES
('geometry-7-ch1', 'math', 7, 'Геометрия 7 · Начальные понятия',
'',
'§1–§7: прямая, луч, отрезок, ломаная, окружность и круг, углы и их виды, смежные и вертикальные углы, перпендикулярные прямые.',
'geometry_7_ch1.html', 7, 'amber', 1, 1, 'geometry-7'),
('geometry-7-ch2', 'math', 7, 'Геометрия 7 · Признаки равенства треугольников',
'',
'§8–§14: три признака равенства треугольников, высота, медиана и биссектриса, равнобедренный треугольник и его признаки, серединный перпендикуляр.',
'geometry_7_ch2.html', 7, 'emerald', 2, 1, 'geometry-7'),
('geometry-7-ch3', 'math', 7, 'Геометрия 7 · Параллельность прямых',
'',
'§15–§18: признаки параллельности прямых, аксиома параллельных, свойства параллельных, углы с параллельными и перпендикулярными сторонами.',
'geometry_7_ch3.html', 4, 'purple', 3, 1, 'geometry-7'),
('geometry-7-ch4', 'math', 7, 'Геометрия 7 · Сумма углов треугольника',
'',
'§19–§26: сумма углов, внешний угол, соотношения между сторонами и углами, неравенство треугольника, прямоугольные треугольники, биссектриса угла, свойство катета против угла 30°.',
'geometry_7_ch4.html', 8, 'cyan', 4, 1, 'geometry-7'),
('geometry-7-ch5', 'math', 7, 'Геометрия 7 · Задачи на построение',
'',
'§27–§31: основные задачи на построение циркулем и линейкой, треугольник по трём сторонам, биссектриса, середина отрезка, перпендикулярная прямая, геометрическое место точек.',
'geometry_7_ch5.html', 5, 'pink', 5, 1, 'geometry-7');