Commit Graph

538 Commits

Author SHA1 Message Date
Maxim Dolgolyov 29a2bae7d9 feat(phys8 hub): Phase 5 — hub polish + cross-cutting
Hub улучшения:
- .ch-card: подъём на hover (-6px scale 1.01) с тематической box-shadow
  по цвету главы.
- .ch-cover::after: shimmer-overlay при наведении (diagonal sweep).
- .ch-cover-wm: micro-перемещение и scale на hover.
- .ch-action svg: стрелка едет вправо на hover.
- .po-xp: пульсирующая тень для overall progress XP-badge (3s loop).

Accessibility:
- aria-label на каждой ch-card с понятным названием темы.
- :focus-visible с 3px outline в brand-цвете для chapter cards.
- :focus-visible с белым outline для hdr-btn на градиенте.
- prefers-reduced-motion: блокирует все анимации.

Mobile responsiveness:
- @media ≤580px: уменьшение шрифта h1 1.4rem, ch-cover-wm 3.8rem.

Footer: '40 параграфов, 7 ЛР, 47 IV-6 интерактивов'.
2026-05-30 10:31:05 +03:00
Maxim Dolgolyov 382dff3879 feat(phys8 lab): Phase 4 — Лабораторный практикум (визуал + 7 IV-6)
Hero: emerald-зелёный градиент (стиль 'химической лаборатории'),
flask SVG-watermark, live meter '7/7 ЛР'.

7 section watermarks: термометр, печь, цепь, посл/парал, P, угол.

7 IV-6 интерактивов:
ЛР1 Теплообмен: 2 ёмкости (0.5 кг + 1 кг), scrubbers T₁/T₂,
кнопка 'Смешать' с tween-анимацией, формула баланса.
ЛР2 Удельная теплоёмкость: scrubbers P/m/t, нагреватель,
термометр с цветовой картой, c=Q/(mΔT) для воды (4200).
ЛР3 Простейшая цепь: батарея+амперметр+лампа+вольтметр,
scrubber U, live показания приборов.
ЛР4 Последовательное соединение: U=U₁+U₂, I одинаков.
ЛР5 Параллельное соединение: U одинаков, I=I₁+I₂.
ЛР6 Работа и мощность: U·I·t, лампа brightness ∝ P,
лучи при P>100 Вт.
ЛР7 Закон отражения: луч + нормаль + угловые дуги,
verdict 'α=β'.
2026-05-30 10:29:50 +03:00
Maxim Dolgolyov aa2e869b93 feat(phys9 flagships): F18 Магистр-симулятор (финал курса)
F18. Магистр-симулятор сценария движения (final5 в ch5):
- Конструктор из 4 типов этапов:
  - Равномерное (slider v)
  - Равноускоренное (slider a)
  - Свободное падение (a = -g)
  - Стоп/покой
- Drag&drop карточек этапов с inline-input'ами:
  - Δt длительность
  - Параметр (v / a / —)
- Кнопка [×] удалить этап
- Шаблон «разгон + равном. + торможение»
- Реальная физика: Эйлер dt=0.05 с
- 3 синхронных графика: x(t), v(t), a(t)
  - Автоматический масштаб по min/max
- Stats: число этапов, общая длительность, итог x и v
- Проверка согласованности скоростей между этапами (предупреждение
  о «рывке» если v не сшивается)
- Сохранение/загрузка сценария в localStorage
  (phys9_F18_scenario)

Подключение: ch5 + хук на final5.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:29:42 +03:00
Maxim Dolgolyov ca67ae6e0d feat(phys8 ch3): Phase 3 — Световые явления (визуал + 9 IV-6)
Hero: spectrum-drift градиент (18s), солнце SVG-watermark
(rotate-анимация 40s), live-meter длины волны (400/470/550/600/700 нм
с цветами цикла).

9 section watermarks: лампа, тень, угол, зеркало, парабола,
рефракция, линза, призма, глаз.

9 IV-6 интерактивов:
§32 Источники — кнопки 'Точечный/Протяжённый' с динамической
тенью (точечный — чёткая, протяжённый — с полутенью).
§33 Тени — drag-источника по X, размер тени пересчитывается
проективно.
§34 Закон отражения — scrubber угла, лучи + нормаль.
§35 Плоское зеркало — drag-d объекта, мнимое изображение за
зеркалом на том же расстоянии (штриховая стрелка).
§36 Сферическое зеркало — drag-d, формула 1/v+1/d=1/F,
изображение с правильным знаком/размером.
§37 Преломление — scrubber угла, закон Снеллиуса (n₁=1, n₂=1.33).
§38 Линза — 3 главных луча от объекта, формула v=dF/(d-F),
изображение по принципу геометрической оптики.
§39 Дисперсия — призма с разложением белого света на 7 цветов
видимого спектра.
§40 Глаз — кнопки 'Норма/Близорукость/Дальнозоркость' с
fokus-точкой и корректирующей линзой (рассеив/собир).
2026-05-30 10:26:17 +03:00
Maxim Dolgolyov e316d39264 feat(phys9 flagships): F6 дорога + F13 Фуко + F14 резонанс
F6. Симулятор скоростной дороги (§20 в ch2):
- 5 покрытий: сухой/мокрый асфальт, гравий, снег, лёд (μ=0.7..0.08)
- Slider скорости 20..180 км/ч
- Автомобиль едет по дороге, кнопка ТОРМОЗ → тормозит до 0
- Расчёт: s = v²/(2μg), t = v/(μg)
- На льду тормозной путь в ~8 раз длиннее асфальта

F13. Маятник Фуко (§36 в ch4):
- Маятник в виде розетки, плоскость вращается со скоростью
  ω = sin(φ) · 2π / 24h
- Slider широты 0..90° (от экватора до полюса)
- На полюсе — 24ч полного оборота, на экваторе — никогда
- Slider «ускорение времени» × (100..20000) — чтобы увидеть розетку
- Места: экватор/Каир/Рим/Минск/Москва/Заполярье/полюс

F14. Резонанс пружинного маятника (§36 в ch4):
- Слева: пружина с грузом + внешняя гармоническая сила
- Slider'ы: m, k, ν_внешн, γ затухание
- Кнопка «Настроить на резонанс» (ν_внешн = ν_собств)
- Реальная физика затухания: m·x'' = -kx - γv + F0·cos(ωt)
- Справа: график x(t) за последние 20 с
- Классификация: вынужденные / близко к резонансу / РЕЗОНАНС!

Подключение:
- ch2: F6 на p20
- ch4: F13 + F14 оба на p36 (маятники)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:23:57 +03:00
Maxim Dolgolyov 0d9226f6d5 feat(phys8 ch2): Phase 2.3 — оставшиеся 14 IV-6 (Ch2 завершена)
scrubberWidget() helper в скрипте — генерирует виджет с N
scrubbers + 1 readout + live SVG render.

§13 Проводники/диэлектрики: 2 стержня, движущиеся электроны в меди,
застрявшие в стекле. Анимация через setInterval.

§14 Электростатическая индукция: + палочка + проводник, при
сближении видны индуцированные −/+ заряды на сторонах.

§15 q=ne: сфера тела с радиально размещёнными ±зарядами,
расчёт n = q/e.

§16 Строение атома: ядро + N электронов на orbitals (2-8-8-2 shells).

§18 A=qU: 2 пластины + drag-arrow с подписью работы.

§19 ЭДС: батарея с readout ε = A/q.

§20 I=q/t: провод с анимированными носителями.

§21 Замкнутая цепь: батарея + switch + лампа, кнопка открыть/замкнуть.

§23 R=ρl/S: динамический wire с длиной/толщиной по scrubberу,
R вычисляется для меди.

§24 Последовательное: 2 резистора, общее R=R1+R2, I.

§26 P=UI: светящаяся лампа brightness ∝ P, лучи при P>120 Вт.

§27 A=UIt: time-bar 0-24 ч, A в кВт·ч.

§29 B≈I вокруг провода: концентрические штриховые круги, opacity ∝ |I|.

