${ch.hero_h2}
${ch.hero_p}
// Generator for Geometry 11 chapter files (Phase 0 skeleton).
// Produces frontend/textbooks/geometry_11_ch{1..4}.html with all helpers + STUB builders.
'use strict';
const fs = require('fs');
const path = require('path');
const OUT_DIR = path.join(__dirname, '..', '..', 'frontend', 'textbooks');
const CHAPTERS = [
{
n: 1,
title: 'Призма и цилиндр',
hdr_sub: 'Призма (правильная, прямая, наклонная, параллелепипед, куб) · цилиндр и его сечения',
hero_h2: 'Призма и цилиндр — главные стереометрические тела',
hero_p: 'Изучаем призму и цилиндр — главные стереометрические тела. Сечения, развёртки, формулы площадей и объёмов в 3D.',
final_id: 'final1',
color: {
hdr_grad: 'linear-gradient(110deg,#92400e 0%,#d97706 55%,#fbbf24 100%)',
hdr_label: 'РАЗДЕЛ 1',
hdr_border: 'rgba(251,191,36,.2)',
pri: '#d97706', pri2: '#b45309', pri_soft: '#fef3c7',
acc: '#f59e0b', acc2: '#d97706', acc_soft: '#fef9c3',
dark_bg: '#0a0a0e', dark_card: '#13120a', dark_card_soft: '#18160a', dark_text: '#fef9e7',
dark_muted: '#a39070', dark_border: '#2a2512',
},
paras: [
{ id: 'p1', num: '§ 1', name: 'Призма', sub: '$S_{бок}=Pl$, $V=S_{осн}h$', watermark: '\\triangle' },
{ id: 'p2', num: '§ 2', name: 'Цилиндр', sub: '$S_{бок}=2\\pi Rh$, $V=\\pi R^2h$', watermark: '\\bigcirc' },
],
},
{
n: 2,
title: 'Пирамида и конус',
hdr_sub: 'Пирамида (правильная, усечённая) · конус (правильный, усечённый) · объёмы через 1/3',
hero_h2: 'Пирамида и конус — фигуры с вершиной',
hero_p: 'Пирамида и конус — фигуры с вершиной. Правильные и усечённые. Объём через одну треть основания на высоту.',
final_id: 'final2',
color: {
hdr_grad: 'linear-gradient(110deg,#064e3b 0%,#059669 55%,#34d399 100%)',
hdr_label: 'РАЗДЕЛ 2',
hdr_border: 'rgba(52,211,153,.2)',
pri: '#059669', pri2: '#047857', pri_soft: '#d1fae5',
acc: '#10b981', acc2: '#059669', acc_soft: '#a7f3d0',
dark_bg: '#04140e', dark_card: '#082017', dark_card_soft: '#0a2a1d', dark_text: '#d1fae5',
dark_muted: '#6ee7b7', dark_border: '#0f3a28',
},
paras: [
{ id: 'p3', num: '§ 3', name: 'Пирамида', sub: '$V=\\frac{1}{3}S_{осн}h$', watermark: '\\triangledown' },
{ id: 'p4', num: '§ 4', name: 'Конус', sub: '$S_{бок}=\\pi Rl$', watermark: '\\nabla' },
],
},
{
n: 3,
title: 'Сфера и шар',
hdr_sub: 'Сфера и её уравнение · шар, сегменты · 5 платоновых тел',
hero_h2: 'Сфера, шар, правильные многогранники',
hero_p: 'Сфера, шар, пять платоновых тел. Уравнение сферы в координатах, шаровые сегменты, вписанные и описанные многогранники.',
final_id: 'final3',
color: {
hdr_grad: 'linear-gradient(110deg,#3b0764 0%,#7c3aed 55%,#a78bfa 100%)',
hdr_label: 'РАЗДЕЛ 3',
hdr_border: 'rgba(167,139,250,.2)',
pri: '#7c3aed', pri2: '#6d28d9', pri_soft: '#ede9fe',
acc: '#a78bfa', acc2: '#7c3aed', acc_soft: '#f3e8ff',
dark_bg: '#0e0521', dark_card: '#1a0a30', dark_card_soft: '#220c3d', dark_text: '#ede9fe',
dark_muted: '#c4b5fd', dark_border: '#3a1d5e',
},
paras: [
{ id: 'p5', num: '§ 5', name: 'Сфера', sub: '$(x-a)^2+(y-b)^2+(z-c)^2=R^2$', watermark: 'S^2' },
{ id: 'p6', num: '§ 6', name: 'Шар', sub: '$S=4\\pi R^2$, $V=\\frac{4}{3}\\pi R^3$', watermark: 'V' },
{ id: 'p7', num: '§ 7', name: 'Правильные многогранники', sub: '5 платоновых тел', watermark: '\\star' },
],
},
{
n: 4,
title: 'Повторение',
hdr_sub: 'Планиметрия · величины · координаты и векторы в 3D · построения',
hero_h2: 'Повторение всей геометрии',
hero_p: 'Повторение всей геометрии: планиметрия, площади и объёмы, координаты и векторы в 3D, классические построения.',
final_id: 'final4',
color: {
hdr_grad: 'linear-gradient(110deg,#881337 0%,#e11d48 55%,#fb7185 100%)',
hdr_label: 'РАЗДЕЛ 4',
hdr_border: 'rgba(251,113,133,.2)',
pri: '#e11d48', pri2: '#be123c', pri_soft: '#ffe4e6',
acc: '#f43f5e', acc2: '#e11d48', acc_soft: '#fecdd3',
dark_bg: '#1a0510', dark_card: '#2a081a', dark_card_soft: '#36102a', dark_text: '#ffe4e6',
dark_muted: '#fda4af', dark_border: '#4a1029',
},
paras: [
{ id: 'p8', num: '§ 8', name: 'Геометрические фигуры и их свойства', sub: 'планиметрия', watermark: '\\square' },
{ id: 'p9', num: '§ 9', name: 'Геометрические величины', sub: 'площади, объёмы', watermark: 'S=' },
{ id: 'p10', num: '§ 10', name: 'Координаты и векторы', sub: '3D: $\\vec{a}=(x;y;z)$', watermark: '\\vec{v}' },
{ id: 'p11', num: '§ 11', name: 'Геометрические построения', sub: 'циркуль и линейка', watermark: '\\circlearrowleft' },
],
},
];
function chapterTpl(ch) {
const allParas = ch.paras.concat([{ id: ch.final_id, num: '★', name: 'Финал раздела', sub: 'Итоги · боссы раздела ' + ch.n, final: true, watermark: '\\star' }]);
const PARAS_JS = allParas.map(p => {
const sub = p.sub ? `, sub:'${p.sub.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'` : '';
const fin = p.final ? `, final:true` : '';
return ` { id:'${p.id}', num:'${p.num}', name:${JSON.stringify(p.name)}${sub}${fin} }`;
}).join(',\n');
// SIDEBARS (basic placeholder per para)
const SIDEBARS_JS = allParas.map(p => {
const t = p.final ? `Финал раздела ${ch.n}` : `Шпаргалка ${p.num}`;
const rows = p.final
? `[["${ch.paras[0].num}–${ch.paras[ch.paras.length-1].num}","теория раздела ${ch.n}"],["Награда","+50 XP"]]`
: `[["Тема", ${JSON.stringify(p.name)}],["Формула","${(p.sub || '').replace(/\\/g, '\\\\\\\\').replace(/"/g, '\\"')}"]]`;
return ` ${p.id}:{title:${JSON.stringify(t)}, rows:${rows}}`;
}).join(',\n');
const TIPS_JS = allParas.map(p => {
const html = p.final
? `Финал раздела ${ch.n} — интегрированные задачи по разделу.`
: `${p.num} «${p.name}» — содержание в разработке. ${(p.sub || '').replace(/\\/g, '\\\\\\\\')}`;
return ` {sec:'${p.id}',html:${JSON.stringify(html)}}`;
}).join(',\n');
const ACH_LABELS_JS = ch.paras.map(p => ` ${p.id}_done:"${p.name} освоено!"`).concat([
` start:"Начало раздела ${ch.n}!"`,
` ch${ch.n}_done:"Раздел ${ch.n} пройден!"`
]).join(',\n');
// sec[id="sec-pX"] rules for accent colors
const SEC_COLOR_RULES = allParas.map(p => {
return `.sec[id="sec-${p.id}"]{ --sec-acc:${ch.color.pri}; --sec-acc-d:${ch.color.pri2}; --sec-acc-soft:${ch.color.pri_soft}; }`;
}).join('\n');
// sec elements in body
const SEC_HTML = allParas.map(p => {
const w = p.final ? '★' : p.watermark;
return ` ${p.name}
${ch.hero_p}