Files
Learn_System/plans/textbooks-7/PLAN_CHEMISTRY_7_VISUAL.md
Maxim Dolgolyov c1ef1ecee9 docs(chemistry7): план визуального и интерактивного апгрейда (анимации)
~15 флагманских анимированных интерактивов поверх готового учебника:
общий движок chem7_anim.js (частицы, пузырьки, пламя, морфинг цвета,
RAF-реестр с паузой вне экрана), апгрейд виджетов по главам
(разделение смесей, 3D-молекулы, горение, ряд активности с пузырьками,
электролиз 2:1, титрование). Фазы V0-V5, правила (reduced-motion,
тёмная тема, перф, достоверная химия). Монтаж в существующие контейнеры.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 19:25:06 +03:00

22 KiB
Raw Permalink Blame History

План: визуальный и интерактивный апгрейд учебника «Химия 7»

Дата: 2026-05-30 Контекст: дополнение к PLAN_CHEMISTRY_7.md. Базовый учебник реализован полностью (все 26 §, 4 главы, виджеты в chem7_ch1..4_widgets.js), но интерактивы сейчас в основном статичные: SVG-картинки, клик-раскрытие, <select>, цветные полоски. Цель этого плана — превратить ключевые виджеты во флагманы: красивые, анимированные, «живые» интерактивы с частицами, плавными переходами и геймификацией, которые запоминаются семикласснику. Аналог PLAN_PHYSICS_9_ADVANCED_INTERACTIVES.md.


Принцип «флагмана» (красиво + анимированно)

Не очередной select+текст, а:

  • анимация в реальном времени (requestAnimationFrame): частицы, пузырьки, пламя, капли;
  • прямое управление мышью/тапом (drag, клик, ползунок), отклик сразу;
  • плавные переходы (easing, морфинг цвета, появление/исчезновение);
  • достоверная химия в движении (пузырьки H₂, рост кристаллов, цвет осадка, объёмы 2:1);
  • микро-геймификация: подсветка успеха, конфетти на боссах, мини-цель в каждом флагмане;
  • бережно к производительности и доступности (пауза вне экрана, prefers-reduced-motion).