§31 Электромагнит: соленоид (число катушек по N), железный сердечник,
полевые линии-параболы с интенсивностью по B=NI.
2026-05-30 10:20:49 +03:00
Maxim Dolgolyov 4d53919e9a feat(phys9 flagships): F9 мост + F11 бильярд + F19 ракета (Wave C+D+финал)
F9. Конструктор моста (§28 в ch3):
- Canvas 700×380: балка на 2 опорах
- Палитра грузов 50/100/200/500 кг (drag&drop) + тест 1000 кг
- Расчёт реакций опор через ΣF=0 + ΣM=0
- При перегрузке (>8000 Н) балка ломается визуально

F11. Бильярдная физика (§32 в ch4):
- Canvas 700×380, зелёный стол, 4 шара
- Тяни мышью от битка → прицельный вектор, отпусти → удар
- Реальные упругие столкновения по нормали
- Трение поля, отскоки от бортов, trails
- Stats: Σ p, Σ Ek

F19. Полёт ракеты (final4, финальный босс):
- Canvas 700×420 — космос со звёздами, Земля внизу
- 4 slider'а: m₀, m_f, v_газов, расход q
- Реальная физика: тяга F = q·u, g(h), сопротивление ρ(h)e^(-h/8000)
- Анимация ракеты с пламенем + перемещение по высоте
- Цель: 400 км (МКС)
- При успехе: +150 XP, localStorage 'phys9_F19_success'

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:19:55 +03:00
Maxim Dolgolyov da6dd96aac feat(phys8 ch2): Phase 2.2 — 6 флагман-интерактивов
§12 Charge Sandbox: canvas с динамическим добавлением зарядов.
Click → +заряд (или - через кнопку), drag для перемещения,
стрелки взаимодействия по Кулону (красные=отталкивание,
зелёные=притяжение). Кнопки '+/-', 'Очистить'.

§17 Field Visualizer: drag-зарядов с live перерисовкой
силовых линий. От каждого + рисуются 16 линий, идущих
по полю E через интегрирование шагами. Линии останавливаются
у − зарядов или вылетают за canvas.

§22 Закон Ома: SVG цепь батарея + резистор + лампа.
Scrubbers U (0.5-12 В), R (1-100 Ом). I=U/R обновляется
live, яркость лампы ∝ I (glow при I>0.3).

§25 Параллельные резисторы: SVG цепь с разветвлением.
Scrubbers R₁, R₂. Live расчёт R_общ = R₁R₂/(R₁+R₂),
I₁, I₂ для каждой ветви, общий I.

§28 Магниты: canvas с 2 drag-магнитами (N-S полюса).
При сближении inner полюсов (S-N) рисуются стрелки
притяжения с величиной по F~1/d².

§30 Опыт Эрстеда: SVG провод с током (scrubber -5..+5 А)
и компас под ним. Силовые линии магн. поля вокруг провода
(концентрические штриховые круги) с opacity ∝ |I|.
Стрелка компаса отклоняется по arctan(I), угол выводится.
2026-05-30 10:17:23 +03:00
Maxim Dolgolyov 1f82a980de feat(phys9 flagships): F10 аквариум + F12 горки (Wave C+D пилоты)
F10. Виртуальный аквариум (§29 в ch3):
- Canvas 640×380 с переключателем жидкости (вода/масло/ртуть)
- Палитра 7 материалов: дерево, пенопласт, пластик, лёд, алюминий,
  железо, золото (с указанием ρ)
- Клик по материалу → бросает кубик в аквариум
- Реальная физика плавания: F_Архимеда vs F_тяжести
- Тела плавают/тонут/висят согласно ρ_тела vs ρ_жидкости
- При смене жидкости тела перераспределяются
- Феномен: «золото плавает в ртути!»
- Контекстный feedback по последнему уложенному телу

F12. Американские горки (§35 в ch4):
- Canvas 700×360 — рисуй мышкой профиль горки слева направо
- Шаблоны: «горка» (V-образная), «петля» (волнистая)
- Slider'ы: μ трения (0..0.5), масса шарика (0.1..5 кг)
- Кнопки: Старт/Сброс/Очистить
- Реальная физика по сегментам:
  a = g·sinα - μg·cosα·sign(v)
- Real-time stats: Ep, Ek, E_total, v
- Зелёная пунктир E₀ на canvas — начальная энергия
- Красная пунктир — диссипация при трении (растёт со временем)
- ЗСМЭ виден визуально: без трения линии совпадают

Подключение:
- ch3: phys9-flagships.css + base + F10 + хук на p29
- ch4: phys9-flagships.css + base + F12 + хук на p35

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:15:41 +03:00
Maxim Dolgolyov 1de2aed05d feat(phys8 ch2): Phase 2.1 — визуальный hero + 20 IV-6 stubs
Hero: новый p8-hero с electric-pulse градиентом (5s), молнией
SVG-watermark (flicker анимация 3.2s), live meter тока в углу
(0.5 → 2.0 → 1.2 → 0.8 → 1.5 А, плавная tween).

20 section watermarks: тематические SVG символы по теме § —
2 заряда, проводник, индукция, атом, силовые линии, U-стрелка,
батарея, цепь, омега Ω, зигзаг ρl/S, посл/парал соединения,
P-мощность, магнит N/S, компас, электромагнит.

20 IV-6 stubs: 'Новый интерактив §N · coming soon' (заглушки
для Phase 2. bulk content). Все 20 builders на месте,
JS парсится.
2026-05-30 10:14:21 +03:00
Maxim Dolgolyov d190fd2de9 feat(phys9 flagships): F5 Атвуд + F7 Лифт (Wave B пилоты)
F5. Машина Атвуда (§22):
- Canvas 640×420: блок с двумя массами на нити
- Slider'ы: m₁, m₂, трение в блоке
- Запуск: бо́льшая масса опускается, меньшая поднимается
- Физика: a = ((m₁-m₂)g - μ)/(m₁+m₂)
- Анимация: блок вращается, грузы движутся, размер пропорц. m
- Показ векторов сил тяжести (m₁g, m₂g) и натяжений (T) в покое
- Stats: a, T, v, t

F7. Лифт с динамометром (§24):
- Canvas 640×460: шахта с 5 этажами + большой циферблат справа
- Слева кабина с динамометром и грузом m
- Slider'ы: m груза, a разгона
- 5 режимов кнопок:
  - Разгон ⬆ (hold) → a = +a_in
  - Разгон ⬇ (hold) → a = -a_in
  - Стоп → a = 0
  - Свободное падение → a = -g (трос показывается пунктиром)
  - Сброс
- 2 динамометра: мини в кабине + большой круглый (шкала 0..2.5g)
- Stats: P, P/(mg), v лифта, h высота
- Контекстный feedback: невесомость / норма / перегрузка / P<0

Подключение в ch2: F5 на p22 (закон Ньютона II), F7 на p24 (вес).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:13:08 +03:00
Maxim Dolgolyov d701d824ba docs(plans): план реализации учебника Физика 7 (Исаченкова, 2022)
Полный план в стиле PLAN_PHYSICS_8: 5 содержательных глав, 42 параграфа,
6 виртуальных ЛР, 8 фаз реализации, ~62 800 LOC.

