1. §1 «Извлечение в столбик» — пошаговая анимация
- Поле ввода числа + пресеты 1296/2916/7744
- Async-функция clStart() рендерит классическое 'деление в столбик'
- JetBrains Mono шрифт, подсветка текущей грани цветом секции
- Поясняющий текст для каждого шага рядом
- При остатке 0: confetti + 15 XP + ачивка 'col-root'
- Для нецелых корней — корректно показывает остаток
2. §4 «Сравнение через квадраты» — визуальное доказательство
- 5 пар: 3√2 vs 2√3, 4√3 vs 3√5, √17 vs 4, ...
- SVG с двумя анимированно растущими квадратами (transform scale 0→1, spring)
- Победитель — бейдж в верхней части
- Под квадратами: (3√2)² = 18 > 12 = (2√3)²
3. §5 «Эйлеровы диаграммы» — альтернатива линейной визуализации
- 4 слайдера для границ A и B
- Два эллипса (pink/blue) с пересечением
- Режимы: 'Показать ∪' (золотой контур), '∩' (зелёная штриховка), 'Оба'
- Дополняет существующую линейную визуализацию
4. §6 «Решатель систем 3+ неравенств» — расширен с 2 до 5
- Динамический контейнер #sys-list с массивом _sysRows
- Кнопка '+ Добавить неравенство' (до 5)
- Кнопка '×' удаляет (кроме первой)
- SVG-прямая динамически масштабируется под N строк
- Совместимость с sysMode/solveLin сохранена
Старая версия: два статичных прямоугольника бок о бок (синий a×b и розовый √(ab)×√(ab)) с текстовым описанием. Зритель не видел РАВЕНСТВА площадей.
Новая версия — настоящее визуальное доказательство:
- Один большой SVG-канвас (600×280) с двумя зонами и стрелкой между ними
- Слева: прямоугольник a×b из единичных клеток (синих). Каждая клетка отдельный <rect> (всего a·b штук)
- Справа: пунктирная рамка квадрата √(ab)×√(ab) (заполнится анимацией)
- При нажатии 'Анимировать':
* Шаг 1: волна подсветки клеток жёлтым по очереди (20мс задержка)
* Шаг 2: клетки 'летят' (CSS transition 550мс на x/y) к новой позиции в квадрате,
меняя цвет с синего на розовый
* Шаг 3: финальная пульсация + KaTeX-формула с числами и бейдж 'Доказано!'
- KaTeX-формула под канвасом обновляется живо: $\sqrt{a·b}$ = ... + $\sqrt{a}·\sqrt{b}$ = ...
- 'Сбросить' возвращает в исходное положение
Бонус: для непрямого квадрата (a·b не точный квадрат) анимация всё равно работает, клетки плотно укладываются в столбцы по ceil(√ab), визуально показывая что суммарная площадь одинакова.
1. KaTeX: в config delimiters добавлены '\['/'\]' (display) и '\('/'\)' (inline) во всех 6 местах вызова renderMathInElement. Раньше initFracIrr использовал \[…\] в template literal — выводилось raw LaTeX. Теперь рендерится математически.
2. «Упрости √» переделан с нуля:
Было: непонятный drag-and-drop с пустой drop-zone и техническим хинтом
Стало: явный вопрос 'Выберите точный квадрат, который делит подкоренное'
- Карточки кандидатов крупные (с подписью "= N²" под числом)
- Не делит → красная тряска + объяснение
- Делит но не максимальный → жёлтое предупреждение
- Максимальный квадрат → зелёная анимация pop + пошаговый вывод KaTeX:
√72 = √(36·2) = √36·√2 = 6√2
- confetti + XP +8
- Кнопка 'Подсказка' даёт намёк
- На правильном ответе остальные карточки блокируются
Было: 3 уровня (i%3) × 12px — близко стоящие √2 √3 √5 π √15 наложились друг на друга.
Стало:
- Точки сортируются по координате
- Для каждой подписи ищется минимальный уровень БЕЗ перекрытия с уже размещёнными (с учётом ширины метки ~44px и шкалы в пикселях)
- До 9 уровней по 20px вверх от оси
- От подписи к точке идёт тонкая линия-выноска (0.45 opacity)
- Box-shadow на метках для разделения если плотно
Также: ось перемещена с y=60 на y=100 — больше места сверху для уровней. Контейнер 120 → 140px высоты.
Было: два изолированных блока (квадрат и линия), связь неявная.
Стало: конвейер из трёх шагов со стрелками:
[x] →(возвести в квадрат)→ [x² с площадью квадрата] →(извлечь корень)→ [|x|]
Ключевое улучшение: ползунок теперь от -8 до +8. При отрицательном x:
- площадь всё равно положительная (x²)
- корень даёт |x|, не x
- формула снизу подсвечивается янтарным предупреждением 'это |x| ≠ x'
Под конвейером: живая формула KaTeX типа 'x = 3 → x² = 9 → √9 = 3 ✓'. При отрицательном x текст явно показывает: 'x = -3 → x² = 9 → √9 = 3 ≠ -3 → это |x| = 3'.
Мобайл: вертикальная компоновка со стрелками вниз.
Было: elm.textContent = text — '✓ √72 = 6√2' выводилось буквально, а не как '✓ √72 = 6√2'.
Стало: elm.innerHTML = text — entities и теги <b> теперь рендерятся как ожидалось.
Затронуты места где feedback() получал HTML-entities: §4 dragSimp, §3 matchCheck, и др. где успех содержал '✓'.
Сначала пробовали left:105% — лежало на правом соседе.
Затем top:calc(100%+8px) — лежало на нижнем ряду.
Третий вариант (intelligent positioning) был бы over-engineered. Проще — выпилить вообще: карточки и так показывают название и % прогресса (круговой), темы видны в самом параграфе после клика.
Удалено:
- <div class='psel-card-preview'> из innerHTML карточек
- CSS правила .psel-card-preview, .psel-preview-* (оставлен display:none!important на случай если в скриптах ещё ссылается на класс)
Главная причина почему «Существует или нет?» (§1) не работал:
В buildP1 setTimeout цепочка была:
initRing() → initCalc() → initSquares() → initExists() → initDual()
initSquares() — функция-не-существует (игра запускается по кнопке через squaresStart). ReferenceError рушил цепочку, поэтому initExists() и initDual() НЕ ВЫЗЫВАЛИСЬ → у dropzones не было event-listeners для drag/click → drag-and-drop не работал.
Та же проблема была в §2 с initRationality() — функция отсутствует, riStart() запускает игру по клику.
Исправил обе цепочки.
В dragRender() (Drag 'упрости √') был while-цикл, который требовал 5 уникальных значений из набора [4,9,16,25,36,49,64,81]. Логика:
- если делит t.n нацело → всегда добавляем
- иначе → добавляем только если size<3
Для t.n=50: единственный делитель из набора это 25. После добавления sq+2 произвольных (size=3), цикл требует только делители — других нет → бесконечный цикл → зависание.
Аналогично ломалось на: 200, 48 и др.
Фикс:
1) сначала добавляем ВСЕ делители-квадраты из расширенного набора (100, 121 включены)
2) затем добивает случайными до 5 штук с лимитом 30 итераций (страховка)
3) берётся slice(0,5) на случай если ВСЕ 10 кандидатов делят t.n
После Wave 3 поле #search-inp в шапке было заменено на модальный поиск Ctrl+K с #search-modal-input. Но старая функция initSearch() в init() продолжала вызывать getElementById('search-inp').addEventListener(...) — что бросало TypeError на null и крашило init() до построения первого параграфа (отсюда подвисание страницы при загрузке).
Фикс: добавлен guard 'if(!inp) return;' — функция остаётся для обратной совместимости (на случай восстановления старого input).
1. XP/уровни: XP_LEVELS[11], addXp(source) во всех тренажёрах и квизах, синий level-up popup, XP-карточка в сайдбаре. Persists в LocalStorage algebra8_ch1_xp
2. Streak-серии: текущая+рекорд, milestones 3/5/7/10 → оранжевый popup + ачивки streak3/5/7/10. Сброс на ошибке
3. Daily Challenge: 7 задач в DAILY_TASKS, дата-гарда, кнопка в шапке с пульсирующим индикатором, модалка с вопросом, +30 XP за прохождение
4. Achievements Gallery: кнопка 'Трофеи' в шапке, модалка с сеткой 20 ачивок (ACH_DEFS), SVG-иконки, статус earned/locked
5. Circular Progress: SVG-кольцо вместо линейной полосы на карточках §§ в para-selector
6. Финальный фейерверк: при общем прогрессе ≥95% автомодалка с confetti×5, статистикой XP/streak/achievements, освоенными темами
7. Sound effects: playTone() через Web Audio, sounds.correct/wrong/levelUp/achievement, кнопка mute в шапке с LocalStorage флагом
Все существующие функции (BUILDERS, STATE.progress, achievement, goTo, buildPN) — без изменений, новое добавлено через IIFE-обёртки.
1. Ctrl+K поиск: модалка со списком, индексирует параграфы, виджеты, карточки, термины глоссария. Стрелками выбор, Enter переход
2. Клавишные шорткаты: 1-7 → §§, ←/→ навигация, Esc закрыть модалки, ? показать справку. Игнорируется при фокусе в input
3. Закладки: SVG-кнопка в углу каждой .card (filled/outlined), хранятся в LocalStorage algebra8_bookmarks. В сайдбаре раздел 'Мои закладки' с переходом и удалением
4. Глоссарий-tooltips: 13 терминов (арифметический корень, радикал, иррациональное, модуль, промежуток, интервал, отрезок, система, совокупность, двойное неравенство и др.). DOM-walker оборачивает термины в .gloss с подчёркиванием, hover показывает определение в floating-tooltip
5. Mini-map: фиксированная панель справа с точкой на каждый .card/.wg в активной секции, активная подсвечивается по скроллу, скрывается на ≤980px
6. 3-уровневая подсказка: 'Подсказка' рядом с 'Проверить' в simp4 и compare. Уровень 1: намёк, 2: шаг, 3: полный ответ (−5 очков)
7. Шпаргалка drawer на мобильном: hamburger-кнопка в шапке, sidebar выезжает справа на ≤980px (transform translateX)
1. Боксёрский ринг (§1): SVG-канаты вокруг квадрата + 4 цветные угловые подушки + ковёр-pattern + bell-звук через Web Audio API при S=36 + анимация боксёра-победителя на 2с
2. Доказательство √(ab)=√a·√b (§3): кнопка 'Воспроизвести' запускает 5-шаговую анимацию (подсветка прямоугольника → разрез на единичные клетки → склейка в квадрат → бейдж 'Доказано!')
3. Drag&drop с инерцией (§4): pointer-based DnD с ghost-карточкой следующей за курсором, drop-zone подсветка, неверный → тряска и возврат с инерцией, кнопочный fallback для тача
4. Match-игра (§3): SVG-overlay рисует линии соединения между парами выражений (синяя dashed pending → зелёная при совпадении / красная мигающая при ошибке)
5. Real-time валидация (liveCheck): ✓/✗ индикатор появляется при вводе во всех числовых input'ах без нажатия 'Проверить'
6. Game-over modal (squares): красивая модалка с рекордом, SVG-кубком, confetti
7. Hover-preview карточек §§: tooltip с темами параграфа и прогресс-баром
8. Fade-переходы между секциями: 180ms fadeOut + 220ms fadeIn с translateY
1. Финал главы:
- После buildAssessment() повторный renderMath(body) — захватывает формулы из квиза
- Дополнительный renderMath через 300ms — на случай если KaTeX не успел загрузиться
2. Мета-теги Cache-Control no-cache, no-store, must-revalidate / Pragma no-cache / Expires 0 — чтобы прежняя версия страницы не зависала в кэше браузера (поэтому и шапка не обновлялась)
Было: init() синхронно вызывал buildP1...buildFinal — 7 секций × ~500 строк HTML, плюс KaTeX renderMathInElement сканировал весь body. На медленном CPU могло подвисать на 2-5 секунд.
Стало: init() строит только §1 (через goTo('p1')). Остальные секции строятся лениво при первом goTo(id) — кэшируются в BUILT Set.
Профит: первая отрисовка в 7 раз быстрее. KaTeX-рендер тоже только для активной секции.
Прошлый коммит хранил название в Map, но старые записи в LocalStorage (Set из id-ов) подгружались с id в качестве текста — пользователь по-прежнему видел 'ring36', 'start'.
Фикс: словарь ACH_LABELS (id → название) применяется при загрузке как fallback:
- старый формат массив id-ов: id → ACH_LABELS[id]
- новый формат объект {id:text}: если text === id, используем ACH_LABELS[id]
Теперь при следующем открытии учебника старые достижения автоматически получат красивые названия.
Было: 'ring36', 'start' — внутренние id-ы достижений
Стало: 'Начало пути по корням!', 'Нашёл сторону ринга'
STATE.achievements теперь Map(id → text). Старый формат массива id-ов читается с обратной совместимостью (id используется как текст). При сохранении пишется как объект.
Убраны:
- <section class="intro"> с заголовком 'Изучаем 3 раздела физики' (там всё ещё видна была старая надпись 'Автор: Исаченкова Л. А.')
- <section class="info-grid"> с 4 info-карточками (Интерактив в каждом §, Прогресс сохраняется, Формулы — KaTeX, Светлая и тёмная тема)
Hub теперь чище: шапка → общий прогресс → 3 карточки разделов → подвал.
- Миграция 011: UPDATE textbooks SET author='' (все 4 записи)
- algebra_8.html: убрано из <title> и футера
- physics_8.html (hub): убрано из title/header/intro/footer, заменено на LearnSpace
- physics8_*.html (3 файла): убраны все вхождения '· Исаченкова' в подписях §
- physics_9.html: убраны все вхождения '· Исаченкова' в подписях §
- chemistry_9.html: убраны 3 упоминания '· Шиманович' в подписях
В каталоге /textbooks автор больше не отображается под названием (так как поле пустое).
Подход: hub-страница, а не слияние файлов.
Проблема: 3 готовых файла-главы (thermal/electro/optics) занимали 3 карточки в каталоге. Физическое слияние в один файл = 800КБ+, конфликты CSS/JS namespaces, риск сломать KaTeX.
Решение:
- Создан frontend/textbooks/physics_8.html — hub-страница с 3 крупными карточками-разделами (амбер/синий/фиолетовый)
- Карточки ссылаются напрямую на /textbooks/physics8_thermal.html и т.д. (express.static уже отдаёт эти файлы)
- Из каталога /textbooks теперь видна ОДНА карточка «Физика 8», sort_order 4
- Hub-страница показывает прогресс по каждой главе через LocalStorage (best-effort парсинг)
- Header «К каталогу», переключатель темы синхронизирован с главами
Миграция 010: удалила 3 прежние записи (physics-8-thermal/electro/optics), добавила физическо-8 → physics_8.html, para_count=40.
Эмодзи в hub не используются (только inline SVG). Эмодзи в файлах глав остались — это контент.
Интегрирован готовый интерактивный учебник по физике 8 класса (40 параграфов, разбитых на 3 файла):
- physics8_thermal.html (§1–11) — Тепловые явления
- physics8_electro.html (§12–31) — Электрические явления
- physics8_optics.html (§32–40) — Световые явления
Все три самодостаточные (KaTeX через CDN, шрифт Outfit, dark mode, анимации, эмодзи).
Автор: Исаченкова Л. А.
Миграция 009 регистрирует три новых textbook-записи:
- physics-8-thermal (amber, sort 4)
- physics-8-electro (blue, sort 5)
- physics-8-optics (violet, sort 6)
После миграции доступны через /textbook/physics-8-thermal и т.д. и видны в каталоге /textbooks.
Pre-commit hook на эмодзи обойден --no-verify по разрешению пользователя: эмодзи здесь являются частью авторского контента учебника (визуальные маркеры разделов: тепловые/электрические/оптические явления), а не нашим кодом.
Боковая шпаргалка строилась обычным HTML (Unicode-символы √ ≤ ⊂), формулы не оформлялись как настоящие математические.
Фикс:
- Все формулы в SIDEBARS обёрнуты $-делимитерами KaTeX (\sqrt, \mathbb, \cap, \subset, \Leftrightarrow и т.д.)
- После buildSidebar() вызывается renderMathInElement(box) для встроенного рендера
- Учебник теперь показывает корни и множества в правильной типографике
Файл algebra_8.html уже создан, но не появлялся в каталоге /textbooks потому что отсутствовала запись в SQLite-таблице textbooks. Миграция 008 добавляет:
- slug: algebra-8
- subject: math, grade: 8
- title: «Алгебра — 8 класс»
- author: Арефьева И. Г., Пирютко О. Н.
- html_path: algebra_8.html
- para_count: 7 (6 параграфов + Финал)
- color: pink, sort_order: 3 (после physics-9)
После применения миграции учебник доступен по /textbook/algebra-8 и виден в общем каталоге /textbooks.
Причина: .geo-acc и .dyn-acc имели overflow:hidden и без flex:0 0 auto. В flex-колонке родительская панель сжимала их при раскрытии, и контент клипировался или наезжал на соседние секции.
Фикс:
- Убран overflow:hidden — контент не клипируется
- flex: 0 0 auto — секция занимает свою натуральную высоту без сжатия
- Border-radius на summary отдельно (без overflow:hidden иначе углы тела торчат)
- Open-состояние: верхние углы скруглены, нижние квадратные (стыкуются с body)
Причина: .geo-tool-btn имел white-space:nowrap, длинные подписи ('Подобие (гомотетия)', 'Параллельность', 'Средняя линия') вылезали за пределы 1fr-ячейки 2-колоночного грида.
Фикс:
- white-space:normal + word-break:break-word + line-height 1.15 в .geo-panel-modern → текст переносится в 2 строки
- overflow-x:hidden на саму панель — гарантия что горизонтальный скролл не появится
- min-width:0 на грид и его ячейки — иначе текст не сжимался
- 'Подобие (гомотетия)' → 'Подобие' (полное название осталось в title)
Было: 13 секций подряд (включая дублирующийся заголовок 'Построения'), 35 кнопок одним сплошным длинным списком, ширина 210px, шрифт .73rem — приходилось много скроллить, инструменты сложно находить.
Стало:
- Ширина 210px → 260px
- Sticky quick-bar сверху с 4 самыми частыми: Выбор / Точка / Отрезок / Круг (фиолетовая подсветка, всегда видна)
- Все остальные инструменты — в 7 collapsible-секциях <details>:
- Линии (Прямая, Луч)
- Фигуры (Треугольник, Четырёхугольник, Многоугольник, Параллелограмм, n-угольник + control)
- Построения (Середина, Пересечение, ⊥ биссектриса, ∠ биссектриса, ∥ прямая, ⊥ прямая, Основание, Касательные, Диагонали, Описанная, Вписанная) — теперь без дублирующегося заголовка
- Треугольник (Высота, Медиана, Центроид, Ортоцентр, Средняя линия, Фалес)
- Преобразования (Симметрия, Перенос, Подобие + k-control)
- Измерения и ГМТ (Длина, Угол, Площадь, ГМТ, Т. на отрезке, Т. на круге)
- Метки (Штрихи, Дуги, Параллельность)
- Шрифт .73rem → .78rem
- Параметры/Объектов/Очистить/Задачник остались внизу без сворачивания
Причины 'один луч, работает неправильно':
1. tangDir = efVec/efLen давал тангенциальное направление, при котором преломлённый луч внутри призмы уходил вниз в основание (sFace > 1), а не в выходную правую грань → внешнего луча не было
2. По умолчанию был включён моно-режим — пользователь видел один луч без дисперсии
Исправлено:
- tangDir = 90° по часовой от efNorm (efNorm.y, -efNorm.x) — теперь падающий луч при стандартных углах попадает в выходную грань правильно
- При первом входе в режим призмы window._obWhiteLight = true → 6 спектральных лучей сразу видны (расхождение цветов)
- Добавлена кнопка 'Белый / Моно' в панель призмы для переключения
PrismSim был сломан в 3 местах:
1. incDir строился с -efNorm (наружу), а не efNorm (внутрь) → падающий луч рисовался не с той стороны
2. cosI = -(incDir·efNorm) с уже-перевёрнутым incDir давал противоречивые знаки
3. Формула Снелла rDir имела + вместо - на коэффициенте efNorm
Итог: при incAngle≈0 преломлённый луч уходил в обратную сторону, точка пересечения с выходной гранью не находилась (tRay<0), и наружный луч с дисперсией не отрисовывался → визуально 'призма не работает'.
Теперь incDir — направление распространения (внутрь призмы), cosI = +(incDir·efNorm), формула: r = (1/n)·l + (cosR − cosI/n)·n
- Расширена с 248px до 300px
- Mode selector: 5 в ряд → 2 ряда (Песочница/Классика, I/II/III законы) с понятными названиями + tooltips
- Sandbox-панель: секции Мир/Отображение/Время/Пресеты обёрнуты в <details> (collapsible) с акцентом-стрелкой
- 21 пресет сгруппирован по 5 категориям: Базовые/Столкновения/Пружины и осцилляторы/Маятники и блоки/Горки и стопки
- Шрифты увеличены с .65-.72rem до .78-.82rem (mode buttons, tool grid, checkboxes, presets, подсказки)
- Newton-панель: сцены A/B/C, классические Атвуд/Наклон/Качение — кнопки крупнее
- Topbar ctrl-dynamics: .65rem → .78rem для всех инструментов и сцен
- Подсказки (help boxes) перерисованы с большим контрастом и шрифтом
- Новый CSS-блок .dyn-panel-modern с детализированным acc-styling
- Менделеев: clamp() для font-size символа элемента (2.4rem..4.4rem) + padding-top 28px → символ не обрезается на узких панелях
- Качественные реакции: в Свободно/Тренировке Проб1-4 содержат известные ионы (видна подпись), в Тренировке Образец — отдельный неизвестный; в Экзамене можно переключаться между пробирками и ответить отдельно для каждой (verdict сохраняется)
- Стехиометрия: непрерывный анимационный цикл — волна на поверхности жидкости, пузырьки в газах/растворах, пульсирующая красная рамка + ЛИМИТ-лейбл у лимитирующего реагента, искры вдоль стрелки реакции, glow на стрелке во время реакции
- Стехиометрия → 4-шаговый wizard (Реакция → Количества → Лимит → Продукты), KaTeX в displayMode, крупные карточки
- Качественные реакции → центрированная сцена с большой пробиркой, журнал справа 290px, нижняя полка реагентов, убран список ионов
- Контраст: основной текст rgba(.92), вторичный (.7), шрифты от .85rem
ВОЛНА A — Расширенная база данных:
- Новый файл _periodic_data.js (~70 KB): PERIODIC_EXT_DATA + ISOTOPES + SPECTRA
- 30 элементов полностью (H..Au): радиусы, ионизация, теплоёмкость, теплопроводность,
кристалл, распространённость, биология, токсичность, пламя, применения, история,
этимология, минералы, типичные реакции
- 9 элементов с минимумом (Sc, Ti, V, As, Se, Kr, Hg, Pb, I)
- 60 изотопов в 20 элементах (включая ¹³¹I, ¹³⁷Cs, ⁶⁰Co, ⁹⁰Sr, ¹⁴C, ³H, U-235/238)
- 43 эмиссионных линий для 8 элементов (H, He, Li, Na, K, Ne, Ar, Hg)
ВОЛНА B — Визуальные режимы:
- Heatmap по 9 свойствам (En, mass, density, melt, boil, discovered + расширенные)
с jet-colormap, lin/log toggle, легендой, анимацией 400ms
- 3D-таблица через Three.js: bar / wave / stack modes, orbit camera, raycaster hover
- Морф между формами таблицы: standard / long (32-col, f-block inline) / short (8-col)
с staggered fade-in 800ms
- Тренды стрелками: радиус / ЭО / ИЕ / металличность с градиентными arrows
ВОЛНА C — Карточка элемента 2.0 (11 табов):
- Обзор (hero 96px символ + Z + категория-бейдж + quick stats)
- Свойства (17-row таблица расширенных параметров)
- Электроника (Bohr + статичная конфигурация)
- Изотопы (список + bar chart + weighted average mass)
- История (timeline + этимология)
- Применения (15 SVG иконок-сфер + текст)
- Биология (badge: macro/micro/trace/toxic/inert/radioactive)
- Минералы (формулы)
- Спектр (rainbow 380-780nm + линии эмиссии)
- Пламя (цвет + название)
- Реакции (типовые уравнения по типу элемента)
- Hero header с цветом типа; smooth fade transitions между табами
ВОЛНА D — Интерактивные режимы:
- Бинарные соединения: drag 2 элемента → формула (NaCl, Fe₂O₃) + тип связи (ΔЭО)
- Сравнить до 4 элементов: side-by-side + min/max highlight + chart
- Ряд активности металлов: 28 элементов от Li до Au, разделитель H
- Таблица Менделеева 1869: 63 элемента + 4 предсказанных (Ga, Sc, Ge, Tc)
с popup «предсказано vs реально»
- Таймлайн открытий 1660-2024 с slider и auto-play
ВОЛНА G — Электронные конфигурации углубление:
- Orbital filling diagram: квадратики с электронами по Хунду/Паули, glow на валентном
- Aufbau diagram с slider Z 1-118 и анимированным указателем порядка заполнения
- Квантовые числа (n, l, m_l, m_s) — hover на электрон → tooltip
- Возбуждение электронов: click на электрон в Bohr → выбор уровня → анимация
перехода с фотоном (цвет ∝ длине волны через ΔE = 13.6 eV × ...)
periodic.js: 750 → 3239 строк. Все 5 волн ADDITIVE — старая база сохранена.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>