Принцип внедрения — без переписывания: флагманы монтируются в уже существующие контейнеры виджетов (#p15-burn, #p23-water, #p9-bld, …). Старый статичный код заменяется анимированным внутри тех же mount_*. Тесты (chemistry7-page.test.js) и движок не трогаем.


A. Общий движок frontend/js/chem7_anim.js (фундамент)

Один неймспейс window.Chem7Anim со всем, что нужно флагманам, чтобы не дублировать код:

// RAF-реестр с авто-очисткой при уходе с § (goTo) и паузой вне вьюпорта
Chem7Anim.loop(canvasOrSvg, stepFn) -> handle{stop()}     // RAF + IntersectionObserver пауза
Chem7Anim.particles(host, opts)                            // система частиц (пузырьки, пар, искры, дым)
Chem7Anim.bubbles(host, {rate, color, riseSpeed})          // поток пузырьков газа (H₂, O₂, CO₂)
Chem7Anim.flame(host, {color, intensity, sparks})          // анимированное пламя (огонь/искры/дым)
Chem7Anim.colorMorph(el, fromColor, toColor, ms)           // плавная смена цвета (осадок, индикатор)
Chem7Anim.dropletInto(host, {color, onLand})               // падающая капля + расплыв цвета
Chem7Anim.grow(el, ms) / fadeSwap(el, htmlA, htmlB, ms)    // появление/морфинг содержимого
Chem7Anim.ease(t)                                          // easeInOutCubic и пресеты
Chem7Anim.confettiSmall(host)                              // лёгкое празднование (без CDN)
Chem7Anim.reduced()                                        // true при prefers-reduced-motion → упрощить
  • Один RAF-цикл на флагман; handle.stop() вызывается из cleanup при goTo (хук добавить в движок или дергать через IntersectionObserver, чтобы анимация на закрытой секции не жгла CPU).
  • Частицы — на <canvas> (производительно) либо SVG (≤30 элементов, легко стилизуется тёмной темой).
  • 3D-молекулы — через biochem-core.js (там уже есть шаростержневые 3D-модели), не дублировать.

B. Визуальный стандарт «красиво»

  1. Палитра главы уже задана (emerald/cyan/violet/blue) — анимации берут акцент главы (var(--pri), var(--pri-d), var(--pri-soft)), а не хардкод.
  2. Достоверные цвета веществ: пламя серы синее, магния — ослепительно-белое, искры железа — оранжевые; осадок Cu(OH)₂ голубой, медь красная, малахит зелёный→CuO чёрный; индикаторы (лакмус, метилоранж, фенолфталеин) — реальные оттенки.
  3. Плавность: все переходы 200–500 мс с easing; никаких резких скачков; hover-микроотклик (лёгкий подъём/тень) на кликабельных элементах.
  4. Карточка-рамка флагмана единая: заголовок, подсказка-цель, область анимации, контролы.
  5. Тёмная тема: все цвета через CSS-переменные/html.dark-ветки; canvas перечитывает фон.
  6. Доступность: при prefers-reduced-motion — статичный финальный кадр вместо цикла; aria-label на canvas; управление и с клавиатуры.
  7. Без эмодзи — только inline SVG .ic (правило проекта feedback_no_emoji).
  8. Производительность: пауза анимации, когда виджет не на экране (IntersectionObserver); cancelAnimationFrame при уходе с §; ≤1 RAF-цикл на видимый флагман.

C. Флагманы по главам (текущий виджет → анимированный апгрейд)

Глава 1 — Первоначальные понятия (emerald)

§ Контейнер Сейчас Флагман (анимация)
§2 / ПР1 #p2-sep / #pr1-sep выбор метода (текст) Симулятор разделения смесей: частицы песка оседают на фильтре, вода капает; при выпаривании — пар уходит частицами, растут кристаллы соли; магнит притягивает железные опилки (полёт частиц). RAF + particles
§5 / §6 #p5-gal / #p6-gal статичные шарики 3D-модели молекул (biochem-core): O₂/O₃/H₂/N₂/H₂O/CO₂/CH₄/NH₃ — вращение мышью, лёгкое «дыхание» атомов
§9 #p9-bld селекты → формула Конструктор со «связями-крючками»: у атомов выезжают чёрточки валентности; верное число — атомы с щелчком соединяются (snap + подсветка), неверное — отталкиваются (shake)
§10 / ЛО1 #p10-signs / #lo1-signs список признаков Анимированные опыты-демо: малахит зеленеет→чернеет (colorMorph) + пузырьки газа; CuSO₄+NaOH — падает синий осадок (частицы оседают); горение серы — синее пламя + «запах» (волны)
§11 #p11-bal статичные весы (toggle) Живые весы массы: коромысло качается и встаёт ровно; молекулы перелетают слева направо и перестраиваются в продукты; стрелка не сдвигается — «масса сохранилась»
§12 #p12-mount балансировщик (Chem8) Живой балансировщик: атомы-шарики каждого элемента слева/справа; при дисбалансе сторона «перевешивает» и мигает; ползунок коэффициента анимирует число молекул до баланса

Глава 2 — Кислород (cyan)

§ Контейнер Сейчас Флагман
§13 #p13-air статичная полоса Живая диаграмма воздуха: донат «прорисовывается», внутри летают молекулы газов в пропорции 78/21/1; hover — сектор подсвечивается и всплывает
§15 #p15-burn статичное пламя + ур-е Симулятор горения: реальное пламя частицами (flame), цвет по веществу (S — синее, Mg — белое, Fe — оранжевые искры), дым; вещество «убывает», оксид оседает; уравнение проявляется
§17 / ПР2 #p17-prod / #pr2-test схема (текст) Прибор получения O₂: нагрев колбы (свечение), пузырьки поднимаются по трубке, газ вытесняет воду в сосуде; тлеющая лучинка вспыхивает (вспышка пламени)

Глава 3 — Водород (violet)

§ Контейнер Сейчас Флагман
§19 #p19-rx текст + свотч Восстановление CuO: пробирка нагревается, поток H₂; чёрный CuO плавно краснеет до меди (colorMorph), на стенках конденсируются капли воды
§20 / ЛО3 #p20-ind / #lo3-ind цветная полоска Капля индикатора: капля падает в раствор и цвет расплывается радиально (лакмус→красный, метилоранж→розовый)
§21 #p21-act кликабельный ряд Интерактивный ряд активности: drag металла в стакан с кислотой → если левее H₂, идут пузырьки H₂ (bubbles) и металл «тает»; правее — тишина; шкала «активности» подсвечивается градиентом
ЛО4 #lo4-rx текст-результат Пробирка металл+кислота: выбор металла/кислоты → анимация пузырьков (Zn/Fe/Mg) или их отсутствие (Cu); уравнение всплывает
§22 #p22-salt селекты → формула Сборка соли: атом металла «выталкивает» водород из кислоты (H₂ улетает пузырьком), кислотный остаток соединяется с металлом → формула соли собирается с анимацией
ПР3 #pr3-test 2 кнопки Проверка чистоты H₂: «хлопок» (вспышка + волна) для смеси с воздухом vs спокойное пламя для чистого

Глава 4 — Вода (blue)

§ Контейнер Сейчас Флагман
§23 #p23-water статичные пробирки 2:1 Электролиз воды: на электродах рождаются пузырьки, трубка с H₂ наполняется вдвое быстрее, чем с O₂; счётчик объёмов растёт 2:1 в реальном времени
§24 / ЛО5 #p24-ind / #lo5-ind цветная полоска Капля индикатора в щёлочи: фенолфталеин расцветает малиновым (colorMorph), лакмус — синим
§25 / ПР4 #p25-neu / #pr4-neu стакан (toggle) Титрование-нейтрализация: капли кислоты падают в малиновый раствор, цвет постепенно бледнеет до бесцветного по мере добавления; «перелил» — предупреждение; уравнение всплывает
§26 #p26-eco список-кнопки Круговорот и очистка воды: анимированная инфографика — испарение→облака→дождь→река; на станции вода проходит фильтр и обеззараживание (поток капель по этапам)

Звёздные флагманы (вау-эффект): §15 горение, §21 ряд активности с пузырьками, §23 электролиз 2:1, §25 титрование, §5/§6 3D-молекулы, §2 разделение смесей.


D. Порядок реализации (по фазам)

Phase V0 — Движок chem7_anim.js (фундамент)

  • Создать frontend/js/chem7_anim.js (window.Chem7Anim): RAF-реестр + IntersectionObserver-пауза, система частиц на canvas, bubbles, flame, colorMorph, dropletInto, confettiSmall, ease, reduced.
  • CSS-хелперы (микро-переходы, hover-подъём, рамка флагмана) — добавить в общий chem7-anim.css (подключить в 4 главах) или инлайн-<style> в главах (как тема).
  • Подключить chem7_anim.js на 4 страницы глав (с ?v=YYYYMMDD cache-busting).
  • Хук очистки: в goTo/unmount останавливать активные циклы (через IntersectionObserver на хосте виджета — не требует правок движка).
  • jsdom-тест: движок грузится, loop/particles создают canvas без ошибок, stop() чистит RAF.

Phase V1 — Глава 1 (emerald): §2 смеси, §5/§6 3D-молекулы, §9 валентность, §10/§11/§12 реакции

Пилот: §15-стиль не тут, но §5/§6 (3D через biochem-core) и §2 (частицы) — лучшие первые «вау».

Phase V2 — Глава 2 (cyan): §13 диаграмма, §15 горение (звёздный), §17/ПР2 прибор O₂

§15 — флагман главы; на нём отрабатываем flame/particles/«вспышку лучинки».

Phase V3 — Глава 3 (violet): §19 восстановление, §20/ЛО3 индикаторы, §21 ряд активности (звёздный), ЛО4, §22 соли, ПР3

§21 с drag-and-bubbles — флагман; переиспользуем bubbles/colorMorph из V2.

Phase V4 — Глава 4 (blue): §23 электролиз (звёздный), §24/ЛО5 индикаторы, §25/ПР4 титрование (звёздный), §26 круговорот

§23 (2:1) и §25 (титрование) — два флагмана; добиваем dropletInto и счётчики.

Phase V5 — Полировка

  • Аудит: каждый RAF имеет пауза/stop, пауза вне экрана, корректный cleanup при goTo.
  • prefers-reduced-motion: статичный кадр; проверить тёмную тему на всех canvas.
  • Производительность: профиль на слабом устройстве; ≤1 активный цикл на видимый флагман.
  • Микро-геймификация: confettiSmall на победе боссов глав; подсветка успеха в флагманах.

Темп: 2–3 флагмана за «волну», каждая = commit + проходящий тест (правило CLAUDE.md). После каждой волны — проверка персиста правок через node-маркеры (флака кириллического пути, см. project_chemistry7_textbook / feedback_verify_edits_applied) и push.


E. Технологический стек

  • Canvas 2D — частицы, пузырьки, пламя, дым (производительно, десятки-сотни частиц).
  • SVG + CSS-анимации/transition — лёгкие переходы, морфинг цвета, появление (≤30 элементов).
  • biochem-core.js — 3D-модели молекул (вращение) — НЕ дублировать.
  • Chem8.chemEq — рендер уравнений (всплывающие формулы) — переиспользовать.
  • requestAnimationFrame + RAF-реестр в chem7_anim.js; IntersectionObserver — пауза вне экрана.
  • Web Audio (опционально) — лёгкий «хлопок» гремучего газа, «пшик» лучинки (с тумблером звука, по умолчанию выкл).
  • Без внешних CDN для анимаций (свой confettiSmall); KaTeX/biochem-core уже подключены.

Шаблон флагмана (внутри существующего mount_*)

function mount_p15() {
  var host = $('p15-burn'); if (!host || host._built) return; host._built = 1;
  // ... контролы (select вещества + кнопка) ...
  var anim = null;
  function ignite(fuel){
    if (anim) anim.stop();
    anim = Chem7Anim.flame(host.querySelector('.stage'), { color: fuel.flame, sparks: fuel.el==='Fe' });
    // дым, убывание вещества, оседание оксида, всплытие уравнения...
  }
  // пауза вне экрана + stop при уходе:
  Chem7Anim.onHidden(host, function(){ if (anim) anim.stop(); });
}

F. Критические правила

НЕ делать

  • Бесконечный RAF без паузы/stop (жжёт CPU/батарею) — всегда IntersectionObserver-пауза + cleanup.
  • Хардкод цветов мимо палитры главы и тёмной темы.
  • Анимации без prefers-reduced-motion-ветки.
  • Дублировать 3D-движок молекул — только biochem-core.js.
  • Эмодзи — только inline SVG .ic.
  • Менять химию ради «красоты» (объёмы 2:1, достоверные цвета пламени/осадков/индикаторов).
  • Ломать тесты chemistry7-page.test.js (флагманы монтируются в те же контейнеры; ассерты на наличие узлов оставить рабочими).

Обязательно

  • Один RAF-цикл на видимый флагман; stop() при уходе с § и пауза вне вьюпорта.
  • Достоверные цвета и пропорции (пламя S синее / Mg белое / Fe искры; H₂:O₂=2:1; осадки/индикаторы).
  • Тёмная тема и prefers-reduced-motion проверены на каждом флагмане.
  • После волны: jsdom-тест зелёный + проверка персиста правок node-маркером + push.
  • Cache-busting ?v=YYYYMMDD на chem7_anim.js и обновлённых chem7_chN_widgets.js.

G. Оценка объёма

Блок Что LOC
V0 движок chem7_anim.js (частицы, bubbles, flame, colorMorph, droplet, RAF-реестр, confetti) + CSS ~1 200
V1 Гл.1 смеси, 3D-молекулы, валентность-крючки, реакции/весы/балансировщик ~1 400
V2 Гл.2 диаграмма воздуха, горение (звёздный), прибор O₂ ~1 100
V3 Гл.3 восстановление, индикаторы-капля, ряд активности (звёздный), соли, ПР3 ~1 400
V4 Гл.4 электролиз 2:1 (звёздный), индикаторы, титрование (звёздный), круговорот ~1 300
V5 полировка reduced-motion, тёмная тема, перф, конфетти, аудит ~400
Итого ~15 флагманов + движок ~6 800 LOC

Прирост идёт поверх готового учебника: меняются тела mount_* (статика → анимация), добавляется один общий движок. Базовая логика (POOLS, теория, прогресс, KaTeX) не трогается.


H. Связанные документы


🎬 Запуск

Phase V0: chem7_anim.js (движок частиц/RAF) + подключение на 4 страницы + jsdom-тест каркаса. Phase V1: пилот на Главе 1 — §5/§6 3D-молекулы (biochem-core) и §2 разделение смесей (частицы): самые быстрые «вау» с минимальным риском. Если заходит — катим V2→V4 по звёздным флагманам (§15 горение, §21 ряд активности, §23 электролиз, §25 титрование).