Особенности курса:
- Новая глава §§1–7 «Методы познания»: измерения, СИ, цена деления, погрешность.
- Глава 4 «Давление» — гидростатика, закон Паскаля, барометры (нет в phys 8).
- Глава 5 «Работа/мощность/энергия» — закон сохранения механической энергии.
- Палитра sky/blue (#0284c7), не пересекается с violet phys 8, amber phys 10, teal phys 11.
- Новые хелперы в phys.js: forceVector, dynamometer, connectedVessels,
  hydraulicPress, mercuryBarometer, HillSlideSim, PendulumSim и др.
- Учтены уроки phys 9: cache-busting ?v=YYYYMMDD, sidebar-фикс на desktop,
  delimiters для renderMathInElement, скобка вне $..$.

Главный визуал курса — закон сохранения механической энергии
(горка с тележкой / маятник, графики E_к(t)/E_п(t)/E_полн(t)).
ИТОГО: 5-й физический курс проекта, первый учебник 7 класса по физике.
2026-05-30 10:12:48 +03:00
Maxim Dolgolyov e85f7135ff feat(phys8 ch1): Phase 1.3 — IV-6 для §2, §4, §5, §7, §9, §10, §11
Заменены оставшиеся stub'ы (Phase 1. coming soon) на реальные
интерактивы. Все 11 параграфов Ch1 теперь имеют flagship IV-6.

§2 Способы изменения U — Drag-piston:
- Цилиндр с газом, движущийся поршень (scrubber сжатия 0-100%).
- Scrubber Q для подачи тепла. Молекулы рисуются динамически
  (количество ∝ T). Цвет газа по T через P8Helpers.thermal.tempColor.
- Readouts T (°C), U (отн.).

§4 Конвекция — Animated convection cell:
- Canvas-симуляция с 60 частицами, P8Anim.raf.
- Поток вверх по центру (нагретая лёгкая вода), вниз по краям.
- Скорость потоков ∝ мощности горелки (scrubber). Цвет частиц
  по локальной T. Кнопки Пуск/Стоп.

§5 Излучение — Radiation balance:
- Лампа с 3 телами (чёрное, белое, зеркало) разной поглощающей
  способности (0.95, 0.20, 0.05).
- Scrubber мощности лампы. Симуляция P8Anim.raf: T каждого тела
  растёт ∝ absorption × power. Glow вокруг тёплых тел.

§7 Q=qm — Fuel burn:
- 3 кнопки палитры топлива (дрова q=10, уголь q=29, газ q=44 МДж/кг).
- Кастрюля с водой 1 кг. Сжигание выбранного топлива + scrubber массы.
- Q = qm, ΔT = Q/(c·m_в). Пар над кастрюлей при ΔT > 60°C.

§9 Q=λm — λ-meter:
- Select веществ (лёд, свинец, алюминий, железо) + scrubber массы.
- SVG: блок вещества + grad-arrow (Q) + расплав. Q = λ·m в реальном
  времени.

§10 Скорость испарения — 3-scrubber sandbox:
- T (0-100°C), площадь (0.01-1 м²), ветер (0-10 м/с).
- Стрелки испарения вверх с количеством ∝ rate; наклон ∝ ветру.
- Качественная демонстрация трёх факторов.

§11 Скороварка — Pressure cooker:
- Canvas: кастрюля с водой, динамические пузыри.
- Scrubber давления 0.5-3 атм. T_кип = 100 + 20·log₂(p).
- Пар, T-индикатор столбиком.

Все интерактивы +10 XP при первом использовании.
Builders все на месте, JS парсится.
2026-05-30 10:12:29 +03:00
Maxim Dolgolyov bc64828b22 feat(phys9 flagships): F3 тахометр+спидометр + F4 орбита (Wave A продолжение)
F3. Тахометр + спидометр + одометр (§11 в ch1):
- Canvas 640×400 с 3 аналоговыми приборами вверху
  (тахометр a, спидометр v, одометр Δx mod 1000)
- Графики v(t) и a(t) внизу с горизонтальной цель-линией
- Кнопки «Газ»/«Тормоз» удержанием, «Отпустить» — coast-режим
  (лёгкое торможение от трения)
- Slider'ы: a_газа, |a_тормоз|, цель скорости (по умолчанию 16.7 м/с)
- Рекорд скорости в localStorage
- Feedback при достижении цели

F4. Орбитальный конструктор (§17 в ch2):
- Canvas 640×480 (космос со звёздами)
- Планета (Земля) в центре, спутник запускается с r=200
- Slider'ы: M, v₀, угол α
- Кнопки: Запустить/Сброс/«Круговая орбита» (вычисляет v=√(M/r))
- Физика: F=GM/r² (G=1), Эйлер 8 шагов/кадр
- Trail орбиты до 1500 точек
- Классификация: падение/круговая/эллипс/убегание
- Период T через переход через ось x
- Feedback при крайних случаях

Подключение:
- ch1: phys9_flag_F3_dashboard.js + хук на p11
- ch2: phys9-flagships.css + base + F4 + хук на p17

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:10:33 +03:00
Maxim Dolgolyov cd14e1326f fix(phys8 ch1): Phase 1.2 redo — CRLF-aware stub replace
Предыдущий коммит eaee79d удалил builders §3, §5, §6, §8 из-за
greedy regex, который пересекал границы параграфов. Фактически
жалкие 211 КБ файла вместо 280 КБ.

redesign_p8_ch1_2.cjs переписан:
- Использует точный stub-text per-paragraph (с 'Новый интерактив §N'
  в title — уникальный маркер).
- Нормализует CRLF/LF (ch1.html на диске CRLF, шаблон — LF).
- Делает простой h.replace(stubText, widget) без regex с greedy.
- Sanity-чек: все 11 builders должны остаться на месте после patch.

Восстановлены §3 Heat Conductor Bench, §6 Heat Mixer, §8 Phase
Diagram T(t) — full IV-6 interactives с drag/scrubbers/Anim.raf.
Размер ch1: 295851 байт. Все 11 builders + 5 IVs in каждом + IV-6
flagship в §1, §3, §6, §8.
2026-05-30 10:08:49 +03:00
Maxim Dolgolyov 4bcc47e5be feat(phys9 flagships): инфраструктура + F1 траектория + F2 гонка (Wave A pilot)
Phase 1 + Wave A пилоты — большие интерактивы Физики 9.

frontend/css/phys9-flagships.css — стили карточек флагманов
(.flag-card с бейджем «★ ФЛАГМАН», .flag-canvas, .flag-controls,
.flag-stats, .flag-sliders, .flag-feedback). Тёмная тема поддержана.

frontend/js/flagships/phys9_flag_base.js — общая инфраструктура:
- register(id, def) — регистрация флагмана
- mount/unmount/unmountAll — управление жизненным циклом
- makeCard(secId, title, desc, body) — создание карточки
- initCanvas(id) — высокий-DPI canvas
- startLoop(id, canvas, tick) — RAF с IntersectionObserver
  (авто-пауза если canvas за экраном)
- arrow(ctx, ...) — стрелка на canvas
- saveRecord/getRecord — сохранение в localStorage
- хук на goTo: unmountAll при смене параграфа

Флагман F1. Конструктор траектории (§5):
- Canvas 600×320, рисуется мышкой/пальцем (touch support)
- Real-time расчёт пути s и перемещения |Δr|
- Шаблоны: прямая / полуокружность / замкнутая окружность
- Feedback: «прямая → s=|Δr|», «замкнутая → |Δr|→0», «кривая → s>|Δr|»
- Кнопка «Замкнуть петлю» соединяет начало и конец

Флагман F2. Гонка двух тел (§9):
- Двухпанельный canvas 640×360 (трасса слева, графики справа)
- 5 slider'ов: v₀₁, a₁, x₀₂, v₀₂, a₂
- Запуск/Пауза/Сброс/Случайный сценарий
- Реальная физика равноуск. движения, симуляция Эйлером (4 шага/кадр)
- Real-time графики x₁(t) и x₂(t), пересечение = встреча
- Автоматическое определение момента встречи (квадратное уравнение)
- При встрече — звёздочка на пересечении графиков + feedback с t и x

В physics_9_ch1.html:
- Подключены CSS + 3 JS
- Расширен хук ensureBuilt: на p5 → mount('F1','p5'), на p9 → mount('F2','p9')

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 10:06:37 +03:00
Maxim Dolgolyov eaee79dc8a feat(phys8 ch1): Phase 1.2 — IV-6 интерактивы §3, §6, §8
Заменены stub'ы 'coming soon' на полноценные drag-and-drop виджеты:

§3 Тепловая лавочка (Heat Conductor Bench):
- SVG-sandbox 560×300 с горелкой (drop zone) и 4 стержнями
  (медь λ=400, серебро λ=430, стекло λ=0.8, дерево λ=0.15).
- P8Drag.attach на каждый стержень → drop на горелку.
- При drop'е sim запускается: P8Anim.raf обновляет цвет
  каждого сегмента стержня через P8Helpers.thermal.tempColor()
  по log-нормализованной λ. Тепловая волна идёт по стержню.
- Readouts: материал, λ, T дальнего конца.

§6 Heat Mixer (Q=cmΔT):
- 2 ёмкости (m₁, T₁), (m₂, T₂) — рисуются с цветом по T.
- 4 scrubber'a (m₁, T₁, m₂, T₂) с live update SVG.
- Кнопка 'Смешать' → tween анимация в 1.2 с → итоговая T
  через формулу теплового баланса (m₁T₁+m₂T₂)/(m₁+m₂).
- Readout T_итог, кнопка 'Сброс'.

§8 График плавления (Phase Diagram T(t)):
- T-t график 560×280 с осями (-20 до 120°C, 0 до 300 с).
- Фазовые области: лёд (синий), вода (голубой), пар (жёлтый).
- Реальная симуляция: c_льда=2100, c_воды=4200, λ=330000,
  r=2300000. P8Anim.raf вычисляет накопление энергии и
  фазовые переходы — плато на 0°C (плавление) и 100°C
  (кипение).
- Scrubber мощности 100-2000 Вт. Кнопки Старт/Сброс.
- Readouts: фаза, T.

+10 XP за каждое успешное взаимодействие.
2026-05-30 10:03:55 +03:00
Maxim Dolgolyov 8f1fba25f9 docs(plans): мощный план Физики 9 — 19 флагман-интерактивов и симуляторов 2026-05-30 09:59:59 +03:00
Maxim Dolgolyov a3f7e9976e fix(phys9): cache-bust phys9_*.js + phys.js (?v=20260530)
KaTeX-фикс в phys9_ch1_widgets.js (delimiters $...$ в renderMathInElement) и
исправление ловушки $(v_1+v_2)/2$ в §7 «Средняя скорость» уже были в HEAD
(коммит 5b075cd), но из-за агрессивного браузерного кеша JS-файлов пользователи
продолжали видеть старую версию: формулы как raw текст, ловушка как
($v_1+v_2)/2$ с битым синтаксисом.

HTML уже имеет no-cache meta-теги, но они не контролируют кеш связанных JS.
Добавляю query-string ?v=20260530 к phys.js и phys9_*.js на 5 страницах глав.
2026-05-30 09:58:17 +03:00
Maxim Dolgolyov a6a9fb858c feat(phys8 ch1): Phase 1 visual hero + IV-6 §1 drag-thermometer
Визуальный редизайн ch1 Тепловые явления:
- Hero: заменён старый .hdr на новый .p8-hero с анимированным
  градиентом (thermal-shift 14s), огненным SVG-watermark
  справа (дышащая анимация 6s), live-meter в углу с пульсацией
  и плавной анимацией значения 37 → 100 → 0 → -10 → 25 → 80 °C.
- Eyebrow 'Глава 1 · 11 параграфов', крупный title, sub-описание.
- Section watermarks: в каждой <section sec-pN> добавлены
  тематические SVG (атом, конвекция, солнце, сосуд, фазовый
  переход, пузыри и т.д.) с opacity .07 на правой стороне.

IV-6 §1 flagship interactive — Drag thermometer:
- SVG-sandbox 560×320 с 4 телами (лёд, вода, чай, пар) разной
  T и относительной U.
- Draggable термометр (P8Drag.attach + P8Helpers.svg).
- При наведении на тело — изменяется цвет термометра по
  P8Helpers.thermal.tempColor(), readout табло показывают
  T (°C) и U (отн.).
- +5 XP за 12 сек исследования.

IV-6 stubs для §2-§11: 'Coming soon' плашки с тематическим
SVG-иконкой clock. Расширим в Phase 1.2.
2026-05-30 09:58:11 +03:00
Maxim Dolgolyov 5b075cde86 feat(phys9 finals): прогресс-бары и ачивки финалов Wave F + G
Новый модуль frontend/js/phys9_finals.js:

1. РАСШИРЯЕТ window.checkNum чтобы поддерживать сигнатуру
   (id, answer, unit, tol) — раньше legacy checkNum принимал только
   sec для POOLS, из-за чего кнопки «Проверить» в финалах не работали.

2. ПРОГРЕСС-БАР под заголовком каждого finalN:
   - Подсчитывает количество <input id="fin1-q1"...> в финале
   - При правильном ответе обновляет % решённых
   - +8 XP за каждую решённую задачу

3. АЧИВКИ:
   - При 100% решённых задач финала — +50 XP + бэйдж
     «★ МАСТЕР ГЛАВЫ» (физика9_chN_master)
   - При всех 5 финалах — +150 XP + ачивка «МАГИСТР ФИЗИКИ 9»
     (Wave G — финал курса)

Подключение во все 5 ch + хук на ensureBuilt вызывает
PHYS9_FINALS_INIT(id) для id вида final1..final5.

(linter добавил { delimiters, throwOnError:false } в renderMathInElement
вызовы во всех 5 widget-модулях — сохранено).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:55:44 +03:00
Maxim Dolgolyov 77e4dffb43 feat(phys8): Phase 0 redesign foundation — CSS + JS infrastructure
Закладывает уникальный визуальный язык и engine'ы для редизайна Физики 8.

CSS:
- phys8-design-system.css (12 КБ): 3 темы (thermal/electric/spectrum),
  тематические hero-палитры, watermarks, animations (thermal-shift,
  electric-pulse, spectrum-drift, wm-breathe/flicker/rotate, noise overlay),
  staggered fade-in для виджетов, soft elevation на карточках,
  monospace для физ. величин, topic-aware progress bars,
  mobile responsive (≤768px), prefers-reduced-motion.
- phys8-interactives.css (10 КБ): .p8-draggable + .p8-droptarget с
  hover-effects, .p8-palette (для circuit-builder), .p8-scrubber,
  .p8-readout табло, .p8-tooltip, .p8-sandbox canvas wrapper,
  .p8-thermometer + .p8-compass-needle SVG-композиции, glow-utility.

JS:
- phys8-anim.js (6 КБ): easing-функции (quad/cubic/expo/back/elastic/
  bounce/spring), tween-engine с onUpdate/onComplete, raf-wrapper,
  oscillate, stagger, onVisible (IntersectionObserver). Экспорт P8Anim.
- phys8-drag.js (12 КБ): универсальный drag-engine. P8Drag.attach()
  для DOM/SVG, P8Drag.attachCanvas() для логических объектов с
  hit-test, P8Drag.attachPalette() для drag-from-palette-to-drop,
  constraints (lockX/Y, bounds, snap-to-grid), touch + mouse + pointer.
- phys8-helpers.js (18 КБ): тематические хелперы. P8Helpers.thermal
  (tempColor 0-1, heatFlowArrow, molecule, thermometerSVG,
  convectionCellParticles), .em (chargeSVG, circuitComponent для
  battery/resistor/lamp/ammeter/voltmeter/switch, fieldLineFrom),
  .optics (rayLine, lensSVG converging/diverging, mirrorPlane),
  .svg utils (el, create, linearGradient, radialGradient,
  gradientArrow, labeledText).

Линковка (redesign_p8_phase0.cjs):
- 2 CSS-link после katex CDN
- 3 JS-link после phys.js/xp.js
- body class p8-theme-thermal/electric/spectrum на ch1/ch2/ch3
- hub и lab — без темы (нейтральный пурпурный brand)
2026-05-30 09:55:00 +03:00
Maxim Dolgolyov 70aad6a423 feat(phys9 ch5): добавлены 12 виджетов Wave E — Лабораторный практикум
Новый модуль frontend/js/phys9_ch5_widgets.js — экспортирует
window.PHYS9_CH5_WIDGETS = { lr1..lr12: fn }.

Каждая ЛР содержит:
- 2-4 slider'а с параметрами измерений
- Автоматический расчёт результата
- Кнопка «Сдать работу (+30 XP)» с интеграцией в XP-систему

Виджеты:
- ЛР 1: средняя скорость на 2 участках
- ЛР 2: ускорение через 2 измерения s/t²
- ЛР 3: a_n по 10 оборотам шарика на нити
- ЛР 4: g через период математического маятника + погрешность
- ЛР 5: проекции силы на наклонной (F‖, F⊥)
- ЛР 6: g = 2h/t² свободное падение + погрешность
- ЛР 7: ЗСМЭ — сравнение Ep и Ek с расчётом потерь
- ЛР 8: F_A и V тела (вес в воздухе и в воде)
- ЛР 9: условие плавания — доля погружения, статус
- ЛР 10: равновесие рычага — l₂ для баланса
- ЛР 11: КПД наклонной — A_пол/A_зат
- ЛР 12: жёсткость пружины k через период

Подключено в physics_9_ch5.html через ensureBuilt hook.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:53:29 +03:00
Maxim Dolgolyov 9d5a2959e1 fix(textbooks): кнопка «Шпаргалка» не открывала контент на desktop
На десктопе (>980px) .col-side уже видна как sticky-колонка справа в grid 1fr 280px.
Клик по кнопке #sidebar-btn добавлял .col-side-backdrop.show — backdrop с
z-index:9990 затемнял всю страницу, перекрывая sticky-aside. Со стороны
выглядело как «ничего не открылось» — на самом деле появлялась чёрная вуаль.

Фикс: @media(min-width:981px) скрывает #sidebar-btn и подавляет показ backdrop.
На мобайле (≤980px) кнопка и overlay работают как раньше.

Применено в 51 файле: physics 8/9/10 chN, algebra 7/9/10/11 chN + 8 ch2-3,
geometry 7/8/9/11 chN, geometry_10 r1-4.
2026-05-30 09:51:04 +03:00
Maxim Dolgolyov d2ce0d70b2 feat(phys9 ch4): добавлены 6 виджетов Wave D — Глава 4 «Импульс, энергия, колебания»
Новый модуль frontend/js/phys9_ch4_widgets.js — экспортирует
window.PHYS9_CH4_WIDGETS = { p31..p36: fn }.

Виджеты:
- §31 CALC: импульс p=mv с slider'ами m, v и бытовой аналогией
  (футбольный мяч / автомобиль / грузовик и т.д.)
- §32 CALC: ЗСИ — упругий и неупругий удар двух тел. m₁, v₁, m₂, v₂ →
  v₁', v₂', проверка сохранения импульса
- §33 DnD: 9 ситуаций → знак работы (A>0/A<0/A=0)
- §34 CALC: Ek+Ep с slider'ами m, v, h
- §35 CALC: ЗСМЭ — найти v в любой точке горки по высоте старта
  (h_старт=5, h_тек=0 → v=9.9 м/с)
- §36 CALC: период маятника (математ./пружинный) — переключатель,
  формула обновляется автоматически

Подключено в physics_9_ch4.html через тот же hook ensureBuilt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:50:53 +03:00
Maxim Dolgolyov 29ae219025 feat(phys9 ch3): добавлены 6 виджетов Wave C — Глава 3 «Статика»
Новый модуль frontend/js/phys9_ch3_widgets.js — экспортирует
window.PHYS9_CH3_WIDGETS = { p25..p30: fn }.

Виджеты:
- §25 CALC+VIS: равновесие рычага — 4 slider'а (m₁, l₁, m₂, l₂),
  балка наклоняется при дисбалансе, статус (равновесие/перевешивание)
- §26 DnD: 8 механизмов → 3 категории (выигрыш в силе / расстоянии /
  без выигрыша)
- §27 CALC: КПД наклонной плоскости — m, h, угол α, μ → A_пол, A_зат, η
- §28 DnD: 8 ситуаций → виды равновесия (устойчивое/неустойчивое/безразл.)
- §29 CALC: F_A=ρgV для разных жидкостей (вода/керосин/ртуть/спирт),
  сравнение с весом, статус (плавает/тонет/висит в толще)
- §30 DnD: 5 жидкостей → группы плотности

Подключено в physics_9_ch3.html через тот же hook ensureBuilt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:49:05 +03:00
Maxim Dolgolyov 88365a6f26 feat(phys9 ch2): добавлены 10 виджетов Wave B — Глава 2 «Динамика»
Новый модуль frontend/js/phys9_ch2_widgets.js — экспортирует
window.PHYS9_CH2_WIDGETS = { p15..p24: fn }. Архитектура аналогична
ch1_widgets (хелперы дублируются для self-sufficient загрузки).

Виджеты:
- §15 CALC: F=Gm₁m₂/r² с slider'ами в показателях 10^a, бытовые
  аналоги (Земля-Луна, Земля-человек)
- §16 DnD: 6 планет → группы по периоду (T<1, 1≤T<5, T≥5 лет)
- §17 CALC: связь T, ν, ω с переключателем «известная величина»
- §18 CALC+VIS: a_n=v²/R + анимированная точка по окружности
  с векторами v (касательно) и a_n (к центру), пересчёт в g
- §19 CALC: F=kx закона Гука + перевод в массу подвешенного тела
- §20 DnD: 8 пар материалов → 3 группы по μ
- §21 DnD: 8 ситуаций → инерц/неинерц СО
- §22 CALC: F=ma + что будет за 1 с
- §23 CALC: g(h) для разных высот (МКС, геостационар, поверхность)
- §24 CALC: вес P=m(g+a) в лифте с классификатором режима
  (норма/перегрузка/разгон/невесомость)

Виджеты подключены в physics_9_ch2.html через тот же hook ensureBuilt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:47:08 +03:00
Maxim Dolgolyov 09cfaa3bd2 fix(phys8): закрытие критических проблем ревью — миграции, ✓→&#10003;, ConvectionSim
- Удалены legacy миграции 009/010/015 (создавали несуществующие physics-8-thermal/electro/optics)
- 037_physics_8_hub.sql сделана self-sufficient: INSERT OR IGNORE родителя + UPDATE
- 7 шт. literal ✓ заменены на &#10003; в physics_8_lab.html (правило проекта)
- В phys.js добавлен createConvectionSim — главный визуал §4 (тороидальный поток частиц)
  закрытие плана Phase 0 Физики 8
2026-05-30 09:44:51 +03:00
Maxim Dolgolyov bf788c1c3a feat(phys9 ch1): добавлены 14 виджетов Wave A — Глава 1 «Основы кинематики»
Новый модуль frontend/js/phys9_ch1_widgets.js — экспортирует
window.PHYS9_CH1_WIDGETS = { p1..p14: fn }.

Каждая функция инжектится в pN-body через расширенный ensureBuilt hook
после оригинального билда и блока POOLS-задач. Идемпотентно
(проверка class wg-phys9-extra-<id>).

Виджеты:
- §1 DnD: 8 объектов → точка / не точка
- §2 CALC: скорость катера отн. берега (slider v_катера, v_течения,
  направление)
- §3 DnD: 8 величин → вектор / скаляр
- §4 CALC + SVG: проекции вектора по углу с тригокружностью
- §5 DnD: 6 траекторий → s=|Δr| или s>|Δr|
- §6 CALC: v=s/t с переводом в км/ч + бытовая аналогия
- §7 CALC: средневзвешенная ⟨v⟩ + ловушка «среднее арифметическое»
- §8 DnD: 6 уравнений x(t) → характер движения
- §9 CALC: время и место встречи двух тел
- §10 DnD: 6 признаков → знак мгновенной v
- §11 CALC: режим движения (ускорение/торможение/равномерное)
- §12 CALC: тормозной путь автомобиля
- §13 CALC: Δx и v при равноуск. + проверка v²−v₀²=2aΔx
- §14 DnD: 6 графиков v(t) → знак ускорения

Все виджеты используют:
- стандартные CSS-классы .wg, .sliders, .score-display, .drop-box
  (из phys-textbook-widgets.css)
- палитру PHYS9_COLORS (тёмная тема работает автоматически)
- KaTeX для формул
- единый DnD движок через wireDnd

В ch1.html подключён скрипт + расширен hook _injectTasks вызывать
PHYS9_CH1_WIDGETS[id] после рендера задач.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:44:28 +03:00
Maxim Dolgolyov 8a480c8ead docs(plans): расширенный план Физики 9 — детально по каждому § и ЛР 2026-05-30 09:39:50 +03:00
Maxim Dolgolyov 15fbd73847 feat(p8 ch2-3): IV-5 расчётные задачи для всех MCQ-only параграфов
Завершение Physics 8 — IV-5 добавлен в оставшиеся 13 параграфов:

Ch2 (Электромагнитные явления, 11 параграфов):
- §12 Электризация: 5 (выравнивание зарядов, n=q/e)
- §13 Проводники/диэлектрики: 5 (плотность носителей, I=q/t)
- §14 Электростатическая индукция: 5 (заземление, угол отклонения)
- §16 Строение атома: 5 (q=ne, заряд ядра)
- §17 Электрическое поле: 5 (E=F/q, F=qE, A=qEd, плотность линий)
- §19 Источники тока: 5 (ЭДС = A/q, A = εIt)
- §21 Электрическая цепь: 5 (I = q/t, числ. электронов)
- §28 Постоянные магниты: 5 (полюса, северный/южный)
- §29 Магнитное поле тока: 5 (F = BIL, B ∝ I)
- §30 Опыт Эрстеда: 5 (правило буравчика, год открытия)
- §31 Электромагнит: 5 (B ∝ N, B ∝ I, сердечник)

Ch3 (Световые явления, 2 параграфа):
- §32 Источники света: 5 (c=3·10^8, время до Луны/Солнца)
- §39 Дисперсия/глаз: 5 (спектр, длины волн, D=1/F)

Итого: 65 новых задач с автопроверкой, подсказкой-решением (KaTeX),
+20 XP. Все Phys 8 параграфы теперь имеют числовой тренажёр.
2026-05-30 09:36:22 +03:00
Maxim Dolgolyov ce9f29fcd0 feat(phys9): 129 canvas-цветов на PHYS9_COLORS — тёмная тема работает (Phase 3)
Mass-replace через node-скрипт (без правки HTML/CSS-частей файла):
- ctx.fillStyle = '#xxx' → ctx.fillStyle = (window.PHYS9_COLORS?...:'#xxx')
- ctx.strokeStyle = '#xxx' → аналогично
- ctx.shadowColor = '#xxx' → аналогично
- drawArrow3(..., '#xxx', ...) → drawArrow3(..., PHYS9_COLORS.x|fallback, ...)

Маппинг по физическим смыслам:
- #94a3b8 → forceNormal (slate-400, пунктир/нормаль)
- #475569 → body (тело)
- #1e293b → axis (координат. оси)
- #ef4444 → plotPrimary (основной график)
- #10b981 → force (сила)
- #3b82f6 → liquid (жидкость)
- #0284c7 → velocity (скорость)
- #ea580c → acceleration (ускорение)
- #7c3aed → forceFriction (трение)
- #2563eb → displacement (перемещение)
- ещё 8 других цветов

Все 129 замен с fallback: если PHYS9_COLORS не загружен (старый кеш),
работает прежний #цвет. Тёмная тема автоматически переключается
благодаря get-проперти в phys9_palette.js.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:32:40 +03:00
Maxim Dolgolyov 75165d900b feat(p8 ch1): IV-5 расчётные задачи для §1-5, §8, §10 (тепловые явления)
В Физике 8 ch1 §6, §7, §9, §11 уже имели IV-4 'Тренажёр N расчётных задач'.
У §1-5, §8, §10 IV-4 был только MCQ — числовых задач не было.

inject_p8_ch1_tasks.cjs добавляет IV-5 виджет после IV-4 в build_pN:
- §1 Внутр. энергия: 5 задач (T-конверсия, U vs масса/высота)
- §2 Способы изменения U: 5 (Q=ΔU+A, кин. энергия молота → тепло)
- §3 Теплопроводность: 5 (тепловой поток P=Q/t, зависимости от d, S, λ)
- §4 Конвекция: 5 (плотности тёплого/холодного, нагрев радиатором)
- §5 Излучение: 5 (солнечный поток, Стефан-Больцман упрощённо)
- §8 Плавление: 5 (Q=λm)
- §10 Испарение: 5 (Q=rm, испарение пота, лужи)

Всего 35 новых задач с автопроверкой числового ответа (±tol),
подсказкой-решением (KaTeX) и +20 XP при прохождении всей серии.
Используется существующий design system (.wg, .tinp, .feedback,
.score-display) — уже подключён через phys-textbook-widgets.css.
2026-05-30 09:30:45 +03:00
Maxim Dolgolyov 239e54540e feat(phys9): единая палитра цветов PHYS9_COLORS (Phase 2)
Новый модуль frontend/js/phys9_palette.js — экспортирует
window.PHYS9_COLORS с цветами для всех кинематических, динамических,
энергетических и геометрических величин Физики 9.

Структура палитры:
- velocity / acceleration / displacement / position / time
- force / forceGravity / forceFriction / forceNormal / forceSpring /
  forceTension
- energyK / energyP / work / power
- body / bodyAccent / liquid / gas / surface
- angle / axis / grid / dashed
- plotPrimary / plotSecondary / plotTertiary
- text / textMuted / textLabel
- bg / bgSubtle / bgCard
- ok / warn / fail

Палитра автоматически переключается между светлой и тёмной темой
через get-проперти, проверяющий html.dark / body.dark.

Утилиты:
- PHYS9_COLORS.vector('F'|'v'|'mg'|...) — цвет вектора по типу
- PHYS9_COLORS.byClass('kinematic'|'dynamic'|...) — цвет по классу

Подключён во все 5 ch-страниц до phys9_legacy.js.

Подготовка к Phase 3 — перенос hardcoded #цветов в legacy на ссылки
PHYS9_COLORS.*.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:30:37 +03:00
Maxim Dolgolyov b6ea1ae398 fix(phys9): удалить Font Awesome — заменено на inline SVG (Phase 1)
Согласно проектной политике CLAUDE.md «никаких эмодзи и Font Awesome,
только inline SVG .ic», вычистил все 14 вхождений FA из Физики 9.

frontend/textbooks/physics_9_ch{1..5}.html (10 правок):
- Удалён <link rel=stylesheet ... font-awesome.css> (5 файлов)
- Заменён <i class="fas fa-star"></i> на inline SVG звезды (5 мест)

frontend/js/phys9_legacy.js (8 правок):
- fa-lightbulb → SVG лампочки (2 места: подсказка задачи, кнопка «решение»)
- fa-check → SVG галочки (кнопка «Проверить»)
- fa-play → SVG треугольник (кнопка «Запустить»)
- fa-pause → SVG двух полосок (кнопка «Стоп»)
- fa-eye-slash → SVG перечёркнутого глаза («Скрыть решение»)
- fa-sun → SVG солнца (тема — день)
- fa-moon → SVG луны (тема — ночь)

Все SVG имеют атрибут class="ic", stroke=currentColor, viewBox 0 0 24 24
для тёмной темы и масштабируемости.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:29:25 +03:00
Maxim Dolgolyov 839f9f65dd docs(plans): план улучшения визуала и интерактивов Физики 9 2026-05-30 09:26:06 +03:00
Maxim Dolgolyov 8142fc814f feat(textbooks): инжект task-панелей §31-36 в physics_9_ch4.html
Жалоба: 'каждому параграфу там [в монолите] есть задачи, тут нет'.
В монолите physics_9.html — отдельный tab-tasks блок содержит 36 ptab-pN
панелей (~1.3 KB каждая) со scaffold'ом score-bar/prog-wrap/nav-dots/
taskArea/feedback/summary. Сами задачи (TASKS_P31..P36) рендерятся в
taskAreapN через goToTask('pN', i).

migrate_phys9_tasks.cjs:
- Извлекает ptab-p31..p36 из монолита (clean emoji + FA<i>)
- Внутри каждого build_pN в ch4 после theory body добавляет <div class='wg'>
  с заголовком 'Задачи §N · Тренажёр §N' и вставляет ptab HTML
- Через 80 мс после render вызывает goToTask('pN', 0) → рендерит первую
  задачу из TASKS_PN

Не делаю это для §1-30: TASKS_P1..P30 не определены в монолите
(там было решение делать тренажёры только для главы 'Законы сохранения').
2026-05-30 09:21:35 +03:00
Maxim Dolgolyov c34fd27c6a feat(phys9 ch): добавлен блок задач параграфа из legacy POOLS
Раньше в монолите physics_9.html на каждый § был блок задач
(navDots, taskArea, fb, sum, progress-bar и chip-ok), но в новых
ch-страницах physics_9_ch{1..5}.html этого не было.

Изменения:

1. В каждой ch1..ch5.html добавлен hook поверх ensureBuilt:
   - Функция _makeTaskBlock(sec) генерирует HTML контейнеров
     legacy-tasks (#taskArea<sec>, #navDots<sec>, #fb<sec>, #sum<sec>,
     #prog<sec>, #ok<sec>, #cur<sec>, #max<sec>, кнопка «Заново»,
     кнопка «Следующая»).
   - _injectTasks(id) добавляет блок в #<id>-body если есть
     window.POOLS[id], и вызывает window.renderTask(id) +
     window.renderNav(id) для рендера первой задачи.
   - ensureBuilt обёрнут так, чтобы вызывать _injectTasks
     после оригинального билда.

2. В phys9_legacy.js добавлен экспорт POOLS и STATE в window
   (раньше они были скрыты внутри IIFE).

Стили блока задач используют CSS-переменные секции (var(--sec-acc, ...))
и работают с любой темой главы.

Теперь по каждому §1-§36 показывается соответствующий пул задач
(TASKS_P1..P36).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:17:38 +03:00
Maxim Dolgolyov 1f17fb40dc fix(textbooks): извлечён общий widget CSS — phys-textbook-widgets.css
Жалоба пользователя по Физике 8 (но проблема общая для Phys 8 и Phys 9):
страницы глав используют классы .wg/.dnd-pool/.dnd-chip/.btn/.score-display/
.feedback/.actions/.sliders/.spoiler/.drop-box в HTML-разметке, но CSS-правила
для них живут только в physics_10_ch1.html. Из-за этого карточки-задания,
chip'ы drag-and-drop, кнопки и feedback-блоки в Phys 8 и Phys 9 рендерились
без стилей (как обычный текст).

- extract_widget_css.cjs: вытягивает CSS-блок (.btn..pre-.col-side) из
  physics_10_ch1.html в frontend/css/phys-textbook-widgets.css (6.4 КБ)
- Подключает <link> в 11 файлов: physics_8_ch1/ch2/ch3/hub/lab,
  physics_9_ch1..ch5, physics_9_hub
- migrate_phys9_content.js теперь инжектит ссылку на widget CSS при будущих
  миграциях (рядом с FA CDN)
2026-05-30 09:16:24 +03:00
Maxim Dolgolyov fe0bfa62c6 fix(phys9 legacy): null-guard в renderTask + try/catch вокруг инициализации
Ошибка: renderTask() падал на secций, отсутствующих на странице ch1
(нет элементов #sum<sec>, #taskArea<sec>, #fb<sec>) — getElementById
возвращал null, .classList.remove падал → IIFE прерывался → экспорт
функций в window не выполнялся → startAnim1 is not defined.

Фиксы:
1. renderTask: early return если area/fb/sum/pool/s — null.
2. Инициализационный forEach обёрнут в try/catch + per-item try/catch.
3. setParaTab('p1') и блок upd2..upd12 обёрнуты в try/catch
   (некоторые элементы могут отсутствовать на отдельных ch-страницах).

Теперь экспорт функций гарантированно выполняется до конца файла.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:13:03 +03:00
Maxim Dolgolyov 932bef237c fix(phys9 ch): подключить phys9_legacy.js во все 5 ch-страниц
Тег <script src="/js/phys9_legacy.js" defer> отсутствовал во всех
physics_9_ch{1..5}.html. Auto-init блок в каждой ch-странице ожидал
window.startAnim1, window.upd2 и т.д. — но без подключения скрипта
эти функции не существовали → ReferenceError: startAnim1 is not defined
при клике на кнопки onclick="startAnim1()".

Тег добавлен после <script src="/js/phys.js"> во всех 5 файлах.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:10:36 +03:00
Maxim Dolgolyov 66bd7ac1f4 fix(textbooks): Физика 9 — STATE collision, KaTeX escape, авто-init симуляций
Три бага из жалобы пользователя:

1) phys9_legacy.js упал с 'Identifier STATE has already been declared' —
   const STATE в монолите конфликтовал с const STATE в chapter inline JS.
   Скрипт extract_phys9_legacy.cjs теперь оборачивает извлечённый код в IIFE
   и явно экспортит через window 70 функций (upd*/draw*/init*/start*/lab*/
   check*/toggle*/render*/show*/...) + 7 const-массивов (TASKS_PN, PUZ_PN).

2) В боковой панели формулы рендерились как 'Delta vecr' вместо Δr⃗ —
   мой переход на JSON.stringify в gen_phys9_ch.js добавил лишний слой
   escape backslash. Уменьшил \\ → \ в SIDEBAR_ROWS, TIPS_HTML,
   PARA_SUBS, LR_SUBS (90 строк). Цепочка теперь: source \Delta → string
   \Delta → JSON "\\Delta" → HTML JS \Delta → runtime \Delta →
   KaTeX \Delta ✓.

