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 страницах глав.
Новый модуль 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>
На десктопе (>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.
Новый модуль 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>
Новый модуль 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>
Раньше в монолите 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>
Жалоба пользователя по Физике 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)
Тег <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>
Три бага из жалобы пользователя:
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>() — для ЛР.