e8767ed30d
- 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>
97 lines
6.5 KiB
JavaScript
97 lines
6.5 KiB
JavaScript
'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ⁿ' },
|
||
{ 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:'●' },
|
||
{ f:'geometry_7_ch2.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 2 · Признаки равенства треугольников', range:'§8–§14', color:'#059669', colorD:'#047857', wm:'△' },
|
||
{ f:'geometry_7_ch3.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 3 · Параллельность прямых', range:'§15–§18', color:'#7c3aed', colorD:'#6d28d9', wm:'∥' },
|
||
{ f:'geometry_7_ch4.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 4 · Сумма углов треугольника', range:'§19–§26', color:'#0891b2', colorD:'#0e7490', wm:'∠' },
|
||
{ f:'geometry_7_ch5.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 5 · Задачи на построение', range:'§27–§31', color:'#db2777', colorD:'#9d174d', wm:'◯' },
|
||
];
|
||
|
||
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);
|
||
}
|