3) 'не работают симуляции' — функции из legacy.js были доступны, но
   chapter goTo(id) их не вызывал. Добавлен авто-вызов upd<N>(),
   startAnim<N>(), init<N>(), draw<N>() при переключении на параграф,
   и updLab<N>(), drawLab<N>() — для ЛР.
2026-05-30 09:06:20 +03:00
Maxim Dolgolyov c26423b7d4 fix(phys9 legacy): null-guard для themeBtn и refToggle в дочерних страницах
На страницах physics-9-ch1..ch5 нет элементов #themeBtn, #refToggle, #refPanel
(они только в hub). Без проверки на null код падал с
"Cannot read properties of null", из-за чего НЕ выполнялся
последующий экспорт функций в window (startAnim1, startAnim15 и т.д.) —
и кликам по кнопкам onclick="startAnim1()" соответствовало
ReferenceError: startAnim1 is not defined.

Обёрнуто в `if (themeBtn) {...}` и `if (refToggle && refPanel) {...}` —
теперь скрипт продолжает работу на любой странице, а функции
анимаций корректно экспортируются.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:04:31 +03:00
Maxim Dolgolyov 16d9dfa029 feat(phys8 lab): Phase 6 — лабораторный практикум, 7 виртуальных ЛР
Каждая ЛР: цель, оборудование, ход работы, симуляция, таблица
измерений, расчёт и кнопка «Сдать работу» (+30 XP).

