@
feat(chemistry-8): Phase 0 — каркас учебника «Химия 8» (hub + 7 глав) Архитектура hub + главы (как физика 7–11, алгебра, геометрия), не монолит. - chemistry_8_hub.html: хаб-каталог 7 разделов, amber-палитра, прогресс из /api/textbooks/chemistry-8/children, achievement «Химик 8 класса» - 7 каркасов глав (вводный + гл.1–6, §1–52) с оглавлением и баннером «в разработке» - /js/chem8_svg.js: неймспейс Chem8 (formula/ionLabel/chemEq готовы, 13 хелперов-заглушек) - миграция 041: родитель chemistry-8 + 7 детей (parent_slug), para_count сумма = 52 - gen_chem8_skeletons.js: генератор каркасов глав - tests/chemistry8.test.js: 9 тестов (примитивы + целостность каркаса), все зелёные - PLAN_CHEMISTRY_8.md обновлён под hub-архитектуру Источник: Шиманович, Красицкий, Сечко, Хвалюк. Химия 8, Народная асвета, 2018. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> @
This commit is contained in:
@@ -0,0 +1,297 @@
|
||||
/* gen_chem8_skeletons.js — генерирует каркасы 7 глав «Химия 8» (Phase 0).
|
||||
* Запуск: node backend/scripts/gen_chem8_skeletons.js
|
||||
* Выход: frontend/textbooks/chemistry_8_intro.html, _ch1.html ... _ch6.html
|
||||
*
|
||||
* Каркас = валидная брендированная страница: header (водяной знак), hero,
|
||||
* оглавление § (read-only), баннер «в разработке», ссылка назад в хаб, тема.
|
||||
* Полный интерактивный SPA-контент каждой главы добавляется в Phase 1–6
|
||||
* (файлы перезаписываются), пока скелет обеспечивает навигацию и структуру.
|
||||
*/
|
||||
'use strict';
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const OUT = path.join(__dirname, '..', '..', 'frontend', 'textbooks');
|
||||
|
||||
const P = (t, n) => ({ t, n }); // параграф
|
||||
const NOTE = (note) => ({ note }); // лаб. опыт / практическая работа
|
||||
|
||||
const CHAPTERS = [
|
||||
{
|
||||
file: 'chemistry_8_intro.html', slug: 'chemistry-8-intro',
|
||||
kicker: 'Вводный раздел', title: 'Количественные понятия в химии',
|
||||
range: '§ 1–9', wm: 'mol',
|
||||
color: { p:'#d97706', d:'#b45309', l:'#fbbf24', soft:'#fef3c7', bgd:'#1c1410', cardd:'#271c14', textd:'#fef3c7' },
|
||||
items: [
|
||||
P('§ 1', 'Атомы. Химические элементы. Относительная атомная масса'),
|
||||
P('§ 2', 'Молекулы. Простые и сложные вещества. Химические формулы. Относительная молекулярная масса'),
|
||||
P('§ 3', 'Химическое количество вещества'),
|
||||
P('§ 4', 'Моль — единица химического количества вещества. Постоянная Авогадро'),
|
||||
P('§ 5', 'Молярная масса. Молярный объём газов'),
|
||||
P('§ 6', 'Вычисление химического количества вещества по его массе и массы вещества по его химическому количеству'),
|
||||
P('§ 7', 'Вычисление химического количества газа по его объёму и объёма газа по его химическому количеству'),
|
||||
NOTE('Практическая работа 1. Химическое количество вещества'),
|
||||
P('§ 8', 'Химические реакции'),
|
||||
P('§ 9', 'Количественные расчёты по уравнениям химических реакций')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch1.html', slug: 'chemistry-8-ch1',
|
||||
kicker: 'Глава 1', title: 'Важнейшие классы неорганических соединений',
|
||||
range: '§ 10–23', wm: 'OH',
|
||||
color: { p:'#0d9488', d:'#0f766e', l:'#14b8a6', soft:'#ccfbf1', bgd:'#0c1a18', cardd:'#102825', textd:'#ccfbf1' },
|
||||
items: [
|
||||
P('§ 10', 'Оксиды. Состав и классификация оксидов'),
|
||||
P('§ 11', 'Химические свойства оксидов'),
|
||||
P('§ 12', 'Получение и применение оксидов'),
|
||||
P('§ 13', 'Кислоты. Состав и классификация кислот'),
|
||||
P('§ 14', 'Химические свойства кислот'),
|
||||
P('§ 15', 'Получение и применение кислот'),
|
||||
P('§ 16', 'Основания'),
|
||||
P('§ 17', 'Химические свойства оснований'),
|
||||
P('§ 18', 'Получение и применение оснований'),
|
||||
NOTE('Лабораторный опыт 1. Получение нерастворимого основания'),
|
||||
NOTE('Практическая работа 2. Изучение реакции нейтрализации'),
|
||||
P('§ 19', 'Соли. Состав и классификация солей'),
|
||||
P('§ 20', 'Химические свойства солей'),
|
||||
NOTE('Лабораторный опыт 2. Взаимодействие растворов солей с металлами'),
|
||||
P('§ 21', 'Получение и применение солей'),
|
||||
P('§ 22', 'Взаимосвязь между классами основных неорганических веществ'),
|
||||
NOTE('Практическая работа 3. Решение экспериментальных задач'),
|
||||
P('§ 23', 'Решение расчётных задач по теме «Основные классы неорганических соединений»')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch2.html', slug: 'chemistry-8-ch2',
|
||||
kicker: 'Глава 2', title: 'Периодический закон и периодическая система химических элементов',
|
||||
range: '§ 24–28', wm: '№',
|
||||
color: { p:'#4f46e5', d:'#4338ca', l:'#818cf8', soft:'#e0e7ff', bgd:'#12122b', cardd:'#1b1b3a', textd:'#e0e7ff' },
|
||||
items: [
|
||||
P('§ 24', 'Систематизация химических элементов'),
|
||||
P('§ 25', 'Понятие об амфотерности'),
|
||||
NOTE('Лабораторный опыт 3. Получение гидроксида цинка и изучение его амфотерных свойств'),
|
||||
P('§ 26', 'Естественные семейства элементов'),
|
||||
P('§ 27', 'Периодический закон Д. И. Менделеева'),
|
||||
P('§ 28', 'Периодическая система химических элементов')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch3.html', slug: 'chemistry-8-ch3',
|
||||
kicker: 'Глава 3', title: 'Строение атома и периодичность изменения свойств',
|
||||
range: '§ 29–35', wm: 'e−',
|
||||
color: { p:'#2563eb', d:'#1d4ed8', l:'#60a5fa', soft:'#dbeafe', bgd:'#0a1428', cardd:'#102137', textd:'#dbeafe' },
|
||||
items: [
|
||||
P('§ 29', 'Строение атома. Атомный номер химического элемента'),
|
||||
P('§ 30', 'Массовое число атома. Нуклиды'),
|
||||
P('§ 31', 'Изотопы. Явление радиоактивности'),
|
||||
P('§ 32', 'Состояние электронов в атоме. Электронное облако. Атомная орбиталь'),
|
||||
P('§ 33', 'Строение электронных оболочек атомов'),
|
||||
P('§ 34', 'Периодичность изменения свойств атомов химических элементов'),
|
||||
P('§ 35', 'Характеристика химического элемента по его положению в периодической системе')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch4.html', slug: 'chemistry-8-ch4',
|
||||
kicker: 'Глава 4', title: 'Химическая связь',
|
||||
range: '§ 36–41', wm: 'H₂O',
|
||||
color: { p:'#059669', d:'#047857', l:'#34d399', soft:'#d1fae5', bgd:'#0a1a12', cardd:'#10271c', textd:'#d1fae5' },
|
||||
items: [
|
||||
P('§ 36', 'Природа химической связи'),
|
||||
P('§ 37', 'Ковалентная связь'),
|
||||
P('§ 38', 'Неполярная и полярная ковалентная связь. Электроотрицательность'),
|
||||
NOTE('Лабораторный опыт 4. Составление моделей молекул'),
|
||||
P('§ 39', 'Ионная связь'),
|
||||
P('§ 40', 'Металлическая связь. Межмолекулярное взаимодействие'),
|
||||
P('§ 41', 'Кристаллическое состояние вещества')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch5.html', slug: 'chemistry-8-ch5',
|
||||
kicker: 'Глава 5', title: 'Окислительно-восстановительные реакции',
|
||||
range: '§ 42–45', wm: 'O₂',
|
||||
color: { p:'#ea580c', d:'#c2410c', l:'#fb923c', soft:'#ffedd5', bgd:'#1c1208', cardd:'#2a1c10', textd:'#ffedd5' },
|
||||
items: [
|
||||
P('§ 42', 'Степень окисления'),
|
||||
P('§ 43', 'Процессы окисления и восстановления'),
|
||||
P('§ 44', 'Окислительно-восстановительные реакции'),
|
||||
P('§ 45', 'Окислительно-восстановительные реакции вокруг нас')
|
||||
]
|
||||
},
|
||||
{
|
||||
file: 'chemistry_8_ch6.html', slug: 'chemistry-8-ch6',
|
||||
kicker: 'Глава 6', title: 'Растворы',
|
||||
range: '§ 46–52', wm: 'aq',
|
||||
color: { p:'#0891b2', d:'#0e7490', l:'#22d3ee', soft:'#cffafe', bgd:'#08191c', cardd:'#10282d', textd:'#cffafe' },
|
||||
items: [
|
||||
P('§ 46', 'Смеси веществ'),
|
||||
P('§ 47', 'Растворение веществ в воде'),
|
||||
P('§ 48', 'Характеристики растворимости веществ'),
|
||||
P('§ 49', 'Качественные характеристики состава растворов'),
|
||||
P('§ 50', 'Количественные характеристики растворённых веществ. Массовая доля растворённого вещества'),
|
||||
P('§ 51', 'Молярная концентрация растворённых веществ'),
|
||||
NOTE('Практическая работа 4. Приготовление раствора с заданной массовой долей и молярной концентрацией'),
|
||||
P('§ 52', 'Вода и растворы в жизни и деятельности человека')
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
function esc(s) {
|
||||
return String(s).replace(/[&<>]/g, c => ({ '&':'&', '<':'<', '>':'>' }[c]));
|
||||
}
|
||||
|
||||
function outlineHtml(items) {
|
||||
return items.map(it => {
|
||||
if (it.note) {
|
||||
return ' <li class="ol-note"><span class="ol-note-ic">' +
|
||||
'<svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>' +
|
||||
'</span><span>' + esc(it.note) + '</span></li>';
|
||||
}
|
||||
return ' <li class="ol-para"><span class="ol-num">' + esc(it.t) + '</span><span class="ol-name">' + esc(it.n) + '</span></li>';
|
||||
}).join('\n');
|
||||
}
|
||||
|
||||
function pageHtml(ch) {
|
||||
const c = ch.color;
|
||||
const wmHeader = ch.kicker.toUpperCase();
|
||||
return `<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · ${esc(ch.kicker)} · «${esc(ch.title)}»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:${c.p}; --pri-d:${c.d}; --pri-l:${c.l}; --pri-soft:${c.soft};
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:${c.bgd}; --card:${c.cardd}; --text:${c.textd}; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,${c.d} 0%,${c.p} 55%,${c.l} 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'${wmHeader}';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">${esc(ch.kicker)} · ${esc(ch.range)}</div>
|
||||
<h1>${esc(ch.title)}</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
${outlineHtml(ch.items)}
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · ${esc(ch.kicker)} · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = '${ch.slug}';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
}
|
||||
|
||||
let count = 0;
|
||||
for (const ch of CHAPTERS) {
|
||||
const html = pageHtml(ch);
|
||||
fs.writeFileSync(path.join(OUT, ch.file), html, 'utf8');
|
||||
count++;
|
||||
console.log('written', ch.file, '(' + ch.items.filter(i => i.t).length + ' §)');
|
||||
}
|
||||
console.log('done:', count, 'chapter skeletons');
|
||||
@@ -0,0 +1,56 @@
|
||||
-- Chemistry 8 hub migration.
|
||||
-- Creates chemistry-8 as a full hub textbook (intro + 6 chapters) in the style of physics-9:
|
||||
-- chemistry-8 (hub, html_path = chemistry_8_hub.html)
|
||||
-- chemistry-8-intro (Количественные понятия, §§1–9) → chemistry_8_intro.html
|
||||
-- chemistry-8-ch1 (Важнейшие классы соединений, §§10–23) → chemistry_8_ch1.html
|
||||
-- chemistry-8-ch2 (Периодический закон и ПСХЭ, §§24–28) → chemistry_8_ch2.html
|
||||
-- chemistry-8-ch3 (Строение атома, §§29–35) → chemistry_8_ch3.html
|
||||
-- chemistry-8-ch4 (Химическая связь, §§36–41) → chemistry_8_ch4.html
|
||||
-- chemistry-8-ch5 (ОВР, §§42–45) → chemistry_8_ch5.html
|
||||
-- chemistry-8-ch6 (Растворы, §§46–52) → chemistry_8_ch6.html
|
||||
--
|
||||
-- Source: Шиманович И. Е., Красицкий В. А., Сечко О. И., Хвалюк В. Н.,
|
||||
-- «Химия 8», Народная асвета, 2018. Контент авторский (наш).
|
||||
-- Author left empty per project policy.
|
||||
|
||||
-- 1. Insert the parent chemistry-8 hub row (does not exist yet in the catalog).
|
||||
INSERT INTO textbooks
|
||||
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug)
|
||||
VALUES
|
||||
('chemistry-8', 'chemistry', 8, 'Химия — 8 класс',
|
||||
'',
|
||||
'Полный курс химии за 8 класс: количественные понятия (моль, молярная масса и объём, расчёты по уравнениям), важнейшие классы неорганических соединений, периодический закон и строение атома, химическая связь, окислительно-восстановительные реакции, растворы. 7 разделов, 52 параграфа, 4 лабораторных опыта, 4 практические работы.',
|
||||
'chemistry_8_hub.html', 52, 'amber', 8, 1, NULL);
|
||||
|
||||
-- 2. Insert the 7 children (intro section + 6 chapters).
|
||||
INSERT INTO textbooks
|
||||
(slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug)
|
||||
VALUES
|
||||
('chemistry-8-intro', 'chemistry', 8, 'Химия 8 · Количественные понятия в химии',
|
||||
'',
|
||||
'§§1–9: атомы и химические элементы, простые и сложные вещества, химическое количество вещества, моль и постоянная Авогадро, молярная масса и молярный объём газов, расчёты по массе/объёму и по уравнениям реакций. Практическая работа 1.',
|
||||
'chemistry_8_intro.html', 9, 'amber', 1, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch1', 'chemistry', 8, 'Химия 8 · Важнейшие классы неорганических соединений',
|
||||
'',
|
||||
'§§10–23: оксиды, кислоты, основания и соли — состав, классификация, химические свойства, получение и применение; генетическая связь между классами. 2 лабораторных опыта, 2 практические работы.',
|
||||
'chemistry_8_ch1.html', 14, 'teal', 2, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch2', 'chemistry', 8, 'Химия 8 · Периодический закон и периодическая система',
|
||||
'',
|
||||
'§§24–28: систематизация элементов, амфотерность, естественные семейства элементов, периодический закон Д. И. Менделеева и строение периодической системы. Лабораторный опыт 3.',
|
||||
'chemistry_8_ch2.html', 5, 'indigo', 3, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch3', 'chemistry', 8, 'Химия 8 · Строение атома',
|
||||
'',
|
||||
'§§29–35: строение атома и атомный номер, массовое число и нуклиды, изотопы и радиоактивность, электронное облако и атомная орбиталь, строение электронных оболочек, периодичность свойств, характеристика элемента по положению в ПС.',
|
||||
'chemistry_8_ch3.html', 7, 'blue', 4, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch4', 'chemistry', 8, 'Химия 8 · Химическая связь',
|
||||
'',
|
||||
'§§36–41: природа химической связи, ковалентная связь (неполярная и полярная, электроотрицательность), ионная и металлическая связь, межмолекулярное взаимодействие, кристаллическое состояние вещества. Лабораторный опыт 4.',
|
||||
'chemistry_8_ch4.html', 6, 'green', 5, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch5', 'chemistry', 8, 'Химия 8 · Окислительно-восстановительные реакции',
|
||||
'',
|
||||
'§§42–45: степень окисления, процессы окисления и восстановления, окислительно-восстановительные реакции и метод электронного баланса, ОВР вокруг нас.',
|
||||
'chemistry_8_ch5.html', 4, 'orange', 6, 1, 'chemistry-8'),
|
||||
('chemistry-8-ch6', 'chemistry', 8, 'Химия 8 · Растворы',
|
||||
'',
|
||||
'§§46–52: смеси веществ, растворение веществ в воде, характеристики растворимости, качественные и количественные характеристики состава растворов, массовая доля и молярная концентрация, вода и растворы в жизни человека. Практическая работа 4.',
|
||||
'chemistry_8_ch6.html', 7, 'cyan', 7, 1, 'chemistry-8');
|
||||
@@ -0,0 +1,102 @@
|
||||
'use strict';
|
||||
/*
|
||||
* Phase 0 тесты учебника «Химия 8» (hub + 7 глав).
|
||||
* 1. Чистые примитивы frontend/js/chem8_svg.js (window.Chem8): formula/ionLabel/chemEq.
|
||||
* 2. Целостность каркаса: хаб + 7 файлов глав существуют, slug'и согласованы,
|
||||
* сумма параграфов = 52, миграция 041 содержит родителя + 7 детей.
|
||||
*/
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const ROOT = path.join(__dirname, '..', '..');
|
||||
const TB = path.join(ROOT, 'frontend', 'textbooks');
|
||||
|
||||
// --- shim browser global, load the frontend module ---
|
||||
global.window = global;
|
||||
require(path.join(ROOT, 'frontend', 'js', 'chem8_svg.js'));
|
||||
const C = global.Chem8;
|
||||
|
||||
test('Chem8.formula — числовые индексы в подстрочные', () => {
|
||||
assert.equal(C.formula('CaCO3'), 'CaCO₃');
|
||||
assert.equal(C.formula('H2O'), 'H₂O');
|
||||
assert.equal(C.formula('Al2(SO4)3'), 'Al₂(SO₄)₃');
|
||||
assert.equal(C.formula('NaCl'), 'NaCl');
|
||||
});
|
||||
|
||||
test('Chem8.ionLabel — заряд ионов надстрочным', () => {
|
||||
assert.equal(C.ionLabel('Na', 1), 'Na⁺');
|
||||
assert.equal(C.ionLabel('Ca', 2), 'Ca²⁺');
|
||||
assert.equal(C.ionLabel('Cl', -1), 'Cl⁻');
|
||||
assert.equal(C.ionLabel('SO4', -2), 'SO₄²⁻');
|
||||
assert.equal(C.ionLabel('Fe', 3), 'Fe³⁺');
|
||||
assert.equal(C.ionLabel('Na', 0), 'Na');
|
||||
});
|
||||
|
||||
test('Chem8.chemEq — стрелка, индексы, газ', () => {
|
||||
const html = C.chemEq('2Na + 2H2O -> 2NaOH + H2^');
|
||||
assert.ok(html.includes('2H₂O'), 'индексы воды');
|
||||
assert.ok(html.includes('→'), 'стрелка реакции');
|
||||
assert.ok(html.includes('H₂↑'), 'значок газа');
|
||||
assert.ok(html.includes('class="ceq"'), 'обёртка');
|
||||
});
|
||||
|
||||
test('Chem8.chemEq — обратимая реакция и осадок', () => {
|
||||
const rev = C.chemEq('N2 + 3H2 <-> 2NH3');
|
||||
assert.ok(rev.includes('⇌'), 'обратимая стрелка');
|
||||
const prec = C.chemEq('AgNO3 + NaCl -> AgClv + NaNO3');
|
||||
assert.ok(prec.includes('AgCl↓'), 'значок осадка');
|
||||
});
|
||||
|
||||
test('Chem8 — заглушки возвращают null и не падают', () => {
|
||||
for (const fn of ['testTube', 'moleTriangle', 'solubilityTable', 'oxStateCalc', 'geneticMap']) {
|
||||
assert.equal(typeof C[fn], 'function', fn + ' определён');
|
||||
assert.equal(C[fn]({}), null, fn + ' заглушка возвращает null');
|
||||
}
|
||||
});
|
||||
|
||||
// --- каркас страниц ---
|
||||
const CHILDREN = [
|
||||
{ slug: 'chemistry-8-intro', file: 'chemistry_8_intro.html', paras: 9 },
|
||||
{ slug: 'chemistry-8-ch1', file: 'chemistry_8_ch1.html', paras: 14 },
|
||||
{ slug: 'chemistry-8-ch2', file: 'chemistry_8_ch2.html', paras: 5 },
|
||||
{ slug: 'chemistry-8-ch3', file: 'chemistry_8_ch3.html', paras: 7 },
|
||||
{ slug: 'chemistry-8-ch4', file: 'chemistry_8_ch4.html', paras: 6 },
|
||||
{ slug: 'chemistry-8-ch5', file: 'chemistry_8_ch5.html', paras: 4 },
|
||||
{ slug: 'chemistry-8-ch6', file: 'chemistry_8_ch6.html', paras: 7 }
|
||||
];
|
||||
|
||||
test('сумма параграфов глав = 52', () => {
|
||||
assert.equal(CHILDREN.reduce((a, c) => a + c.paras, 0), 52);
|
||||
});
|
||||
|
||||
test('хаб chemistry_8_hub.html существует и ссылается на все 7 глав', () => {
|
||||
const hub = fs.readFileSync(path.join(TB, 'chemistry_8_hub.html'), 'utf8');
|
||||
assert.ok(hub.includes('var TOTAL = 52'), 'TOTAL=52');
|
||||
for (const ch of CHILDREN) {
|
||||
assert.ok(hub.includes('/textbook/' + ch.slug), 'ссылка на ' + ch.slug);
|
||||
}
|
||||
assert.ok(hub.includes('/api/textbooks/chemistry-8/children'), 'грузит детей');
|
||||
});
|
||||
|
||||
test('каждая глава существует и задаёт свой _TB_SLUG', () => {
|
||||
for (const ch of CHILDREN) {
|
||||
const html = fs.readFileSync(path.join(TB, ch.file), 'utf8');
|
||||
assert.ok(html.includes("const _TB_SLUG = '" + ch.slug + "'"), ch.file + ' slug');
|
||||
assert.ok(html.includes('/textbook/chemistry-8"'), ch.file + ' ссылка назад в хаб');
|
||||
assert.ok(html.includes('/js/chem8_svg.js'), ch.file + ' подключает chem8_svg');
|
||||
assert.ok(html.includes('/js/biochem-core.js'), ch.file + ' подключает biochem-core');
|
||||
}
|
||||
});
|
||||
|
||||
test('миграция 041 — родитель chemistry-8 + 7 детей, нет эмоджи', () => {
|
||||
const sql = fs.readFileSync(
|
||||
path.join(ROOT, 'backend', 'src', 'db', 'migrations', '041_chemistry8_hub.sql'), 'utf8');
|
||||
assert.ok(/'chemistry-8'.*NULL/s.test(sql) || sql.includes("'chemistry-8', 'chemistry', 8"), 'родитель');
|
||||
for (const ch of CHILDREN) {
|
||||
assert.ok(sql.includes("'" + ch.slug + "'"), 'дитя ' + ch.slug);
|
||||
}
|
||||
// запрет эмоджи (правило проекта)
|
||||
assert.ok(!/[\u{1F000}-\u{1FAFF}\u{2600}-\u{27BF}]/u.test(sql), 'без эмоджи');
|
||||
});
|
||||
@@ -0,0 +1,139 @@
|
||||
/* chem8_svg.js — химические наглядные примитивы для учебника «Химия 8».
|
||||
*
|
||||
* Неймспейс: window.Chem8.*
|
||||
* Молекулярные модели (структурные / шаростержневые / 3D) — НЕ здесь, а через
|
||||
* biochem-core.js (window.BioChem). Здесь только то, чего там нет: рендер формул и
|
||||
* уравнений, ионы, степени окисления, интерактивные виджеты (растворимость, ряд
|
||||
* активности, индикаторы, классификаторы, калькуляторы расчётов и т. п.).
|
||||
*
|
||||
* Phase 0: реализованы чистые текстовые примитивы (ionLabel, chemEq, formula).
|
||||
* Остальные хелперы — каркасы-заглушки, наполняются по фазам (см. PLAN_CHEMISTRY_8.md, разд. B).
|
||||
*
|
||||
* Правила (CLAUDE.md / план):
|
||||
* - без эмоджи, только inline SVG .ic;
|
||||
* - в KaTeX-шаблонах двойной backslash (\\to, \\downarrow, \\rightleftharpoons);
|
||||
* - drag/слайдеры: window-listeners + state ВЫШЕ redraw(), без setPointerCapture.
|
||||
*/
|
||||
(function (global) {
|
||||
'use strict';
|
||||
|
||||
var SUB = { '0':'₀','1':'₁','2':'₂','3':'₃','4':'₄',
|
||||
'5':'₅','6':'₆','7':'₇','8':'₈','9':'₉' };
|
||||
var SUP = { '0':'⁰','1':'¹','2':'²','3':'³','4':'⁴',
|
||||
'5':'⁵','6':'⁶','7':'⁷','8':'⁸','9':'⁹',
|
||||
'+':'⁺','-':'⁻' };
|
||||
|
||||
function toSub(digits) {
|
||||
return String(digits).replace(/[0-9]/g, function (d) { return SUB[d]; });
|
||||
}
|
||||
function toSup(s) {
|
||||
return String(s).replace(/[0-9+\-]/g, function (c) { return SUP[c] || c; });
|
||||
}
|
||||
|
||||
/* formula('CaCO3') -> 'CaCO₃' : числовые индексы атомов в подстрочные.
|
||||
Не трогает множители-коэффициенты в начале (их рендерит chemEq). */
|
||||
function formula(src) {
|
||||
if (src == null) return '';
|
||||
return String(src).replace(/([A-Za-z\)\]])(\d+)/g, function (_, a, n) {
|
||||
return a + toSub(n);
|
||||
});
|
||||
}
|
||||
|
||||
/* ionLabel('SO4', -2) -> 'SO₄²⁻' ; ionLabel('Ca', 2) -> 'Ca²⁺' ; ionLabel('Na', 1) -> 'Na⁺' */
|
||||
function ionLabel(form, charge) {
|
||||
var body = formula(form);
|
||||
var c = Number(charge) || 0;
|
||||
if (c === 0) return body;
|
||||
var mag = Math.abs(c);
|
||||
var sign = c > 0 ? '+' : '-';
|
||||
var num = mag === 1 ? '' : String(mag);
|
||||
return body + toSup(num + sign);
|
||||
}
|
||||
|
||||
/* chemEq('2Na + 2H2O -> 2NaOH + H2^', {arrow:'->'}) -> HTML-строка с индексами,
|
||||
стрелками (= → ⇌), значками газа (↑) и осадка (↓), условием над стрелкой.
|
||||
Токены: '->'/'=' необратимая, '<->'/'<=>' обратимая, '^' газ, 'v' осадок.
|
||||
opts.cond — подпись над стрелкой (например 't', 'кат.', 'эл. ток'). */
|
||||
function chemEq(src, opts) {
|
||||
opts = opts || {};
|
||||
var s = String(src == null ? '' : src).trim();
|
||||
var arrowHtml = ' <span class="ceq-arrow">' + arrowGlyph(s, opts) + condHtml(opts) + '</span> ';
|
||||
// выделяем стрелку
|
||||
var parts = s.split(/<->|<=>|->|⇌|=(?![^(]*\))|→/);
|
||||
var left = parts[0] || '';
|
||||
var right = parts.length > 1 ? parts.slice(1).join(' ') : '';
|
||||
var html = renderSide(left);
|
||||
if (right) html += arrowHtml + renderSide(right);
|
||||
return '<span class="ceq">' + html + '</span>';
|
||||
}
|
||||
|
||||
function arrowGlyph(s, opts) {
|
||||
if (opts.arrow === '<->' || opts.arrow === '<=>' || /<->|<=>|⇌/.test(s)) return '⇌';
|
||||
return '→'; // →
|
||||
}
|
||||
function condHtml(opts) {
|
||||
if (!opts.cond) return '';
|
||||
return '<sup class="ceq-cond">' + escapeHtml(opts.cond) + '</sup>';
|
||||
}
|
||||
|
||||
/* одна сторона уравнения: разбор на вещества по '+', значки ↑/↓ */
|
||||
function renderSide(side) {
|
||||
return side.split('+').map(function (term) {
|
||||
var t = term.trim();
|
||||
if (!t) return '';
|
||||
var gas = false, prec = false;
|
||||
t = t.replace(/\^|↑/g, function () { gas = true; return ''; })
|
||||
.replace(/(^|[A-Za-z0-9\)])v(\b|$)|↓/g, function (m) {
|
||||
prec = true; return m.replace(/v|↓/, '');
|
||||
});
|
||||
// коэффициент в начале
|
||||
var coef = '';
|
||||
t = t.replace(/^(\d+)/, function (_, n) { coef = n; return ''; });
|
||||
var out = (coef ? coef : '') + formula(t.trim());
|
||||
if (gas) out += '↑';
|
||||
if (prec) out += '↓';
|
||||
return out;
|
||||
}).filter(Boolean).join(' + ');
|
||||
}
|
||||
|
||||
function escapeHtml(s) {
|
||||
return String(s).replace(/[&<>"']/g, function (c) {
|
||||
return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[c];
|
||||
});
|
||||
}
|
||||
|
||||
/* ---- Каркасы-заглушки интерактивных виджетов (реализуются по фазам) ---- */
|
||||
function notImplemented(name) {
|
||||
return function () {
|
||||
if (global.console && console.warn) {
|
||||
console.warn('[Chem8] ' + name + ' ещё не реализован (Phase 0 заглушка)');
|
||||
}
|
||||
return null;
|
||||
};
|
||||
}
|
||||
|
||||
var Chem8 = {
|
||||
// готово (Phase 0)
|
||||
formula: formula,
|
||||
ionLabel: ionLabel,
|
||||
chemEq: chemEq,
|
||||
toSub: toSub,
|
||||
toSup: toSup,
|
||||
// заглушки (см. план, разд. B) — наполняются в Phase 1–6
|
||||
testTube: notImplemented('testTube'), // §18,25 — пробирка: осадок/газ/окраска
|
||||
moleTriangle: notImplemented('moleTriangle'), // §6 — треугольник n–m–M
|
||||
equationBalancer: notImplemented('equationBalancer'),// §8 — балансировщик уравнений
|
||||
oxStateCalc: notImplemented('oxStateCalc'), // §42 — калькулятор степени окисления
|
||||
redoxBalancer: notImplemented('redoxBalancer'), // §44 — e-баланс ОВР
|
||||
orbitalDiagram: notImplemented('orbitalDiagram'), // §33 — орбитальная диаграмма
|
||||
solubilityTable: notImplemented('solubilityTable'), // §19,20,48 — таблица растворимости
|
||||
activitySeries: notImplemented('activitySeries'), // §14,20 — ряд активности металлов
|
||||
miniPeriodic: notImplemented('miniPeriodic'), // §1,26,34 — мини-ПСХЭ с подсветкой
|
||||
indicatorScale: notImplemented('indicatorScale'), // §13,14,16,17 — индикатор + шкала pH
|
||||
dissociationAnim: notImplemented('dissociationAnim'),// §47 — анимация растворения
|
||||
classifier: notImplemented('classifier'), // §10,13,16,19,46 — DnD-классификатор
|
||||
geneticMap: notImplemented('geneticMap') // §22 — генетическая карта-граф классов
|
||||
};
|
||||
|
||||
global.Chem8 = Chem8;
|
||||
})(typeof window !== 'undefined' ? window : this);
|
||||
@@ -0,0 +1,148 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 1 · «Важнейшие классы неорганических соединений»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#0d9488; --pri-d:#0f766e; --pri-l:#14b8a6; --pri-soft:#ccfbf1;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#0c1a18; --card:#102825; --text:#ccfbf1; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#0f766e 0%,#0d9488 55%,#14b8a6 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 1';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 1 · § 10–23</div>
|
||||
<h1>Важнейшие классы неорганических соединений</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 10</span><span class="ol-name">Оксиды. Состав и классификация оксидов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 11</span><span class="ol-name">Химические свойства оксидов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 12</span><span class="ol-name">Получение и применение оксидов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 13</span><span class="ol-name">Кислоты. Состав и классификация кислот</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 14</span><span class="ol-name">Химические свойства кислот</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 15</span><span class="ol-name">Получение и применение кислот</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 16</span><span class="ol-name">Основания</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 17</span><span class="ol-name">Химические свойства оснований</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 18</span><span class="ol-name">Получение и применение оснований</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Лабораторный опыт 1. Получение нерастворимого основания</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Практическая работа 2. Изучение реакции нейтрализации</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 19</span><span class="ol-name">Соли. Состав и классификация солей</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 20</span><span class="ol-name">Химические свойства солей</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Лабораторный опыт 2. Взаимодействие растворов солей с металлами</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 21</span><span class="ol-name">Получение и применение солей</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 22</span><span class="ol-name">Взаимосвязь между классами основных неорганических веществ</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Практическая работа 3. Решение экспериментальных задач</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 23</span><span class="ol-name">Решение расчётных задач по теме «Основные классы неорганических соединений»</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 1 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch1';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,136 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 2 · «Периодический закон и периодическая система химических элементов»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#4f46e5; --pri-d:#4338ca; --pri-l:#818cf8; --pri-soft:#e0e7ff;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#12122b; --card:#1b1b3a; --text:#e0e7ff; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#4338ca 0%,#4f46e5 55%,#818cf8 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 2';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 2 · § 24–28</div>
|
||||
<h1>Периодический закон и периодическая система химических элементов</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 24</span><span class="ol-name">Систематизация химических элементов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 25</span><span class="ol-name">Понятие об амфотерности</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Лабораторный опыт 3. Получение гидроксида цинка и изучение его амфотерных свойств</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 26</span><span class="ol-name">Естественные семейства элементов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 27</span><span class="ol-name">Периодический закон Д. И. Менделеева</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 28</span><span class="ol-name">Периодическая система химических элементов</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 2 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch2';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,137 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 3 · «Строение атома и периодичность изменения свойств»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#2563eb; --pri-d:#1d4ed8; --pri-l:#60a5fa; --pri-soft:#dbeafe;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#0a1428; --card:#102137; --text:#dbeafe; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#1d4ed8 0%,#2563eb 55%,#60a5fa 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 3';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 3 · § 29–35</div>
|
||||
<h1>Строение атома и периодичность изменения свойств</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 29</span><span class="ol-name">Строение атома. Атомный номер химического элемента</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 30</span><span class="ol-name">Массовое число атома. Нуклиды</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 31</span><span class="ol-name">Изотопы. Явление радиоактивности</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 32</span><span class="ol-name">Состояние электронов в атоме. Электронное облако. Атомная орбиталь</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 33</span><span class="ol-name">Строение электронных оболочек атомов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 34</span><span class="ol-name">Периодичность изменения свойств атомов химических элементов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 35</span><span class="ol-name">Характеристика химического элемента по его положению в периодической системе</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 3 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch3';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,137 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 4 · «Химическая связь»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#059669; --pri-d:#047857; --pri-l:#34d399; --pri-soft:#d1fae5;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#0a1a12; --card:#10271c; --text:#d1fae5; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#047857 0%,#059669 55%,#34d399 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 4';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 4 · § 36–41</div>
|
||||
<h1>Химическая связь</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 36</span><span class="ol-name">Природа химической связи</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 37</span><span class="ol-name">Ковалентная связь</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 38</span><span class="ol-name">Неполярная и полярная ковалентная связь. Электроотрицательность</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Лабораторный опыт 4. Составление моделей молекул</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 39</span><span class="ol-name">Ионная связь</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 40</span><span class="ol-name">Металлическая связь. Межмолекулярное взаимодействие</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 41</span><span class="ol-name">Кристаллическое состояние вещества</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 4 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch4';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,134 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 5 · «Окислительно-восстановительные реакции»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#ea580c; --pri-d:#c2410c; --pri-l:#fb923c; --pri-soft:#ffedd5;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#1c1208; --card:#2a1c10; --text:#ffedd5; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#c2410c 0%,#ea580c 55%,#fb923c 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 5';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 5 · § 42–45</div>
|
||||
<h1>Окислительно-восстановительные реакции</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 42</span><span class="ol-name">Степень окисления</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 43</span><span class="ol-name">Процессы окисления и восстановления</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 44</span><span class="ol-name">Окислительно-восстановительные реакции</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 45</span><span class="ol-name">Окислительно-восстановительные реакции вокруг нас</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 5 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch5';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,138 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Глава 6 · «Растворы»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#0891b2; --pri-d:#0e7490; --pri-l:#22d3ee; --pri-soft:#cffafe;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#08191c; --card:#10282d; --text:#cffafe; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#0e7490 0%,#0891b2 55%,#22d3ee 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ГЛАВА 6';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Глава 6 · § 46–52</div>
|
||||
<h1>Растворы</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 46</span><span class="ol-name">Смеси веществ</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 47</span><span class="ol-name">Растворение веществ в воде</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 48</span><span class="ol-name">Характеристики растворимости веществ</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 49</span><span class="ol-name">Качественные характеристики состава растворов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 50</span><span class="ol-name">Количественные характеристики растворённых веществ. Массовая доля растворённого вещества</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 51</span><span class="ol-name">Молярная концентрация растворённых веществ</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Практическая работа 4. Приготовление раствора с заданной массовой долей и молярной концентрацией</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 52</span><span class="ol-name">Вода и растворы в жизни и деятельности человека</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Глава 6 · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-ch6';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,473 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 класс — учебник</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@400;700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff;
|
||||
--text:#1c1917; --muted:#78716c;
|
||||
--border:#fde68a;
|
||||
--pri:#d97706; --pri-d:#b45309;
|
||||
--pri-soft:#fef3c7;
|
||||
--c0:#d97706; --c0-d:#b45309; /* intro — amber */
|
||||
--c1:#0d9488; --c1-d:#0f766e; /* гл.1 — teal */
|
||||
--c2:#4f46e5; --c2-d:#4338ca; /* гл.2 — indigo */
|
||||
--c3:#2563eb; --c3-d:#1d4ed8; /* гл.3 — blue */
|
||||
--c4:#059669; --c4-d:#047857; /* гл.4 — green */
|
||||
--c5:#ea580c; --c5-d:#c2410c; /* гл.5 — orange */
|
||||
--c6:#0891b2; --c6-d:#0e7490; /* гл.6 — cyan */
|
||||
--sh:0 4px 16px rgba(217,119,6,.10);
|
||||
--sh-h:0 12px 36px rgba(217,119,6,.18);
|
||||
}
|
||||
html.dark{
|
||||
--bg:#1c1410; --card:#271c14;
|
||||
--text:#fef3c7; --muted:#d6b88a;
|
||||
--border:#4a3520;
|
||||
--pri-soft:rgba(217,119,6,.16);
|
||||
}
|
||||
*{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;transition:background .25s,color .25s}
|
||||
|
||||
/* HEADER */
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#92400e 0%,#d97706 55%,#fbbf24 100%);color:#fff;padding:32px 24px 28px;overflow:hidden;border-bottom:2px solid rgba(254,243,199,.18)}
|
||||
.hdr::before{content:'ХИМИЯ';position:absolute;right:-14px;top:-18%;font-family:'Outfit',sans-serif;font-size:clamp(5rem,16vw,13rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(254,243,199,.14);line-height:1;pointer-events:none;user-select: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,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.85rem;font-weight:900;letter-spacing:-.01em}
|
||||
.hdr-sub{font-size:.92rem;opacity:.9;margin-top:4px}
|
||||
.hdr-side{margin-left:auto;display:flex;gap:8px}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
main{max-width:1100px;margin:0 auto;padding:32px 24px 60px}
|
||||
|
||||
/* OVERALL PROGRESS */
|
||||
.prog-overall{background:linear-gradient(135deg,var(--pri-soft),rgba(251,191,36,.12));border:1px solid var(--border);border-radius:14px;padding:14px 18px;margin-bottom:28px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
|
||||
.po-icon{width:46px;height:46px;border-radius:12px;background:linear-gradient(135deg,#d97706,#fbbf24);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-family:'Outfit',sans-serif;font-size:1.4rem;font-weight:900}
|
||||
.po-text{flex:1;min-width:160px}
|
||||
.po-label{font-size:.78rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px}
|
||||
.po-bar{height:8px;background:rgba(217,119,6,.16);border-radius:5px;overflow:hidden;margin-top:6px}
|
||||
.po-fill{height:100%;background:linear-gradient(90deg,var(--pri),#fbbf24);border-radius:5px;transition:width .5s}
|
||||
.po-xp{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;background:linear-gradient(135deg,#f59e0b,var(--pri));color:#fff;border-radius:99px;font-size:.8rem;font-weight:800;font-family:'Unbounded',sans-serif;letter-spacing:.02em;box-shadow:0 4px 12px rgba(217,119,6,.24)}
|
||||
|
||||
/* CHAPTER GRID */
|
||||
.ch-grid{display:grid;grid-template-columns:1fr;gap:18px;margin-bottom:30px}
|
||||
@media(min-width:680px){.ch-grid{grid-template-columns:1fr 1fr}}
|
||||
@media(min-width:1000px){.ch-grid{grid-template-columns:repeat(3,1fr)}}
|
||||
|
||||
.ch-card{background:var(--card);border:1.5px solid var(--border);border-radius:18px;overflow:hidden;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s,border-color .2s;cursor:pointer;text-decoration:none;color:inherit}
|
||||
.ch-card:hover{transform:translateY(-4px);box-shadow:var(--sh-h)}
|
||||
.ch-cover{padding:22px 22px 18px;color:#fff;position:relative;overflow:hidden}
|
||||
.ch-cover-wm{position:absolute;right:-4px;top:-14px;font-size:4rem;font-weight:900;font-family:'Outfit',sans-serif;line-height:1;color:rgba(255,255,255,.22);pointer-events:none;letter-spacing:-.03em}
|
||||
.ch-num{display:inline-block;padding:4px 10px;background:rgba(255,255,255,.24);border-radius:99px;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px;position:relative;z-index:1}
|
||||
.ch-title{font-family:'Outfit',sans-serif;font-size:1.1rem;font-weight:800;letter-spacing:-.01em;position:relative;z-index:1;line-height:1.3}
|
||||
.ch-range{font-size:.84rem;opacity:.9;margin-top:4px;position:relative;z-index:1;font-weight:500}
|
||||
|
||||
.ch-cover.cc0{background:linear-gradient(135deg,#92400e,#d97706 60%,#fbbf24)}
|
||||
.ch-cover.cc1{background:linear-gradient(135deg,#134e4a,#0d9488 60%,#14b8a6)}
|
||||
.ch-cover.cc2{background:linear-gradient(135deg,#3730a3,#4f46e5 60%,#818cf8)}
|
||||
.ch-cover.cc3{background:linear-gradient(135deg,#1e3a8a,#2563eb 60%,#60a5fa)}
|
||||
.ch-cover.cc4{background:linear-gradient(135deg,#064e3b,#059669 60%,#34d399)}
|
||||
.ch-cover.cc5{background:linear-gradient(135deg,#9a3412,#ea580c 60%,#fb923c)}
|
||||
.ch-cover.cc6{background:linear-gradient(135deg,#164e63,#0891b2 60%,#22d3ee)}
|
||||
|
||||
.ch-body{padding:16px 20px 18px;display:flex;flex-direction:column;flex:1}
|
||||
.ch-desc{font-size:.88rem;color:var(--text);opacity:.84;flex:1;margin-bottom:12px;line-height:1.55}
|
||||
|
||||
.ch-prog{margin-bottom:12px}
|
||||
.ch-prog-label{display:flex;justify-content:space-between;font-size:.74rem;color:var(--muted);font-weight:600;margin-bottom:4px}
|
||||
.ch-prog-bar{height:6px;background:rgba(0,0,0,.07);border-radius:4px;overflow:hidden}
|
||||
.ch-prog-fill{height:100%;border-radius:4px;transition:width .5s}
|
||||
.ch-card.k0 .ch-prog-fill{background:linear-gradient(90deg,var(--c0),var(--c0-d))}
|
||||
.ch-card.k1 .ch-prog-fill{background:linear-gradient(90deg,var(--c1),var(--c1-d))}
|
||||
.ch-card.k2 .ch-prog-fill{background:linear-gradient(90deg,var(--c2),var(--c2-d))}
|
||||
.ch-card.k3 .ch-prog-fill{background:linear-gradient(90deg,var(--c3),var(--c3-d))}
|
||||
.ch-card.k4 .ch-prog-fill{background:linear-gradient(90deg,var(--c4),var(--c4-d))}
|
||||
.ch-card.k5 .ch-prog-fill{background:linear-gradient(90deg,var(--c5),var(--c5-d))}
|
||||
.ch-card.k6 .ch-prog-fill{background:linear-gradient(90deg,var(--c6),var(--c6-d))}
|
||||
|
||||
.ch-action{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:11px;font-weight:700;font-size:.9rem;color:#fff;transition:filter .15s}
|
||||
.ch-action:hover{filter:brightness(1.08)}
|
||||
.ch-card.k0 .ch-action{background:linear-gradient(135deg,var(--c0),#fbbf24)}
|
||||
.ch-card.k1 .ch-action{background:linear-gradient(135deg,var(--c1),#14b8a6)}
|
||||
.ch-card.k2 .ch-action{background:linear-gradient(135deg,var(--c2),#818cf8)}
|
||||
.ch-card.k3 .ch-action{background:linear-gradient(135deg,var(--c3),#60a5fa)}
|
||||
.ch-card.k4 .ch-action{background:linear-gradient(135deg,var(--c4),#34d399)}
|
||||
.ch-card.k5 .ch-action{background:linear-gradient(135deg,var(--c5),#fb923c)}
|
||||
.ch-card.k6 .ch-action{background:linear-gradient(135deg,var(--c6),#22d3ee)}
|
||||
|
||||
/* COURSE FINAL (placeholder — наполняется в Phase 7) */
|
||||
.final-wrap{margin:0 0 28px;background:var(--card);border:1.5px solid var(--border);border-radius:18px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.final-head{padding:18px 22px;background:linear-gradient(135deg,#92400e 0%,#d97706 55%,#f59e0b 100%);color:#fff;cursor:pointer;display:flex;align-items:center;gap:14px;user-select:none;transition:filter .15s}
|
||||
.final-head:hover{filter:brightness(1.06)}
|
||||
.final-head-icon{width:46px;height:46px;border-radius:12px;background:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.final-head-icon svg{width:26px;height:26px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.final-head-text{flex:1;min-width:0}
|
||||
.final-head-tag{display:inline-block;padding:3px 9px;background:rgba(255,255,255,.24);border-radius:99px;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px}
|
||||
.final-head-title{font-family:'Outfit',sans-serif;font-size:1.18rem;font-weight:800;letter-spacing:-.01em;line-height:1.25}
|
||||
.final-head-sub{font-size:.84rem;opacity:.9;margin-top:2px}
|
||||
.final-chevron{flex-shrink:0;transition:transform .25s}
|
||||
.final-chevron svg{width:24px;height:24px;stroke:#fff;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
|
||||
.final-wrap.open .final-chevron{transform:rotate(180deg)}
|
||||
.final-body{display:none;padding:22px}
|
||||
.final-wrap.open .final-body{display:block}
|
||||
.fin-placeholder{padding:24px 18px;background:linear-gradient(135deg,var(--pri-soft),rgba(251,191,36,.08));border:1.5px dashed var(--pri);border-radius:14px;text-align:center;color:var(--text)}
|
||||
.fin-placeholder h3{font-family:'Outfit',sans-serif;color:var(--pri-d);margin-bottom:8px;font-size:1.1rem}
|
||||
.fin-placeholder p{color:var(--muted);font-size:.92rem;line-height:1.55}
|
||||
|
||||
/* ACHIEVEMENT STRIP */
|
||||
.ach-strip{background:var(--card);border:1.5px solid var(--border);border-radius:16px;padding:18px 22px;margin-bottom:28px;display:flex;align-items:center;gap:16px;transition:border-color .4s,box-shadow .4s}
|
||||
.ach-strip.lit{border-color:#f59e0b;box-shadow:0 0 0 3px rgba(245,158,11,.18)}
|
||||
.ach-icon{width:52px;height:52px;border-radius:14px;background:rgba(0,0,0,.06);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .4s}
|
||||
.ach-strip.lit .ach-icon{background:linear-gradient(135deg,#fbbf24,#f59e0b)}
|
||||
.ach-icon svg{width:28px;height:28px;stroke:var(--muted);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ach-strip.lit .ach-icon svg{stroke:#fff}
|
||||
.ach-text{flex:1}
|
||||
.ach-title{font-weight:800;font-size:1.02rem;color:var(--text)}
|
||||
.ach-sub{font-size:.85rem;color:var(--muted);margin-top:2px}
|
||||
.ach-strip.lit .ach-title{color:#92400e}
|
||||
html.dark .ach-strip.lit .ach-title{color:#fde68a}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border)}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<div>
|
||||
<a href="/textbooks" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К каталогу
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h1>Химия — 8 класс</h1>
|
||||
<div class="hdr-sub">Количественные понятия, классы соединений, периодический закон, строение атома, химическая связь, ОВР, растворы. 7 разделов, 52 параграфа.</div>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
|
||||
<section class="prog-overall">
|
||||
<div class="po-icon">Х</div>
|
||||
<div class="po-text">
|
||||
<div class="po-label">Общий прогресс по курсу</div>
|
||||
<div id="overall-text" style="font-size:1.05rem;font-weight:700">Загрузка...</div>
|
||||
<div class="po-bar"><div id="overall-fill" class="po-fill" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div id="hero-xp-badge" class="po-xp" style="display:none" data-gamified>0 XP</div>
|
||||
</section>
|
||||
|
||||
<div class="ch-grid">
|
||||
|
||||
<a href="/textbook/chemistry-8-intro" class="ch-card k0" id="ch-1">
|
||||
<div class="ch-cover cc0">
|
||||
<div class="ch-cover-wm">mol</div>
|
||||
<div class="ch-num">Вводный раздел</div>
|
||||
<div class="ch-title">Количественные понятия в химии</div>
|
||||
<div class="ch-range">§1–§9 · ПР 1</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Атомы и элементы, простые и сложные вещества, химическое количество вещества, моль и постоянная Авогадро, молярная масса и объём газов, расчёты по массе, объёму и уравнениям реакций.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-1">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-1" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-1">Открыть раздел</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch1" class="ch-card k1" id="ch-2">
|
||||
<div class="ch-cover cc1">
|
||||
<div class="ch-cover-wm">OH−</div>
|
||||
<div class="ch-num">Глава 1</div>
|
||||
<div class="ch-title">Важнейшие классы неорганических соединений</div>
|
||||
<div class="ch-range">§10–§23 · 2 лаб · ПР 2,3</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Оксиды, кислоты, основания и соли: состав, классификация, химические свойства, получение и применение; генетическая связь между классами неорганических веществ.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-2">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-2" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-2">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch2" class="ch-card k2" id="ch-3">
|
||||
<div class="ch-cover cc2">
|
||||
<div class="ch-cover-wm">№</div>
|
||||
<div class="ch-num">Глава 2</div>
|
||||
<div class="ch-title">Периодический закон и периодическая система</div>
|
||||
<div class="ch-range">§24–§28 · 1 лаб</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Систематизация элементов, амфотерность, естественные семейства элементов, периодический закон Д. И. Менделеева и строение периодической системы.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-3">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-3" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-3">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch3" class="ch-card k3" id="ch-4">
|
||||
<div class="ch-cover cc3">
|
||||
<div class="ch-cover-wm">e−</div>
|
||||
<div class="ch-num">Глава 3</div>
|
||||
<div class="ch-title">Строение атома</div>
|
||||
<div class="ch-range">§29–§35</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Строение атома и атомный номер, массовое число и нуклиды, изотопы и радиоактивность, электронное облако и орбиталь, электронные оболочки, периодичность свойств.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-4">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-4" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-4">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch4" class="ch-card k4" id="ch-5">
|
||||
<div class="ch-cover cc4">
|
||||
<div class="ch-cover-wm">H₂O</div>
|
||||
<div class="ch-num">Глава 4</div>
|
||||
<div class="ch-title">Химическая связь</div>
|
||||
<div class="ch-range">§36–§41 · 1 лаб</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Природа химической связи, ковалентная связь (неполярная и полярная, электроотрицательность), ионная и металлическая связь, межмолекулярное взаимодействие, кристаллические решётки.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-5">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-5" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-5">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch5" class="ch-card k5" id="ch-6">
|
||||
<div class="ch-cover cc5">
|
||||
<div class="ch-cover-wm">O₂</div>
|
||||
<div class="ch-num">Глава 5</div>
|
||||
<div class="ch-title">Окислительно-восстановительные реакции</div>
|
||||
<div class="ch-range">§42–§45</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Степень окисления, процессы окисления и восстановления, окислительно-восстановительные реакции и метод электронного баланса, ОВР вокруг нас.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-6">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-6" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-6">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="/textbook/chemistry-8-ch6" class="ch-card k6" id="ch-7">
|
||||
<div class="ch-cover cc6">
|
||||
<div class="ch-cover-wm">aq</div>
|
||||
<div class="ch-num">Глава 6</div>
|
||||
<div class="ch-title">Растворы</div>
|
||||
<div class="ch-range">§46–§52 · ПР 4</div>
|
||||
</div>
|
||||
<div class="ch-body">
|
||||
<div class="ch-desc">Смеси веществ, растворение в воде, характеристики растворимости, качественные и количественные характеристики состава растворов, массовая доля и молярная концентрация, вода в жизни человека.</div>
|
||||
<div class="ch-prog">
|
||||
<div class="ch-prog-label"><span>Прогресс</span><span id="prog-7">0%</span></div>
|
||||
<div class="ch-prog-bar"><div class="ch-prog-fill" id="fill-7" style="width:0%"></div></div>
|
||||
</div>
|
||||
<div class="ch-action"><span id="btn-7">Открыть главу</span><svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
<section class="final-wrap" id="course-final">
|
||||
<div class="final-head" id="final-head" tabindex="0" role="button" aria-expanded="false" aria-controls="final-body">
|
||||
<div class="final-head-icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M7 4h10v6a5 5 0 0 1-10 0V4z"/><path d="M5 4h2v2H5a2 2 0 0 1 0-4M19 4h-2v2h2a2 2 0 0 0 0-4M9 20h6M12 15v5"/></svg>
|
||||
</div>
|
||||
<div class="final-head-text">
|
||||
<div class="final-head-tag">Финал курса</div>
|
||||
<div class="final-head-title">Босс-проверка по всему курсу</div>
|
||||
<div class="final-head-sub">Шпаргалка курса и интегрированные боссы по всем 7 разделам. Победи всех — получи «Химик 8 класса».</div>
|
||||
</div>
|
||||
<div class="final-chevron"><svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg></div>
|
||||
</div>
|
||||
<div class="final-body" id="final-body">
|
||||
<div class="fin-placeholder">
|
||||
<h3>Финал курса появится позже</h3>
|
||||
<p>Итоговая шпаргалка по всем разделам и интегрированные боссы добавляются на завершающем этапе разработки учебника (Phase 7). Пока проходи разделы по порядку — прогресс сохраняется автоматически.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ach-strip" id="ach-strip">
|
||||
<div class="ach-icon">
|
||||
<svg viewBox="0 0 24 24"><path d="M6 9H4l-1-3h18l-1 3h-2M6 9l1 6h10l1-6M6 9h12"/><path d="M9 21h6M12 15v6"/></svg>
|
||||
</div>
|
||||
<div class="ach-text">
|
||||
<div class="ach-title">Химик 8 класса</div>
|
||||
<div class="ach-sub" id="ach-sub">Изучите все 52 параграфа курса, чтобы получить достижение.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Шиманович, Красицкий, Сечко, Хвалюк · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
/* THEME */
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
|
||||
/* PROGRESS */
|
||||
var TOTAL = 52;
|
||||
var CH_PARA = {
|
||||
'chemistry-8-intro': 9,
|
||||
'chemistry-8-ch1': 14,
|
||||
'chemistry-8-ch2': 5,
|
||||
'chemistry-8-ch3': 7,
|
||||
'chemistry-8-ch4': 6,
|
||||
'chemistry-8-ch5': 4,
|
||||
'chemistry-8-ch6': 7
|
||||
};
|
||||
var CH_IDX = {
|
||||
'chemistry-8-intro': 1,
|
||||
'chemistry-8-ch1': 2,
|
||||
'chemistry-8-ch2': 3,
|
||||
'chemistry-8-ch3': 4,
|
||||
'chemistry-8-ch4': 5,
|
||||
'chemistry-8-ch5': 6,
|
||||
'chemistry-8-ch6': 7
|
||||
};
|
||||
|
||||
function setChProg(idx, readCount, total) {
|
||||
var pct = total ? Math.round(readCount * 100 / total) : 0;
|
||||
var labelEl = document.getElementById('prog-' + idx);
|
||||
var fillEl = document.getElementById('fill-' + idx);
|
||||
var btnEl = document.getElementById('btn-' + idx);
|
||||
if (labelEl) labelEl.textContent = pct + '%';
|
||||
if (fillEl) fillEl.style.width = pct + '%';
|
||||
if (btnEl) {
|
||||
var base = idx === 1 ? 'раздел' : 'главу';
|
||||
if (readCount > 0 && readCount < total) btnEl.textContent = 'Продолжить';
|
||||
else if (readCount >= total) btnEl.textContent = 'Открыть снова';
|
||||
else btnEl.textContent = 'Открыть ' + base;
|
||||
}
|
||||
return pct;
|
||||
}
|
||||
|
||||
var FIN_ACH_KEY = 'chemistry8_course_master';
|
||||
|
||||
function renderProgress(children) {
|
||||
var totalRead = 0;
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
var ch = children[i];
|
||||
var idx = CH_IDX[ch.slug];
|
||||
if (!idx) continue;
|
||||
var read = ch.progress ? ch.progress.read.length : 0;
|
||||
var total = ch.para_count || CH_PARA[ch.slug] || 1;
|
||||
totalRead += read;
|
||||
setChProg(idx, read, total);
|
||||
}
|
||||
|
||||
var pct = Math.round(totalRead * 100 / TOTAL);
|
||||
var overallEl = document.getElementById('overall-text');
|
||||
var fillEl = document.getElementById('overall-fill');
|
||||
if (overallEl) overallEl.textContent = totalRead + ' из ' + TOTAL + ' параграфов \xb7 ' + pct + '%';
|
||||
if (fillEl) fillEl.style.width = pct + '%';
|
||||
|
||||
var xpBadge = document.getElementById('hero-xp-badge');
|
||||
var xp = parseInt(localStorage.getItem('chemistry8_xp') || '0', 10) || 0;
|
||||
if (xpBadge && xp > 0) {
|
||||
xpBadge.style.display = '';
|
||||
xpBadge.textContent = xp + ' XP';
|
||||
}
|
||||
|
||||
var mastered = localStorage.getItem(FIN_ACH_KEY) === '1';
|
||||
if (totalRead >= TOTAL || mastered) {
|
||||
var strip = document.getElementById('ach-strip');
|
||||
var sub = document.getElementById('ach-sub');
|
||||
if (strip) strip.classList.add('lit');
|
||||
if (sub) sub.textContent = mastered
|
||||
? 'Выполнено! Вы — Химик 8 класса.'
|
||||
: 'Выполнено! Вы изучили весь курс химии 8 класса.';
|
||||
}
|
||||
}
|
||||
|
||||
/* FINAL ACCORDION */
|
||||
(function bindFinalAccordion(){
|
||||
var head = document.getElementById('final-head');
|
||||
var wrap = document.getElementById('course-final');
|
||||
if (!head || !wrap) return;
|
||||
function toggle(){
|
||||
var willOpen = !wrap.classList.contains('open');
|
||||
wrap.classList.toggle('open');
|
||||
head.setAttribute('aria-expanded', willOpen ? 'true' : 'false');
|
||||
}
|
||||
head.addEventListener('click', toggle);
|
||||
head.addEventListener('keydown', function(e){
|
||||
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggle(); }
|
||||
});
|
||||
})();
|
||||
|
||||
function loadProgress() {
|
||||
if (typeof window.LS === 'undefined' || typeof window.LS.api !== 'function') {
|
||||
renderProgress([]);
|
||||
return;
|
||||
}
|
||||
window.LS.api('/api/textbooks/chemistry-8/children')
|
||||
.then(function(data) {
|
||||
if (data && data.children) renderProgress(data.children);
|
||||
else renderProgress([]);
|
||||
})
|
||||
.catch(function() { renderProgress([]); });
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', loadProgress);
|
||||
} else {
|
||||
loadProgress();
|
||||
}
|
||||
window.addEventListener('focus', loadProgress);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,140 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Химия 8 · Вводный раздел · «Количественные понятия в химии»</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@700;800;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
|
||||
<script src="/js/api.js" defer></script>
|
||||
<script src="/js/xp.js" defer></script>
|
||||
<script src="/js/biochem-core.js" defer></script>
|
||||
<script src="/js/chem8_svg.js" defer></script>
|
||||
<style>
|
||||
:root{
|
||||
--bg:#fffbeb; --card:#fff; --text:#1c1917; --muted:#78716c; --border:#e7e5e4;
|
||||
--pri:#d97706; --pri-d:#b45309; --pri-l:#fbbf24; --pri-soft:#fef3c7;
|
||||
--sh:0 4px 16px rgba(0,0,0,.06); --sh-h:0 12px 32px rgba(0,0,0,.12);
|
||||
}
|
||||
html.dark{ --bg:#1c1410; --card:#271c14; --text:#fef3c7; --muted:#a8a29e; --border:#3a3026; --pri-soft:rgba(0,0,0,.2); }
|
||||
*{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;transition:background .25s,color .25s}
|
||||
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
|
||||
.hdr{position:relative;background:linear-gradient(110deg,#b45309 0%,#d97706 55%,#fbbf24 100%);color:#fff;padding:34px 24px 30px;overflow:hidden;border-bottom:2px solid rgba(255,255,255,.18)}
|
||||
.hdr::before{content:'ВВОДНЫЙ РАЗДЕЛ';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(4rem,13vw,10rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.13);line-height:1;pointer-events:none;user-select:none;z-index:0}
|
||||
.hdr-inner{position:relative;z-index:1;max-width:1000px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||||
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.16);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600;transition:background .15s}
|
||||
.hdr-back:hover{background:rgba(255,255,255,.26)}
|
||||
.hdr-kicker{font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.14em;opacity:.85}
|
||||
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.55rem;font-weight:900;letter-spacing:-.01em;line-height:1.25;margin-top:3px}
|
||||
.hdr-side{margin-left:auto}
|
||||
.hdr-btn{padding:8px 12px;background:rgba(255,255,255,.16);border:none;color:#fff;border-radius:9px;cursor:pointer;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;font-family:inherit}
|
||||
.hdr-btn:hover{background:rgba(255,255,255,.26)}
|
||||
|
||||
main{max-width:1000px;margin:0 auto;padding:28px 24px 60px}
|
||||
|
||||
.wip{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(135deg,var(--pri-soft),rgba(0,0,0,.02));border:1.5px dashed var(--pri);border-radius:16px;padding:18px 20px;margin-bottom:26px}
|
||||
.wip-ic{width:42px;height:42px;border-radius:11px;background:var(--pri);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.wip-ic svg{width:22px;height:22px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.wip h2{font-family:'Outfit',sans-serif;font-size:1.05rem;color:var(--pri-d);margin-bottom:4px}
|
||||
html.dark .wip h2{color:var(--pri-l)}
|
||||
.wip p{font-size:.9rem;color:var(--muted);line-height:1.55}
|
||||
|
||||
.ol-title{font-family:'Outfit',sans-serif;font-size:1.15rem;font-weight:800;margin:6px 0 14px;display:flex;align-items:center;gap:9px}
|
||||
.ol-title svg{width:20px;height:20px;stroke:var(--pri);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-list{list-style:none;background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;box-shadow:var(--sh)}
|
||||
.ol-para,.ol-note{display:flex;gap:12px;align-items:baseline;padding:12px 18px;border-bottom:1px solid var(--border)}
|
||||
.ol-list li:last-child{border-bottom:0}
|
||||
.ol-num{flex-shrink:0;min-width:46px;font-weight:800;color:var(--pri);font-size:.92rem}
|
||||
.ol-name{font-size:.94rem;color:var(--text)}
|
||||
.ol-note{background:var(--pri-soft);align-items:center;gap:10px}
|
||||
.ol-note-ic{display:inline-flex;color:var(--pri-d)}
|
||||
html.dark .ol-note-ic{color:var(--pri-l)}
|
||||
.ol-note-ic svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
|
||||
.ol-note span:last-child{font-size:.88rem;font-weight:600;color:var(--pri-d)}
|
||||
html.dark .ol-note span:last-child{color:var(--pri-l)}
|
||||
|
||||
.foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="hdr">
|
||||
<div class="hdr-inner">
|
||||
<a href="/textbook/chemistry-8" class="hdr-back">
|
||||
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
К разделам
|
||||
</a>
|
||||
<div>
|
||||
<div class="hdr-kicker">Вводный раздел · § 1–9</div>
|
||||
<h1>Количественные понятия в химии</h1>
|
||||
</div>
|
||||
<div class="hdr-side">
|
||||
<button id="theme-btn" class="hdr-btn" title="Сменить тему">
|
||||
<svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
<span id="theme-lab">Тёмная</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="wip">
|
||||
<div class="wip-ic">
|
||||
<svg viewBox="0 0 24 24"><path d="M14.7 6.3a4 4 0 0 0-5.4 5.4l-6.3 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l6.3-6.3a4 4 0 0 0 5.4-5.4l-2.6 2.6-2-2 2.6-2.6z"/></svg>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Раздел в разработке</h2>
|
||||
<p>Интерактивное наглядное наполнение этого раздела (теория, модели, симуляторы, тренажёры и боссы) добавляется поэтапно. Ниже — план параграфов раздела согласно учебнику.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="ol-title">
|
||||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h10"/></svg>
|
||||
Содержание раздела
|
||||
</div>
|
||||
<ul class="ol-list">
|
||||
<li class="ol-para"><span class="ol-num">§ 1</span><span class="ol-name">Атомы. Химические элементы. Относительная атомная масса</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 2</span><span class="ol-name">Молекулы. Простые и сложные вещества. Химические формулы. Относительная молекулярная масса</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 3</span><span class="ol-name">Химическое количество вещества</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 4</span><span class="ol-name">Моль — единица химического количества вещества. Постоянная Авогадро</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 5</span><span class="ol-name">Молярная масса. Молярный объём газов</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 6</span><span class="ol-name">Вычисление химического количества вещества по его массе и массы вещества по его химическому количеству</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 7</span><span class="ol-name">Вычисление химического количества газа по его объёму и объёма газа по его химическому количеству</span></li>
|
||||
<li class="ol-note"><span class="ol-note-ic"><svg viewBox="0 0 24 24"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></span><span>Практическая работа 1. Химическое количество вещества</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 8</span><span class="ol-name">Химические реакции</span></li>
|
||||
<li class="ol-para"><span class="ol-num">§ 9</span><span class="ol-name">Количественные расчёты по уравнениям химических реакций</span></li>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
<footer class="foot">
|
||||
Интерактивный учебник «Химия — 8 класс» · Вводный раздел · LearnSpace
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
const _TB_SLUG = 'chemistry-8-intro';
|
||||
(function(){
|
||||
var saved = localStorage.getItem('chemistry8_theme') || localStorage.getItem('theme') || 'light';
|
||||
if (saved === 'dark') document.documentElement.classList.add('dark');
|
||||
var lab = document.getElementById('theme-lab');
|
||||
if (lab) lab.textContent = saved === 'dark' ? 'Светлая' : 'Тёмная';
|
||||
document.getElementById('theme-btn').addEventListener('click', function(){
|
||||
document.documentElement.classList.toggle('dark');
|
||||
var dark = document.documentElement.classList.contains('dark');
|
||||
localStorage.setItem('chemistry8_theme', dark ? 'dark' : 'light');
|
||||
localStorage.setItem('theme', dark ? 'dark' : 'light');
|
||||
if (lab) lab.textContent = dark ? 'Светлая' : 'Тёмная';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,417 @@
|
||||
# План реализации: Химия 8 (Беларусь) — интерактивный наглядный учебник
|
||||
|
||||
> Цель: создать **с нуля** интерактивный наглядный учебник по всей программе 8 класса
|
||||
> в **современной архитектуре hub + главы** (как Физика 7–11 / Алгебра / Геометрия —
|
||||
> НЕ как легаси-монолит `chemistry_9.html`), на уровне их качества, с поправкой на
|
||||
> содержание 8 класса: **количественные понятия (моль, M, Vm, расчёты по уравнениям),
|
||||
> классы неорганических соединений, периодический закон, строение атома, химическая
|
||||
> связь, ОВР, растворы.**
|
||||
>
|
||||
> **Архитектура (утверждена):** `chemistry_8_hub.html` (хаб-каталог глав) + **7 файлов глав**
|
||||
> (вводный раздел + 6 глав книги). В БД — родитель `chemistry-8` + 7 детей с `parent_slug`.
|
||||
> Каждая глава — самостоятельная страница со своими § (см. карту ниже), модульный
|
||||
> CSS/JS на предмет. Единый стандарт с планом Химии 9 ([[plans/textbooks-9/PLAN_CHEMISTRY_9.md]]).
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Источник
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| Книга | `himiya_8kl_shimanovich_rus_2018 (1).pdf` |
|
||||
| Авторы | Шиманович И. Е., Красицкий В. А., Сечко О. И., Хвалюк В. Н. |
|
||||
| Изд. | Минск, «Народная асвета», 2018, 243 с. (тираж 116 000) |
|
||||
| Структура | **Вводный раздел + 6 глав, 52 §, 4 лабораторных опыта, 4 практические работы** |
|
||||
| Справочные таблицы | ПСХЭ Менделеева, таблица растворимости, ряд активности металлов (форзацы) |
|
||||
|
||||
PDF лежит в `G:\Dev\Тесты\Методички\тест_6 класс\Книги\`. Оглавление — стр. 238–239 PDF.
|
||||
|
||||
> **Важные отличия от Химии 9:**
|
||||
> 1. Страниц химии-8 **ещё нет** — строим с нуля. Каркас берём у **современных hub-учебников**
|
||||
> (`physics_9_hub.html` + `physics_9_chN.html`), а НЕ у легаси-монолита `chemistry_9.html`.
|
||||
> 2. Описательной химии металлов/неметаллов в 8 классе **нет** (это 9 класс) — акцент на
|
||||
> количественные расчёты, классификацию веществ, строение атома и химическую связь, ОВР.
|
||||
>
|
||||
> **Соответствие «раздел книги → файл главы → slug»:**
|
||||
>
|
||||
> | Раздел книги | § | Файл | slug | Цвет |
|
||||
> |---|---|---|---|---|
|
||||
> | Вводный: Количественные понятия | 1–9 | `chemistry_8_intro.html` | `chemistry-8-intro` | amber |
|
||||
> | Гл.1 Классы неорг. соединений | 10–23 | `chemistry_8_ch1.html` | `chemistry-8-ch1` | teal |
|
||||
> | Гл.2 Периодический закон и ПСХЭ | 24–28 | `chemistry_8_ch2.html` | `chemistry-8-ch2` | indigo |
|
||||
> | Гл.3 Строение атома | 29–35 | `chemistry_8_ch3.html` | `chemistry-8-ch3` | blue |
|
||||
> | Гл.4 Химическая связь | 36–41 | `chemistry_8_ch4.html` | `chemistry-8-ch4` | green |
|
||||
> | Гл.5 ОВР | 42–45 | `chemistry_8_ch5.html` | `chemistry-8-ch5` | deep-orange |
|
||||
> | Гл.6 Растворы | 46–52 | `chemistry_8_ch6.html` | `chemistry-8-ch6` | cyan |
|
||||
>
|
||||
> Хаб: `chemistry_8_hub.html` / slug `chemistry-8` (родитель в каталоге).
|
||||
|
||||
---
|
||||
|
||||
## 📗 ПОЛНАЯ КАРТА СОДЕРЖАНИЯ (52 §)
|
||||
|
||||
Колонка **«Интерактив»** — главный наглядный элемент сверх текста (минимум 1 «звёздный»
|
||||
виджет на §; полный набор — в стандарте ниже).
|
||||
|
||||
### ВВОДНЫЙ РАЗДЕЛ. Повторение курса 7 класса. Количественные понятия в химии (§§1–9) — *amber*
|
||||
| § | Тема | Ключ | Интерактив (звёздный виджет) |
|
||||
|---|------|------|------------------------------|
|
||||
| §1 | Атомы. Химические элементы. Относительная атомная масса | $Z$, символ, $A_r$ | **miniPeriodic** + поиск $A_r$ по элементу; модель атома |
|
||||
| §2 | Молекулы. Простые/сложные вещества. Химические формулы. $M_r$ | формула, индексы, $M_r=\sum A_r$ | **Конструктор формул** + калькулятор $M_r$ (biochem-core) |
|
||||
| §3 | Химическое количество вещества | понятие «порция», $n$ | Визуализация «порции вещества» (частицы → моль) |
|
||||
| §4 | Моль — единица количества вещества. Постоянная Авогадро | $N=n\cdot N_A$, $N_A=6{,}02\cdot10^{23}$ | **Счётчик частиц** $N\leftrightarrow n$, масштаб $N_A$ |
|
||||
| §5 | Молярная масса. Молярный объём газов | $M$ (г/моль), $V_m=22{,}4$ л/моль (н.у.) | Калькулятор $M$ + газовая модель ($V_m$) |
|
||||
| §6 | Вычисление $n$ по $m$ и $m$ по $n$ | $n=\dfrac{m}{M}$ | **Треугольник $n$–$m$–$M$** (интерактивный калькулятор-тренажёр) |
|
||||
| §7 | Вычисление $n$ газа по $V$ и $V$ по $n$ | $n=\dfrac{V}{V_m}$ | Калькулятор $V=n\cdot V_m$ + связка $m$–$n$–$V$–$N$ |
|
||||
| §8 | Химические реакции | признаки, закон сохранения массы, балансировка | **Балансировщик уравнений** (анимация коэффициентов) + классификатор типов реакций |
|
||||
| §9 | Количественные расчёты по уравнениям реакций | стехиометрия, мольные отношения | **sim `stoichiometry`** + пошаговый решатель «дано → по уравнению» |
|
||||
|
||||
**Практическая работа 1** (после §7): «Химическое количество вещества».
|
||||
|
||||
### ГЛАВА 1. Важнейшие классы неорганических соединений (§§10–23) — *teal/cyan*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §10 | Оксиды. Состав и классификация | $Э_xO_y$; осн./кисл./амфот./несолеобр. | **Классификатор оксидов** (drag формулы → класс) + конструктор формул оксидов по валентности |
|
||||
| §11 | Химические свойства оксидов | осн.оксид+кислота/вода; кисл.оксид+щёлочь/вода | **Матрица реакций оксидов** (`chemEq`, признаки) |
|
||||
| §12 | Получение и применение оксидов | горение, разложение; применение | Схемы получения + инфографика применения |
|
||||
| §13 | Кислоты. Состав и классификация | $H_xAc$; бескисл./кислородсод., основность | **Классификатор кислот** + `indicatorScale` (лакмус/метилоранж) |
|
||||
| §14 | Химические свойства кислот | + Me (ряд активности), + осн.оксид, + основание, + соль | **Реакции кислот** (4 типа) + ряд активности + `indicatorScale` |
|
||||
| §15 | Получение и применение кислот | кисл.оксид+вода, соль+кислота | Схемы получения + инфографика |
|
||||
| §16 | Основания | $Me(OH)_n$; щёлочи/нерастворимые | Конструктор $Me(OH)_n$ + `indicatorScale` (фенолфталеин малиновый) |
|
||||
| §17 | Химические свойства оснований | нейтрализация, +кисл.оксид, +соль, разложение | **Реакция нейтрализации** (анимация) + `indicatorScale` |
|
||||
| §18 | Получение и применение оснований | Me+вода, щёлочь+соль | Схемы; **Лаб.1**: получение нерастворимого основания (`testTube` $Cu(OH)_2$↓ голубой) |
|
||||
| §19 | Соли. Состав и классификация | катион×анион; средние/кислые/основные | **Конструктор солей** (катион×анион) + `solubilityTable` |
|
||||
| §20 | Химические свойства солей | РИО (↓↑), соль+Me (ряд активности) | `solubilityTable` + предсказатель РИО; **Лаб.2**: соли+металлы |
|
||||
| §21 | Получение и применение солей | 8+ способов получения | **Матрица способов получения солей** |
|
||||
| §22 | Взаимосвязь между классами неорг. веществ | генетическая связь Me/неMe → оксид → гидроксид → соль | **Генетическая карта-граф** (интерактивные переходы) |
|
||||
| §23 | Решение расчётных задач по теме | расчёты по классам, по уравнениям | **sim `stoichiometry`** + тренажёр расчётов |
|
||||
|
||||
**Лаб. опыт 1** (после §18): получение нерастворимого основания.
|
||||
**Практическая работа 2** (после §18): изучение реакции нейтрализации.
|
||||
**Лаб. опыт 2** (после §20): взаимодействие растворов солей с металлами.
|
||||
**Практическая работа 3** (после §22): решение экспериментальных задач.
|
||||
|
||||
### ГЛАВА 2. Периодический закон и периодическая система (§§24–28) — *indigo/violet*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §24 | Систематизация химических элементов | ранние классификации, металлы/неметаллы | Сортировщик элементов (Me/неMe/амфот.) |
|
||||
| §25 | Понятие об амфотерности | $Zn(OH)_2, Al(OH)_3$ + кислота **и** + щёлочь | **Амфотерность** (`testTube`, обе реакции); **Лаб.3**: гидроксид цинка |
|
||||
| §26 | Естественные семейства элементов | щелочные, ЩЗМ, галогены, инертные | **miniPeriodic** — подсветка семейств, тренды свойств |
|
||||
| §27 | Периодический закон Д. И. Менделеева | формулировка, периодичность | **Демонстрация периодичности** (карточки-раскладка элементов) |
|
||||
| §28 | Периодическая система химических элементов | период/группа/подгруппа, структура | **Интерактивная ПСХЭ** (sim `periodic`) + разбор структуры |
|
||||
|
||||
**Лаб. опыт 3** (после §25): получение гидроксида цинка и изучение амфотерных свойств.
|
||||
|
||||
### ГЛАВА 3. Строение атома и периодичность свойств (§§29–35) — *blue*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §29 | Строение атома. Атомный номер | ядро ($p^+,n^0$) + $e^-$, $Z$ | **Модель атома** (sim `bohratom`) — сборка по $Z$ |
|
||||
| §30 | Массовое число атома. Нуклиды | $A=Z+N$, нуклид | Калькулятор $A=Z+N$ + конструктор нуклида |
|
||||
| §31 | Изотопы. Явление радиоактивности | одинаковый $Z$, разный $N$; распад | Изотопы-конструктор + sim `radioactive` + расчёт $A_r$ по изотопам |
|
||||
| §32 | Состояние электронов. Электронное облако. Орбиталь | $s,p,d$ орбитали, форма облака | **3D-облака орбиталей** (sim `orbitals`) |
|
||||
| §33 | Строение электронных оболочек атомов | уровни, $2n^2$, конфигурация | **Конструктор электронной конфигурации** (`orbitalDiagram`, заполнение) |
|
||||
| §34 | Периодичность изменения свойств атомов | радиус, ЭО, металличность по периоду/группе | **Графики трендов** (slider период/группа → свойство) |
|
||||
| §35 | Характеристика элемента по положению в ПС | алгоритм «паспорта» элемента | **Генератор «паспорта элемента»** (пошагово) |
|
||||
|
||||
### ГЛАВА 4. Химическая связь (§§36–41) — *green*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §36 | Природа химической связи | октет, энергия связи, устойчивость | Анимация «почему атомы соединяются» |
|
||||
| §37 | Ковалентная связь | общие электронные пары, схемы Льюиса | **Конструктор e-пар** + структурные формулы (biochem-core) |
|
||||
| §38 | Неполярная и полярная ков. связь. ЭО | $\Delta$ЭО → полярность, диполь | **Slider ЭО → тип связи** + диполь; **Лаб.4**: модели молекул (biochem-core 3D) |
|
||||
| §39 | Ионная связь | передача $e^-$, ионная решётка | **Анимация $Na\to Cl$** + решётка $NaCl$ |
|
||||
| §40 | Металлическая связь. Межмолекулярное взаимодействие | «электронный газ», водородная связь | **Модель электронного газа** + водородная связь |
|
||||
| §41 | Кристаллическое состояние вещества | 4 типа решёток → свойства | **4 типа решёток** (3D) + связь «тип → свойства» |
|
||||
|
||||
**Лаб. опыт 4** (после §38): составление моделей молекул.
|
||||
|
||||
### ГЛАВА 5. Окислительно-восстановительные реакции (§§42–45) — *deep-orange*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §42 | Степень окисления | правила, расчёт по формуле | **Калькулятор степени окисления** (любая формула) |
|
||||
| §43 | Процессы окисления и восстановления | отдача/приём $e^-$, окислитель/восстановитель | Визуализация переноса $e^-$ |
|
||||
| §44 | Окислительно-восстановительные реакции | метод электронного баланса | **Балансировщик ОВР** (пошаговый e-баланс) |
|
||||
| §45 | ОВР вокруг нас | горение, коррозия, дыхание, батарейки | Инфографика-исследование ОВР в жизни |
|
||||
|
||||
### ГЛАВА 6. Растворы (§§46–52) — *cyan*
|
||||
| § | Тема | Ключ | Интерактив |
|
||||
|---|------|------|------------|
|
||||
| §46 | Смеси веществ | однородные/неоднородные, разделение | Классификатор смесей + методы разделения |
|
||||
| §47 | Растворение веществ в воде | гидратация, тепловой эффект | **Анимация растворения** (`dissociationAnim`) |
|
||||
| §48 | Характеристики растворимости веществ | $s=f(t)$, насыщ./ненасыщ. | **График растворимости** + `solubilityTable` |
|
||||
| §49 | Качественные характеристики состава растворов | насыщ./ненасыщ./разб./конц. | Качественная шкала «крепости» раствора |
|
||||
| §50 | Количественные характеристики. Массовая доля | $w=\dfrac{m_{в-ва}}{m_{р-ра}}$ | **Калькулятор $w$** (sim `solutions`) |
|
||||
| §51 | Молярная концентрация растворённых веществ | $c=\dfrac{n}{V}$, разбавление, смешение | **Калькулятор $c$** + разбавление/смешение |
|
||||
| §52 | Вода и растворы в жизни и деятельности человека | значение, очистка, быт | Инфографика-исследование |
|
||||
|
||||
**Практическая работа 4** (после §51): приготовление раствора с заданной $w$ и $c$.
|
||||
|
||||
**Итого**: 52 §, вводный раздел + 6 глав, **4 лаб. опыта** (§18, §20, §25, §38), **4 практические работы** (§7, §18, §22, §51).
|
||||
|
||||
---
|
||||
|
||||
## ⚗️ ХИМИЧЕСКИЙ СТАНДАРТ КАЧЕСТВА
|
||||
|
||||
### A. Движки и переиспользуемые активы (всё уже есть в проекте)
|
||||
|
||||
| Что нужно | Берём из | Файл / id |
|
||||
|-----------|----------|-----------|
|
||||
| Парсинг формул, $M$/$M_r$, формула Хилла | biochem-core | `frontend/js/biochem-core.js` ✅ |
|
||||
| 2D/3D шаростержневые модели, VSEPR | biochem-core | `frontend/js/biochem-core.js` ✅ |
|
||||
| Интерактивная ПСХЭ | sim `periodic` | реестр `_register-all.js` ✅ |
|
||||
| Модель атома (Бор) | sim `bohratom` | реестр ✅ |
|
||||
| Орбитали | sim `orbitals` | реестр ✅ |
|
||||
| Радиоактивность/изотопы | sim `radioactive` | реестр ✅ |
|
||||
| Стехиометрия | sim `stoichiometry` | реестр ✅ |
|
||||
| Титрование (нейтрализация) | sim `titration` | реестр ✅ |
|
||||
| Качественный анализ | sim `qualanalysis` | реестр ✅ |
|
||||
| Растворы / массовая доля | sim `solutions` | реестр ✅ |
|
||||
| Песочница реакций | sim `chemsandbox` | реестр ✅ |
|
||||
|
||||
Монтаж: контейнер `<div id="sim-<id>"></div>` + `openSim('<id>')` (или прямой mount
|
||||
через `window.LabRegistry`), как на остальных страницах.
|
||||
|
||||
### B. Общий хелпер `/js/chem8_svg.js` (по образцу `geom7_svg.js`, `alg10_svg.js`)
|
||||
|
||||
> **Рекомендация:** химические примитивы 8 и 9 классов сильно пересекаются. Реализовать
|
||||
> файл так, чтобы его можно было продвинуть в **общий `/js/chem_svg.js`** (план Химии 9
|
||||
> ссылается на `chem9_svg.js` — при совместной разработке свести в один shared-модуль и
|
||||
> переиспользовать оба). Молекулы — **только через `biochem-core.js`**, не дублировать.
|
||||
|
||||
```js
|
||||
// 1. Рендер уравнения реакции: коэффициенты, состояния (↑↓), стрелки, условия над стрелкой
|
||||
const chemEq = (src, opts={}) => { /* токенизация формул, верхн./нижн. индексы, →/⇌/→[t°] */ };
|
||||
|
||||
// 2. Ион с зарядом: ionLabel('SO4', -2) → 'SO₄²⁻'
|
||||
const ionLabel = (formula, charge) => { /* нижние индексы + надстрочный заряд */ };
|
||||
|
||||
// 3. Пробирка с осадком/газом/окраской (SVG-анимация)
|
||||
const testTube = ({fill, precipitate, gas, color, label}) => { /* svg */ };
|
||||
|
||||
// 4. Треугольник n–m–M (звёздный виджет §6): кликаешь искомое → формула + калькулятор
|
||||
const moleTriangle = (mount, {solveFor}) => { /* n=m/M, m=n·M, M=m/n */ };
|
||||
|
||||
// 5. Балансировщик уравнений (§8): подбор коэффициентов, проверка баланса атомов
|
||||
const equationBalancer = (mount, {skeleton}) => { /* матрица атомов, подсветка дисбаланса */ };
|
||||
|
||||
// 6. Калькулятор степени окисления (§42): формула → с.о. каждого элемента (правила)
|
||||
const oxStateCalc = (mount, {formula}) => { /* разбор, правила H+1/O−2/Σ=0 */ };
|
||||
|
||||
// 7. Балансировщик ОВР методом e-баланса (§44): полуреакции, НОК, коэффициенты
|
||||
const redoxBalancer = (mount, {skeleton}) => { /* окислитель/восстановитель, Δe⁻ */ };
|
||||
|
||||
// 8. Орбитальная диаграмма (§33): orbitalDiagram('1s2 2s2 2p4') → клетки + ↑↓
|
||||
const orbitalDiagram = (config) => { /* svg клетки, принцип Хунда/Паули */ };
|
||||
|
||||
// 9. Интерактивная таблица растворимости (§19,20,48): подсветка пары катион×анион (Р/Н/М/—)
|
||||
const solubilityTable = (mount, {highlight}) => { /* из форзаца книги */ };
|
||||
|
||||
// 10. Интерактивный ряд активности металлов (§14,20): клик → предсказание реакции
|
||||
const activitySeries = (mount, opts) => { /* K Ca Na Mg Al Zn Fe ... Au + (H₂) */ };
|
||||
|
||||
// 11. Мини-ПСХЭ с подсветкой (§1,26,34): элемент/группа/период/семейство
|
||||
const miniPeriodic = (mount, {highlight, onClick}) => { /* интерактивная сетка */ };
|
||||
|
||||
// 12. Индикатор + шкала pH (§13,14,16,17): лакмус/фенолфталеин/метилоранж
|
||||
const indicatorScale = (mount, {ph, indicator}) => { /* цвет полоски */ };
|
||||
|
||||
// 13. Анимация растворения/гидратации (§47): частицы воды окружают ионы/молекулы
|
||||
const dissociationAnim = (mount, {substance}) => { /* canvas/SVG-частицы */ };
|
||||
|
||||
// 14. Классификатор-DnD (§10,13,16,19,46): drag формулы → класс/тип; проверка
|
||||
const classifier = (mount, {items, buckets}) => { /* оксиды/кислоты/основания/соли/смеси */ };
|
||||
|
||||
// 15. Генетическая карта-граф (§22): Me/неMe → оксид → гидроксид → соль, клик-переходы
|
||||
const geneticMap = (mount, opts) => { /* SVG-граф классов + рендер реакции перехода */ };
|
||||
```
|
||||
|
||||
### C. Правила рендера химии (обязательны с §1)
|
||||
|
||||
1. **Формулы веществ** — нижние индексы для атомов ($H_2O$, $CaCO_3$), верхние для зарядов
|
||||
ионов ($SO_4^{2-}$) и степеней окисления ($\overset{+2}{Ca}$); единый рендер через
|
||||
`chemEq`/`ionLabel`, не «сырой» текст.
|
||||
2. **Уравнения реакций** — всегда сбалансированы; стрелки `=`/`→` (необратимая),
|
||||
`⇌` (обратимая), `↑` (газ), `↓` (осадок), условия над стрелкой ($t$, кат., эл.ток).
|
||||
3. **Состояние/признак** — для качественных реакций показывать цвет осадка, пузырьки газа,
|
||||
изменение окраски индикатора (через `testTube`/`indicatorScale`).
|
||||
4. **Количественные расчёты** — каждый расчётный § даёт калькулятор/тренажёр с пошаговым
|
||||
решением (дано → формула → подстановка → ответ с единицами), не только готовый ответ.
|
||||
5. **Молекулярные модели** — структурная формула + 3D (biochem-core) для каждой изучаемой
|
||||
молекулы (§37–38, §41); для типов решёток — 3D-ячейки.
|
||||
6. **Цвета — химически достоверные**: осадки ($Cu(OH)_2$ голубой, $Fe(OH)_3$ бурый,
|
||||
$Zn(OH)_2$ белый); индикаторы (фенолфталеин в щёлочи малиновый, лакмус в кислоте красный,
|
||||
метилоранж в кислоте розовый).
|
||||
7. **Безопасность** — где уместно (растворение кислот/щелочей, разбавление) — заметка-«скрепка».
|
||||
8. **KaTeX-эскейпы** — в JS-шаблонах двойной backslash (`\\to`, `\\downarrow`, `\\rightleftharpoons`).
|
||||
9. **Drag/слайдеры** — `window`-listeners + `{passive:false}` + state ВЫШЕ `redraw()`
|
||||
(стандарт геометрии), `touch-action:none` на draggable SVG/canvas, **без `setPointerCapture`**.
|
||||
10. **Без эмоджи** — только inline SVG `.ic`/`.ico` (правило проекта [[feedback_no_emoji]]).
|
||||
|
||||
### D. Типы интерактивов по темам 8 класса
|
||||
|
||||
| Тип темы | Интерактив |
|
||||
|----------|------------|
|
||||
| Количество вещества (§3–7, 9) | `moleTriangle`, калькуляторы $M/V_m/N$, sim `stoichiometry` |
|
||||
| Химические реакции (§8) | `equationBalancer`, классификатор типов |
|
||||
| Классы соединений (§10–21) | `classifier`, матрицы реакций, `indicatorScale`, `solubilityTable`, `activitySeries` |
|
||||
| Генетическая связь (§22) | `geneticMap` |
|
||||
| Периодический закон / ПСХЭ (§24–28, 34) | `miniPeriodic`, sim `periodic`, графики трендов |
|
||||
| Строение атома (§29–33) | sim `bohratom`, sim `orbitals`, sim `radioactive`, `orbitalDiagram` |
|
||||
| Химическая связь (§36–41) | slider ЭО, biochem-core 3D, ионная/металлич. решётка, 4 типа кристаллов |
|
||||
| ОВР (§42–44) | `oxStateCalc`, `redoxBalancer`, визуализация переноса $e^-$ |
|
||||
| Растворы (§46–52) | `dissociationAnim`, график растворимости, sim `solutions`, калькулятор $c$ |
|
||||
| Качественные/амфотерность (§18,25) | `testTube` + уравнение + признак |
|
||||
|
||||
---
|
||||
|
||||
## 📦 СТРУКТУРА КАЖДОГО § (стандарт наполнения)
|
||||
|
||||
**Теория (3–4 карточки):**
|
||||
- `theory` — основное определение/понятие + наглядная SVG/модель
|
||||
- `rule` — ключевая закономерность/формула (рамка)
|
||||
- `example` — разобранный пример (реакция/расчёт) с пошаговым рендером
|
||||
- (для прикладных §) `apply` — применение/значение (инфографика)
|
||||
|
||||
**Интерактивы (4–6 на §):**
|
||||
1. **Звёздный виджет** темы (из карты содержания)
|
||||
2. **Конструктор/симулятор** (slider / drag / sim из реестра)
|
||||
3. **Калькулятор** ($M$, $n$, $w$, $c$, с.о., по уравнению) — где применимо
|
||||
4. **DnD-классификатор** (классы веществ, тип связи/реакции, тип решётки)
|
||||
5. **Тренажёр** — 5 задач с inline-наглядностью (формула/уравнение/модель в условии)
|
||||
6. **Босс §** — 4 интеграционные задачи (+5 XP каждая)
|
||||
|
||||
**Дополнительно:** пополнение глоссария (термины §, `[[ссылки]]`), «Вопросы и задания»
|
||||
из учебника (адаптированные, с проверкой), проходящий jsdom-тест страницы.
|
||||
|
||||
**Финал главы:** итоговая шпаргалка (mini-cards), карта связей (SVG-граф понятий),
|
||||
7 интегрированных боссов (+10 XP), achievement «Мастер главы N» (+50 XP, confetti),
|
||||
кнопка перехода к следующей главе.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ПОРЯДОК РЕАЛИЗАЦИИ (по фазам)
|
||||
|
||||
### Phase 0 — Фундамент (hub + каркасы глав)
|
||||
- **`chemistry_8_hub.html`** — хаб-каталог 7 глав по образцу `physics_9_hub.html`: палитра
|
||||
**amber**, водяной знак «ХИМИЯ», карточки глав с прогрессом (грузится из
|
||||
`/api/textbooks/chemistry-8/children`), блок «Финал курса» (шпаргалка + боссы — наполняется в Phase 7),
|
||||
achievement-strip «Химик 8 класса», тема (localStorage `chemistry8_theme`).
|
||||
- **7 файлов глав** `chemistry_8_intro.html` + `chemistry_8_ch1..ch6.html` — на Phase 0
|
||||
валидные каркасы-заглушки (header с водяным знаком, hero, sidebar-оглавление §, контейнер
|
||||
параграфов, XP/tracker-интеграция), наполнение § — в Phase 1–6.
|
||||
- **`/js/chem8_svg.js`** (хелперы B — заглушки → реализация по фазам).
|
||||
- Подключить `biochem-core.js` + нужные симуляторы на страницах глав.
|
||||
- **Миграция `041_chemistry8_hub.sql`** (следующий номер после `040_content_access.sql`):
|
||||
**INSERT** родителя `chemistry-8` (`html_path='chemistry_8_hub.html'`, `para_count=52`,
|
||||
`color='amber'`, `parent_slug=NULL`) + **7 детей** `chemistry-8-intro`/`-ch1..-ch6`
|
||||
(`parent_slug='chemistry-8'`, свои `html_path`/`para_count`/`color`/`sort_order`) — по образцу
|
||||
`038_physics_9_hub.sql`. Применить `npm run migrate`.
|
||||
- jsdom-тест-каркас: хаб строится, все 8 файлов парсятся, ссылки глав ведут на существующие slug.
|
||||
|
||||
### Phase 1 — Вводный раздел «Количественные понятия» (§§1–9) + ПР1 — фундамент расчётов
|
||||
Базовые движки: калькулятор $M_r$ (biochem-core), `moleTriangle`, связка $m$–$n$–$V$–$N$,
|
||||
`equationBalancer`, sim `stoichiometry`. **Критично** — эти расчёты используются во всех главах.
|
||||
|
||||
### Phase 2 — Глава 1 «Классы неорганических соединений» (§§10–23) + Лаб.1,2 + ПР2,3
|
||||
Самая объёмная. Закладываем `classifier`, `indicatorScale`, `solubilityTable`,
|
||||
`activitySeries`, матрицы реакций, `testTube` (первые качественные/нейтрализация),
|
||||
`geneticMap` (§22), sim `titration`.
|
||||
|
||||
### Phase 3 — Глава 2 «Периодический закон и ПСХЭ» (§§24–28) + Лаб.3
|
||||
`miniPeriodic`, sim `periodic`, амфотерность ($Zn(OH)_2$ — обе реакции + `testTube`),
|
||||
демонстрация периодичности.
|
||||
|
||||
### Phase 4 — Глава 3 «Строение атома» (§§29–35)
|
||||
sim `bohratom`, sim `orbitals`, sim `radioactive`, `orbitalDiagram`, графики периодических
|
||||
трендов, генератор «паспорта элемента».
|
||||
|
||||
### Phase 5 — Глава 4 «Химическая связь» (§§36–41) + Лаб.4
|
||||
slider ЭО → тип связи, biochem-core 3D-модели, ионная/металлическая решётки,
|
||||
4 типа кристаллических решёток (3D) и связь «тип → свойства».
|
||||
|
||||
### Phase 6 — Глава 5 «ОВР» (§§42–45) + Глава 6 «Растворы» (§§46–52) + ПР4
|
||||
`oxStateCalc`, `redoxBalancer`, визуализация переноса $e^-$; затем `dissociationAnim`,
|
||||
график растворимости, sim `solutions`, калькулятор $c$, ПР4.
|
||||
|
||||
### Phase 7 — Финалы глав + общий финал учебника
|
||||
Шпаргалки и карты связей по каждой главе; интегрированные боссы + achievements;
|
||||
**большой финал**: генетическая карта классов + строение/связь, итоговый босс-квест,
|
||||
ачивка «Химик 8 класса»; глоссарий собран и связан `[[ссылками]]`.
|
||||
|
||||
### Phase 8 — Качество и админка
|
||||
Полный прогон jsdom-тестов (каждый § — builder не stub); аудит баланса уравнений и
|
||||
KaTeX/`chemEq`-эскейпов; синхронизация с админкой (если новые sim в `lab.html` →
|
||||
обновить `ADMIN_SIMS` в `admin.html` — [[feedback_sims_admin_sync]]); проверка доступа
|
||||
по классам/ученикам ([[project_content_access]], `/api/access`).
|
||||
|
||||
> Рекомендуемый темп: внутри фазы — по 2–3 § за «волну», каждая волна = commit +
|
||||
> проходящий jsdom-тест (правило CLAUDE.md: commit изменённых файлов + push).
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ ИНТЕГРАЦИЯ С ПРОЕКТОМ
|
||||
|
||||
| Точка | Действие |
|
||||
|-------|----------|
|
||||
| **БД каталог** | `chemistry-8` в `textbooks` **отсутствует** → миграция `041_chemistry8_hub.sql`: INSERT родитель + 7 детей (образец — `038_physics_9_hub.sql`). Каталог `/api/textbooks` показывает только `parent_slug IS NULL`; хаб тянет детей через `/api/textbooks/chemistry-8/children`. |
|
||||
| **Прогресс/XP** | Автоматически: `textbook-xp-widget.js` (+5 XP/§), `textbook-tracker.js`, `LS.xp`. Доп. XP за боссов — по образцу `phys7_ch1_widgets.js`. |
|
||||
| **Симуляторы** | Реестр `frontend/js/labs/_register-all.js`. Нужные химические sim уже зарегистрированы: `periodic`, `bohratom`, `orbitals`, `radioactive`, `stoichiometry`, `titration`, `qualanalysis`, `solutions`, `chemsandbox`. |
|
||||
| **Молекулы** | `biochem-core.js` (парсинг, $M$, 2D/3D, VSEPR). |
|
||||
| **Бэкенд** | Роуты готовы: `backend/src/routes/textbooks.js` (catalog/progress/bookmarks). Доступ: `backend/src/services/contentAccess.js`. |
|
||||
| **Глоссарий** | Виджет всплывающих определений на странице (общего нет — реализовать). |
|
||||
| **Тесты** | `cd backend && npm test` (jsdom). На каждый § — тест: страница строится, builder не stub, уравнения сбалансированы. |
|
||||
| **Админка** | Новые sim в `lab.html` → синхронно `ADMIN_SIMS` в `admin.html`. |
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ КРИТИЧЕСКИЕ ПРАВИЛА
|
||||
|
||||
### ❌ НЕ делать
|
||||
- «Сырые» формулы текстом — только `chemEq`/`ionLabel`/KaTeX.
|
||||
- Несбалансированные уравнения (аудит баланса перед commit).
|
||||
- Дублировать молекулярный движок — использовать `biochem-core.js`.
|
||||
- `setPointerCapture` (теряется после `innerHTML`-replace) → `window`-listeners + state-flag.
|
||||
- `\to`, `\downarrow`, `\rightleftharpoons` без удвоения backslash в JS-шаблонах.
|
||||
- Slider-диапазоны за пределы химически возможного (концентрации, температуры, $V_m$).
|
||||
- Эмоджи — запрещены; только inline SVG `.ic`.
|
||||
- **Grep tool — запрещён**; поиск только `ast-index` ([[reference_sqlite_node]] и правила проекта).
|
||||
|
||||
### ✅ Обязательно
|
||||
- Каждый commit → jsdom-тест 100% pass.
|
||||
- Аудит баланса уравнений + KaTeX-эскейпов после каждой волны.
|
||||
- Расчётный § = калькулятор/тренажёр с **пошаговым** решением и единицами измерения.
|
||||
- Качественная реакция = уравнение (молек.+, где есть, ионное) **+ видимый признак**.
|
||||
- Цвета осадков/индикаторов — химически достоверные.
|
||||
- Все builder-функции в конце финальной волны главы — НЕ stub'ы.
|
||||
- Коммитить только изменённые файлы (не `git add -A`), сразу push.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Оценка объёма
|
||||
|
||||
| Раздел | § | Лаб/ПР | Ожидаемый LOC |
|
||||
|--------|---|--------|---------------|
|
||||
| Вводный (кол-во вещества) | 9 | ПР1 | ~7 000 (+`moleTriangle`, `equationBalancer`, `stoichiometry`) |
|
||||
| Гл.1 Классы соединений | 14 | Лаб1,2 + ПР2,3 | ~16 000 (+`classifier`, `solubilityTable`, `activitySeries`, `geneticMap`) |
|
||||
| Гл.2 ПЗ и ПСХЭ | 5 | Лаб3 | ~5 000 (+`miniPeriodic`, амфотерность) |
|
||||
| Гл.3 Строение атома | 7 | — | ~7 000 (+`orbitalDiagram`, sim bohratom/orbitals/radioactive) |
|
||||
| Гл.4 Химическая связь | 6 | Лаб4 | ~6 500 (+3D-модели, 4 решётки) |
|
||||
| Гл.5 ОВР | 4 | — | ~4 500 (+`oxStateCalc`, `redoxBalancer`) |
|
||||
| Гл.6 Растворы | 7 | ПР4 | ~7 000 (+`dissociationAnim`, sim solutions, калькулятор $c$) |
|
||||
| Финалы глав + общий | — | — | ~5 000 |
|
||||
| `/js/chem8_svg.js` хелперы | — | — | ~3 000 |
|
||||
| Хаб + 7 каркасов глав (Phase 0) | — | — | ~3 000 |
|
||||
| **Итого** | **52** | **4 лаб + 4 ПР** | **~64 000 LOC** |
|
||||
|
||||
---
|
||||
|
||||
## 🎬 Запуск
|
||||
|
||||
**Phase 0**: `chemistry_8_hub.html` (по образцу `physics_9_hub.html`) + 7 каркасов глав
|
||||
(`chemistry_8_intro.html`, `chemistry_8_ch1..ch6.html`) + `/js/chem8_svg.js` (скелет) +
|
||||
подключение `biochem-core.js`/симуляторов + миграция `041_chemistry8_hub.sql` (родитель + 7 детей)
|
||||
+ `npm run migrate` + jsdom-каркас.
|
||||
**Phase 1**: Вводный раздел (§§1–9) — закладываем движки расчётов (`moleTriangle`,
|
||||
`equationBalancer`, sim `stoichiometry`), от которых зависят все главы.
|
||||
|
||||
Дальше — последовательно по главам (Phase 2 → 6), затем финалы (Phase 7) и качество (Phase 8).
|
||||
Reference in New Issue
Block a user