ЛР 1: Теплообмен при смешивании воды разной T
- симуляция 2 калориметров + слияние, цвета через tempColor
- расчёт t_теор vs t_изм с погрешностью

ЛР 2: Удельная теплоёмкость твёрдого тела
- 4 материала (медь/железо/алюминий/свинец)
- образец 100°C → калориметр с водой 18°C, расчёт c

ЛР 3: Сборка простейшей цепи
- виртуальная цепь: батарея + лампа + амперметр (последов) +
  вольтметр (паралл лампе) + ключ
- замыкание ключа → I=0.52 А, U=4.2 В, R=8 Ом

ЛР 4: Последовательное соединение
- 2 резистора, slider'ы R₁, R₂, U; проверка 3 правил автоматически

ЛР 5: Параллельное соединение
- 2 ветви, расчёт I₁, I₂, R_общ; проверка 3 правил

ЛР 6: Работа и мощность тока
- slider'ы U, I, t; расчёт P=UI и A=Pt

ЛР 7: Отражение света
- лазер + зеркало, slider α 10-80°
- таблица серии измерений: α=15/30/45/60, β = α

Ачивка lab_master при сдаче всех 7 ЛР.

Phase 6 завершён. С Phase 0-7 курс «Физика 8» полностью готов:
40 параграфов + 7 ЛР + 3 финала глав + финал курса (в hub).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 09:02:32 +03:00
Maxim Dolgolyov a6bc034bdb feat(phys8 ch3): Phase 5 Wave 3+4 — §36-40 + Финал — Глава 3 завершена
§36 Преломление света:
- Закон Снеллиуса с интерактивным OPTICS.refractRay
- 4 материала (воздух/вода/стекло/алмаз)
- Полное внутреннее отражение
- 5 численных задач

§37 Линзы. Оптическая сила:
- OPTICS.thinLens — собирающая и рассеивающая
- D = 1/F, дптр
- 5 задач (включая F=17 мм для глаза)

§38 Построение изображений (ГЛАВНЫЙ ВИЗУАЛ ОПТИКИ):
- Конструктор изображения через OPTICS.buildLensImage
- slider F и d, увеличение, тип изображения
- 5 типов (d>2F/2F/F<d<2F/d=F/d<F)
- DnD устройств (фотоаппарат/проектор/лупа)
- 5 задач на формулу тонкой линзы

§39 Глаз как оптическая система:
- OPTICS.eyeDiagram с slider'ом аккомодации
- 5 элементов глаза, MCQ
- DnD оптические vs нервные части

§40 Дефекты зрения. Очки:
- Визуализация близоруков. и дальнозоркости с очками
- OPTICS.thinLens исправляет фокус
- 5 задач (включая «знак D»)

ФИНАЛ ГЛАВЫ 3:
- Шпаргалка из 10 формул
- 7 интегрированных боссов: c, отражение, преломление, D, тонкая
  линза, очки, магистр света
- Ачивка light_master (+50 XP)

Глава 3 «Световые явления» (§§32-40, 9 параграфов + финал) закончена.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 08:58:32 +03:00
Maxim Dolgolyov dcdcde5b4e fix(textbooks): Физика 9 — escape § в num + phys9_legacy.js + финалы 5 глав
Багфиксы:
- gen_phys9_ch.js: убран двойной escape \u00a7 → литерал §
  (раньше карточка показывала '\u00a7 1' вместо '§ 1')
- phys9_legacy.js (262 КБ): извлечён весь JS монолита для глобальных onclick-
  обработчиков (startAnim1, lab11add/all/reset, checkNum, togglePend36 и пр.).
  Setup-код в конце обёрнут в try/catch — он рассчитан на DOM монолита.
- migrate_phys9_ch4.js + migrate_phys9_content.js: подключают phys9_legacy.js
  во все 5 ch-файлов перед закрытием <head>.

Финалы глав (write_phys9_finals.js):
- ch1: 5 задач (кинематика — поезд, разгон, окружность, лодка/река)
- ch2: 5 задач (динамика — трение, Гук, свободное падение, перегрузка)
- ch3: 5 задач (статика — рычаг, Архимед, блок, КПД накл. плоск., льдина)
- ch4: 5 задач (импульс — неупр. удар, ЗСЭ, мощность крана, пуля, бросок)
- ch5: 5 контрольных по практикуму (среднее, ЛР2, ЛР4, ЛР6, ЛР10)

Все задачи с автопроверкой через checkNum() (теперь работает из legacy.js).
2026-05-30 08:55:00 +03:00
Maxim Dolgolyov 0c6618fb38 feat(phys8 ch3): Phase 5 Wave 1+2 — §32 источники + §33 тени + §34 отражение + §35 зеркало
§32 Источники света:
- 3 теории: естеств./искусств., тепловые/люминесц., точечные
- IV-1: 8 раундов «светит/отражает»
- IV-2: 6 раундов «тепловой/люминесцентный»
- IV-3: DnD 8 источников на 2 категории
- IV-4: 6 MCQ

§33 Скорость света и распространение:
- 3 теории: c, прямолинейность, тень/полутень
- IV-1: ГЛАВНЫЙ ВИЗУАЛ — динамическая тень/полутень: slider'ы
  размера источника (0=точечный → 40=протяжённый) и расстояния,
  рисуются зоны тени и полутени на экране
- IV-2: калькулятор времени пролёта света
- IV-3: DnD 8 утверждений правда/ложь
- IV-4: 5 числовых задач (Солнце, Луна, скорость vs звук)

§34 Отражение света:
- 3 теории: закон отражения, зеркальное/диффузное, примеры
- IV-1: динамическая визуализация через OPTICS.reflectRay,
  slider α 0-80°
- IV-2: 6 раундов «зеркало/диффузное»
- IV-3: DnD 8 поверхностей
- IV-4: 5 задач (включая поворот зеркала)

§35 Плоское зеркало:
- 3 теории: свойства изображения, построение, зеркальные надписи
- IV-1: построение мнимого изображения через OPTICS.mirrorPlane
  + OPTICS.lightObject, slider расстояния
- IV-2: 6 True/False
- IV-3: DnD свойств изображения
- IV-4: 5 задач (включая 2 зеркала под 90°)

§36-40 + финал — stub-заглушки, будут реализованы в Wave 3-4.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 08:52:26 +03:00
Maxim Dolgolyov 3727417810 feat(phys8 ch2): Phase 4 Wave 2 — §30 Эрстед + §31 электромагнит + Финал главы 2
§30 Опыт Эрстеда:
- 3 теории: открытие 1820, значение опыта, применения
- IV-1: симуляция Эрстеда — провод + стрелка, slider'ы ключа и
  направления тока; без тока стрелка указывает на N (Землю),
  при включении тока отклоняется на 60° (по/против часовой
  в зависимости от направления)
- IV-2: 5 вопросов о значимости опыта
- IV-3: DnD 8 «есть/нет поля» (магниты, токи, нейтр. тела)
- IV-4: 6 MCQ

§31 Поле прямого провода + электромагнит:
- 3 теории: окружности линий и правило правой руки, соленоид,
  электромагнит
- IV-1: ГЛАВНЫЙ ВИЗУАЛ — электромагнит-конструктор: slider'ы I, N
  и dropdown сердечника (воздух/железо μ=500); катушка с витками,
  стержень, рассчитанный |B| и число поднимаемых скрепок
- IV-2: 5 вопросов «правило правой руки»
- IV-3: DnD 8 действий «усилит/ослабит поле»
- IV-4: 6 MCQ

ФИНАЛ ГЛАВЫ 2:
- Шпаргалка из 12 формул и понятий
- 10 интегрированных боссов: закон Ома, R=ρl/S, последов., параллельная,
  смешанная цепь, мощность, Джоуль-Ленц, кВт·ч за месяц, тариф,
  магистр электромагнетизма
- Прогресс-бар + ачивка em_master (+50 XP) при 10/10

Глава 2 «Электромагнитные явления» (§§12-31, 20 параграфов) закончена.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 23:54:53 +03:00
Maxim Dolgolyov 007c9211cd feat(phys8 ch2): Phase 4 Wave 1 — §28 постоянные магниты + §29 магнитное поле
§28 Постоянные магниты:
- 3 теории: что такое магнит, закон взаимод. полюсов, поле Земли
- IV-1: интерактив 2 магнита, slider переворота второго —
  N–S притягиваются (зелёные стрелки), N–N отталкиваются (красные)
- IV-2: 5 раундов «полюсы»
- IV-3: DnD 8 утверждений правда/ложь
- IV-4: 6 MCQ

§29 Магнитное поле:
- 3 теории: что такое B, линии индукции (замкнутые!), опилки
- IV-1: ГЛАВНЫЙ ВИЗУАЛ — 7 эллиптических замкнутых линий поля
  полосового магнита N→S, со стрелками направления, прямые
  линии вблизи оси
- IV-2: 5 утверждений правда/ложь
- IV-3: DnD 8 свойств «электрическое vs магнитное поле»
- IV-4: 6 MCQ

Добавлен общий хелпер _drawMagnet.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 23:49:58 +03:00
Maxim Dolgolyov 24d7f2b1d9 feat(phys8 ch2): Phase 3 Wave 4 — §26 P=UI/Джоуль-Ленц + §27 электроэнергия
§26 Работа и мощность тока:
- 3 теории: A=UIt, P=UI=I²R=U²/R, закон Джоуля-Ленца
- IV-1: калькулятор + анимация нагрева резистора по tempColor,
  цвет меняется от синего до красного в зависимости от P,
  glow при высокой мощности
- IV-2: 5 раундов «какую формулу использовать?»
- IV-3: DnD 5 приборов по возрастанию P (LED → автомобиль)
- IV-4: 6 числовых задач

§27 Электроэнергия. Безопасность:
- 3 теории: кВт·ч, экономия, правила ТБ
- IV-1: ГЛАВНЫЙ ВИЗУАЛ — счётчик за месяц: 4 прибора (лампа, ТВ,
  чайник, холодильник) + slider'ы часов/день и тарифа,
  показывает кВт·ч и руб + «самый прожорливый прибор»
- IV-2: 6 ситуаций «безопасно/опасно»
- IV-3: DnD 8 ситуаций «экономит/расходует»
- IV-4: 5 задач (включая обогреватель за месяц)

Со Phase 3 завершён: §19-27 (постоянный ток, 9 параграфов).
Phase 4 → §28-31 + Финал главы 2.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 23:46:36 +03:00